Commit f84ad249 by golton_gao

update: 调整cordova桥为yzj的桥

parent 74b7cdb6
......@@ -5,6 +5,7 @@
<title>self-service</title>
<meta name="format-detection" content="telephone=no"/>
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
<script src="miniapp://common/js/qing/qing.js"></script>
</head>
<body>
<div id="app"></div>
......
......@@ -25,6 +25,7 @@ export default class CordovaApi extends NativeApi {
conf.platform = 'cordova'
super(conf)
/* gdd:20231015 屏蔽旧的,请用qingjs代替
if (typeof window !== 'undefined' && typeof window.document !== 'undefined') {
var self = this
if (!window.document.getElementById('cordovaJS')) {
......@@ -45,6 +46,11 @@ export default class CordovaApi extends NativeApi {
window.document.body.appendChild(script)
}
}
*/
var self = this
qing.ready(function () {
self.doReady(self)
})
}
set methods (methods) {
......
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import './polyfill/index'
import Vue from 'vue'
import router from './router'
import App from './app.vue'
......
;(function (global) {
var qingjs = global.qing
var qingPromise = function (fnName, params) {
return new Promise(function (resolve, reject) {
var originSuccess = params.success
var originError = params.error
var opt = Object.assign(params, {
success: function (res) {
if (originSuccess) {
originSuccess(res)
}
resolve(res)
},
error: function (e) {
if (originError) {
originError(e)
}
reject(e)
}
})
qing.call(fnName, opt)
})
}
// 根据“工号”查询【工号、eid、orgId】等信息
function getPersonInfosByJobNo(jobNos) {
var opt = {
url: '/gateway/xmjf-other-service/person/role/query/jobNo',
serializer: 'form',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Cloudoffice-Version': 'v0.0.1'
},
data: {
jobNos: jobNos.join(',')
}
}
return new Promise(function (resolve, reject) {
opt.success = function (result) {
var success = (result || {}).success || false
var data = (result || {}).data || []
if (String(success).toLowerCase() !== 'true' || data.length === 0) {
reject(result.error || '获取人员信息失败!')
return
}
resolve(result.data)
}
opt.error = function (e) {
reject(e)
}
qing.call('request', opt)
})
}
// 根据openId查询【工号、eid、orgId】等信息
function getPersonInfosByoIds(oIds) {
var opt = {
url: '/gateway/xmjf-other-service/person/role/query/oId',
serializer: 'form',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Cloudoffice-Version': 'v0.0.1'
},
data: {
oIds: oIds.join(',')
}
}
return new Promise(function (resolve, reject) {
opt.success = function (result) {
var success = (result || {}).success
var data = (result || {}).data || []
if (String(success).toLowerCase() !== 'true' || data.length === 0) {
reject(result.error || '获取人员信息失败!')
return
}
resolve(result.data)
}
opt.error = function (e) {
reject(e)
}
qing.call('request', opt)
})
}
// 通过qingjs选人
function selectPersonByQing(selected, isMulti) {
return new Promise(function (resolve, reject) {
qing.call('selectPersons', {
isMulti: isMulti,
selected: selected,
success: function (result) {
var success = (result || {}).success || false
var persons = ((result || {}).data || {}).persons || []
if (
String(success).toLowerCase() !== 'true' ||
persons.length === 0
) {
reject(result.error || '请选择人员后再提交')
return
}
resolve(persons)
}
})
})
}
// 将人员信息转化成美信的
function formatData2Mx(persons) {
// openId和人员的映射关系
var personMap = {}
var openIds = persons.map(function (p) {
// 将云之家的人员字段与美信的人员字段映射起来
p.telephonenumber = p.phone
p.cn = p.name
p.positionname = p.jobTitle
p.mobile = p.phone
// 创建缓存,方便后续根据openId查询人员信息
var openId = p.openId
personMap[openId] = p
return openId
})
return getPersonInfosByoIds(openIds).then(function (ids) {
var persons = ids.map(function (personIds) {
var openId = personIds.oId
var jobNo = personIds.jobNo
// 从缓存里面查询对应人员
var p = personMap[openId]
// 更新工号
p.uid = jobNo
p.jobNo = jobNo
return p
})
return persons
})
}
// 选人
function selectPersons(selected, isMulti, successFn, failFn) {
// 将传入的工号转为openId
var selectedPromise = Promise.resolve([])
if (selected && selected.length) {
selectedPromise = getPersonInfosByJobNo(selected)
}
// 根据openId选人
selectedPromise
.then(function (persons) {
var oIds = persons.map(function (p) {
return p.oId
})
return selectPersonByQing(oIds, isMulti)
})
.then(function (persons) {
// 格式化选人信息
return formatData2Mx(persons)
})
.then(function (persons) {
successFn({
result: true,
array: persons
})
})
.catch(function () {
failFn({
result: false,
array: []
})
})
}
// 获取当前用户信息
function getCurrentUserInfo(callback) {
var opt = {
url: '/gateway/xmjf-other-service/person/role/save/person',
method: 'POST',
headers: {
'Cloudoffice-Version': 'v0.0.1'
},
data: {},
success: callback
}
qing.call('request', opt)
}
var handlers = {
MIDEACOMMON: {
exit: function (p, successFn, failFn) {
qing.call('closeWebView')
successFn('success')
},
orgChoose1: function (p, successFn, failFn) {
selectPersons([], false, successFn, failFn)
},
orgMuChoose1: function (selected, successFn, failFn) {
selectPersons(selected, true, successFn, failFn)
},
openSysBrowser: function (urls, successFn, failFn) {
var u = urls || []
if (!u.length) {
failFn('未检测到要打开的url!')
return
}
qing.call('localFunction', {
name: 'openExtBrowser',
param: {
url: u[0]
},
success: successFn
})
},
language: function (param, successFn, failFn) {
var lang = 'zh-CN'
var result = navigator.userAgent.match(/(;|^)\s*lang\s*:([^;]*)/)
if (result && result.length === 3) {
lang = result[2]
}
// 只取后面的国家代码
lang = lang.replace(/^[a-z]+\-/i, '')
successFn({
language: lang.toLowerCase()
})
},
vcard: function (uids, successFn, failFn) {
var jobNos = uids || []
if (!jobNos.length) {
failFn('未检测到要打开人员的openId!')
return
}
// 通过工号获取openId,然后用openId打开人员详情页面。
getPersonInfosByJobNo(jobNos)
.then(function (personInfos) {
// 打开人员卡片只有一条信息
qing.call('personInfo', {
openId: personInfos[0].oId
})
successFn(true)
})
.catch(function (e) {
failFn(e)
})
},
openUrl: function (params, successFn, failFn) {
// params的第一个参数是要打开的url
var url = (params || [])[0]
// 第二个参数是打开url的参数
var _p = (params || [])[1] || {}
if (!url) {
failFn('未检测到要打开的url!')
return
}
// 注册页面关闭的回调事件。
if (_p.H5CallBackFunction) {
var fnName = _p.H5CallBackFunction.replace('()', '')
var fn = window[fnName]
if (fn && (typeof fn === 'function')) {
qing.on('appear', function () {
fn()
})
}
}
qing.call('gotoLightApp', {
urlParam: url
})
},
showWidget: function () {},
getExtra: function (params, successFn, failFn) {
successFn(null)
}
},
MIDEAUSER: {
getUser: function (param, successFn, failFn) {
getCurrentUserInfo(function (result) {
var success = (result || {}).success
var error = (result || {}).error
var data = (result || {}).data || {}
if (String(success).toLowerCase() !== 'true') {
failFn(error)
return
}
var userInfo = data.userInfo || {}
successFn({
uid: userInfo.username,
email: userInfo.email,
avatar: userInfo.avatar,
cn: userInfo.name,
gender: userInfo.gender,
mobile: userInfo.email,
fullDeptName: userInfo.fullDeptName.replace('!', '_'),
departmentName: userInfo.deptName,
ssoToken: data.ssoToken
})
})
}
},
MIDEAPDF: {
showTxt: function (param, successFn, failFn) {
var p = param || {}
if (!p.url) {
failFn('未检测到要打开文件的url!')
return
}
/*
var ext = '';
var extIndex = param.title.lastIndexOf('.');
if (extIndex !== -1) {
var innerExt = param.title.slice(extIndex + 1);
if (innerExt.length > 0 && innerExt.length <=4) {
ext = innerExt;
}
}
*/
var qingParam = {
fileDownloadUrl: param.url,
success: successFn,
fail: failFn,
error: failFn
}
if (param.title) {
qingParam.fileName = param.title
}
qing.call('showFile', qingParam)
},
showPdf: function (urls, successFn, failFn) {
var u = urls || []
if (!u.length) {
failFn('未检测到要打开文件的url!')
return
}
qing.call('showFile', {
fileDownloadUrl: u[0],
success: successFn,
fail: failFn,
error: failFn
})
},
showRAR: function () {}
}
}
global.cordova = {
exec: function (successFn, failFn, module, method, params) {
params = params || []
console.warn('cordova-module:' + module + ', method:' + method)
var modules = handlers[module.toUpperCase()]
if (!modules) {
console.error('请求的模块' + module + '未注册!')
failFn('请求的模块' + module + '未注册!')
return
}
var handler = modules[method]
if (!handler) {
console.error('未在' + module + '模块找到' + method + '方法的实现!')
// 当桥不存在的时候,不阻断业务让流程还可以正常走。
successFn({})
return
}
handler(params, successFn, failFn)
}
}
var CAMERA = {
PictureSourceType: {
0: 'photo',
1: 'camera',
2: 'photo'
}
}
global.navigator.camera = {
getPicture: function (successFn, failFn, params) {
var sourceType = params.sourceType || 1
var opt = {
type: sourceType === 1 ? 'camera' : 'photo'
}
qingPromise('selectPic', opt)
.then(function (result) {
var success = (result || {}).success || false
var data = (result || {}).data || {}
var error = (result || {}).error || '获取图片信息失败!'
if (String(success).toLowerCase() === 'true') {
successFn(data.fileData)
} else {
failFn(error)
}
})
.catch(function (e) {
failFn(e)
})
}
}
})(window)
import './cordova.js'
import './request.js'
const events = {}
window.customEvt = {
addEventListener: function(name, fn) {
if (!events[name]) {
events[name] = []
}
const fns = events[name] || []
fns.push(fn)
},
removeEventListener: function(name, fn) {
const fns = events[name] || []
if (!fn) {
events[name] = []
return
}
for(let index = 0, len = fns.length; index < len; index++) {
const _fn = fns[index]
if (_fn === fn) {
fns.splice(index, 1)
break
}
}
},
triggerEvent: function(name) {
const fns = events[name] || []
for(const fn of fns) {
fn()
}
}
}
var customEvt = window.customEvt
var qing = window.qing
qing.ready(function () {
// 重写左侧返回按钮
qing.call('defback', {
success: function () {
customEvt.triggerEvent('backbutton')
}
})
// 绑定左侧按钮默认事件
customEvt.addEventListener('backbutton', () => {
if (history.length <= 1) {
//顶级页面,则关闭当前Web
qing.call('closeWebView')
} else {
history.back()
}
})
})
import axios from 'axios'
var originAdapter = axios.defaults.adapter
axios.defaults.adapter = function (config) {
if (!/^https?/.test(config.url)) {
return originAdapter(config)
}
return request(config)
}
function isObject(value) {
return value !== null && typeof value === 'object'
}
function isFormData(fd) {
return Object.prototype.toString.call(fd) === '[object FormData]'
}
function formData2obj(fd) {
var data = {}
for (var p of fd.entries()) {
data[p[0]] = p[1]
}
return data
}
function params2object(url) {
var params = {}
if (typeof url === 'object') {
return url
} else if (typeof url === 'string') {
url
.replace(/^.*\?|#.*$/g, '')
.split('&')
.forEach((n) => {
n = n.split('=')
if (n.length === 2) {
params[n[0]] = n[1]
}
})
}
return params
}
function request(opt) {
opt = opt || {}
if (!opt.url) {
return Promise.reject('interface url is required!')
}
// 默认get请求
opt.method = opt.method || 'get'
// 处理params
var urlParams = opt.params || {}
// 合并url和params字段的数据,如果params字段与url中有重名参数,以params中的为准
urlParams = Object.assign(params2object(opt.url), urlParams)
// 处理url
// url如果包含空格,会在iOS中报错
opt.url = opt.url.replace(/^\s+|\s+$/g, '')
// 将params拼接到url中
opt.url =
opt.url.split('?')[0] +
'?' +
Object.keys(urlParams)
.map((key) => {
var val = urlParams[key]
if (isObject(val)) {
val = JSON.stringify(val)
val = encodeURIComponent(val)
} else if (/[^\x00-\xff]/.test(val)) {
val = encodeURIComponent(val)
}
return key + '=' + val
})
.join('&')
// post非json即是form。
if (opt.method.toLowerCase() === 'post') {
var data = opt.data
if (isFormData(data)) {
opt.headers = Object.assign(opt.headers || {}, {
'Content-Type': 'application/x-www-form-urlencoded'
})
opt.data = formData2obj(data)
} else if (isObject(data)) {
opt.headers = Object.assign(opt.headers || {}, {
'Content-Type': 'application/json;charset=UTF-8'
})
}
}
// 处理header
opt.headers = opt.headers || {}
// headers字段值必须是字符串型
Object.keys(opt.headers).forEach(function (key) {
var val = opt.headers[key]
var type = typeof val
if (type === 'undefined') {
delete opt.headers[key]
} else if (type !== 'string') {
opt.headers[key] = val + ''
}
})
return new Promise(function (resolve, reject) {
qing.call('request', {
url: opt.url,
method: opt.method,
headers: opt.headers,
header: opt.headers,
data: opt.data || {},
dataType: opt.dataType,
success: function (resp) {
var response = {
data: resp.data,
status: resp.statusCode,
headers: resp.header,
config: opt
}
var validateStatus = response.config.validateStatus
// Note: status is not exposed by XDomainRequest
if (
!response.status ||
!validateStatus ||
validateStatus(response.status)
) {
resolve(response)
} else {
var error = new Error(
'Request failed with status code ' + response.status
)
error.config = response.config
error.response = response
reject(error)
}
},
error: function (e) {
var error = new Error(e)
error.config = opt
reject(error)
}
})
})
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment