w-web-api 1.0.51 → 1.0.53

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 (86) hide show
  1. package/_gh-pages-deploy/.nojekyll +0 -0
  2. package/_gh-pages-deploy/WWebApi.html +898 -0
  3. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.eot +0 -0
  4. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.ttf +0 -0
  5. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.woff +0 -0
  6. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Bold.woff2 +0 -0
  7. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.eot +0 -0
  8. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.ttf +0 -0
  9. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.woff +0 -0
  10. package/_gh-pages-deploy/fonts/Montserrat/Montserrat-Regular.woff2 +0 -0
  11. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.eot +0 -0
  12. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.svg +978 -0
  13. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.ttf +0 -0
  14. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff +0 -0
  15. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-light-webfont.woff2 +0 -0
  16. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.eot +0 -0
  17. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.svg +1049 -0
  18. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.ttf +0 -0
  19. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff +0 -0
  20. package/_gh-pages-deploy/fonts/Source-Sans-Pro/sourcesanspro-regular-webfont.woff2 +0 -0
  21. package/_gh-pages-deploy/index.html +84 -0
  22. package/_gh-pages-deploy/scripts/collapse.js +39 -0
  23. package/_gh-pages-deploy/scripts/commonNav.js +28 -0
  24. package/_gh-pages-deploy/scripts/linenumber.js +25 -0
  25. package/_gh-pages-deploy/scripts/nav.js +12 -0
  26. package/_gh-pages-deploy/scripts/polyfill.js +4 -0
  27. package/_gh-pages-deploy/scripts/prettify/Apache-License-2.0.txt +202 -0
  28. package/_gh-pages-deploy/scripts/prettify/lang-css.js +2 -0
  29. package/_gh-pages-deploy/scripts/prettify/prettify.js +28 -0
  30. package/_gh-pages-deploy/scripts/search.js +99 -0
  31. package/{docs/WWebApi.mjs.html → _gh-pages-deploy/server_WWebApi.mjs.html} +118 -41
  32. package/_gh-pages-deploy/src_components_Common_CheckYesNo.vue.html +187 -0
  33. package/_gh-pages-deploy/styles/jsdoc.css +776 -0
  34. package/_gh-pages-deploy/styles/prettify.css +80 -0
  35. package/dist/css/app.fe69497a.css +1 -0
  36. package/dist/index.tmp +4 -2
  37. package/dist/js/app-legacy.15819aa7.js +1 -0
  38. package/dist/js/app.15819aa7.js +1 -0
  39. package/dist/js/chunk-vendors-legacy.c1a32dd1.js +15 -0
  40. package/dist/js/chunk-vendors.c1a32dd1.js +15 -0
  41. package/dist/w-web-api.umd.js +2 -2
  42. package/dist/w-web-api.umd.js.map +1 -1
  43. package/docs/WWebApi.html +2 -2
  44. package/docs/index.html +1 -1
  45. package/docs/server_WWebApi.mjs.html +1012 -0
  46. package/docs/src_components_Common_CheckYesNo.vue.html +187 -0
  47. package/g.getSettings.mjs +3 -0
  48. package/package.json +15 -11
  49. package/public/index.html +9 -2
  50. package/server/WWebApi.mjs +115 -38
  51. package/server/procApis.mjs +62 -0
  52. package/server/procLang.mjs +724 -0
  53. package/server/procProxy.mjs +120 -0
  54. package/server/srLog.mjs +30 -0
  55. package/server/staLogs/staEvent.mjs +129 -0
  56. package/server/staLogs/test_staEvent.mjs +132 -0
  57. package/settings.json +14 -0
  58. package/src/App.vue +11 -7
  59. package/src/assets/scalar-ui.css +113 -0
  60. package/src/components/Common/CheckYes.vue +102 -0
  61. package/src/components/Common/CheckYesNo.vue +115 -0
  62. package/src/components/Common/LoadingWinBar.vue +114 -0
  63. package/src/components/Layout.vue +33 -7
  64. package/src/components/LayoutContent.vue +308 -333
  65. package/src/components/LayoutContentEdit.vue +577 -0
  66. package/src/components/LayoutContentStats.vue +485 -0
  67. package/src/components/LayoutContentTest.vue +799 -0
  68. package/src/components/MdPanel.vue +80 -58
  69. package/src/main.js +8 -0
  70. package/src/plugins/mUI.mjs +58 -71
  71. package/src/schema/tables/apis.mjs +30 -0
  72. package/src/store/mutations.mjs +1 -1
  73. package/srv.mjs +47 -19
  74. package/tableTags.json +1 -1
  75. package/.github/workflows/ci-test.yml +0 -24
  76. package/.vscode/launch.json +0 -18
  77. package/db/wapis/apis/data.mdb +0 -0
  78. package/db/wapis/apis/lock.mdb +0 -0
  79. package/dist/css/app.b5cf2ef5.css +0 -1
  80. package/dist/js/app-legacy.fbfba810.js +0 -1
  81. package/dist/js/app.fbfba810.js +0 -1
  82. package/dist/js/chunk-vendors-legacy.735ec7d6.js +0 -13
  83. package/dist/js/chunk-vendors.735ec7d6.js +0 -13
  84. package/src/plugins/mLang.mjs +0 -250
  85. package/tableTags-web-api.json +0 -1
  86. package/test/all.test.mjs +0 -10
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
 
