w-web-api 1.0.28 → 1.0.29
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 +23 -16
- package/dist/css/app.d38a4241.css +1 -0
- package/dist/index.tmp +1 -1
- package/dist/js/app-legacy.86198344.js +2 -0
- package/dist/js/app-legacy.86198344.js.map +1 -0
- package/dist/js/app.86198344.js +2 -0
- package/dist/js/app.86198344.js.map +1 -0
- package/dist/js/chunk-vendors-legacy.c0c4267e.js +14 -0
- package/dist/js/chunk-vendors-legacy.c0c4267e.js.map +1 -0
- package/dist/js/chunk-vendors.c0c4267e.js +14 -0
- package/dist/js/chunk-vendors.c0c4267e.js.map +1 -0
- package/dist/w-web-api.umd.js +2 -2
- package/dist/w-web-api.umd.js.map +1 -1
- package/docs/WWebApi.html +4 -4
- package/docs/WWebApi.mjs.html +167 -64
- package/docs/index.html +1 -1
- package/{g.mDb.mjs → g.backupDb.mjs} +1 -1
- package/{g.mInitialTestData.mjs → g.initialTestData.mjs} +1 -1
- package/package.json +5 -10
- package/public/index.html +1 -1
- package/server/WWebApi.mjs +166 -63
- package/server/provideApis.mjs +2 -2
- package/src/App.vue +0 -8
- package/src/components/LayoutContent.vue +15 -35
- package/src/main.js +0 -2
- package/srv.mjs +21 -12
- package/tableTags-web-api.json +1 -1
- package/vue.config.js +1 -1
- package/dist/css/app.8f83f1ad.css +0 -1
- package/dist/css/chunk-vendors.004a7134.css +0 -5
- package/dist/js/app-legacy.fe5cd851.js +0 -2
- package/dist/js/app-legacy.fe5cd851.js.map +0 -1
- package/dist/js/app.fe5cd851.js +0 -2
- package/dist/js/app.fe5cd851.js.map +0 -1
- package/dist/js/chunk-vendors-legacy.1bbf0550.js +0 -14
- package/dist/js/chunk-vendors-legacy.1bbf0550.js.map +0 -1
- package/dist/js/chunk-vendors.1bbf0550.js +0 -14
- package/dist/js/chunk-vendors.1bbf0550.js.map +0 -1
- package/src/plugins/mVuetify.mjs +0 -12
package/server/WWebApi.mjs
CHANGED
|
@@ -8,6 +8,7 @@ import keys from 'lodash/keys'
|
|
|
8
8
|
import j2o from 'wsemi/src/j2o.mjs'
|
|
9
9
|
import iseobj from 'wsemi/src/iseobj.mjs'
|
|
10
10
|
import isestr from 'wsemi/src/isestr.mjs'
|
|
11
|
+
import isearr from 'wsemi/src/isearr.mjs'
|
|
11
12
|
import ispint from 'wsemi/src/ispint.mjs'
|
|
12
13
|
import isfun from 'wsemi/src/isfun.mjs'
|
|
13
14
|
import ispm from 'wsemi/src/ispm.mjs'
|
|
@@ -26,7 +27,7 @@ import ds from '../src/schema/index.mjs'
|
|
|
26
27
|
|
|
27
28
|
|
|
28
29
|
/**
|
|
29
|
-
*
|
|
30
|
+
* API伺服器
|
|
30
31
|
*
|
|
31
32
|
* @class
|
|
32
33
|
* @param {Function} WOrm 輸入資料庫ORM函數
|
|
@@ -45,10 +46,9 @@ import ds from '../src/schema/index.mjs'
|
|
|
45
46
|
* @param {String} [opt.subfolder=''] 輸入站台所在子目錄字串,提供站台位於內網採反向代理進行服務時,故需支援位於子目錄情形,預設''
|
|
46
47
|
* @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
|
|
47
48
|
* @example
|
|
48
|
-
*
|
|
49
49
|
* import WOrm from 'w-orm-mongodb/src/WOrmMongodb.mjs' //自行選擇引用ORM, 使用Mongodb測試
|
|
50
|
-
* import getSettings from './server/getSettings.mjs'
|
|
51
50
|
* import WWebApi from './server/WWebApi.mjs'
|
|
51
|
+
* import getSettings from './g.getSettings.mjs'
|
|
52
52
|
*
|
|
53
53
|
* //st
|
|
54
54
|
* let st = getSettings()
|
|
@@ -57,22 +57,55 @@ import ds from '../src/schema/index.mjs'
|
|
|
57
57
|
* let db = st.dbName
|
|
58
58
|
* let opt = {
|
|
59
59
|
*
|
|
60
|
-
* getUserById: null,
|
|
61
60
|
* bCheckUser: false,
|
|
61
|
+
* getUserById: null,
|
|
62
62
|
* bExcludeWhenNotAdmin: false,
|
|
63
63
|
*
|
|
64
64
|
* serverPort: 11005,
|
|
65
|
-
* subfolder: '', //
|
|
65
|
+
* subfolder: '', //mapi
|
|
66
66
|
*
|
|
67
67
|
* webName: {
|
|
68
68
|
* 'eng': 'API Service',
|
|
69
|
-
* 'cht': 'API管理系統'
|
|
69
|
+
* 'cht': 'API管理系統',
|
|
70
70
|
* },
|
|
71
|
+
* webDescription: {
|
|
72
|
+
* 'eng': 'A web service package as methods to send requests to and receive responses from an API.',
|
|
73
|
+
* 'cht': 'A web service package as methods to send requests to and receive responses from an API.',
|
|
74
|
+
* },
|
|
75
|
+
* webLogo: 'data:image/svg+xml;base64,...',
|
|
76
|
+
*
|
|
77
|
+
* }
|
|
71
78
|
*
|
|
79
|
+
* let getUserByToken = (token) => {
|
|
80
|
+
* // return {} //測試無法登入
|
|
81
|
+
* if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
|
|
82
|
+
* return {
|
|
83
|
+
* id: 'id-for-application',
|
|
84
|
+
* name: 'application',
|
|
85
|
+
* email: 'admin@example.com',
|
|
86
|
+
* isAdmin: 'y',
|
|
87
|
+
* }
|
|
88
|
+
* }
|
|
89
|
+
* if (token === 'sys') { //開發階段w-ui-loginout自動給予browser使用者(且位於localhost)的token為sys
|
|
90
|
+
* return {
|
|
91
|
+
* id: 'id-for-admin',
|
|
92
|
+
* name: '測試者',
|
|
93
|
+
* email: 'admin@example.com',
|
|
94
|
+
* isAdmin: 'y',
|
|
95
|
+
* }
|
|
96
|
+
* }
|
|
97
|
+
* console.log('invalid token', token)
|
|
98
|
+
* console.log('於生產環境時得加入SSO等驗證token機制')
|
|
99
|
+
* return {}
|
|
100
|
+
* }
|
|
101
|
+
*
|
|
102
|
+
* let verifyUser = (user) => {
|
|
103
|
+
* console.log('於生產環境時得加入驗證user機制')
|
|
104
|
+
* return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
72
105
|
* }
|
|
73
106
|
*
|
|
74
107
|
* //WWebApi
|
|
75
|
-
* let instWWebApi = WWebApi(WOrm, url, db, opt)
|
|
108
|
+
* let instWWebApi = WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt)
|
|
76
109
|
*
|
|
77
110
|
* instWWebApi.on('error', (err) => {
|
|
78
111
|
* console.log(err)
|
|
@@ -188,32 +221,37 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
188
221
|
}
|
|
189
222
|
|
|
190
223
|
|
|
191
|
-
//
|
|
192
|
-
let
|
|
224
|
+
//getTokenUserForSelf
|
|
225
|
+
let getTokenUserForSelf = async (token) => {
|
|
193
226
|
|
|
194
227
|
//getUserByToken
|
|
195
|
-
let
|
|
196
|
-
if (ispm(
|
|
197
|
-
|
|
228
|
+
let userSelf = getUserByToken(token)
|
|
229
|
+
if (ispm(userSelf)) {
|
|
230
|
+
userSelf = await userSelf
|
|
198
231
|
}
|
|
199
|
-
|
|
200
|
-
|
|
232
|
+
|
|
233
|
+
//check
|
|
234
|
+
if (!iseobj(userSelf)) {
|
|
235
|
+
console.log(`can not find the user from token`, token)
|
|
236
|
+
return Promise.reject(`can not find the user from token`)
|
|
201
237
|
}
|
|
202
238
|
|
|
203
239
|
//verifyUser
|
|
204
|
-
let b = verifyUser(
|
|
240
|
+
let b = verifyUser(userSelf)
|
|
205
241
|
if (ispm(b)) {
|
|
206
242
|
b = await b
|
|
207
243
|
}
|
|
208
244
|
|
|
209
245
|
//check
|
|
210
246
|
if (!b) {
|
|
247
|
+
console.log('userSelf', userSelf)
|
|
211
248
|
return Promise.reject(`user does not have permission`)
|
|
212
249
|
}
|
|
213
250
|
|
|
214
|
-
return
|
|
251
|
+
return userSelf
|
|
215
252
|
}
|
|
216
253
|
|
|
254
|
+
|
|
217
255
|
//getAPIsList
|
|
218
256
|
let getAPIsList = async (query = {}) => {
|
|
219
257
|
let rs = await woItems.apis.select(query)
|
|
@@ -222,7 +260,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
222
260
|
|
|
223
261
|
|
|
224
262
|
//parsePayload
|
|
225
|
-
let parsePayload = (req) => {
|
|
263
|
+
let parsePayload = async (req) => {
|
|
226
264
|
let inp = get(req, 'payload')
|
|
227
265
|
|
|
228
266
|
//to obj
|
|
@@ -230,37 +268,57 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
230
268
|
inp = j2o(inp)
|
|
231
269
|
}
|
|
232
270
|
|
|
233
|
-
//
|
|
234
|
-
if (iseobj(inp)) {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
//apis
|
|
240
|
-
each(apis, (api, kapi) => {
|
|
241
|
-
// console.log(kapi, api.name)
|
|
242
|
-
each(api, (v, k) => {
|
|
243
|
-
// console.log(k, v)
|
|
244
|
-
if (isestr(v)) {
|
|
245
|
-
if (strleft(v, 7) === 'base64:') {
|
|
246
|
-
// console.log(k, 'get base64')
|
|
247
|
-
v = strdelleft(v, 7)
|
|
248
|
-
v = b642str(v)
|
|
249
|
-
// console.log(v)
|
|
250
|
-
apis[kapi][k] = v
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
})
|
|
254
|
-
})
|
|
271
|
+
//check
|
|
272
|
+
if (!iseobj(inp)) {
|
|
273
|
+
console.log('inp', inp)
|
|
274
|
+
return Promise.reject(`invalid inp from req`)
|
|
275
|
+
}
|
|
255
276
|
|
|
256
|
-
|
|
257
|
-
|
|
277
|
+
//group
|
|
278
|
+
let group = get(inp, 'group', '')
|
|
258
279
|
|
|
280
|
+
//check
|
|
281
|
+
if (!isestr(group)) {
|
|
282
|
+
console.log('inp', inp)
|
|
283
|
+
console.log('group', group)
|
|
284
|
+
return Promise.reject(`invalid group from inp`)
|
|
259
285
|
}
|
|
260
|
-
|
|
261
|
-
|
|
286
|
+
|
|
287
|
+
//apis
|
|
288
|
+
let apis = get(inp, 'apis', [])
|
|
289
|
+
|
|
290
|
+
//check
|
|
291
|
+
if (!isearr(apis)) {
|
|
292
|
+
console.log('inp', inp)
|
|
293
|
+
console.log('apis', apis)
|
|
294
|
+
return Promise.reject(`invalid apis from inp`)
|
|
262
295
|
}
|
|
263
296
|
|
|
297
|
+
//偵測b64自動恢復
|
|
298
|
+
each(apis, (api, kapi) => {
|
|
299
|
+
// console.log(kapi, api.name)
|
|
300
|
+
each(api, (v, k) => {
|
|
301
|
+
// console.log(k, v)
|
|
302
|
+
if (isestr(v)) {
|
|
303
|
+
if (strleft(v, 7) === 'base64:') {
|
|
304
|
+
// console.log(k, 'get base64')
|
|
305
|
+
v = strdelleft(v, 7)
|
|
306
|
+
v = b642str(v)
|
|
307
|
+
// console.log(v)
|
|
308
|
+
apis[kapi][k] = v
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
})
|
|
312
|
+
})
|
|
313
|
+
|
|
314
|
+
//save group
|
|
315
|
+
each(apis, (api, kapi) => {
|
|
316
|
+
apis[kapi].group = group
|
|
317
|
+
})
|
|
318
|
+
|
|
319
|
+
//resave
|
|
320
|
+
inp = { group, apis }
|
|
321
|
+
|
|
264
322
|
return inp
|
|
265
323
|
}
|
|
266
324
|
|
|
@@ -280,19 +338,36 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
280
338
|
}
|
|
281
339
|
|
|
282
340
|
|
|
283
|
-
//
|
|
284
|
-
let
|
|
341
|
+
//syncAndReplaceApis
|
|
342
|
+
let syncAndReplaceApis = async (params) => {
|
|
285
343
|
|
|
286
|
-
//
|
|
287
|
-
let
|
|
344
|
+
//group
|
|
345
|
+
let group = get(params, 'group', '')
|
|
288
346
|
// console.log('group', group)
|
|
289
|
-
|
|
347
|
+
|
|
348
|
+
//check
|
|
349
|
+
if (!isestr(group)) {
|
|
350
|
+
console.log('params', params)
|
|
351
|
+
console.log('group', group)
|
|
352
|
+
return Promise.reject(`invalid group`)
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
//apis
|
|
356
|
+
let apis = get(params, 'apis', [])
|
|
357
|
+
// console.log('apis', apis)
|
|
358
|
+
|
|
359
|
+
//check
|
|
360
|
+
if (!isearr(apis)) {
|
|
361
|
+
console.log('params', params)
|
|
362
|
+
console.log('apis', apis)
|
|
363
|
+
return Promise.reject(`invalid apis`)
|
|
364
|
+
}
|
|
290
365
|
|
|
291
366
|
//delAll group
|
|
292
367
|
await woItems.apis.delAll({ group })
|
|
293
368
|
|
|
294
369
|
//insert
|
|
295
|
-
let r = await woItems.apis.insert(
|
|
370
|
+
let r = await woItems.apis.insert(apis)
|
|
296
371
|
|
|
297
372
|
return r
|
|
298
373
|
}
|
|
@@ -354,8 +429,15 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
354
429
|
//token
|
|
355
430
|
let token = get(req, 'query.token', '')
|
|
356
431
|
|
|
357
|
-
//
|
|
358
|
-
let user = await
|
|
432
|
+
//getTokenUserForSelf
|
|
433
|
+
let user = await getTokenUserForSelf(token)
|
|
434
|
+
|
|
435
|
+
//check
|
|
436
|
+
if (!iseobj(user)) {
|
|
437
|
+
console.log('token', token)
|
|
438
|
+
console.log('[API]getUserByToken/check user: invalid user')
|
|
439
|
+
return Promise.reject(`token does not have permission`)
|
|
440
|
+
}
|
|
359
441
|
|
|
360
442
|
return user
|
|
361
443
|
}
|
|
@@ -378,8 +460,15 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
378
460
|
//token
|
|
379
461
|
let token = get(req, 'query.token', '')
|
|
380
462
|
|
|
381
|
-
//
|
|
382
|
-
await
|
|
463
|
+
//getTokenUserForSelf
|
|
464
|
+
let user = await getTokenUserForSelf(token)
|
|
465
|
+
|
|
466
|
+
//check
|
|
467
|
+
if (!iseobj(user)) {
|
|
468
|
+
console.log('token', token)
|
|
469
|
+
console.log('[API]getAPIsList/check user: invalid user')
|
|
470
|
+
return Promise.reject(`token does not have permission`)
|
|
471
|
+
}
|
|
383
472
|
|
|
384
473
|
//getAPIsList
|
|
385
474
|
let r = await getAPIsList({ isActive: 'y' })
|
|
@@ -406,11 +495,18 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
406
495
|
//token
|
|
407
496
|
let token = get(req, 'query.token', '')
|
|
408
497
|
|
|
409
|
-
//
|
|
410
|
-
await
|
|
498
|
+
//getTokenUserForSelf
|
|
499
|
+
let user = await getTokenUserForSelf(token)
|
|
500
|
+
|
|
501
|
+
//check
|
|
502
|
+
if (!iseobj(user)) {
|
|
503
|
+
console.log('token', token)
|
|
504
|
+
console.log('[API]updateAPIs/check user: invalid user')
|
|
505
|
+
return Promise.reject(`token does not have permission`)
|
|
506
|
+
}
|
|
411
507
|
|
|
412
508
|
//parsePayload
|
|
413
|
-
let inp = parsePayload(req)
|
|
509
|
+
let inp = await parsePayload(req)
|
|
414
510
|
|
|
415
511
|
//updateAPIs
|
|
416
512
|
let r = await updateAPIs(inp)
|
|
@@ -427,9 +523,9 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
427
523
|
},
|
|
428
524
|
{
|
|
429
525
|
method: 'POST',
|
|
430
|
-
path: '/
|
|
526
|
+
path: '/syncAndReplaceApis',
|
|
431
527
|
handler: async function (req, res) {
|
|
432
|
-
// console.log('
|
|
528
|
+
// console.log('syncAndReplaceApis', req)
|
|
433
529
|
// console.log('payload', req.payload)
|
|
434
530
|
|
|
435
531
|
async function core() {
|
|
@@ -437,14 +533,21 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt = {}) {
|
|
|
437
533
|
//token
|
|
438
534
|
let token = get(req, 'query.token', '')
|
|
439
535
|
|
|
440
|
-
//
|
|
441
|
-
await
|
|
536
|
+
//getTokenUserForSelf
|
|
537
|
+
let user = await getTokenUserForSelf(token)
|
|
538
|
+
|
|
539
|
+
//check
|
|
540
|
+
if (!iseobj(user)) {
|
|
541
|
+
console.log('token', token)
|
|
542
|
+
console.log('[API]syncAndReplaceApis/check user: invalid user')
|
|
543
|
+
return Promise.reject(`token does not have permission`)
|
|
544
|
+
}
|
|
442
545
|
|
|
443
546
|
//parsePayload
|
|
444
|
-
let inp = parsePayload(req)
|
|
547
|
+
let inp = await parsePayload(req)
|
|
445
548
|
|
|
446
|
-
//
|
|
447
|
-
let r = await
|
|
549
|
+
//syncAndReplaceApis
|
|
550
|
+
let r = await syncAndReplaceApis(inp)
|
|
448
551
|
|
|
449
552
|
return r
|
|
450
553
|
}
|
package/server/provideApis.mjs
CHANGED
|
@@ -4,8 +4,8 @@ import genPm from 'wsemi/src/genPm.mjs'
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
async function provideApis(url, group, apis) {
|
|
7
|
-
//url: 指API伺服器提供的接入網址, 例如 http://localhost:11005/
|
|
8
|
-
//group: 指API
|
|
7
|
+
//url: 指API伺服器提供的接入網址, 例如 http://localhost:11005/syncAndReplaceApis
|
|
8
|
+
//group: 指API所屬群組
|
|
9
9
|
|
|
10
10
|
//pm
|
|
11
11
|
let pm = genPm()
|
package/src/App.vue
CHANGED
|
@@ -8,21 +8,20 @@
|
|
|
8
8
|
|
|
9
9
|
<template v-if="syncState">
|
|
10
10
|
|
|
11
|
-
<!-- menu left, 使用opacity:0.999讓WDrawer使用浮動模式時不會遮蔽vuetify彈窗, 僅由Layout處設定即可, 其內dom皆受影響 -->
|
|
12
11
|
<WDrawer
|
|
13
|
-
:style="`height:${panelHeight}px; width:100
|
|
12
|
+
:style="`height:${panelHeight}px; width:100%;`"
|
|
14
13
|
v-model="drawer"
|
|
15
14
|
:drawerWidth.sync="drawerWidth"
|
|
16
15
|
:drawerWidthMin="drawerWidthMin"
|
|
17
16
|
:drawerWidthMax="drawerWidthMax"
|
|
18
17
|
:mode="'from-left'"
|
|
19
|
-
:afloat="drawerAfloat"
|
|
20
18
|
:dragDrawerWidth="true"
|
|
19
|
+
:autoSwitch="true"
|
|
20
|
+
:switchWidth="drawerWidth*2.3"
|
|
21
21
|
>
|
|
22
22
|
|
|
23
23
|
<template v-slot:drawer="props">
|
|
24
|
-
|
|
25
|
-
<div :style="`height:${props.height}px; background:${drawerAfloat?'#fff':'transparent'}; position:relative;`">
|
|
24
|
+
<div :style="`height:${props.height}px; background:#fff; position:relative;`">
|
|
26
25
|
|
|
27
26
|
<WTree
|
|
28
27
|
:style="`height:${props.height}px;`"
|
|
@@ -87,7 +86,6 @@
|
|
|
87
86
|
</div>
|
|
88
87
|
|
|
89
88
|
</div>
|
|
90
|
-
|
|
91
89
|
</template>
|
|
92
90
|
|
|
93
91
|
<template v-slot:content="props">
|
|
@@ -327,7 +325,10 @@
|
|
|
327
325
|
|
|
328
326
|
<div style="border:1px solid #ddd; background:#fff">
|
|
329
327
|
|
|
330
|
-
<div
|
|
328
|
+
<div
|
|
329
|
+
style="padding:10px 15px;"
|
|
330
|
+
v-if="optputMenuItemSelectId==='tree'"
|
|
331
|
+
>
|
|
331
332
|
<WJsonView
|
|
332
333
|
style="width:100%;"
|
|
333
334
|
:viewHeightMax="null"
|
|
@@ -335,8 +336,11 @@
|
|
|
335
336
|
></WJsonView>
|
|
336
337
|
</div>
|
|
337
338
|
|
|
338
|
-
<div
|
|
339
|
-
|
|
339
|
+
<div
|
|
340
|
+
style="padding:15px; color:#555; font-size:0.85rem;"
|
|
341
|
+
v-if="optputMenuItemSelectId==='raw'
|
|
342
|
+
">
|
|
343
|
+
<pre style="margin:0px; padding:0px;">{{getOutputJson(apiSelect)}}</pre>
|
|
340
344
|
</div>
|
|
341
345
|
|
|
342
346
|
</div>
|
|
@@ -430,11 +434,9 @@ export default {
|
|
|
430
434
|
return {
|
|
431
435
|
|
|
432
436
|
panelWidth: 0,
|
|
433
|
-
panelWidthTemp: 0,
|
|
434
437
|
panelHeight: 0,
|
|
435
438
|
|
|
436
439
|
drawer: true,
|
|
437
|
-
drawerAfloat: false,
|
|
438
440
|
drawerWidth: 320,
|
|
439
441
|
drawerWidthMin: 200,
|
|
440
442
|
drawerWidthMax: 700,
|
|
@@ -512,30 +514,6 @@ export default {
|
|
|
512
514
|
vo.panelHeight = msg.snew.clientHeight
|
|
513
515
|
// console.log('vo.panelHeight', vo.panelHeight)
|
|
514
516
|
|
|
515
|
-
//modeResize
|
|
516
|
-
let modeResize = '' //寬度可能相同故得有預設空字串的種類
|
|
517
|
-
if (vo.panelWidth > vo.panelWidthTemp) {
|
|
518
|
-
modeResize = 'toLarge'
|
|
519
|
-
}
|
|
520
|
-
else if (vo.panelWidth < vo.panelWidthTemp) {
|
|
521
|
-
modeResize = 'toSmall'
|
|
522
|
-
}
|
|
523
|
-
// console.log('modeResize', modeResize, vo.panelWidth, vo.panelWidthTemp)
|
|
524
|
-
|
|
525
|
-
//drawer
|
|
526
|
-
if (vo.drawer && modeResize === 'toSmall' && vo.panelWidth < 1.7 * vo.drawerWidthMax) { //已開啟抽屜且為變窄時才偵測
|
|
527
|
-
vo.drawer = false
|
|
528
|
-
}
|
|
529
|
-
else if (!vo.drawer && modeResize === 'toLarge' && vo.panelWidth >= 1.7 * vo.drawerWidthMax) { //已隱藏抽屜且為變寬時才偵測
|
|
530
|
-
vo.drawer = true
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
//drawerAfloat
|
|
534
|
-
vo.drawerAfloat = vo.panelWidth < 1.7 * vo.drawerWidthMax
|
|
535
|
-
|
|
536
|
-
//save
|
|
537
|
-
vo.panelWidthTemp = vo.panelWidth
|
|
538
|
-
|
|
539
517
|
},
|
|
540
518
|
|
|
541
519
|
genTree: function () {
|
|
@@ -574,6 +552,8 @@ export default {
|
|
|
574
552
|
let tree = convertToTree(tr, { bindRoot: '全部' })
|
|
575
553
|
// console.log('tree', cloneDeep(tree))
|
|
576
554
|
|
|
555
|
+
//filepathToTree
|
|
556
|
+
|
|
577
557
|
//apiSelect, 預先選定api項目, 非tree選單active物件, 因id由convertToTree轉換提供, 故不能直接算得active選單物件id
|
|
578
558
|
let apiSelect = get(apis, 0, null)
|
|
579
559
|
// console.log('apiSelect', cloneDeep(apiSelect))
|
package/src/main.js
CHANGED
|
@@ -11,7 +11,6 @@ import domResize from 'w-component-vue/src/js/domResize.mjs'
|
|
|
11
11
|
import domDragDrop from 'w-component-vue/src/js/domDragDrop.mjs'
|
|
12
12
|
import App from './App.vue'
|
|
13
13
|
import store from './store/index.mjs'
|
|
14
|
-
import mVuetify from './plugins/mVuetify.mjs'
|
|
15
14
|
import ui from './plugins/mUI.mjs'
|
|
16
15
|
import mDataSelectorSchema from './plugins/mDataSelectorSchema.mjs'
|
|
17
16
|
import mDataSupport from './plugins/mDataSupport.mjs'
|
|
@@ -96,7 +95,6 @@ WServHapiClient({
|
|
|
96
95
|
|
|
97
96
|
//new
|
|
98
97
|
new Vue({
|
|
99
|
-
vuetify: mVuetify,
|
|
100
98
|
store,
|
|
101
99
|
render: h => h(App)
|
|
102
100
|
}).$mount('#app')
|
package/srv.mjs
CHANGED
|
@@ -15,7 +15,7 @@ let opt = {
|
|
|
15
15
|
bExcludeWhenNotAdmin: false,
|
|
16
16
|
|
|
17
17
|
serverPort: 11005,
|
|
18
|
-
subfolder: '', //
|
|
18
|
+
subfolder: '', //mapi
|
|
19
19
|
|
|
20
20
|
webName: {
|
|
21
21
|
'eng': 'API Service',
|
|
@@ -30,24 +30,33 @@ let opt = {
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
let getUserByToken = (token) => {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
// return {} //測試無法登入
|
|
34
|
+
if (token === '{token-for-application}') { //提供外部應用系統作為存取使用者
|
|
35
|
+
return {
|
|
36
|
+
id: 'id-for-application',
|
|
37
|
+
name: 'application',
|
|
38
|
+
email: 'admin@example.com',
|
|
39
|
+
isAdmin: 'y',
|
|
40
|
+
}
|
|
37
41
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
42
|
+
if (token === 'sys') { //開發階段w-ui-loginout自動給予browser使用者(且位於localhost)的token為sys
|
|
43
|
+
return {
|
|
44
|
+
id: 'id-for-admin',
|
|
45
|
+
name: '測試者',
|
|
46
|
+
email: 'admin@example.com',
|
|
47
|
+
isAdmin: 'y',
|
|
48
|
+
}
|
|
43
49
|
}
|
|
50
|
+
console.log('invalid token', token)
|
|
51
|
+
console.log('於生產環境時得加入SSO等驗證token機制')
|
|
52
|
+
return {}
|
|
44
53
|
}
|
|
45
54
|
|
|
46
55
|
let verifyUser = (user) => {
|
|
47
|
-
|
|
56
|
+
console.log('於生產環境時得加入驗證user機制')
|
|
57
|
+
return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
48
58
|
}
|
|
49
59
|
|
|
50
|
-
|
|
51
60
|
//WWebApi
|
|
52
61
|
let instWWebApi = WWebApi(WOrm, url, db, getUserByToken, verifyUser, opt)
|
|
53
62
|
|
package/tableTags-web-api.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"apis":"
|
|
1
|
+
{"apis":"fY7kYV"}
|
package/vue.config.js
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.md[data-v-6700278b] table{border-collapse:collapse;margin:0;padding:0;word-break:normal}.md[data-v-6700278b] tr{margin:0;padding:0}.md[data-v-6700278b] table tr th{font-weight:700;background:#eee;border:1px solid #ddd;border-bottom:0;margin:0;padding:6px 13px}.md[data-v-6700278b] table tr td{border:1px solid #ddd;margin:0;padding:6px 13px}.md[data-v-6700278b] h1{font-size:1.2rem;line-height:1.2rem}.md[data-v-6700278b] h1,.md[data-v-6700278b] h2{font-weight:700;margin-top:.5rem;margin-bottom:.5rem}.md[data-v-6700278b] h2{font-size:1.1rem;line-height:1.1rem}.md[data-v-6700278b] h3,.md[data-v-6700278b] h4,.md[data-v-6700278b] h5,.md[data-v-6700278b] h6{font-weight:700;font-size:1rem;line-height:1rem;margin-top:.5rem;margin-bottom:.5rem}.bk[data-v-8c31201e]{display:inline-block;width:200px;padding:0 10px 10px 0;vertical-align:top}.bk-title[data-v-8c31201e]{padding:3px;font-size:.8rem;color:#888}.bk-item[data-v-8c31201e]{padding:3px 5px;font-size:.9rem;line-height:.9rem;border-radius:5px;border:1px solid #ddd;background:#fff}body,html{font-family:微軟正黑體,Microsoft JhengHei,MicrosoftJhengHeiRegular,Avenir,Helvetica,Arial,sans-serif;overflow-y:hidden}.v-application,.v-application--wrap,a,button,div,input,p,pre,span,textarea{font-family:inherit}.v-chip{cursor:inherit}.fade-enter-active{-webkit-animation:go 1s;animation:go 1s}.fade-leave-active{-webkit-animation:back 1s;animation:back 1s}@-webkit-keyframes go{0%{opacity:0}to{opacity:1}}@keyframes go{0%{opacity:0}to{opacity:1}}@-webkit-keyframes back{0%{opacity:1}to{opacity:0}}@keyframes back{0%{opacity:1}to{opacity:0}}
|