w-web-perm 1.0.4 → 1.0.6
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 +9 -4
- package/dist/css/app.dad1d596.css +1 -0
- package/dist/index.tmp +1 -1
- package/dist/js/app-legacy.4e39a313.js +2 -0
- package/dist/js/app-legacy.4e39a313.js.map +1 -0
- package/dist/js/app.4e39a313.js +2 -0
- package/dist/js/app.4e39a313.js.map +1 -0
- package/dist/js/chunk-vendors-legacy.827f1c54.js +13 -0
- package/dist/js/chunk-vendors-legacy.827f1c54.js.map +1 -0
- package/dist/js/chunk-vendors.827f1c54.js +13 -0
- package/dist/js/chunk-vendors.827f1c54.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 +41 -5
- package/docs/WWebPerm.mjs.html +341 -25
- package/docs/index.html +1 -1
- package/{g.mDb.mjs → g.backupDb.mjs} +1 -1
- package/g.initialData.mjs +111 -0
- package/{g.mInitialTestData.mjs → g.initialTestData.mjs} +1 -1
- package/g.provideRuleGroups.mjs +56 -0
- package/g.provideTargets.mjs +57 -0
- package/g.provideUsers.mjs +45 -0
- package/package.json +2 -7
- package/public/index.html +1 -1
- package/server/WWebPerm.mjs +340 -24
- package/server/provideRuleGroups.mjs +65 -0
- package/server/provideTargets.mjs +59 -0
- package/server/provideUsers.mjs +68 -0
- package/src/App.vue +2 -10
- package/src/components/Common/CheckYes.vue +2 -2
- package/src/components/Common/CheckYesNo.vue +3 -3
- package/src/components/Common/LoadingWinBar.vue +1 -1
- package/src/components/LayoutContent.vue +37 -68
- package/src/components/LayoutContentGroups.vue +68 -62
- package/src/components/LayoutContentTargets.vue +56 -54
- package/src/components/LayoutContentUsers.vue +66 -61
- package/src/components/VeUser.vue +18 -26
- package/src/components/ruleGroup.vue +11 -11
- package/src/main.js +0 -2
- package/src/schema/tables/ruleGroups.mjs +11 -11
- package/src/schema/tables/targets.mjs +6 -9
- package/src/schema/tables/users.mjs +5 -5
- package/src/store/mutations.mjs +324 -69
- package/srv.mjs +10 -11
- package/tableTags-web-perm.json +1 -1
- package/vue.config.js +1 -1
- package/dist/css/app.79b4b59b.css +0 -1
- package/dist/css/chunk-vendors.99633b53.css +0 -5
- package/dist/js/app-legacy.48e6e535.js +0 -2
- package/dist/js/app-legacy.48e6e535.js.map +0 -1
- package/dist/js/app.7f6428ac.js +0 -2
- package/dist/js/app.7f6428ac.js.map +0 -1
- package/dist/js/chunk-vendors-legacy.7cb6c366.js +0 -13
- package/dist/js/chunk-vendors-legacy.7cb6c366.js.map +0 -1
- package/dist/js/chunk-vendors.7cb6c366.js +0 -13
- package/dist/js/chunk-vendors.7cb6c366.js.map +0 -1
- package/g.mInitialData.mjs +0 -147
- package/src/plugins/mVuetify.mjs +0 -12
|
@@ -0,0 +1,111 @@
|
|
|
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
|
+
rs = [
|
|
11
|
+
['viewer', '普通瀏覽者', 'id-for-權限群組1'],
|
|
12
|
+
['basic', '一般使用者', 'id-for-權限群組2'],
|
|
13
|
+
['admin', '系統管理者', 'id-for-權限群組3'],
|
|
14
|
+
]
|
|
15
|
+
rs = map(rs, ([key, name, ruleGroupsIds], k) => {
|
|
16
|
+
let v = ds.users.funNew({
|
|
17
|
+
order: k,
|
|
18
|
+
name,
|
|
19
|
+
email: `${key}@example.com`,
|
|
20
|
+
ruleGroupsIds,
|
|
21
|
+
userId: 'id-for-admin',
|
|
22
|
+
})
|
|
23
|
+
v.id = `id-for-${key}`
|
|
24
|
+
if (key === 'admin') {
|
|
25
|
+
v.isAdmin = 'y'
|
|
26
|
+
}
|
|
27
|
+
return v
|
|
28
|
+
})
|
|
29
|
+
await woItems.users.delAll()
|
|
30
|
+
await woItems.users.insert(rs)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
//人工建置數據時得要嚴格建立各階分層, 否則會無法查找到自動建立之parentId
|
|
34
|
+
rs = [
|
|
35
|
+
'專案A',
|
|
36
|
+
'專案A/頁A',
|
|
37
|
+
'專案A/頁A/區塊A',
|
|
38
|
+
'專案A/頁A/區塊A/執行按鈕',
|
|
39
|
+
'專案A/頁A/區塊A/分析按鈕',
|
|
40
|
+
'專案A/頁B',
|
|
41
|
+
'專案A/頁B/區塊A',
|
|
42
|
+
'專案A/頁B/區塊A/執行按鈕',
|
|
43
|
+
'專案A/頁B/區塊A/分析按鈕',
|
|
44
|
+
'專案A/頁B/區塊B',
|
|
45
|
+
'專案A/頁B/區塊B/展開按鈕',
|
|
46
|
+
'專案A/頁B/區塊B/下載按鈕',
|
|
47
|
+
'專案B',
|
|
48
|
+
'專案B/頁A',
|
|
49
|
+
'專案B/頁A/區塊A',
|
|
50
|
+
'專案B/頁A/區塊A/下載報表按鈕',
|
|
51
|
+
'專案B/頁A/區塊A/下載數據按鈕',
|
|
52
|
+
'專案B/頁B/區塊A',
|
|
53
|
+
'專案B/頁B/區塊B',
|
|
54
|
+
'專案B/頁B/區塊B/顯示後台按鈕',
|
|
55
|
+
'專案B/頁B/區塊B/轉跳主站按鈕',
|
|
56
|
+
]
|
|
57
|
+
rs = map(rs, (key, k) => {
|
|
58
|
+
let v = ds.targets.funNew({
|
|
59
|
+
order: k,
|
|
60
|
+
description: key,
|
|
61
|
+
})
|
|
62
|
+
v.id = key
|
|
63
|
+
return v
|
|
64
|
+
})
|
|
65
|
+
await woItems.targets.delAll()
|
|
66
|
+
await woItems.targets.insert(rs)
|
|
67
|
+
|
|
68
|
+
rs = [
|
|
69
|
+
['權限群組1', '權限群組1之說明',
|
|
70
|
+
`{
|
|
71
|
+
"___all___": { "show": "y", "active": "n" },
|
|
72
|
+
"專案A/頁A": { "show": "y", "active": "y" },
|
|
73
|
+
"專案A/頁B": { "show": "n", "active": "n" },
|
|
74
|
+
}`
|
|
75
|
+
],
|
|
76
|
+
['權限群組2', '權限群組2之說明',
|
|
77
|
+
`{
|
|
78
|
+
"___all___": { "show": "y", "active": "n" },
|
|
79
|
+
}`
|
|
80
|
+
],
|
|
81
|
+
['權限群組3', '權限群組3之說明',
|
|
82
|
+
`{
|
|
83
|
+
"___all___": { "show": "y", "active": "y" },
|
|
84
|
+
}`
|
|
85
|
+
],
|
|
86
|
+
]
|
|
87
|
+
rs = map(rs, ([name, description, crules], k) => {
|
|
88
|
+
let v = ds.ruleGroups.funNew({
|
|
89
|
+
order: k,
|
|
90
|
+
name,
|
|
91
|
+
description,
|
|
92
|
+
crules,
|
|
93
|
+
userId: 'id-for-admin',
|
|
94
|
+
})
|
|
95
|
+
v.id = `id-for-${name}`
|
|
96
|
+
return v
|
|
97
|
+
})
|
|
98
|
+
await woItems.ruleGroups.delAll()
|
|
99
|
+
await woItems.ruleGroups.insert(rs)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
initialData()
|
|
105
|
+
.catch((err) => {
|
|
106
|
+
console.log('initialData catch', err)
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
//重建資料庫
|
|
111
|
+
//node --experimental-modules --es-module-specifier-resolution=node g.initialData.mjs
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import map from 'lodash/map'
|
|
2
|
+
import ds from './src/schema/index.mjs'
|
|
3
|
+
import provideRuleGroups from './server/provideRuleGroups.mjs'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
async function provide() {
|
|
7
|
+
|
|
8
|
+
let url = `http://localhost:11006/syncAndReplaceRuleGroups?token=sys`
|
|
9
|
+
|
|
10
|
+
let from = `pd`
|
|
11
|
+
|
|
12
|
+
let rs = [
|
|
13
|
+
['pd-權限群組1', 'pd-權限群組1之說明',
|
|
14
|
+
`{
|
|
15
|
+
"___all___": { "show": "y", "active": "n" },
|
|
16
|
+
"pd-專案A/頁A": { "show": "y", "active": "y" },
|
|
17
|
+
"pd-專案A/頁B": { "show": "n", "active": "n" },
|
|
18
|
+
}`
|
|
19
|
+
],
|
|
20
|
+
['pd-權限群組2', 'pd-權限群組2之說明',
|
|
21
|
+
`{
|
|
22
|
+
"___all___": { "show": "y", "active": "n" },
|
|
23
|
+
}`
|
|
24
|
+
],
|
|
25
|
+
['pd-權限群組3', 'pd-權限群組3之說明',
|
|
26
|
+
`{
|
|
27
|
+
"___all___": { "show": "y", "active": "y" },
|
|
28
|
+
}`
|
|
29
|
+
],
|
|
30
|
+
]
|
|
31
|
+
rs = map(rs, ([name, description, crules], k) => {
|
|
32
|
+
let v = ds.ruleGroups.funNew({
|
|
33
|
+
order: 1000 + k,
|
|
34
|
+
name,
|
|
35
|
+
description,
|
|
36
|
+
crules,
|
|
37
|
+
userId: 'id-for-admin',
|
|
38
|
+
from,
|
|
39
|
+
})
|
|
40
|
+
v.id = `id-for-${name}`
|
|
41
|
+
return v
|
|
42
|
+
})
|
|
43
|
+
console.log('rs', rs)
|
|
44
|
+
|
|
45
|
+
let r = await provideRuleGroups(url, from, rs)
|
|
46
|
+
console.log('r.msg', r.msg)
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
provide()
|
|
51
|
+
.catch((err) => {
|
|
52
|
+
console.log('provide catch', err)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
//node --experimental-modules --es-module-specifier-resolution=node g.provideRuleGroups.mjs
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import map from 'lodash/map'
|
|
2
|
+
import ds from './src/schema/index.mjs'
|
|
3
|
+
import provideTargets from './server/provideTargets.mjs'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
async function provide() {
|
|
7
|
+
|
|
8
|
+
let url = `http://localhost:11006/syncAndReplaceTargets?token=sys`
|
|
9
|
+
|
|
10
|
+
let from = `pd`
|
|
11
|
+
|
|
12
|
+
let rs = [
|
|
13
|
+
'pd-專案A',
|
|
14
|
+
'pd-專案A/頁A',
|
|
15
|
+
'pd-專案A/頁A/區塊A',
|
|
16
|
+
'pd-專案A/頁A/區塊A/執行按鈕',
|
|
17
|
+
'pd-專案A/頁A/區塊A/分析按鈕',
|
|
18
|
+
'pd-專案A/頁B',
|
|
19
|
+
'pd-專案A/頁B/區塊A',
|
|
20
|
+
'pd-專案A/頁B/區塊A/執行按鈕',
|
|
21
|
+
'pd-專案A/頁B/區塊A/分析按鈕',
|
|
22
|
+
'pd-專案A/頁B/區塊B',
|
|
23
|
+
'pd-專案A/頁B/區塊B/展開按鈕',
|
|
24
|
+
'pd-專案A/頁B/區塊B/下載按鈕',
|
|
25
|
+
'pd-專案B',
|
|
26
|
+
'pd-專案B/頁A',
|
|
27
|
+
'pd-專案B/頁A/區塊A',
|
|
28
|
+
'pd-專案B/頁A/區塊A/下載報表按鈕',
|
|
29
|
+
'pd-專案B/頁A/區塊A/下載數據按鈕',
|
|
30
|
+
'pd-專案B/頁B/區塊A',
|
|
31
|
+
'pd-專案B/頁B/區塊B',
|
|
32
|
+
'pd-專案B/頁B/區塊B/顯示後台按鈕',
|
|
33
|
+
'pd-專案B/頁B/區塊B/轉跳主站按鈕',
|
|
34
|
+
]
|
|
35
|
+
rs = map(rs, (key, k) => {
|
|
36
|
+
let v = ds.targets.funNew({
|
|
37
|
+
order: 1000 + k,
|
|
38
|
+
description: key,
|
|
39
|
+
from,
|
|
40
|
+
})
|
|
41
|
+
v.id = key
|
|
42
|
+
return v
|
|
43
|
+
})
|
|
44
|
+
console.log('rs', rs)
|
|
45
|
+
|
|
46
|
+
let r = await provideTargets(url, from, rs)
|
|
47
|
+
console.log('r.msg', r.msg)
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
provide()
|
|
52
|
+
.catch((err) => {
|
|
53
|
+
console.log('provide catch', err)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
//node --experimental-modules --es-module-specifier-resolution=node g.provideTargets.mjs
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import map from 'lodash/map'
|
|
2
|
+
import ds from './src/schema/index.mjs'
|
|
3
|
+
import provideUsers from './server/provideUsers.mjs'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
async function provide() {
|
|
7
|
+
|
|
8
|
+
let url = `http://localhost:11006/syncAndReplaceUsers?token=sys`
|
|
9
|
+
|
|
10
|
+
let from = `pd`
|
|
11
|
+
|
|
12
|
+
let rs = [
|
|
13
|
+
['pd-viewer', 'pd-普通瀏覽者', 'id-for-pd-權限群組1'],
|
|
14
|
+
['pd-basic', 'pd-一般使用者', 'id-for-pd-權限群組2'],
|
|
15
|
+
['pd-admin', 'pd-系統管理者', 'id-for-pd-權限群組3'],
|
|
16
|
+
]
|
|
17
|
+
rs = map(rs, ([key, name, ruleGroupsIds], k) => {
|
|
18
|
+
let v = ds.users.funNew({
|
|
19
|
+
order: 1000 + k,
|
|
20
|
+
name,
|
|
21
|
+
email: `${key}@example.com`,
|
|
22
|
+
ruleGroupsIds,
|
|
23
|
+
userId: 'id-for-admin',
|
|
24
|
+
from,
|
|
25
|
+
})
|
|
26
|
+
v.id = `id-for-${key}`
|
|
27
|
+
if (key === 'pd-admin') {
|
|
28
|
+
v.isAdmin = 'y'
|
|
29
|
+
}
|
|
30
|
+
return v
|
|
31
|
+
})
|
|
32
|
+
console.log('rs', rs)
|
|
33
|
+
|
|
34
|
+
let r = await provideUsers(url, from, rs)
|
|
35
|
+
console.log('r.msg', r.msg)
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
provide()
|
|
40
|
+
.catch((err) => {
|
|
41
|
+
console.log('provide catch', err)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
//node --experimental-modules --es-module-specifier-resolution=node g.provideUsers.mjs
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "w-web-perm",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"main": "dist/w-web-perm.umd.js",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@mdi/js": "^7.2.96",
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"json5": "^2.2.3",
|
|
9
9
|
"lodash": "^4.17.21",
|
|
10
10
|
"showdown": "^2.1.0",
|
|
11
|
-
"w-component-vue": "^2.3.
|
|
11
|
+
"w-component-vue": "^2.3.47",
|
|
12
12
|
"w-data-collector": "^1.0.19",
|
|
13
13
|
"w-serv-hapi": "^1.0.11",
|
|
14
14
|
"w-serv-orm": "^1.0.7",
|
|
@@ -27,12 +27,7 @@
|
|
|
27
27
|
"eslint-plugin-promise": "^6.1.1",
|
|
28
28
|
"eslint-plugin-standard": "^4.1.0",
|
|
29
29
|
"eslint-plugin-vue": "^9.10.0",
|
|
30
|
-
"sass": "^1.60.0",
|
|
31
|
-
"sass-loader": "^13.2.2",
|
|
32
30
|
"vue": "^2.6.14",
|
|
33
|
-
"vue-cli-plugin-vuetify": "^2.5.8",
|
|
34
|
-
"vuetify": "^2.6.14",
|
|
35
|
-
"vuetify-loader": "^1.9.2",
|
|
36
31
|
"vuex": "^3.6.2",
|
|
37
32
|
"w-orm-mongodb": "^1.1.29",
|
|
38
33
|
"w-package-tools": "^1.0.70"
|
package/public/index.html
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
<link href="https://cdn.jsdelivr.net/npm/@mdi/font/css/materialdesignicons.min.css" rel="stylesheet">
|
|
11
11
|
|
|
12
12
|
<!-- fontawesome -->
|
|
13
|
-
<link href="https://
|
|
13
|
+
<link href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.4.2/css/all.min.css" rel="stylesheet">
|
|
14
14
|
|
|
15
15
|
</head>
|
|
16
16
|
<body style="font-family:'Microsoft JhengHei','Avenir','Helvetica', 'Arial', 'sans-serif'; padding:0px; margin:0px;">
|