5
5
  <meta charset="utf-8">
6
- <title>WWebApi.mjs - Documentation</title>
6
+ <title>server/WWebApi.mjs - Documentation</title>
7
7
 
8
8
 
9
9
  <script src="scripts/prettify/prettify.js"></script>
@@ -35,7 +35,7 @@
35
35
 
36
36
  <div id="main">
37
37
 
38
- <h1 class="page-title">WWebApi.mjs</h1>
38
+ <h1 class="page-title">server/WWebApi.mjs</h1>
39
39
 
40
40
 
41
41
 
@@ -72,6 +72,11 @@ import fsIsFile from 'wsemi/src/fsIsFile.mjs'
72
72
  import replace from 'wsemi/src/replace.mjs'
73
73
  import WServHapiServer from 'w-serv-hapi/src/WServHapiServer.mjs'
74
74
  import WServOrm from 'w-serv-orm/src/WServOrm.mjs'
75
+ import procLang from './procLang.mjs'
76
+ import procProxy from './procProxy.mjs'
77
+ import procApis from './procApis.mjs'
78
+ import staEvent from './staLogs/staEvent.mjs'
79
+ import srLogInit from './srLog.mjs'
75
80
  import ds from '../src/schema/index.mjs'
76
81
 
77
82
 
@@ -269,6 +274,20 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
269
274
  let urlRedirect = get(opt, 'urlRedirect', '')
270
275
 
271
276
 
277
+ //params
278
+ let showLanguage = get(opt, 'showLanguage', 'y')
279
+ let language = get(opt, 'language', 'eng')
280
+ let logFd = get(opt, 'logFd', './_logs') //srLog 寫入 + staEvent 統計共用之 log 資料夾
281
+
282
+
283
+ //kpLangExt
284
+ let kpLangExt = get(opt, 'kpLangExt', {})
285
+
286
+
287
+ //kpLang
288
+ let kpLang = procLang({ kpLangExt, webName, webDescription })
289
+
290
+
272
291
  //WServOrm
