w-web-api 1.0.38 → 1.0.40
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 +4 -4
- package/db/wapis/apis/data.mdb +0 -0
- package/db/wapis/apis/lock.mdb +0 -0
- package/dist/css/{app.99a58617.css → app.02bbf3c6.css} +1 -1
- package/dist/index.tmp +2 -2
- package/dist/js/app-legacy.d2226e7d.js +2 -0
- package/dist/js/app-legacy.d2226e7d.js.map +1 -0
- package/dist/js/app.d2226e7d.js +2 -0
- package/dist/js/app.d2226e7d.js.map +1 -0
- package/dist/js/{chunk-vendors.767ef893.js → chunk-vendors-legacy.10dbc55a.js} +3 -3
- package/dist/js/chunk-vendors-legacy.10dbc55a.js.map +1 -0
- package/dist/js/{chunk-vendors-legacy.767ef893.js → chunk-vendors.10dbc55a.js} +3 -3
- package/dist/js/chunk-vendors.10dbc55a.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 +6 -6
- package/docs/WWebApi.mjs.html +120 -34
- package/docs/index.html +1 -1
- package/g.getSettings.mjs +6 -4
- package/g.mOrm.mjs +2 -2
- package/package.json +7 -7
- package/public/index.html +1 -1
- package/script.txt +0 -1
- package/server/WWebApi.mjs +119 -33
- package/src/App.vue +25 -4
- package/src/components/Layout.vue +56 -26
- package/src/components/LayoutContent.vue +51 -37
- package/src/components/LayoutState.vue +20 -8
- package/src/main.js +17 -20
- package/src/plugins/mLang.mjs +250 -0
- package/src/plugins/mUI.mjs +140 -51
- package/src/schema/tables/apis.mjs +6 -8
- package/src/store/mutations.mjs +8 -102
- package/src/store/types.mjs +1 -1
- package/srv.mjs +6 -6
- package/tableTags.json +1 -1
- package/dist/js/app-legacy.f7e293ef.js +0 -2
- package/dist/js/app-legacy.f7e293ef.js.map +0 -1
- package/dist/js/app.f7e293ef.js +0 -2
- package/dist/js/app.f7e293ef.js.map +0 -1
- package/dist/js/chunk-vendors-legacy.767ef893.js.map +0 -1
- package/dist/js/chunk-vendors.767ef893.js.map +0 -1
- package/src/plugins/mDataSupport.mjs +0 -66
package/server/WWebApi.mjs
CHANGED
|
@@ -8,6 +8,7 @@ import iseobj from 'wsemi/src/iseobj.mjs'
|
|
|
8
8
|
import isestr from 'wsemi/src/isestr.mjs'
|
|
9
9
|
import isearr from 'wsemi/src/isearr.mjs'
|
|
10
10
|
import ispint from 'wsemi/src/ispint.mjs'
|
|
11
|
+
import isErr from 'wsemi/src/isErr.mjs'
|
|
11
12
|
import isfun from 'wsemi/src/isfun.mjs'
|
|
12
13
|
import ispm from 'wsemi/src/ispm.mjs'
|
|
13
14
|
import cint from 'wsemi/src/cint.mjs'
|
|
@@ -30,10 +31,10 @@ import ds from '../src/schema/index.mjs'
|
|
|
30
31
|
*
|
|
31
32
|
* @class
|
|
32
33
|
* @param {Function} WOrm 輸入資料庫ORM函數
|
|
33
|
-
* @param {String} url 輸入資料庫連線字串,例如'mongodb://
|
|
34
|
+
* @param {String} url 輸入資料庫連線字串,例如w-orm-lmdb為'./db',或w-orm-mongodb為'mongodb://username:password@$127.0.0.1:27017'
|
|
34
35
|
* @param {String} db 輸入資料庫名稱字串
|
|
35
36
|
* @param {Function} getUserByToken 輸入處理函數,函數會傳入使用者token,通過此函數處理後並回傳使用者資訊物件,並至少須提供'id'、'email'、'name'、'isAdmin'欄位,且'isAdmin'限輸入'y'或'n',且輸入'y'時會複寫權限系統該使用者之'isAdmin'欄位值
|
|
36
|
-
* @param {Function}
|
|
37
|
+
* @param {Function} verifyClientUser 輸入驗證瀏覽使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
|
|
37
38
|
* @param {Function} verifyAppUser 輸入驗證應用程序使用者身份之處理函數,函數會傳入使用者資訊物件,通過此函數識別後回傳布林值,允許使用者回傳true,反之回傳false
|
|
38
39
|
* @param {Object} [opt={}] 輸入設定物件,預設{}
|
|
39
40
|
* @param {Integer} [opt.serverPort=11005] 輸入伺服器通訊port,預設11005
|
|
@@ -48,7 +49,7 @@ import ds from '../src/schema/index.mjs'
|
|
|
48
49
|
* @returns {Object} 回傳物件,其內server為hapi伺服器實體,wsrv為w-converhp的伺服器事件物件,wsds為w-serv-webdata的伺服器事件物件,可監聽error事件
|
|
49
50
|
* @example
|
|
50
51
|
*
|
|
51
|
-
* import WOrm from 'w-orm-
|
|
52
|
+
* import WOrm from 'w-orm-lmdb/src/WOrmLmdb.mjs'
|
|
52
53
|
* import WWebApi from './server/WWebApi.mjs'
|
|
53
54
|
* import getSettings from './g.getSettings.mjs'
|
|
54
55
|
*
|
|
@@ -56,7 +57,7 @@ import ds from '../src/schema/index.mjs'
|
|
|
56
57
|
* //st
|
|
57
58
|
* let st = getSettings()
|
|
58
59
|
*
|
|
59
|
-
* let url =
|
|
60
|
+
* let url = st.dbUrl
|
|
60
61
|
* let db = st.dbName
|
|
61
62
|
* let opt = {
|
|
62
63
|
*
|
|
@@ -103,14 +104,14 @@ import ds from '../src/schema/index.mjs'
|
|
|
103
104
|
* return {}
|
|
104
105
|
* }
|
|
105
106
|
*
|
|
106
|
-
* let
|
|
107
|
-
* console.log('
|
|
107
|
+
* let verifyClientUser = (user, from) => {
|
|
108
|
+
* console.log('verifyClientUser/user', user)
|
|
108
109
|
* // return false //測試無法登入
|
|
109
110
|
* console.log('於生產環境時得加入限制瀏覽器使用者身份機制')
|
|
110
111
|
* return user.isAdmin === 'y' //測試僅系統管理者使用
|
|
111
112
|
* }
|
|
112
113
|
*
|
|
113
|
-
* let verifyAppUser = (user,
|
|
114
|
+
* let verifyAppUser = (user, from) => {
|
|
114
115
|
* console.log('verifyAppUser/user', user)
|
|
115
116
|
* // return false //測試無法登入
|
|
116
117
|
* console.log('於生產環境時得加入限制應用程式使用者身份機制')
|
|
@@ -118,14 +119,14 @@ import ds from '../src/schema/index.mjs'
|
|
|
118
119
|
* }
|
|
119
120
|
*
|
|
120
121
|
* //WWebApi
|
|
121
|
-
* let instWWebApi = WWebApi(WOrm, url, db, getUserByToken,
|
|
122
|
+
* let instWWebApi = WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser, opt)
|
|
122
123
|
*
|
|
123
124
|
* instWWebApi.on('error', (err) => {
|
|
124
125
|
* console.log(err)
|
|
125
126
|
* })
|
|
126
127
|
*
|
|
127
128
|
*/
|
|
128
|
-
function WWebApi(WOrm, url, db, getUserByToken,
|
|
129
|
+
function WWebApi(WOrm, url, db, getUserByToken, verifyClientUser, verifyAppUser, opt = {}) {
|
|
129
130
|
let instWServHapiServer = null
|
|
130
131
|
|
|
131
132
|
|
|
@@ -157,10 +158,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
|
|
|
157
158
|
}
|
|
158
159
|
|
|
159
160
|
|
|
160
|
-
//check
|
|
161
|
-
if (!isfun(
|
|
162
|
-
console.log('invalid
|
|
163
|
-
throw new Error('invalid
|
|
161
|
+
//check verifyClientUser
|
|
162
|
+
if (!isfun(verifyClientUser)) {
|
|
163
|
+
console.log('invalid verifyClientUser', verifyClientUser)
|
|
164
|
+
throw new Error('invalid verifyClientUser')
|
|
164
165
|
}
|
|
165
166
|
|
|
166
167
|
|
|
@@ -245,6 +246,37 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
|
|
|
245
246
|
}
|
|
246
247
|
|
|
247
248
|
|
|
249
|
+
//checkUser
|
|
250
|
+
let checkUser = async(user) => {
|
|
251
|
+
let id = get(user, 'id', '')
|
|
252
|
+
if (!isestr(id)) {
|
|
253
|
+
console.log('user', user)
|
|
254
|
+
console.log('can not get the userId')
|
|
255
|
+
return Promise.reject(`can not get the userId`)
|
|
256
|
+
}
|
|
257
|
+
let email = get(user, 'email', '')
|
|
258
|
+
if (!isestr(email)) {
|
|
259
|
+
console.log('user', user)
|
|
260
|
+
console.log('can not get the email of user')
|
|
261
|
+
return Promise.reject(`can not get the email of user`)
|
|
262
|
+
}
|
|
263
|
+
let name = get(user, 'name', '')
|
|
264
|
+
if (!isestr(name)) {
|
|
265
|
+
console.log('user', user)
|
|
266
|
+
console.log('can not get userName')
|
|
267
|
+
return Promise.reject(`can not get userName`)
|
|
268
|
+
}
|
|
269
|
+
let isAdmin = get(user, 'isAdmin', '')
|
|
270
|
+
if (isAdmin !== 'y' && isAdmin !== 'n') {
|
|
271
|
+
console.log('user', user)
|
|
272
|
+
console.log('user.isAdmin is not y or n', user.isAdmin)
|
|
273
|
+
console.log('can not get the role of user')
|
|
274
|
+
return Promise.reject(`can not get the role of user`)
|
|
275
|
+
}
|
|
276
|
+
return true
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
|
|
248
280
|
//getTokenUser
|
|
249
281
|
let getTokenUser = async (token) => {
|
|
250
282
|
|
|
@@ -255,24 +287,43 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
|
|
|
255
287
|
}
|
|
256
288
|
|
|
257
289
|
//check
|
|
258
|
-
if (
|
|
259
|
-
|
|
260
|
-
console.log(`
|
|
261
|
-
|
|
290
|
+
if (true) {
|
|
291
|
+
// if (!iseobj(userSelf)) {
|
|
292
|
+
// console.log(`token`, token)
|
|
293
|
+
// console.log(`can not find the user from token`)
|
|
294
|
+
// return Promise.reject(`can not find the user from token`)
|
|
295
|
+
// }
|
|
296
|
+
await checkUser(userSelf)
|
|
262
297
|
}
|
|
263
298
|
|
|
264
299
|
return userSelf
|
|
265
300
|
}
|
|
266
301
|
|
|
267
302
|
|
|
303
|
+
//p
|
|
304
|
+
let p = {
|
|
305
|
+
checkToken: async(token) => {
|
|
306
|
+
|
|
307
|
+
//getUserByToken
|
|
308
|
+
let u = await getUserByToken(token)
|
|
309
|
+
// console.log('u', u)
|
|
310
|
+
|
|
311
|
+
//checkUser
|
|
312
|
+
await checkUser(u)
|
|
313
|
+
|
|
314
|
+
return true
|
|
315
|
+
},
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
|
|
268
319
|
//getAndVerifyBrowserTokenUser
|
|
269
|
-
let getAndVerifyBrowserTokenUser = async (token,
|
|
320
|
+
let getAndVerifyBrowserTokenUser = async (token, from = '') => {
|
|
270
321
|
|
|
271
322
|
//getTokenUser
|
|
272
323
|
let userSelf = await getTokenUser(token)
|
|
273
324
|
|
|
274
|
-
//
|
|
275
|
-
let b =
|
|
325
|
+
//verifyClientUser
|
|
326
|
+
let b = verifyClientUser(userSelf, from)
|
|
276
327
|
if (ispm(b)) {
|
|
277
328
|
b = await b
|
|
278
329
|
}
|
|
@@ -289,13 +340,13 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
|
|
|
289
340
|
|
|
290
341
|
|
|
291
342
|
//getAndVerifyAppTokenUser
|
|
292
|
-
let getAndVerifyAppTokenUser = async (token,
|
|
343
|
+
let getAndVerifyAppTokenUser = async (token, from = '') => {
|
|
293
344
|
|
|
294
345
|
//getTokenUser
|
|
295
346
|
let userSelf = await getTokenUser(token)
|
|
296
347
|
|
|
297
348
|
//verifyAppUser
|
|
298
|
-
let b = verifyAppUser(userSelf,
|
|
349
|
+
let b = verifyAppUser(userSelf, from)
|
|
299
350
|
if (ispm(b)) {
|
|
300
351
|
b = await b
|
|
301
352
|
}
|
|
@@ -486,13 +537,7 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
|
|
|
486
537
|
// return 'someAPI'
|
|
487
538
|
// },
|
|
488
539
|
// },
|
|
489
|
-
|
|
490
|
-
method: 'GET',
|
|
491
|
-
path: '/getWebInfor',
|
|
492
|
-
handler: async function (req, res) {
|
|
493
|
-
return getWebInfor()
|
|
494
|
-
},
|
|
495
|
-
},
|
|
540
|
+
|
|
496
541
|
{
|
|
497
542
|
method: 'GET',
|
|
498
543
|
path: '/api/getUserByToken', //未登入界面需先檢測token是否為系統管理員, 確認後回傳為系統管理員資訊物件, getUserByToken為w-ui-loginout預設值, 若要更改兩邊須同時修改
|
|
@@ -520,6 +565,9 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
|
|
|
520
565
|
|
|
521
566
|
//pm2resolve core
|
|
522
567
|
let r = await pm2resolve(core)() //w-ui-loginout接收已預設格式用pm2resolve轉過, 會提取state進行判斷
|
|
568
|
+
if (isErr(r.msg)) {
|
|
569
|
+
r.msg = r.msg.message
|
|
570
|
+
}
|
|
523
571
|
// console.log('getUserByToken', r)
|
|
524
572
|
|
|
525
573
|
return r
|
|
@@ -555,7 +603,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
|
|
|
555
603
|
|
|
556
604
|
//pm2resolve core
|
|
557
605
|
let r = await pm2resolve(core)()
|
|
558
|
-
|
|
606
|
+
if (isErr(r.msg)) {
|
|
607
|
+
r.msg = r.msg.message
|
|
608
|
+
}
|
|
609
|
+
// console.log('getAPIsList', r)
|
|
559
610
|
|
|
560
611
|
return r
|
|
561
612
|
},
|
|
@@ -594,7 +645,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
|
|
|
594
645
|
|
|
595
646
|
//pm2resolve core
|
|
596
647
|
let r = await pm2resolve(core)()
|
|
597
|
-
|
|
648
|
+
if (isErr(r.msg)) {
|
|
649
|
+
r.msg = r.msg.message
|
|
650
|
+
}
|
|
651
|
+
// console.log('updateAPIs', r)
|
|
598
652
|
|
|
599
653
|
return r
|
|
600
654
|
},
|
|
@@ -633,7 +687,10 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
|
|
|
633
687
|
|
|
634
688
|
//pm2resolve core
|
|
635
689
|
let r = await pm2resolve(core)()
|
|
636
|
-
|
|
690
|
+
if (isErr(r.msg)) {
|
|
691
|
+
r.msg = r.msg.message
|
|
692
|
+
}
|
|
693
|
+
// console.log('syncAndReplaceApis', r)
|
|
637
694
|
|
|
638
695
|
return r
|
|
639
696
|
},
|
|
@@ -653,7 +710,30 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
|
|
|
653
710
|
instWServHapiServer = new WServHapiServer({
|
|
654
711
|
port: opt.serverPort,
|
|
655
712
|
pathStaticFiles,
|
|
713
|
+
apiName: 'api',
|
|
656
714
|
apis,
|
|
715
|
+
tokenType: 'Bearer',
|
|
716
|
+
verifyConn: async ({ apiType, authorization, query, headers, req }) => {
|
|
717
|
+
// console.log('verifyConn', `apiType[${apiType}]`, `authorization[${authorization}]`)
|
|
718
|
+
|
|
719
|
+
//token
|
|
720
|
+
let token = strdelleft(authorization, 7) //刪除Bearer
|
|
721
|
+
// console.log('token', token)
|
|
722
|
+
|
|
723
|
+
//check
|
|
724
|
+
if (!isestr(token)) {
|
|
725
|
+
console.log('apiType', apiType)
|
|
726
|
+
console.log('authorization', authorization)
|
|
727
|
+
console.log('invalid token')
|
|
728
|
+
return false
|
|
729
|
+
}
|
|
730
|
+
|
|
731
|
+
//checkToken
|
|
732
|
+
let b = await p.checkToken(token)
|
|
733
|
+
// console.log('b', b)
|
|
734
|
+
|
|
735
|
+
return b
|
|
736
|
+
},
|
|
657
737
|
getUserIdByToken: async (token) => { //可使用async或sync函數
|
|
658
738
|
// console.log('getUserIdByToken', token)
|
|
659
739
|
return ''
|
|
@@ -673,11 +753,17 @@ function WWebApi(WOrm, url, db, getUserByToken, verifyBrowserUser, verifyAppUser
|
|
|
673
753
|
methodsExec: ['select', 'insert', 'save', 'del'], //mix需於procOrm內註冊以提供
|
|
674
754
|
tableNamesSync,
|
|
675
755
|
kpFunExt: { //接收參數第1個為userId, 之後才是前端給予參數
|
|
756
|
+
|
|
676
757
|
getWebInfor,
|
|
758
|
+
|
|
677
759
|
getAPIsList: (userId, query = {}) => {
|
|
678
760
|
return getAPIsList(query)
|
|
679
761
|
},
|
|
680
|
-
|
|
762
|
+
|
|
763
|
+
// updateApis: (userId, rows) => {
|
|
764
|
+
// return updateApis(rows)
|
|
765
|
+
// },
|
|
766
|
+
|
|
681
767
|
},
|
|
682
768
|
fnTableTags: 'tableTags-web-api.json',
|
|
683
769
|
})
|
package/src/App.vue
CHANGED
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
<Layout v-if="ready"></Layout>
|
|
11
11
|
</transition>
|
|
12
12
|
|
|
13
|
+
<!--
|
|
14
|
+
<LoadingWinBar></LoadingWinBar>
|
|
15
|
+
<CheckYesNo></CheckYesNo>
|
|
16
|
+
<CheckYes></CheckYes> -->
|
|
17
|
+
|
|
13
18
|
</div>
|
|
14
19
|
</template>
|
|
15
20
|
|
|
@@ -17,6 +22,7 @@
|
|
|
17
22
|
import get from 'lodash-es/get.js'
|
|
18
23
|
import cloneDeep from 'lodash-es/cloneDeep.js'
|
|
19
24
|
import isestr from 'wsemi/src/isestr.mjs'
|
|
25
|
+
import iseobj from 'wsemi/src/iseobj.mjs'
|
|
20
26
|
import isDev from 'wsemi/src/isDev.mjs'
|
|
21
27
|
import wui from 'w-ui-loginout/src/WUiLoginout.mjs'
|
|
22
28
|
import Layout from './components/Layout.vue'
|
|
@@ -41,16 +47,21 @@ export default {
|
|
|
41
47
|
//setVo, 更換ui內vo, 才能使用廣播技術, 更換語系才能用廣播通知全部組件forceUpdate
|
|
42
48
|
vo.$ui.setVo(vo)
|
|
43
49
|
|
|
50
|
+
//setLang
|
|
51
|
+
let lang = get(window, '___pmwperm___.language', '')
|
|
52
|
+
vo.$ui.setLang(lang, 'app init') //初始化先讀取html內語系設定進行變更
|
|
53
|
+
// console.log('lang', lang)
|
|
54
|
+
|
|
44
55
|
function loginSuccess(data) {
|
|
45
56
|
console.log('login success', cloneDeep(data.user))
|
|
46
|
-
vo.$ui.updateConnState('
|
|
57
|
+
vo.$ui.updateConnState('csLogin')
|
|
47
58
|
vo.$ui.updateUserToken(data.token)
|
|
48
59
|
vo.$ui.updateUserSelf(data.user)
|
|
49
60
|
}
|
|
50
61
|
|
|
51
62
|
function loginError(data) {
|
|
52
63
|
console.log('login error', cloneDeep(data))
|
|
53
|
-
vo.$ui.updateConnState(
|
|
64
|
+
vo.$ui.updateConnState('csErrLogin')
|
|
54
65
|
vo.$ui.updateUserToken('')
|
|
55
66
|
let urlRedirect = get(window, '___pmwapi___.urlRedirect', '')
|
|
56
67
|
if (!isestr(urlRedirect)) {
|
|
@@ -86,8 +97,18 @@ export default {
|
|
|
86
97
|
computed: {
|
|
87
98
|
|
|
88
99
|
ready: function() {
|
|
89
|
-
|
|
90
|
-
|
|
100
|
+
//console.log('computed ready')
|
|
101
|
+
|
|
102
|
+
let vo = this
|
|
103
|
+
|
|
104
|
+
let connState = get(vo, `$store.state.connState`)
|
|
105
|
+
let webInfor = get(vo, `$store.state.webInfor`)
|
|
106
|
+
|
|
107
|
+
let b1 = connState === 'csLogin'
|
|
108
|
+
let b2 = iseobj(webInfor)
|
|
109
|
+
let b = b1 && b2
|
|
110
|
+
|
|
111
|
+
return b
|
|
91
112
|
},
|
|
92
113
|
|
|
93
114
|
},
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
<div style="display:flex; align-items:center;">
|
|
17
17
|
|
|
18
18
|
<div style="padding-right:10px; display:flex; align-items:center;" v-if="webLogo">
|
|
19
|
-
<img style="width:36px; height:36px;" :src="webLogo" />
|
|
19
|
+
<img style="width:36px; _min-width:36px; height:36px;" :src="webLogo" />
|
|
20
20
|
</div>
|
|
21
21
|
|
|
22
22
|
<div>
|
|
@@ -29,13 +29,23 @@
|
|
|
29
29
|
|
|
30
30
|
<div style="width:100%;"></div>
|
|
31
31
|
|
|
32
|
-
<div
|
|
32
|
+
<div
|
|
33
|
+
style="padding-right:10px; white-space:nowrap;"
|
|
34
|
+
v-if="showLangSelect"
|
|
35
|
+
>
|
|
33
36
|
<WTextSelect
|
|
34
37
|
style="width:100px;"
|
|
35
|
-
:items="
|
|
36
|
-
|
|
37
|
-
@input="
|
|
38
|
-
|
|
38
|
+
:items="keysLang"
|
|
39
|
+
:value="lang"
|
|
40
|
+
@input="toggleLang"
|
|
41
|
+
>
|
|
42
|
+
<template v-slot:select="props">
|
|
43
|
+
{{getLangText(props.item)}}
|
|
44
|
+
</template>
|
|
45
|
+
<template v-slot:item="props">
|
|
46
|
+
{{getLangText(props.item)}}
|
|
47
|
+
</template>
|
|
48
|
+
</WTextSelect>
|
|
39
49
|
</div>
|
|
40
50
|
|
|
41
51
|
</div>
|
|
@@ -70,30 +80,37 @@ export default {
|
|
|
70
80
|
|
|
71
81
|
drawer: false, //null,
|
|
72
82
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
text: 'English',
|
|
81
|
-
},
|
|
83
|
+
firstSetting: true,
|
|
84
|
+
|
|
85
|
+
showLangSelect: false,
|
|
86
|
+
|
|
87
|
+
keysLang: [
|
|
88
|
+
'eng',
|
|
89
|
+
'cht',
|
|
82
90
|
],
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
91
|
+
kpLangSelect: {
|
|
92
|
+
'eng': 'English',
|
|
93
|
+
'cht': '中文',
|
|
86
94
|
},
|
|
87
95
|
|
|
88
96
|
}
|
|
89
97
|
},
|
|
90
|
-
|
|
91
|
-
// console.log('
|
|
98
|
+
mounted: function() {
|
|
99
|
+
// console.log('mounted')
|
|
92
100
|
|
|
93
101
|
let vo = this
|
|
94
102
|
|
|
95
|
-
//
|
|
96
|
-
|
|
103
|
+
//firstSetting
|
|
104
|
+
if (vo.firstSetting) {
|
|
105
|
+
// console.log('webInfor', vo.webInfor)
|
|
106
|
+
let showLanguage = get(vo, 'webInfor.showLanguage', '')
|
|
107
|
+
// console.log('showLanguage', showLanguage)
|
|
108
|
+
vo.showLangSelect = showLanguage === 'y'
|
|
109
|
+
let language = get(vo, 'webInfor.language', '')
|
|
110
|
+
// console.log('language', language)
|
|
111
|
+
vo.$ui.setLang(language, 'layout mounted')
|
|
112
|
+
vo.firstSetting = false
|
|
113
|
+
}
|
|
97
114
|
|
|
98
115
|
},
|
|
99
116
|
computed: {
|
|
@@ -138,11 +155,24 @@ export default {
|
|
|
138
155
|
},
|
|
139
156
|
methods: {
|
|
140
157
|
|
|
141
|
-
|
|
142
|
-
// console.log('methods
|
|
158
|
+
getLangText: function(lang) {
|
|
159
|
+
// console.log('methods getLangText', lang)
|
|
160
|
+
|
|
161
|
+
let vo = this
|
|
162
|
+
|
|
163
|
+
let t = get(vo, `kpLangSelect.${lang}`, '')
|
|
164
|
+
|
|
165
|
+
return t
|
|
166
|
+
},
|
|
167
|
+
|
|
168
|
+
toggleLang: function(lang) {
|
|
169
|
+
// console.log('methods toggleLang', lang)
|
|
170
|
+
|
|
143
171
|
let vo = this
|
|
144
|
-
|
|
145
|
-
|
|
172
|
+
|
|
173
|
+
//setLang
|
|
174
|
+
vo.$ui.setLang(lang, 'toggle')
|
|
175
|
+
|
|
146
176
|
},
|
|
147
177
|
|
|
148
178
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div
|
|
3
3
|
style="height:100%; width:100%;"
|
|
4
|
-
:changeApis="changeApis"
|
|
5
4
|
v-domresize
|
|
6
5
|
@domresize="resize"
|
|
6
|
+
:changeApis="changeApis"
|
|
7
7
|
>
|
|
8
8
|
|
|
9
9
|
<template v-if="syncState">
|
|
@@ -25,47 +25,55 @@
|
|
|
25
25
|
<template v-slot:drawer="props">
|
|
26
26
|
<div :style="`height:${props.height}px; background:#fff; position:relative;`">
|
|
27
27
|
|
|
28
|
-
<
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
28
|
+
<template v-if="apisTree.length>0">
|
|
29
|
+
<WTree
|
|
30
|
+
:style="`height:${props.height}px;`"
|
|
31
|
+
:viewHeightMax="props.height"
|
|
32
|
+
:data="apisTree"
|
|
33
|
+
:iconHeight="lineHeightTree"
|
|
34
|
+
:defItemHeight="lineHeightTree"
|
|
35
|
+
:activable="true"
|
|
36
|
+
:itemActive="apiActive"
|
|
37
|
+
:funActive="funActive"
|
|
38
|
+
:itemTextColorActive="'#000'"
|
|
39
|
+
:itemBackgroundColorActive ="'rgba(100,100,100,0.15)'"
|
|
40
|
+
>
|
|
41
|
+
<template v-slot:item="props">
|
|
41
42
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
43
|
+
<div
|
|
44
|
+
:style="`display:flex; align-items:center; min-height:${lineHeightTree}px;`"
|
|
45
|
+
v-if="props.data.type!=='node'"
|
|
46
|
+
>
|
|
47
|
+
{{props.data.key}}
|
|
48
|
+
</div>
|
|
48
49
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
<div
|
|
51
|
+
:style="`display:flex; align-items:center; min-height:${lineHeightTree}px; cursor:pointer;`"
|
|
52
|
+
@click="ckItem(getItemByKey(props.data.text))"
|
|
53
|
+
v-else
|
|
54
|
+
>
|
|
54
55
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
<div style="padding-right:5px;">
|
|
57
|
+
<div :style="`padding:0px 6px; font-size:0.7rem; border-radius:10px; border:1px solid #ddd; color:#fff; background:${getMethodColorByKey(props.data.text)};`">
|
|
58
|
+
{{getMethodByKey(props.data.text)}}
|
|
59
|
+
</div>
|
|
58
60
|
</div>
|
|
59
|
-
</div>
|
|
60
61
|
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
62
|
+
<div>
|
|
63
|
+
{{$ui.gv(getItemByKey(props.data.text),'name')}}
|
|
64
|
+
</div>
|
|
64
65
|
|
|
65
|
-
|
|
66
|
+
</div>
|
|
66
67
|
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
</template>
|
|
69
|
+
</WTree>
|
|
70
|
+
</template>
|
|
71
|
+
<div
|
|
72
|
+
style="padding:20px; font-size:0.9rem;"
|
|
73
|
+
v-else
|
|
74
|
+
>
|
|
75
|
+
{{$t('waitingData')}}
|
|
76
|
+
</div>
|
|
69
77
|
|
|
70
78
|
<div
|
|
71
79
|
:style="`position:absolute; top:1px; right:12px;`"
|
|
@@ -405,6 +413,7 @@
|
|
|
405
413
|
import get from 'lodash-es/get.js'
|
|
406
414
|
import set from 'lodash-es/set.js'
|
|
407
415
|
import each from 'lodash-es/each.js'
|
|
416
|
+
import size from 'lodash-es/size.js'
|
|
408
417
|
import trim from 'lodash-es/trim.js'
|
|
409
418
|
import find from 'lodash-es/find.js'
|
|
410
419
|
import cloneDeep from 'lodash-es/cloneDeep.js'
|
|
@@ -522,9 +531,16 @@ export default {
|
|
|
522
531
|
let vo = this
|
|
523
532
|
|
|
524
533
|
//default
|
|
534
|
+
vo.apiActive = null
|
|
535
|
+
vo.apiSelect = null
|
|
525
536
|
vo.apisTree = []
|
|
526
537
|
vo.kpApisTree = {}
|
|
527
538
|
|
|
539
|
+
//check
|
|
540
|
+
if (size(vo.apis) === 0) {
|
|
541
|
+
return
|
|
542
|
+
}
|
|
543
|
+
|
|
528
544
|
//cloneDeep
|
|
529
545
|
let apis = cloneDeep(vo.apis)
|
|
530
546
|
// console.log('apis', cloneDeep(apis))
|
|
@@ -554,8 +570,6 @@ export default {
|
|
|
554
570
|
let tree = convertToTree(tr, { bindRoot: '全部' })
|
|
555
571
|
// console.log('tree', cloneDeep(tree))
|
|
556
572
|
|
|
557
|
-
//filepathToTree
|
|
558
|
-
|
|
559
573
|
//apiSelect, 預先選定api項目, 非tree選單active物件, 因id由convertToTree轉換提供, 故不能直接算得active選單物件id
|
|
560
574
|
let apiSelect = get(apis, 0, null)
|
|
561
575
|
// console.log('apiSelect', cloneDeep(apiSelect))
|