fstarter 2.10.50 → 2.10.51

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 (79) hide show
  1. package/.babelrc +6 -6
  2. package/.editorconfig +9 -9
  3. package/index.html +22 -22
  4. package/index.js +222 -222
  5. package/package.json +1 -1
  6. package/src/App.vue +38 -38
  7. package/src/i18n/en-US.js +35 -35
  8. package/src/i18n/zh-CN.js +35 -35
  9. package/src/main.js +95 -87
  10. package/src/plugins/assets/ak.js +948 -948
  11. package/src/plugins/assets/callNative.js +490 -490
  12. package/src/plugins/assets/compressImg.js +75 -75
  13. package/src/plugins/assets/config.js +106 -106
  14. package/src/plugins/assets/fileServer.js +469 -469
  15. package/src/plugins/assets/http.js +343 -343
  16. package/src/plugins/assets/ua.js +27 -27
  17. package/src/plugins/components/BSButton.vue +61 -61
  18. package/src/plugins/components/BSCascader.vue +465 -465
  19. package/src/plugins/components/BSCell.vue +48 -48
  20. package/src/plugins/components/BSDatePicker.vue +167 -167
  21. package/src/plugins/components/BSImage.vue +42 -42
  22. package/src/plugins/components/BSInput.vue +140 -140
  23. package/src/plugins/components/BSList.vue +81 -81
  24. package/src/plugins/components/BSPicCode.vue +96 -96
  25. package/src/plugins/components/BSPopup.vue +43 -43
  26. package/src/plugins/components/BSRadio.vue +97 -97
  27. package/src/plugins/components/BSSearch.vue +109 -109
  28. package/src/plugins/components/BSSelect.vue +144 -144
  29. package/src/plugins/components/BSSign.vue +454 -454
  30. package/src/plugins/components/BSStepper.vue +115 -115
  31. package/src/plugins/components/BSUpload.vue +92 -92
  32. package/src/plugins/components/BSUpload2.vue +398 -398
  33. package/src/plugins/components/BSVerCode.vue +128 -128
  34. package/src/plugins/components/BSViewer.vue +92 -92
  35. package/src/plugins/components/base.js +496 -496
  36. package/src/plugins/components/base2.js +489 -489
  37. package/src/plugins/lib/weixin.js +20 -20
  38. package/src/plugins/platform/index.js +7 -7
  39. package/src/plugins/platform/isp_phone.js +310 -310
  40. package/src/plugins/route/index.js +140 -140
  41. package/src/plugins/selector/index.js +342 -342
  42. package/src/plugins/service/index.js +81 -81
  43. package/src/plugins/services/callCamera.js +53 -53
  44. package/src/plugins/services/exit.js +36 -36
  45. package/src/plugins/services/face.js +69 -69
  46. package/src/plugins/services/faceH5.js +49 -0
  47. package/src/plugins/services/faceInApp.js +31 -31
  48. package/src/plugins/services/faceTx.js +61 -61
  49. package/src/plugins/services/getFaceResult.js +104 -104
  50. package/src/plugins/services/getH5FaceResult.js +62 -0
  51. package/src/plugins/services/getMenus.js +40 -40
  52. package/src/plugins/services/getSystemData.js +128 -128
  53. package/src/plugins/services/getToken.js +79 -79
  54. package/src/plugins/services/getTxFaceResult.js +83 -83
  55. package/src/plugins/services/getUserInfo.js +47 -47
  56. package/src/plugins/services/goSetPage.js +40 -40
  57. package/src/plugins/services/hideFhoneTitle.js +36 -36
  58. package/src/plugins/services/index.js +45 -41
  59. package/src/plugins/services/init.js +35 -35
  60. package/src/plugins/services/jumpView.js +40 -40
  61. package/src/plugins/services/logout.js +43 -43
  62. package/src/plugins/services/share.js +113 -113
  63. package/src/plugins/services/statusBarHeight.js +39 -39
  64. package/src/plugins/session/index.js +32 -32
  65. package/src/services/getAuthInfo.js +22 -22
  66. package/src/services/index.js +9 -9
  67. package/src/services/sendVerCode.js +23 -23
  68. package/src/views/auth.vue +367 -367
  69. package/src/views/auth2.vue +90 -90
  70. package/src/views/auth3.vue +157 -157
  71. package/src/views/auth4.vue +8979 -8979
  72. package/src/views/auth5.vue +50 -50
  73. package/src/views/authh5.vue +369 -0
  74. package/src/views/components/BankSelect.vue +55 -55
  75. package/src/views/foot.vue +140 -140
  76. package/src/views/page.vue +222 -222
  77. package/src/views/shellFunc.vue +41 -41
  78. package/themes/basic.css +1 -1
  79. package/webpack.config.js +144 -144