273
292
  let optWServOrm = {
274
293
  useCheckUser,
@@ -285,12 +304,47 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
285
304
  let { woItems, procOrm } = wp
286
305
 
287
306
 
307
+ //srLog(後端 log;錯誤一律 log err-key 供識別,對齊 w-web-sso)
308
+ let srLog = srLogInit(opt)
309
+
310
+ //kpFunExt 邊界統一處理:成功記 info(供 staEvent 統計呼叫頻率);catch 後端錯誤 → srLog 該 err-key →
311
+ //原樣 re-reject(前端依 key 查自己 lang 顯示)。event 統一加 'kpfun-' 前綴 → 專用事件、與 api/verifyConn 區分。
312
+ let wrapErrLog = (event, fn) => {
313
+ let ev = 'kpfun-' + event
314
+ return async (...args) => {
315
+ try {
316
+ let result = await fn(...args)
317
+ srLog.info({ event: ev }) //成功也記 info
318
+ return result
319
+ }
320
+ catch (err) {
321
+ srLog.error({ event: ev, err })
322
+ return Promise.reject(err)
323
+ }
324
+ }
325
+ }
326
+
327
+
328
+ //procProxy
329
+ let { proxyRequest } = procProxy({ srLog })
330
+
331
+
332
+ //procApis
333
+ let { getApisList, saveApi, deleteApi } = procApis({ woItems, procOrm, ds })
334
+
335
+
288
336
  //getWebInfor
289
337
  let getWebInfor = (userId) => {
290
338
  return {
291
- webName,
292
- webDescription,
339
+
340
+ // webName, //已併入kpLang
341
+ // webDescription, //已併入kpLang
293
342
  webLogo,
343
+
344
+ showLanguage,
345
+ language,
346
+ kpLang,
347
+
294
348
  }
295
349
  }
296
350
 
@@ -301,26 +355,26 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
301
355
  if (!isestr(id)) {
302
356
  console.log('user', user)
303
357
  console.log('can not get the userId')
304
- return Promise.reject(`can not get the userId`)
358
+ return Promise.reject('errUserIdMissing')
305
359
  }
306
360
  let email = get(user, 'email', '')
307
361
  if (!isestr(email)) {
308
362
  console.log('user', user)
309
363
  console.log('can not get the email of user')
310
- return Promise.reject(`can not get the email of user`)
364
+ return Promise.reject('errUserEmailMissing')
311
365
  }
312
366
  let name = get(user, 'name', '')
313
367
  if (!isestr(name)) {
314
368
  console.log('user', user)
315
369
  console.log('can not get userName')
316
- return Promise.reject(`can not get userName`)
370
+ return Promise.reject('errUserNameMissing')
317
371
  }
318
372
  let isAdmin = get(user, 'isAdmin', '')
319
373
  if (isAdmin !== 'y' &amp;&amp; isAdmin !== 'n') {
320
374
  console.log('user', user)
321
375
  console.log('user.isAdmin is not y or n', user.isAdmin)
322
376
  console.log('can not get the role of user')
323
- return Promise.reject(`can not get the role of user`)
377
+ return Promise.reject('errUserRoleMissing')
324
378
  }
325
379
  return true
326
380
  }
@@ -340,7 +394,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
340
394
  // if (!iseobj(userSelf)) {
341
395
  // console.log(`token`, token)
342
396
  // console.log(`can not find the user from token`)
343
- // return Promise.reject(`can not find the user from token`)
397
+ // return Promise.reject('errUserNotFound')
344
398
  // }
345
399
  await checkUser(userSelf)
346
400
  }
@@ -382,9 +436,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
382
436
  if (!b) {
383
437
  console.log('user', user)
384
438
  console.log(`user does not have permission`)
385
- return Promise.reject(`user does not have permission`)
439
+ return Promise.reject('errUserNoPermission')
386
440
  }
387
441
 
442
+ srLog.info({ event: 'verifyClientUser', from, userId: get(user, 'id', '') }) //瀏覽使用者驗證通過
388
443
  return user
389
444
  }
390
445
 
@@ -407,7 +462,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
407
462
  if (!iseobj(user)) {
408
463
  console.log(`token`, token)
409
464
  console.log(`can not find the user from token`)
410
- return Promise.reject(`can not find the user from token`)
465
+ return Promise.reject('errUserNotFound')
411
466
  }
412
467
 
413
468
  //verifyAppUser
@@ -420,9 +475,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
420
475
  if (!b) {
421
476
  console.log('user', user)
422
477
  console.log(`user does not have permission`)
423
- return Promise.reject(`user does not have permission`)
478
+ return Promise.reject('errUserNoPermission')
424
479
  }
425
480
 
481
+ srLog.info({ event: 'verifyAppUser', from, userId: get(user, 'id', '') }) //應用程式使用者驗證通過
426
482
  return user
427
483
  }
428
484
 
@@ -449,7 +505,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
449
505
  if (!iseobj(payload)) {
450
506
  console.log('payload', payload)
451
507
  console.log(`invalid payload in req`)
452
- return Promise.reject(`invalid payload in req`)
508
+ return Promise.reject('errPayloadInvalid')
453
509
  }
454
510
 
455
511
  //group
@@ -459,7 +515,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
459
515
  if (!isestr(group)) {
460
516
  console.log('payload', payload)
461
517
  console.log(`invalid group in payload`)
462
- return Promise.reject(`invalid group in payload`)
518
+ return Promise.reject('errGroupInvalid')
463
519
  }
464
520
 
465
521
  //rows
@@ -469,7 +525,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
469
525
  if (!isearr(rows)) {
470
526
  console.log('payload', payload)
471
527
  console.log(`invalid rows in payload`)
472
- return Promise.reject(`invalid rows in payload`)
528
+ return Promise.reject('errRowsInvalid')
473
529
  }
474
530
 
475
531
  //r
@@ -509,7 +565,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
509
565
  console.log('inp', inp)
510
566
  console.log('group', group)
511
567
  console.log(`invalid group`)
512
- return Promise.reject(`invalid group`)
568
+ return Promise.reject('errGroupInvalid')
513
569
  }
514
570
 
515
571
  //rows
@@ -520,7 +576,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
520
576
  if (!isearr(rows)) {
521
577
  console.log('inp', inp)
522
578
  console.log('keyTable', keyTable)
523
- return Promise.reject(`invalid rows`)
579
+ return Promise.reject('errRowsInvalid')
524
580
  }
525
581
 
526
582
  //save from
@@ -591,6 +647,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
591
647
  c = replace(c, '/mapi/', '{sfd}/') //方法同genEntry
592
648
  c = replace(c, '{sfd}', subfolder)
593
649
  c = replace(c, '{urlRedirect}', urlRedirect)
650
+ c = replace(c, '{language}', language) //注入初始語系 → window.___pmwperm___.language(前端 getLang 之來源之一)
594
651
  fs.writeFileSync(fpEntryOut, c, 'utf8')
595
652
  }
596
653
  catch (err) {
@@ -619,7 +676,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
619
676
  console.log('token', token)
620
677
  console.log('[API]getUserByToken/check token: invalid token')
621
678
  console.log(`token does not have permission`)
622
- return Promise.reject(`token does not have permission`)
679
+ return Promise.reject('errTokenNoPermission')
623
680
  }
624
681
 
625
682
  //getAndVerifyClientUser
@@ -630,9 +687,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
630
687
  console.log('token', token)
631
688
  console.log('[API]getUserByToken/check user: invalid user')
632
689
  console.log(`token does not have permission`)
633
- return Promise.reject(`token does not have permission`)
690
+ return Promise.reject('errTokenNoPermission')
634
691
  }
635
692
 
693
+ srLog.info({ event: 'api/getUserByToken', userId: get(user, 'id', '') })
636
694
  return user
637
695
  }
638
696
 
@@ -664,7 +722,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
664
722
  // console.log('token', token)
665
723
  // console.log('[API]getAPIsList/check token: invalid token')
666
724
  // console.log(`token does not have permission`)
667
- // return Promise.reject(`token does not have permission`)
725
+ // return Promise.reject('errTokenNoPermission')
668
726
  // }
669
727
 
670
728
  // //getAndVerifyClientUser
@@ -675,7 +733,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
675
733
  // console.log('token', token)
676
734
  // console.log('[API]getAPIsList/check user: invalid user')
677
735
  // console.log(`token does not have permission`)
678
- // return Promise.reject(`token does not have permission`)
736
+ // return Promise.reject('errTokenNoPermission')
679
737
  // }