@@ -1,490 +1,490 @@
1
- import { ua } from './ua'
2
- import ak from './ak.js'
3
-
4
- import Vue from 'vue'
5
- export const SHELL = {
6
- GET_PHONE_INFO: {
7
- functionName: 'getSystemData',
8
- dataObject: {
9
- jsFunction: 'SHELL_CB.phoneInfo',
10
- jsData: {}
11
- }
12
- },
13
- TOAST: {
14
- functionName: 'toast',
15
- dataObject: {
16
- content: '',
17
- delay: 10
18
- }
19
- },
20
- SHARE: {
21
- functionName: 'share',
22
- dataObject: {
23
- shareChannel: []
24
- }
25
- },
26
- LIVE: {
27
- 'functionName': 'getOCRimg',
28
- 'dataObject': {
29
- 'jsFunction': 'SHELL_CB.live',
30
- 'jsData': {},
31
- 'expired': '-1',
32
- 'maxSizeKB': '0'
33
- }
34
- },
35
- GET_IDCARD_PIC: {
36
- 'functionName': 'getIDauth',
37
- 'dataObject': {
38
- 'jsFunction': 'SHELL_CB.getIDPic',
39
- 'count': 1,
40
- 'sizeType': 0,
41
- 'expired': '-1',
42
- 'actions': '',
43
- 'jsData': {},
44
- 'sourceType': ['相机', '相册'],
45
- 'maxSizeKB': '0'
46
- }
47
- },
48
- CALL_CAMERA: {
49
- 'functionName': 'verifyIdentity',
50
- 'dataObject': {
51
- 'jsFunction': 'SHELL_CB.getPic',
52
- 'count': 1,
53
- 'sizeType': 0,
54
- 'actions': '',
55
- 'jsData': {},
56
- 'sourceType': ['相机', '相册'],
57
- 'expired': '-1',
58
- 'maxSizeKB': '0',
59
- 'cancelCrop': true
60
- }
61
- },
62
- CALL_CAMERA_OTHER: {
63
- 'functionName': 'verifyIdentity',
64
- 'dataObject': {
65
- 'jsFunction': 'SHELL_CB.getPic',
66
- 'count': 9,
67
- 'sizeType': 0,
68
- 'actions': '',
69
- 'cropType': 1,
70
- 'jsData': {},
71
- 'sourceType': ['相机', '相册'],
72
- 'expired': '-1',
73
- 'maxSizeKB': '0',
74
- 'cancelCrop': true
75
- }
76
- },
77
- QRCODE: {
78
- 'functionName': 'get2Dinfo',
79
- 'dataObject': {
80
- 'jsFunction': 'SHELL_CB.getQrcode',
81
- 'jsData': {}
82
- }
83
- },
84
- GET_TOKEN: {
85
- 'functionName': 'getToken',
86
- 'dataObject': {
87
- 'jsFunction': 'SHELL_CB.getToken',
88
- 'isNull': 'true',
89
- 'jsData': {}
90
- }
91
- },
92
- JUMP_TO_LOGIN: {
93
- 'functionName': 'jumpValue',
94
- 'dataObject': {
95
- 'naviInit': {
96
- 'dataObject': {
97
- 'setFunction': {
98
- 'jsData': { 'callBackKey': 'login' },
99
- 'jsFunction': 'SHELL_CB.toLogin' }
100
- }
101
- },
102
- 'pageCode': 'CUSTOMER_LOGIN',
103
- 'url': '',
104
- 'businessData': {}
105
- }
106
- },
107
- JUMP_VIEW: {
108
- 'functionName': 'jumpValue',
109
- 'dataObject': {
110
- 'url': '',
111
- 'pageCode': 'COMMON_PRIMARY_PAGE'
112
- }
113
- },
114
- POPVIEW: {
115
- 'functionName': 'popView',
116
- 'dataObject': {}
117
- },
118
- HIDE_FHONE_TITLE: {
119
- 'functionName': 'naviInit',
120
- 'dataObject': {
121
- 'setVisible': { 'visibility': false }
122
- }
123
- },
124
- CALL_PHONE: {
125
- 'functionName': 'call',
126
- 'dataObject': {
127
- 'phone': ''
128
- }
129
- },
130
- SEND_MESSAGE: {
131
- 'functionName': 'sendSms',
132
- 'dataObject': {
133
- 'phone': '',
134
- 'content': ''
135
- }
136
- },
137
- GET_MAIL_LIST: {
138
- 'functionName': 'getContact',
139
- 'dataObject': {
140
- 'jsFunction': 'SHELL_CB.getContract'
141
- }
142
- },
143
- // 查看PDF 老版本
144
- GET_PDF_READ: {
145
- 'functionName': 'pdfRead',
146
- 'dataObject': {
147
- 'pdfName': '',
148
- // 'pdfBaseUrl': `${FilePathPkg.fileBasePath}`,
149
- 'pdfBaseUrl': '',
150
- 'pdfUrl': '',
151
- 'time': '10',
152
- 'pdfCanShare': '', // 是否显示分享按钮,1是显示,空或者其他不显示
153
- 'shareTitle': 'test.pdf', // 自定义文件名 (需要添加.pdf后缀) 不传或者为空壳默认文件名为”文件.pdf”
154
- 'jsFunction': 'SHELL_CB.pdfRead'
155
- }
156
- },
157
- // 查看PDF 新版本
158
- GET_PDF_READ_FIT: {
159
- 'functionName': 'pdfReadFit',
160
- 'dataObject': {
161
- 'pdfName': '',
162
- // 'pdfBaseUrl': `${FilePathPkg.fileBasePath}`,
163
- 'pdfBaseUrl': '',
164
- 'pdfUrl': '',
165
- 'time': '0', // 倒计时时间 传0不显示倒计时
166
- 'pdfCanShare': '', // 是否显示分享按钮,1是显示,空或者其他不显示
167
- 'shareTitle': 'test.pdf', // 自定义文件名 (需要添加.pdf后缀) 不传或者为空壳默认文件名为”文件.pdf”
168
- 'jsFunction': 'SHELL_CB.pdfRead'
169
- }
170
- },
171
- // 设置头部title
172
- SET_TITLE: {
173
- 'functionName': 'naviInit',
174
- 'dataObject': {
175
- 'setTitle': {'title': ''}
176
- }
177
- }
178
- }
179
-
180
- // 分享渠道
181
- export const SHARE_CHANNEL = {
182
- WEIXIN_FRIEND: 'wx_friend',
183
- WEIXIN_SPACE: 'wx_space',
184
- QQ_FRIEND: 'qq_friend',
185
- QQ_SPACE: 'qq_space',
186
- WB: 'wb',
187
- MESSAGE: 'message',
188
- COPYURL: 'copy_url'
189
- }
190
- // 分享类型
191
- export const SHARE_TYPE = {
192
- TEXT: '1',
193
- IMAGE: '2',
194
- SCREEN_IMAGE: '3',
195
- TEXT_IMAGE: '4',
196
- SCREEN_TEXT_IMAGE: '5',
197
- TEXT_IMAGE_LINK: '6',
198
- SCREEN_TEXT_IMAGE_LINK: '7'
199
- }
200
-
201
- // 入参所需字段
202
- export const PARAM_FIELD = {
203
- TEXT: 'text',
204
- TITLE: 'title',
205
- IMAGE: 'image',
206
- DESCRIPTION: 'description',
207
- URL: 'url',
208
- BTNTITLE: 'btnTitle',
209
- SHARE_TYPE: 'share_type'
210
- }
211
-
212
-
213
-
214
-
215
- /**
216
- * 外部调用API
217
- */
218
-
219
- // 获取手机信息
220
- export function getPhoneInfo(vnode) {
221
- callShell(SHELL.GET_PHONE_INFO, null, null, vnode)
222
- }
223
- // 获取token
224
- export function getToken(vnode) {
225
- callShell(SHELL.GET_TOKEN, null, null, vnode)
226
- }
227
- // 跳转登陆页面
228
- export function jumpToLogin(cbparam) {
229
- callShell(SHELL.JUMP_TO_LOGIN, null, cbparam)
230
- }
231
- // 页面后退
232
- export function popView() {
233
- callShell(SHELL.POPVIEW, null)
234
- }
235
- // 分享页面
236
- export function share(params) {
237
- const btns = [{ channel: SHARE_CHANNEL.WEIXIN_SPACE, type: SHARE_TYPE.TEXT_IMAGE_LINK, param: { [PARAM_FIELD.BTNTITLE]: '微信朋友圈', [PARAM_FIELD.TEXT]: params.text, [PARAM_FIELD.TITLE]: params.title, [PARAM_FIELD.IMAGE]: params.imgurl, [PARAM_FIELD.DESCRIPTION]: '11111111111', [PARAM_FIELD.URL]: params.url }},
238
- { channel: SHARE_CHANNEL.COPYURL, param: { [PARAM_FIELD.TEXT]: params.text, [PARAM_FIELD.BTNTITLE]: '复制链接' }}
239
- ]
240
- btns.push({ channel: SHARE_CHANNEL.WEIXIN_FRIEND, type: SHARE_TYPE.TEXT_IMAGE_LINK, param: { [PARAM_FIELD.BTNTITLE]: '微信好友', [PARAM_FIELD.TEXT]: params.text, [PARAM_FIELD.TITLE]: params.title, [PARAM_FIELD.IMAGE]: params.imgurl, [PARAM_FIELD.DESCRIPTION]: params.description, [PARAM_FIELD.URL]: params.url }})
241
- //
242
- getShareBtns(btns)
243
- // shareSingleBtn(btnm)
244
- }
245
- // 唤出多个分享按钮
246
- export function getShareBtns(shareSetting) {
247
- if (Array.isArray(shareSetting)) {
248
- const ret = []
249
- shareSetting.map(({ channel, type, param }) => {
250
- const btn = shareSingleBtn(channel, type, param)
251
- if (typeof btn === 'string') {
252
- alert(btn)
253
- } else {
254
- ret.push(btn)
255
- }
256
- })
257
- const fnModel = SHELL.SHARE
258
- if (fnModel) {
259
- const fnParamModel = JSON.parse(JSON.stringify(fnModel))
260
- fnParamModel.dataObject.shareChannel = ret
261
- const requestJson = JSON.stringify(fnParamModel)
262
- if (ua.iPad || ua.iPhone) {
263
- if (window.navigator.userAgent.indexOf('app_ios_wk') != -1) {
264
- window.webkit.messageHandlers.JSonString.postMessage(requestJson)
265
- } else {
266
- JSonString(requestJson)
267
- }
268
- } else {
269
- window.jsObj.jsCallAndroid(requestJson)
270
- }
271
- }
272
- } else {
273
- alert('传入多分享按钮的数据应为数组,请核实')
274
- }
275
- }
276
- // 提示信息
277
- export function toast(content, delay = 10) {
278
- callShell(SHELL.TOAST, { content, delay })
279
- }
280
- // 隐藏原生标题
281
- export function hidePhoneTitle() {
282
- callShell(SHELL.HIDE_FHONE_TITLE)
283
- }
284
- // 人脸识别
285
- export function live(param, vnode) {
286
- callShell(SHELL.LIVE, param, null, vnode)
287
- }
288
-
289
- // 扫描身份证信息
290
- export function getIDCard(param, vnode) {
291
- callShell(SHELL.GET_IDCARD_PIC, param, null, vnode)
292
- }
293
- // 扫描二维码
294
- export function getQrcode() {
295
- callShell(SHELL.QRCODE)
296
- }
297
- // 获取图片信息
298
- export function getPicture(param, vnode) {
299
- callShell(SHELL.CALL_CAMERA, param, null, vnode)
300
- }
301
- // 呼叫
302
- export function callphone(phoneNo) {
303
- callShell(SHELL.CALL_PHONE, { phone: phoneNo })
304
- }
305
- // 短信
306
- export function sendMessage(phone, content) {
307
- callShell(SHELL.SEND_MESSAGE, { phone, content })
308
- }
309
- // 通讯录
310
- export function seeMailList() {
311
- callShell(SHELL.GET_MAIL_LIST)
312
- }
313
- // 设置页面头部
314
- export function setTitle(params) {
315
- callShell(SHELL.SET_TITLE, params)
316
- }
317
-
318
- // 单个分享按钮
319
- function shareSingleBtn(channel, type, param) {
320
- const des = _getDescription(channel)
321
- const btnName = des && des[0]
322
- // const btnImage = des && des[1]
323
- return Object.assign({}, { type: channel, shareType: type, btnTitle: btnName }, param)
324
- }
325
-
326
- // 分享渠道说明
327
- function _getDescription(channel) {
328
- switch (channel) {
329
- case SHARE_CHANNEL.WEIXIN_FRIEND: return ['微信好友', '../weibo_logo.png']
330
- case SHARE_CHANNEL.WEIXIN_SPACE: return ['朋友圈', '../weibo_logo.png']
331
- case SHARE_CHANNEL.QQ_FRIEND: return ['QQ好友', '../weibo_logo.png']
332
- case SHARE_CHANNEL.QQ_SPACE: return ['QQ空间', '../weibo_logo.png']
333
- case SHARE_CHANNEL.WB: return ['微博', '../weibo_logo.png']
334
- case SHARE_CHANNEL.MESSAGE: return ['短信', '../weibo_logo.png']
335
- case SHARE_CHANNEL.COPYURL: return ['复制链接', '../weibo_logo.png']
336
- }
337
- }
338
- export const EBType = {}
339
- EBType.PhoneInfo = 'getPhoneInfo'
340
- EBType.Login = 'login'
341
- EBType.PdfInfo = 'getpdfInfo'
342
- EBType.IDCard = 'getIDcard'
343
- EBType.getPIC = 'getPic'
344
- EBType.getQRCode = 'getQrcode'
345
- EBType.Live = 'live'
346
- EBType.getContract = 'getContract'
347
- EBType.getToken = 'getToken'
348
- EBType.statusBarHeight = 'statusBarHeight'
349
-
350
- /**
351
- * 事件类型对照
352
- */
353
- export const EventTypeMapping = {
354
- [EBType.PdfInfo]: '查看pdf',
355
- [EBType.IDCard]: '身份证OCR',
356
- [EBType.getPIC]: '获取图像',
357
- [EBType.getQRCode]: '获取二维码',
358
- [EBType.Live]: '活体识别',
359
- [EBType.getToken]: '获取TOKEN',
360
- [EBType.getContract]: '调用通讯录'
361
- }
362
-
363
- /**
364
- * 壳返回回调
365
- */
366
- export const SHELL_CB = {
367
- phoneInfo: function(data) {
368
- handleBackData(data, EBType.PhoneInfo, (retData) => {
369
- window.phoneInfoRequired = false
370
- return retData
371
- })
372
- },
373
-
374
- getToken: function(data) {
375
- handleBackData(data, EBType.getToken, (retData) => {
376
- if (ak.utils.isEmpty(retData.token)) {
377
- jumpToLogin()
378
- } else {
379
- !!retData.token && ak.utils.setSessionStorage('jtl', retData.token)
380
- // Vue.$root.eventHub.$emit('userInfo', retData)
381
- window.tokenRequired = false
382
- return retData
383
- }
384
- })
385
- },
386
- toLogin: function(data) {
387
- handleBackData(data, EBType.Login, (retData) => {
388
- ak.utils.removeSessionStorage('jtl')
389
- if (!retData.token) {
390
- // 如果是取消登录,并没有拿到token,则需要一直停留在登录页。但是现在为了演示过掉,先注释调下面一行。正常应该是放开的
391
- jumpToLogin()
392
- } else {
393
- if (!retData.team) {
394
- getToken()
395
- } else {
396
- // Vue.$root.eventHub.$emit('userInfo', retData)
397
- window.tokenRequired = false
398
- }
399
- }
400
- })
401
- },
402
- live: function(data) {
403
- handleBackData(data, EBType.Live, (retData) => {
404
- const fileName = retData.fileId + '.' + retData.ext // 文件名 + 扩展名
405
- const actions = retData.actions ? JSON.parse(retData.actions) : null
406
- return { fileName, actions }
407
- })
408
- },
409
- getIDPic: function(data) {
410
- handleBackData(data, EBType.IDCard, (retData) => {
411
- const fileName = retData.fileId + '.' + retData.ext // 文件名 + 扩展名
412
- const actions = retData.actions ? JSON.parse(retData.actions) : null
413
- return { fileName, actions }
414
- })
415
- },
416
- getQrcode: function(data) {
417
- handleBackData(data, EBType.getQRCode, (retData) => {
418
- const qrCode = retData.CodeString
419
- return { qrCode }
420
- })
421
- },
422
- getPic: function(data) {
423
- handleBackData(data, EBType.getPIC, (retData) => {
424
- const fileName = retData.fileId + '.' + retData.ext // 文件名 + 扩展名
425
- const actions = retData.actions ? JSON.parse(retData.actions) : null
426
- return { fileName, actions }
427
- })
428
- },
429
- pdfRead: function(data) {
430
- handleBackData(data, EBType.PdfInfo, (retData) => {
431
- return { flag: retData.readFinish === '1' }
432
- })
433
- },
434
- getContract: function(data) {
435
- handleBackData(data, EBType.getContract, (retData) => {
436
- return { name: retData.name, phone: retData.phone }
437
- })
438
- }
439
- }
440
-
441
- // 处理调壳返回的结果
442
- export function handleBackData(src, eventType, reformateData) {
443
- const info = eventType ? (EventTypeMapping[eventType] || eventType || '') : ''
444
- if (src && ( src.nativeData || src.height)) {
445
- const data = src.nativeData || src.height
446
- console.log((`壳${info}类型调用成功!返回原始数据:` + JSON.stringify(data)))
447
- const ret = reformateData(data)
448
- if (ret && window.shellCaller) { // 如果注册了回调caller,则返回结果给它。注意,此方法默认中途没有其他调用壳的操作!!!
449
- window.shellCaller.$emit(eventType, ret)
450
- } else if (ret) {
451
- Vue.$root.eventHub.$emit(eventType, ret) // 全局发送事件。任意监听
452
- }
453
- } else {
454
- console.log(`壳${info}类型调用,返回结果异常!为空或没有nativeData节点`)
455
- }
456
- }
457
-
458
- window.SHELL_CB = SHELL_CB
459
-
460
-
461
- // 唤起壳功能
462
- function callShell(fnModel, param, cbparam, vnode = null) {
463
- if (fnModel) {
464
- const jsonObj = JSON.parse(JSON.stringify(fnModel))
465
- if (!ak.utils.isEmpty(param))
466
- jsonObj.dataObject = Object.assign({}, jsonObj.dataObject, param)
467
-
468
- if (!ak.utils.isEmpty(cbparam))
469
- jsonObj.dataObject.jsData = { cbparam }
470
-
471
- if (ak.utils.isEmpty(jsonObj.dataObject.actions)) {
472
- jsonObj.dataObject.actions = ''
473
- }
474
- const requestJson = JSON.stringify(jsonObj)
475
- console.log('壳调用json:' + requestJson, ua)
476
- if (vnode != null) {
477
- window.shellCaller = vnode
478
- }
479
- if (ua.iPad || ua.iPhone) {
480
- if (window.navigator.userAgent.indexOf('app_ios_wk') != -1) {
481
- window.webkit.messageHandlers.JSonString.postMessage(requestJson)
482
- } else {
483
- JSonString(requestJson)
484
- }
485
- } else {
486
- window.jsObj.jsCallAndroid(requestJson)
487
- }
488
- }
489
- }
490
-
1
+ import { ua } from './ua'
2
+ import ak from './ak.js'
3
+
4
+ import Vue from 'vue'
5
+ export const SHELL = {
6
+ GET_PHONE_INFO: {
7
+ functionName: 'getSystemData',
8
+ dataObject: {
9
+ jsFunction: 'SHELL_CB.phoneInfo',
10
+ jsData: {}
11
+ }
12
+ },
13
+ TOAST: {
14
+ functionName: 'toast',
15
+ dataObject: {
16
+ content: '',
17
+ delay: 10
18
+ }
19
+ },
20
+ SHARE: {
21
+ functionName: 'share',
22
+ dataObject: {
23
+ shareChannel: []
24
+ }
25
+ },
26
+ LIVE: {
27
+ 'functionName': 'getOCRimg',
28
+ 'dataObject': {
29
+ 'jsFunction': 'SHELL_CB.live',
30
+ 'jsData': {},
31
+ 'expired': '-1',
32
+ 'maxSizeKB': '0'
33
+ }
34
+ },
35
+ GET_IDCARD_PIC: {
36
+ 'functionName': 'getIDauth',
37
+ 'dataObject': {
38
+ 'jsFunction': 'SHELL_CB.getIDPic',
39
+ 'count': 1,
40
+ 'sizeType': 0,
41
+ 'expired': '-1',
42
+ 'actions': '',
43
+ 'jsData': {},
44
+ 'sourceType': ['相机', '相册'],
45
+ 'maxSizeKB': '0'
46
+ }
47
+ },
48
+ CALL_CAMERA: {
49
+ 'functionName': 'verifyIdentity',
50
+ 'dataObject': {
51
+ 'jsFunction': 'SHELL_CB.getPic',
52
+ 'count': 1,
53
+ 'sizeType': 0,
54
+ 'actions': '',
55
+ 'jsData': {},
56
+ 'sourceType': ['相机', '相册'],
57
+ 'expired': '-1',
58
+ 'maxSizeKB': '0',
59
+ 'cancelCrop': true
60
+ }
61
+ },
62
+ CALL_CAMERA_OTHER: {
63
+ 'functionName': 'verifyIdentity',
64
+ 'dataObject': {
65
+ 'jsFunction': 'SHELL_CB.getPic',
66
+ 'count': 9,
67
+ 'sizeType': 0,
68
+ 'actions': '',
69
+ 'cropType': 1,
70
+ 'jsData': {},
71
+ 'sourceType': ['相机', '相册'],
72
+ 'expired': '-1',
73
+ 'maxSizeKB': '0',
74
+ 'cancelCrop': true
75
+ }
76
+ },
77
+ QRCODE: {
78
+ 'functionName': 'get2Dinfo',
79
+ 'dataObject': {
80
+ 'jsFunction': 'SHELL_CB.getQrcode',
81
+ 'jsData': {}
82
+ }
83
+ },
84
+ GET_TOKEN: {
85
+ 'functionName': 'getToken',
86
+ 'dataObject': {
87
+ 'jsFunction': 'SHELL_CB.getToken',
88
+ 'isNull': 'true',
89
+ 'jsData': {}
90
+ }
91
+ },
92
+ JUMP_TO_LOGIN: {
93
+ 'functionName': 'jumpValue',
94
+ 'dataObject': {
95
+ 'naviInit': {
96
+ 'dataObject': {
97
+ 'setFunction': {
98
+ 'jsData': { 'callBackKey': 'login' },
99
+ 'jsFunction': 'SHELL_CB.toLogin' }
100
+ }
101
+ },
102
+ 'pageCode': 'CUSTOMER_LOGIN',
103
+ 'url': '',
104
+ 'businessData': {}
105
+ }
106
+ },
107
+ JUMP_VIEW: {
108
+ 'functionName': 'jumpValue',
109
+ 'dataObject': {
110
+ 'url': '',
111
+ 'pageCode': 'COMMON_PRIMARY_PAGE'
112
+ }
113
+ },
114
+ POPVIEW: {
115
+ 'functionName': 'popView',
116
+ 'dataObject': {}
117
+ },
118
+ HIDE_FHONE_TITLE: {
119
+ 'functionName': 'naviInit',
120
+ 'dataObject': {
121
+ 'setVisible': { 'visibility': false }
122
+ }
123
+ },
124
+ CALL_PHONE: {
125
+ 'functionName': 'call',
126
+ 'dataObject': {
127
+ 'phone': ''
128
+ }
129
+ },
130
+ SEND_MESSAGE: {
131
+ 'functionName': 'sendSms',
132
+ 'dataObject': {
133
+ 'phone': '',
134
+ 'content': ''
135
+ }
136
+ },
137
+ GET_MAIL_LIST: {
138
+ 'functionName': 'getContact',
139
+ 'dataObject': {
140
+ 'jsFunction': 'SHELL_CB.getContract'
141
+ }
142
+ },
143
+ // 查看PDF 老版本
144
+ GET_PDF_READ: {
145
+ 'functionName': 'pdfRead',
146
+ 'dataObject': {
147
+ 'pdfName': '',
148
+ // 'pdfBaseUrl': `${FilePathPkg.fileBasePath}`,
149
+ 'pdfBaseUrl': '',
150
+ 'pdfUrl': '',
151
+ 'time': '10',
152
+ 'pdfCanShare': '', // 是否显示分享按钮,1是显示,空或者其他不显示
153
+ 'shareTitle': 'test.pdf', // 自定义文件名 (需要添加.pdf后缀) 不传或者为空壳默认文件名为”文件.pdf”
154
+ 'jsFunction': 'SHELL_CB.pdfRead'
155
+ }
156
+ },
157
+ // 查看PDF 新版本
158
+ GET_PDF_READ_FIT: {
159
+ 'functionName': 'pdfReadFit',
160
+ 'dataObject': {
161
+ 'pdfName': '',
162
+ // 'pdfBaseUrl': `${FilePathPkg.fileBasePath}`,
163
+ 'pdfBaseUrl': '',
164
+ 'pdfUrl': '',
165
+ 'time': '0', // 倒计时时间 传0不显示倒计时
166
+ 'pdfCanShare': '', // 是否显示分享按钮,1是显示,空或者其他不显示
167
+ 'shareTitle': 'test.pdf', // 自定义文件名 (需要添加.pdf后缀) 不传或者为空壳默认文件名为”文件.pdf”
168
+ 'jsFunction': 'SHELL_CB.pdfRead'
169
+ }
170
+ },
171
+ // 设置头部title
172
+ SET_TITLE: {
173
+ 'functionName': 'naviInit',
174
+ 'dataObject': {
175
+ 'setTitle': {'title': ''}
176
+ }
177
+ }
178
+ }
179
+
180
+ // 分享渠道
181
+ export const SHARE_CHANNEL = {
182
+ WEIXIN_FRIEND: 'wx_friend',
183
+ WEIXIN_SPACE: 'wx_space',
184
+ QQ_FRIEND: 'qq_friend',
185
+ QQ_SPACE: 'qq_space',
186
+ WB: 'wb',
187
+ MESSAGE: 'message',
188
+ COPYURL: 'copy_url'
189
+ }
190
+ // 分享类型
191
+ export const SHARE_TYPE = {
192
+ TEXT: '1',
193
+ IMAGE: '2',
194
+ SCREEN_IMAGE: '3',
195
+ TEXT_IMAGE: '4',
196
+ SCREEN_TEXT_IMAGE: '5',
197
+ TEXT_IMAGE_LINK: '6',
198
+ SCREEN_TEXT_IMAGE_LINK: '7'
199
+ }
200
+
201
+ // 入参所需字段
202
+ export const PARAM_FIELD = {
203
+ TEXT: 'text',
204
+ TITLE: 'title',
205
+ IMAGE: 'image',
206
+ DESCRIPTION: 'description',
207
+ URL: 'url',
208
+ BTNTITLE: 'btnTitle',
209
+ SHARE_TYPE: 'share_type'
210
+ }
211
+
212
+
213
+
214
+
215
+ /**
216
+ * 外部调用API
217
+ */
218
+
219
+ // 获取手机信息
220
+ export function getPhoneInfo(vnode) {
221
+ callShell(SHELL.GET_PHONE_INFO, null, null, vnode)
222
+ }
223
+ // 获取token
224
+ export function getToken(vnode) {
225
+ callShell(SHELL.GET_TOKEN, null, null, vnode)
226
+ }
227
+ // 跳转登陆页面
228
+ export function jumpToLogin(cbparam) {
229
+ callShell(SHELL.JUMP_TO_LOGIN, null, cbparam)
230
+ }
231
+ // 页面后退
232
+ export function popView() {
233
+ callShell(SHELL.POPVIEW, null)
234
+ }
235
+ // 分享页面
236
+ export function share(params) {
237
+ const btns = [{ channel: SHARE_CHANNEL.WEIXIN_SPACE, type: SHARE_TYPE.TEXT_IMAGE_LINK, param: { [PARAM_FIELD.BTNTITLE]: '微信朋友圈', [PARAM_FIELD.TEXT]: params.text, [PARAM_FIELD.TITLE]: params.title, [PARAM_FIELD.IMAGE]: params.imgurl, [PARAM_FIELD.DESCRIPTION]: '11111111111', [PARAM_FIELD.URL]: params.url }},
238
+ { channel: SHARE_CHANNEL.COPYURL, param: { [PARAM_FIELD.TEXT]: params.text, [PARAM_FIELD.BTNTITLE]: '复制链接' }}
239
+ ]
240
+ btns.push({ channel: SHARE_CHANNEL.WEIXIN_FRIEND, type: SHARE_TYPE.TEXT_IMAGE_LINK, param: { [PARAM_FIELD.BTNTITLE]: '微信好友', [PARAM_FIELD.TEXT]: params.text, [PARAM_FIELD.TITLE]: params.title, [PARAM_FIELD.IMAGE]: params.imgurl, [PARAM_FIELD.DESCRIPTION]: params.description, [PARAM_FIELD.URL]: params.url }})
241
+ //
242
+ getShareBtns(btns)
243
+ // shareSingleBtn(btnm)
244
+ }
245
+ // 唤出多个分享按钮
246
+ export function getShareBtns(shareSetting) {
247
+ if (Array.isArray(shareSetting)) {
248
+ const ret = []
249
+ shareSetting.map(({ channel, type, param }) => {
250
+ const btn = shareSingleBtn(channel, type, param)
251
+ if (typeof btn === 'string') {
252
+ alert(btn)
253
+ } else {
254
+ ret.push(btn)
255
+ }
256
+ })
257
+ const fnModel = SHELL.SHARE
258
+ if (fnModel) {
259
+ const fnParamModel = JSON.parse(JSON.stringify(fnModel))
260
+ fnParamModel.dataObject.shareChannel = ret
261
+ const requestJson = JSON.stringify(fnParamModel)
262
+ if (ua.iPad || ua.iPhone) {
263
+ if (window.navigator.userAgent.indexOf('app_ios_wk') != -1) {
264
+ window.webkit.messageHandlers.JSonString.postMessage(requestJson)
265
+ } else {
266
+ JSonString(requestJson)
267
+ }
268
+ } else {
269
+ window.jsObj.jsCallAndroid(requestJson)
270
+ }
271
+ }
272
+ } else {
273
+ alert('传入多分享按钮的数据应为数组,请核实')
274
+ }
275
+ }
276
+ // 提示信息
277
+ export function toast(content, delay = 10) {
278
+ callShell(SHELL.TOAST, { content, delay })
279
+ }
280
+ // 隐藏原生标题
281
+ export function hidePhoneTitle() {
282
+ callShell(SHELL.HIDE_FHONE_TITLE)
283
+ }
284
+ // 人脸识别
285
+ export function live(param, vnode) {
286
+ callShell(SHELL.LIVE, param, null, vnode)
287
+ }
288
+
289
+ // 扫描身份证信息
290
+ export function getIDCard(param, vnode) {
291
+ callShell(SHELL.GET_IDCARD_PIC, param, null, vnode)
292
+ }
293
+ // 扫描二维码
294
+ export function getQrcode() {
295
+ callShell(SHELL.QRCODE)
296
+ }
297
+ // 获取图片信息
298
+ export function getPicture(param, vnode) {
299
+ callShell(SHELL.CALL_CAMERA, param, null, vnode)
300
+ }
301
+ // 呼叫
302
+ export function callphone(phoneNo) {
303
+ callShell(SHELL.CALL_PHONE, { phone: phoneNo })
304
+ }
305
+ // 短信
306
+ export function sendMessage(phone, content) {
307
+ callShell(SHELL.SEND_MESSAGE, { phone, content })
308
+ }
309
+ // 通讯录
310
+ export function seeMailList() {
311
+ callShell(SHELL.GET_MAIL_LIST)
312
+ }
313
+ // 设置页面头部
314
+ export function setTitle(params) {
315
+ callShell(SHELL.SET_TITLE, params)
316
+ }
317
+
318
+ // 单个分享按钮
319
+ function shareSingleBtn(channel, type, param) {
320
+ const des = _getDescription(channel)
321
+ const btnName = des && des[0]
322
+ // const btnImage = des && des[1]
323
+ return Object.assign({}, { type: channel, shareType: type, btnTitle: btnName }, param)
324
+ }
325
+
326
+ // 分享渠道说明
327
+ function _getDescription(channel) {
328
+ switch (channel) {
329
+ case SHARE_CHANNEL.WEIXIN_FRIEND: return ['微信好友', '../weibo_logo.png']
330
+ case SHARE_CHANNEL.WEIXIN_SPACE: return ['朋友圈', '../weibo_logo.png']
331
+ case SHARE_CHANNEL.QQ_FRIEND: return ['QQ好友', '../weibo_logo.png']
332
+ case SHARE_CHANNEL.QQ_SPACE: return ['QQ空间', '../weibo_logo.png']
333
+ case SHARE_CHANNEL.WB: return ['微博', '../weibo_logo.png']
334
+ case SHARE_CHANNEL.MESSAGE: return ['短信', '../weibo_logo.png']
335
+ case SHARE_CHANNEL.COPYURL: return ['复制链接', '../weibo_logo.png']
336
+ }
337
+ }
338
+ export const EBType = {}
339
+ EBType.PhoneInfo = 'getPhoneInfo'
340
+ EBType.Login = 'login'
341
+ EBType.PdfInfo = 'getpdfInfo'
342
+ EBType.IDCard = 'getIDcard'
343
+ EBType.getPIC = 'getPic'
344
+ EBType.getQRCode = 'getQrcode'
345
+ EBType.Live = 'live'
346
+ EBType.getContract = 'getContract'
347
+ EBType.getToken = 'getToken'
348
+ EBType.statusBarHeight = 'statusBarHeight'
349
+
350
+ /**
351
+ * 事件类型对照
352
+ */
353
+ export const EventTypeMapping = {
354
+ [EBType.PdfInfo]: '查看pdf',
355
+ [EBType.IDCard]: '身份证OCR',
356
+ [EBType.getPIC]: '获取图像',
357
+ [EBType.getQRCode]: '获取二维码',
358
+ [EBType.Live]: '活体识别',
359
+ [EBType.getToken]: '获取TOKEN',
360
+ [EBType.getContract]: '调用通讯录'
361
+ }
362
+
363
+ /**
364
+ * 壳返回回调
365
+ */
366
+ export const SHELL_CB = {
367
+ phoneInfo: function(data) {
368
+ handleBackData(data, EBType.PhoneInfo, (retData) => {
369
+ window.phoneInfoRequired = false
370
+ return retData
371
+ })
372
+ },
373
+
374
+ getToken: function(data) {
375
+ handleBackData(data, EBType.getToken, (retData) => {
376
+ if (ak.utils.isEmpty(retData.token)) {
377
+ jumpToLogin()
378
+ } else {
379
+ !!retData.token && ak.utils.setSessionStorage('jtl', retData.token)
380
+ // Vue.$root.eventHub.$emit('userInfo', retData)
381
+ window.tokenRequired = false
382
+ return retData
383
+ }
384
+ })
385
+ },
386
+ toLogin: function(data) {
387
+ handleBackData(data, EBType.Login, (retData) => {
388
+ ak.utils.removeSessionStorage('jtl')
389
+ if (!retData.token) {
390
+ // 如果是取消登录,并没有拿到token,则需要一直停留在登录页。但是现在为了演示过掉,先注释调下面一行。正常应该是放开的
391
+ jumpToLogin()
392
+ } else {
393
+ if (!retData.team) {
394
+ getToken()
395
+ } else {
396
+ // Vue.$root.eventHub.$emit('userInfo', retData)
397
+ window.tokenRequired = false
398
+ }
399
+ }
400
+ })
401
+ },
402
+ live: function(data) {
403
+ handleBackData(data, EBType.Live, (retData) => {
404
+ const fileName = retData.fileId + '.' + retData.ext // 文件名 + 扩展名
405
+ const actions = retData.actions ? JSON.parse(retData.actions) : null
406
+ return { fileName, actions }
407
+ })
408
+ },
409
+ getIDPic: function(data) {
410
+ handleBackData(data, EBType.IDCard, (retData) => {
411
+ const fileName = retData.fileId + '.' + retData.ext // 文件名 + 扩展名
412
+ const actions = retData.actions ? JSON.parse(retData.actions) : null
413
+ return { fileName, actions }
414
+ })
415
+ },
416
+ getQrcode: function(data) {
417
+ handleBackData(data, EBType.getQRCode, (retData) => {
418
+ const qrCode = retData.CodeString
419
+ return { qrCode }
420
+ })
421
+ },
422
+ getPic: function(data) {
423
+ handleBackData(data, EBType.getPIC, (retData) => {
424
+ const fileName = retData.fileId + '.' + retData.ext // 文件名 + 扩展名
425
+ const actions = retData.actions ? JSON.parse(retData.actions) : null
426
+ return { fileName, actions }
427
+ })
428
+ },
429
+ pdfRead: function(data) {
430
+ handleBackData(data, EBType.PdfInfo, (retData) => {
431
+ return { flag: retData.readFinish === '1' }
432
+ })
433
+ },
434
+ getContract: function(data) {
435
+ handleBackData(data, EBType.getContract, (retData) => {
436
+ return { name: retData.name, phone: retData.phone }
437
+ })
438
+ }
439
+ }
440
+
441
+ // 处理调壳返回的结果
442
+ export function handleBackData(src, eventType, reformateData) {
443
+ const info = eventType ? (EventTypeMapping[eventType] || eventType || '') : ''
444
+ if (src && ( src.nativeData || src.height)) {
445
+ const data = src.nativeData || src.height
446
+ console.log((`壳${info}类型调用成功!返回原始数据:` + JSON.stringify(data)))
447
+ const ret = reformateData(data)
448
+ if (ret && window.shellCaller) { // 如果注册了回调caller,则返回结果给它。注意,此方法默认中途没有其他调用壳的操作!!!
449
+ window.shellCaller.$emit(eventType, ret)
450
+ } else if (ret) {
451
+ Vue.$root.eventHub.$emit(eventType, ret) // 全局发送事件。任意监听
452
+ }
453
+ } else {
454
+ console.log(`壳${info}类型调用,返回结果异常!为空或没有nativeData节点`)
455
+ }
456
+ }
457
+
458
+ window.SHELL_CB = SHELL_CB
459
+
460
+
461
+ // 唤起壳功能
462
+ function callShell(fnModel, param, cbparam, vnode = null) {
463
+ if (fnModel) {
464
+ const jsonObj = JSON.parse(JSON.stringify(fnModel))
465
+ if (!ak.utils.isEmpty(param))
466
+ jsonObj.dataObject = Object.assign({}, jsonObj.dataObject, param)
467
+
468
+ if (!ak.utils.isEmpty(cbparam))
469
+ jsonObj.dataObject.jsData = { cbparam }
470
+
471
+ if (ak.utils.isEmpty(jsonObj.dataObject.actions)) {
472
+ jsonObj.dataObject.actions = ''
473
+ }
474
+ const requestJson = JSON.stringify(jsonObj)
475
+ console.log('壳调用json:' + requestJson, ua)
476
+ if (vnode != null) {
477
+ window.shellCaller = vnode
478
+ }
479
+ if (ua.iPad || ua.iPhone) {
480
+ if (window.navigator.userAgent.indexOf('app_ios_wk') != -1) {
481
+ window.webkit.messageHandlers.JSonString.postMessage(requestJson)
482
+ } else {
483
+ JSonString(requestJson)
484
+ }
485
+ } else {
486
+ window.jsObj.jsCallAndroid(requestJson)
487
+ }
488
+ }
489
+ }
490
+