680
738
 
681
739
  // //getAPIsList
@@ -713,7 +771,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
713
771
  // console.log('token', token)
714
772
  // console.log('[API]updateAPIs/check token: invalid token')
715
773
  // console.log(`token does not have permission`)
716
- // return Promise.reject(`token does not have permission`)
774
+ // return Promise.reject('errTokenNoPermission')
717
775
  // }
718
776
 
719
777
  // //getAndVerifyClientUser
@@ -724,7 +782,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
724
782
  // console.log('token', token)
725
783
  // console.log('[API]updateAPIs/check user: invalid user')
726
784
  // console.log(`token does not have permission`)
727
- // return Promise.reject(`token does not have permission`)
785
+ // return Promise.reject('errTokenNoPermission')
728
786
  // }
729
787
 
730
788
  // //parsePayload
@@ -765,7 +823,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
765
823
  console.log('token', token)
766
824
  console.log('[API]syncAndReplaceTabs/check token: invalid token')
767
825
  console.log(`token does not have permission`)
768
- return Promise.reject(`token does not have permission`)
826
+ return Promise.reject('errTokenNoPermission')
769
827
  }
770
828
 
771
829
  //keyTable
@@ -777,14 +835,14 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
777
835
  console.log('keyTable', keyTable)
778
836
  console.log('[API]syncAndReplaceTabs/check keyTable: invalid keyTable')
779
837
  console.log(`token does not have permission`)
780
- return Promise.reject(`token does not have permission`)
838
+ return Promise.reject('errTokenNoPermission')
781
839
  }
782
840
 
783
841
  //check keyTable
784
842
  let allowedTables = ['apis']
785
843
  if (!allowedTables.includes(keyTable)) {
786
844
  console.log('[API]syncAndReplaceTabs/check keyTable: unexpected keyTable', keyTable)
787
- return Promise.reject(`invalid keyTable: ${keyTable}`)
845
+ return Promise.reject('errKeyTableInvalid')
788
846
  }
789
847
 
790
848
  //getAndVerifyAppUser
@@ -795,7 +853,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
795
853
  console.log('token', token)
796
854
  console.log('[API]syncAndReplaceTabs/check user: invalid user')
797
855
  console.log(`token does not have permission`)
798
- return Promise.reject(`token does not have permission`)
856
+ return Promise.reject('errTokenNoPermission')
799
857
  }
800
858
 
801
859
  //userId
@@ -807,7 +865,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
807
865
  console.log('user', user)
808
866
  console.log('[API]syncAndReplaceTabs/check userId: invalid userId')
809
867
  console.log(`token does not have permission`)
810
- return Promise.reject(`token does not have permission`)
868
+ return Promise.reject('errTokenNoPermission')
811
869
  }
812
870
 
813
871
  //parsePayload
@@ -816,6 +874,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
816
874
  //syncAndReplaceTabs
817
875
  let r = await syncAndReplaceTabs(userId, inp, keyTable)
818
876
 
877
+ srLog.info({ event: 'api/syncAndReplaceTabs', userId, keyTable })
819
878
  return r
820
879
  }
821
880
 
@@ -867,19 +926,17 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
867
926
  let b = await p.checkToken(token)
868
927
  // console.log('b', b)
869
928
 
929
+ srLog.info({ event: 'verifyConn', apiType }) //連線驗證通過(checkToken 失敗時會 throw 不到此)
870
930
  return b
871
931
  },
872
932
  getUserIdByToken: async (token) => { //可使用async或sync函數
873
933
  // console.log('getUserIdByToken', token)
874
- return ''
875
- // let user = await getUserByToken(token) //api儲存時須使用
876
- // let userId = get(user, 'id', '')
877
- // if (!isestr(userId)) {
878
- // console.log('token', token)
879
- // console.log('userId', userId)
880
- // return Promise.reject(`can not find user.id`)
881
- // }
882
- // return userId
934
+ if (!isestr(token)) {
935
+ return ''
936
+ }
937
+ let user = await getUserByToken(token)
938
+ let userId = get(user, 'id', '')
939
+ return userId
883
940
  },
884
941
  useDbOrm: true,
885
942
  kpOrm: woItems,
@@ -887,9 +944,29 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser,
887
944
  tableNamesExec,
888
945
  methodsExec: ['select', 'insert', 'save', 'del'], //mix需於procOrm內註冊以提供
889
946
  tableNamesSync,
890
- kpFunExt: { //接收參數第1個為userId, 之後才是前端給予參數
891
-
892
- getWebInfor,
947
+ kpFunExt: { //接收參數第1個為userId, 之後才是前端給予參數(皆經 wrapErrLog:錯誤 srLog err-key 後 re-reject)
948
+
949
+ getWebInfor: wrapErrLog('getWebInfor', getWebInfor),
950
+
951
+ proxyRequest: wrapErrLog('proxyRequest', (userId, reqSpec) => {
952
+ return proxyRequest(reqSpec)
953
+ }),
954
+
955
+ getApisList: wrapErrLog('getApisList', (userId) => {
956
+ return getApisList(userId)
957
+ }),
958
+ saveApi: wrapErrLog('saveApi', (userId, row) => {
959
+ return saveApi(userId, row)
960
+ }),
961
+ deleteApi: wrapErrLog('deleteApi', (userId, id) => {
962
+ return deleteApi(userId, id)
963
+ }),
964
+
965
+ //統計資訊頁:回傳各 event 之時段發生頻率(讀 logFd 之 log)。連線已由 verifyClientUser 限管理員,
966
+ //故此處不另檢查(同 getApisList)。timeLength 天數 / timeInterval 'hr'|'day'。
967
+ getStaEvent: wrapErrLog('getStaEvent', (userId, timeLength = 7, timeInterval = 'hr') => {
968
+ return staEvent(timeLength, timeInterval, { fdLog: logFd })
969
+ }),
893
970
 
894
971
  // getAPIsList: (userId, query = {}) => { //待提供api管理系統界面使用
895
972
  // return getAPIsList(query)
@@ -922,7 +999,7 @@ export default WWebApi
922
999
  <br class="clear">
923
1000
 
924
1001
  <footer>
925
- Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.2</a> on Thu Dec 18 2025 22:26:48 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
1002
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Jun 22 2026 15:42:09 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
926
1003
  </footer>
927
1004
 
928
1005
  <script>prettyPrint();</script>
@@ -0,0 +1,187 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+
5
+ <meta charset="utf-8">
6
+ <title>src/components/Common/CheckYesNo.vue - Documentation</title>
7
+
8
+
9
+ <script src="scripts/prettify/prettify.js"></script>
10
+ <script src="scripts/prettify/lang-css.js"></script>
11
+ <!--[if lt IE 9]>
12
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
13
+ <![endif]-->
14
+ <link type="text/css" rel="stylesheet" href="styles/prettify.css">
15
+ <link type="text/css" rel="stylesheet" href="styles/jsdoc.css">
16
+ <script src="scripts/nav.js" defer></script>
17
+
18
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
19
+ </head>
20
+ <body>
21
+
22
+ <input type="checkbox" id="nav-trigger" class="nav-trigger" />
23
+ <label for="nav-trigger" class="navicon-button x">
24
+ <div class="navicon"></div>
25
+ </label>
26
+
27
+ <label for="nav-trigger" class="overlay"></label>
28
+
29
+ <nav >
30
+
31
+
32
+ <h2><a href="index.html">Home</a></h2><h3>Classes</h3><ul><li><a href="WWebApi.html">WWebApi</a></li></ul>
33
+
34
+ </nav>
35
+
36
+ <div id="main">
37
+
38
+ <h1 class="page-title">src/components/Common/CheckYesNo.vue</h1>
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ <section>
47
+ <article>
48
+ <pre class="prettyprint source linenums"><code>&lt;template>
49
+ &lt;WConfirm
50
+ :show.sync="bShow"
51
+ :title="$t('systemMessage')"
52
+ :content="content"
53
+ :_contentColor="'white'"
54
+ :_contentIconColor="'white'"
55
+ :_contentBackgroundColor="'orange lighten-5'"
56
+ :_titleColor="'white'"
57
+ :headerBackgroundColor="'grey lighten-3'"
58
+ :noBtnText="$t('no')"
59
+ :yesBtnText="$t('yes')"
60
+ @click-no="clickBtn(false)"
61
+ @click-yes="clickBtn(true)"
62
+ >&lt;/WConfirm>
63
+ &lt;/template>
64
+
65
+ &lt;script>
66
+ import Vue from 'vue'
67
+ import genPm from 'wsemi/src/genPm.mjs'
68
+ import WConfirm from 'w-component-vue/src/components/WConfirm.vue'
69
+
70
+ export default {
71
+ components: {
72
+ WConfirm,
73
+ },
74
+ props: {
75
+ },
76
+ data: function() {
77
+ return {
78
+
79
+ bShow: false,
80
+ pm: null,
81
+
82
+ content: '',
83
+
84
+ }
85
+ },
86
+ mounted: function() {
87
+ //console.log('mounted')
88
+
89
+ let vo = this
90
+
91
+ //set
92
+ Vue.prototype.$dg.showCheckYesNo = vo.show
93
+
94
+ },
95
+ computed: {
96
+ },
97
+ methods: {
98
+
99
+ /**
100
+ * 顯示 Yes/No 確認對話框並回傳 Promise。
101
+ *
102
+ * **Contract** (caller 須遵守):
103
+ * - 使用者點 **Yes** → Promise `resolve()` (無值, 進 `.then()`)
104
+ * - 使用者點 **No** → Promise `reject('close')` (進 `.catch(err => err === 'close')`)
105
+ *
106
+ * 正確 caller pattern:
107
+ *
108
+ * vo.$dg.showCheckYesNo('確定要 X?')
109
+ * .then(() => {
110
+ * //使用者點 Yes
111
+ * doX()
112
+ * })
113
+ * .catch((err) => {
114
+ * //使用者點 No (err === 'close') 為正常路徑, 靜默處理
115
+ * if (err === 'close') return
116
+ * //非預期錯誤 (CheckYesNo 本身故障等)
117
+ * console.log('showCheckYesNo unexpected error', err)
118
+ * })
119
+ *
120
+ * @param {string} content - 顯示在 modal 中的訊息文字
121
+ * @returns {Promise&lt;void>} Yes → resolve(); No → reject('close')
122
+ */
123
+ show: function(content) {
124
+ //console.log('methods show', content)
125
+
126
+ let vo = this
127
+
128
+ //pm
129
+ vo.pm = genPm()
130
+
131
+ //save
132
+ vo.content = content
133
+
134
+ //show
135
+ vo.bShow = true
136
+
137
+ return vo.pm
138
+ },
139
+
140
+ clickBtn: function(mode) {
141
+ //console.log('methods clickBtn', mode)
142
+
143
+ let vo = this
144
+
145
+ if (mode) {
146
+ vo.pm.resolve()
147
+ }
148
+ else {
149
+ vo.pm.reject('close')
150
+ }
151
+
152
+ //hide
153
+ vo.bShow = false
154
+
155
+ },
156
+
157
+ }
158
+ }
159
+ &lt;/script>
160
+
161
+ &lt;style scoped>
162
+ &lt;/style>
163
+ </code></pre>
164
+ </article>
165
+ </section>
166
+
167
+
168
+
169
+
170
+
171
+
172
+ </div>
173
+
174
+ <br class="clear">
175
+
176
+ <footer>
177
+ Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Jun 22 2026 15:42:09 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
178
+ </footer>
179
+
180
+ <script>prettyPrint();</script>
181
+ <script src="scripts/polyfill.js"></script>
182
+ <script src="scripts/linenumber.js"></script>
183
+
184
+
185
+
186
+ </body>
187
+ </html>