mtl-js-sdk
Version:
ynf-fw-mtl-api
1,232 lines (1,197 loc) • 40.8 kB
JavaScript
/*
* @Author: wangyingliang@yonyou.com
* @Date: 2024-10-31 09:34:14
* @LastEditors: wangyingliang wangyingliang@yonyou.com
* @LastEditTime: 2025-04-07 09:38:44
* @FilePath: /mtl-api-project/src/common/environment.js
* @Description: 获取环境变量
* Copyright (c) 2024 by Yonyou, All Rights Reserved.
*/
import xaxios from 'axios'
const baseUrl = "ht' + 'tps://build.yyuap.c' + 'om"
const FAIL_CODE = 1
const axios = xaxios?.default || xaxios
let apiUpesn = ""
let upesnVersion = 0 // 单数表示ios、偶数表示安卓
const NAVITYPE = {
GAODE: 1,
BAIDU: 2,
TENCENT: 3,
}
function getSystemType(params) {
let systemType = '';
if (userAgent.indexOf('Windows') > -1) {
systemType = 'windows';
} else if (userAgent.indexOf('Macintosh') > -1 || userAgent.indexOf('Mac OS X') > -1) {
systemType = 'macOS';
} else if (userAgent.indexOf('iPhone') > -1 || userAgent.indexOf('iPad') > -1 || userAgent.indexOf('iPod') > -1) {
systemType = 'iOS';
} else if (userAgent.indexOf('Android') > -1) {
systemType = 'Android';
} else {
systemType = '无法识别的系统类型';
}
return systemType
}
function getPlatform() {
let userAgent = window.navigator.userAgent
let platform = null
if (userAgent.indexOf("miniProgram") !== -1 || userAgent.indexOf("wxwork") !== -1 || userAgent.indexOf("wechatdevtools") !== -1) {
platform = "wx"
// initInputChooseFile()
loadCDNJS("https://res.wx.qq.com/open/js/jweixin-1.5.0.js", (res) => {
console.log(res);
}, (err) => {
console.log(err);
})
} else if (userAgent.indexOf("APIAndroid") !== -1) {
if (userAgent.indexOf("QYZone") !== -1) {
apiUpesn = "APIAndroid"
platform = "upesnAndroid"
upesnVersion = 2 // 安卓为偶数
} else {
platform = "APIAndroid"
}
} else if (userAgent.indexOf("APIIOS") !== -1) {
if (userAgent.indexOf("QYZone") !== -1) {
apiUpesn = "APIIos"
platform = "upesnIos"
upesnVersion = 1 // ios为奇数
} else {
platform = "APIIos"
}
} else if (userAgent.indexOf("APIHarmonyOS") !== -1) {
// 鸿蒙旗舰版
apiUpesn = "APIHarmonyOS"
platform = "APIHarmonyOS"
upesnVersion = 3 // 鸿蒙为偶数
} else if (userAgent.indexOf("QYZone") !== -1) {
platform = "upesn"
apiUpesn = "upesn"
} else if (/dingtalk/i.test(userAgent)) {
platform = "dingtalk"
// initInputFile()
loadCDNJS("https://g.alicdn.com/dingding/dingtalk-jsapi/3.0.25/dingtalk.open.js", (res) => {
console.log(res);
}, (err) => {
console.log(err);
})
} else if (userAgent.indexOf("Feishu") !== -1) {
// 飞书平台
platform = "tt"
// initInputFile()
loadCDNJS("https://lf1-cdn-tos.bytegoofy.com/goofy/lark/op/h5-js-sdk-1.5.37.js", (res) => {
console.log(res);
}, (err) => {
console.log(err);
})
} else {
platform = "h5"
// initInputFile()
}
return platform
}
function isWxH5() {
let userAgent = window.navigator.userAgent.toLowerCase()
if (userAgent.toLowerCase().indexOf("micromessenger") !== -1) {
return true
}
return false
}
/**
* 获取是否是可信平台, 表单.
* @param {Array} whiteList 白名单.['tt']
* @return true 可信; false 不可信
*/
function isTrustedPlatform(object) {
let whiteList = object?.whiteList || []
let platform = window.mtl.platform
// 设置白名单
let isTrusted = whiteList.includes(platform)
if (!isTrusted) {
if (platform.indexOf("upesn") !== -1) {
// 友空间内, 尝试调用友空间函数, 确保UA没有被篡改
if (window.MTLWebViewJavascriptBridge && window.api) {
window.MTLWebViewJavascriptBridge.registerHandler("autoPermission", function (res) {
console.log(res);
});
isTrusted = true
}
} else if (platform.indexOf("tt") !== -1) {
if (tt?.chooseImage) {
isTrusted = true
}
} else if (platform.indexOf("dingtalk") !== -1) {
if (dd?.biz?.util?.chooseImage) {
isTrusted = true
}
} else if (platform.indexOf("wx") !== -1) {
if (wx?.chooseImage) {
isTrusted = true
}
}
}
return isTrusted
}
/**
* 初始化移动基础服务
* @param {string} url 移动基础服务地址, 'https://c1.yonyoucloud.com'
* @returns
*/
function initMobileService(object) {
const { url } = object
if (!url || url === "") {
object.fail && object.fail({ message: "url is null!", code: FAIL_CODE })
return
}
const hostUrl = new URL(url)
const origin = hostUrl.origin
const requestUrl = `${url}/rest/v1/mobile/app/workbench/env?host=${origin}`
let params = {
url: requestUrl,
method: "GET",
withCredentials: true,
responseType: "json",
headers: {
"content-type": "application/json;",
},
}
axios(params).then((response) => {
let res = response.data && response.status && response.headers ? response.data : response
let dataObj = convertToObject(res)
if (dataObj && dataObj.data) {
mtl.setStorage({
key: "key_mobile_app_url",
data: dataObj.data.mobileAppUrl,
})
}
object.success && object.success(dataObj)
}).catch((err) => {
object.fail && object.fail(err)
})
}
function initInputFile() {
let input = document.createElement("input")
input.type = "file"
input.accept = "image/*"
input.id = "mtlChooseImage"
input.name = "mtlChooseImage"
input.style.display = "none"
document.head && document.head.appendChild(input)
// initInputChooseFile()
// initInputVideoFile()
}
// 选择附件
function initInputChooseFile() {
let inputFile = document.createElement("input")
inputFile.type = "file"
inputFile.id = "mtlChooseFiles"
inputFile.name = "mtlChooseFiles"
inputFile.style.display = "none"
document.head && document.head.appendChild(inputFile)
}
// 选择视频
function initInputVideoFile() {
let inputFile = document.createElement("input")
inputFile.type = "file"
inputFile.id = "mtlChooseVideo"
inputFile.name = "mtlChooseVideo"
inputFile.style.display = "none"
document.head && document.head.appendChild(inputFile)
}
//设置MTL上下文Context
function setContext(object) {
mtl.setStorage({
domain: "mtl",
key: "mtlContext",
data: object,
})
}
// 加载cdn mtljs
function loadMtlCDNJs(object) {
const _obj = object || {}
const { url = `https://design.yonyoucloud.com/library/mtl/release/mtl.min.js`, type } = _obj
if (type && type === "all") {
loadCDNJS(url, _obj.success, _obj.fail)
} else {
if (isWxAndroid()) {
loadCDNJS(url, _obj.success, _obj.fail)
}
}
}
//加载js
function loadCDNJS(url, success, fail) {
if (url && !isLoadedJsScript(url)) {
var script = document.createElement("script")
script.type = "text/javascript"
script.src = url
script.onload = () => success && success(true)
script.onerror = (err) => fail && fail(err)
document.head.appendChild(script)
}
}
function isLoadedJsScript(url) {
for (var i = 0; i < document.scripts.length; i++) {
if (document.scripts[i].src == url) {
return true;
}
}
return false;
}
//判断平台是否wx-安卓
function isWxAndroid() {
const ua = window.navigator.userAgent
if (mtl.platform === "wx") {
if (ua.includes("Android") || ua.includes("Linux")) {
console.log("isWxAndroid success")
return true
}
}
console.log("isWxAndroid fail")
return false
}
//用户密码登录
function login(object = {}) {
console.warn("'login:' is deprecated; first deprecated in 6.2.13; use 'loginNew' function.")
loginRequest("login", object)
}
function loginNew(object = {}) {
loginRequest("loginNew", object)
}
function logout(object = {}) {
const { url, openUrl, yhtToken, wbAt, lang = "zh_CN" } = object
if (!!!url) {
let res = {
code: FAIL_CODE,
message: "url is null",
}
handleFailCallBack(object, res)
object.complete && object.complete(res)
return
}
if (!!!yhtToken || !!!wbAt) {
mtl.getStorage({
domain: "mtlLoginInfo",
key: "data",
success(res) {
const data = res.data || {}
if (data) {
let dataObj = typeof data === "string" ? JSON.parse(data) : data
const authToken = dataObj.yhtToken.yhtAccessToken
const wbAt = dataObj.sessionInfo.sessionId
logoutRequest({ ...object, url, yhtToken: authToken, wbAt: wbAt, lang, openUrl })
} else {
handleFailCallBack(object, { message: "Please log in again!", code: FAIL_CODE })
object.complete && object.complete({ message: "Please log in again!", code: FAIL_CODE })
}
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
} else {
logoutRequest(object)
}
}
function logoutRequest(object = {}) {
const { url, openUrl, yhtToken, wbAt, lang = "zh_CN" } = object
const vv = `yht_access_token=${yhtToken};wb_at=${wbAt};`
let newUrl = `${url}/rest/v1/mobile/user/logout`
requestAction({
requestType: 1,
url: `${newUrl}${/\?/.test(newUrl) ? "&" : "?"}lang=${lang}`,
method: "POST",
withCredentials: true,
responseType: "json",
headers: {
"content-type": "application/json;",
cookie: vv,
},
success(res) {
if (openUrl) {
mtl.navigateTo({
url: openUrl,
navShow: 0,
})
}
handleSuccessCallBack(object, res)
object.complete && object.complete(res)
mtl.removeStorage({
domain: "mtlLoginInfo",
key: "data",
})
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
}
//手机号验证码登录
function validateCodeLogin(object = {}) {
console.warn("'validateCodeLogin:' is deprecated; first deprecated in 6.2.13; use 'validateCodeLoginNew' function.")
loginRequest("validateCodeLogin", object)
}
function validateCodeLoginNew(object = {}) {
loginRequest("validateCodeLoginNew", object)
}
//自动登录
function autoLogin(object = {}) {
console.warn("'autoLogin:' is deprecated; first deprecated in 6.2.13; use 'autoLoginNew' function.")
autoLoginRequest("autoLogin", object)
}
function autoLoginNew(object = {}) {
autoLoginRequest("autoLoginNew", object)
}
function autoLoginRequest(type, object = {}) {
let path = object.url ? object.url : baseUrl
const lang = object.lang || "zh_CN"
if (type === "autoLoginNew") {
object.url = `${path}/rest/v1/mobile/login/token?lang=${lang}`
} else {
object.url = `${path}/mobile-app/rest/v1/mobile/login/token?lang=${lang}`
}
let params = object?.data || {}
mtl.getStorage({
domain: "mtlLoginInfo",
key: "data",
success(res) {
const data = res.data || {}
if (data) {
let dataObj = typeof data === "string" ? JSON.parse(data) : data
const authToken = dataObj.yhtToken.yhtAccessToken
const userId = dataObj.userInfo.userId
const tenantId = object.tenantId ? object.tenantId : ""
requestAction({
requestType: object.requestType,
url: object.url,
method: "POST",
data: {
userId: userId,
token: authToken,
tenantId: tenantId,
...params,
},
headers: {
"content-type": "application/json;",
},
responseType: "json",
success(res) {
let obj = convertToObject(res)
if (obj && obj.data) {
mtl.setStorage({
domain: "mtlLoginInfo",
key: "data",
data: obj.data,
})
}
handleSuccessCallBack(object, obj)
object.complete && object.complete(res)
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
} else {
handleFailCallBack(object, { message: "Please log in again!", code: FAIL_CODE })
object.complete && object.complete({ message: "Please log in again!", code: FAIL_CODE })
}
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
}
//发送验证码
function sendValidateCode(object = {}) {
console.warn("'sendValidateCode:' is deprecated; first deprecated in 6.2.13; use 'sendValidateCodeNew' function.")
sendValidateCodeRequest("send", object)
}
function sendValidateCodeNew(object = {}) {
sendValidateCodeRequest("sendNew", object)
}
function sendValidateCodeRequest(type, object) {
let path = object.url ? object.url : baseUrl
const lang = object.lang || "zh_CN"
if (type === "sendNew") {
object.url = `${path}/rest/v1/mobile/login/sendCode?lang=${lang}`
} else {
object.url = `${path}/mobile-app/rest/v1/mobile/login/sendCode?lang=${lang}`
}
object.method = "POST"
let data = {
username: object.mobile,
lang: object.lang || "",
}
delete object.username
requestAction({
requestType: object.requestType,
url: object.url,
method: "POST",
data: data,
headers: {
"content-type": "application/json;",
},
responseType: "json",
success(res) {
let dataObj = convertToObject(res)
handleSuccessCallBack(object, dataObj)
object.complete && object.complete(res)
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
}
//切换租户
function changeTenant(object) {
console.warn("'changeTenant:' is deprecated; first deprecated in 6.2.13; use 'changeTenantNew' function.")
autoLoginRequest("autoLogin", object)
}
function changeTenantNew(object) {
autoLoginRequest("autoLoginNew", object)
}
//获取wx应用列表
function getAppList(object) {
console.warn("'getAppList:' is deprecated; first deprecated in 6.2.13; use 'getAppListNew' function.")
getAppListRequest("getApp", object)
}
function getAppListNew(object) {
getAppListRequest("getAppNew", object)
}
function getAppListRequest(type, object) {
let path = object.url ? object.url : baseUrl
const lang = object.lang || "zh_CN"
if (type === "getAppNew") {
object.url = `${path}/rest/v1/mobile/app/vx/list?lang=${lang}`
} else {
object.url = `${path}/mobile-app/rest/v1/mobile/app/vx/list?lang=${lang}`
}
mtl.getStorage({
domain: "mtlLoginInfo",
key: "data",
success(res) {
const data = res.data || {}
if (data) {
let dataObj = typeof data === "string" ? JSON.parse(data) : data
const token = dataObj.yhtToken.yhtAccessToken
const userId = dataObj.userInfo.userId
const terminalType = mtl.platform
requestAction({
requestType: object.requestType,
url: object.url,
method: "GET",
params: {
yht_access_token: token,
terminalType: terminalType,
userId: userId,
lang: object.lang || "",
},
headers: {
"content-type": "application/json;",
},
responseType: "json",
success(res) {
let dataObj = convertToObject(res)
handleSuccessCallBack(object, dataObj)
object.complete && object.complete(res)
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
} else {
handleFailCallBack(object, { message: "Please log in again!", code: FAIL_CODE })
object.complete && object.complete({ message: "Please log in again!", code: FAIL_CODE })
}
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
}
//获取独立app应用列表
function getIndependenceAppList(object) {
let path = object.url ? object.url : baseUrl
const lang = object.lang || "zh_CN"
object.url = `${path}/rest/v1/mobile/app/workbench/list?lang=${lang}`
let param = {
appId: object.appId,
// lang: object.lang || "",
}
if (object.hasOwnProperty("includeApproveCenter")) {
param.includeApproveCenter = object.includeApproveCenter
}
let headers = object.headers ? object.headers : { "content-type": "application/json;" }
requestAction({
requestType: object.requestType,
url: object.url,
method: "GET",
params: param,
headers,
withCredentials: true,
responseType: "json",
success(res) {
let dataObj = convertToObject(res)
handleSuccessCallBack(object, dataObj)
object.complete && object.complete(res)
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
}
//获取友空间code
function getEsnCode(object = {}) {
console.warn("'getEsnCode:' is deprecated; first deprecated in 6.2.13; use 'getEsnCodeNew' function.")
getEsnCodeRequest("esnCode", object)
}
function getEsnCodeNew(object = {}) {
getEsnCodeRequest("esnCodeNew", object)
}
function getEsnCodeRequest(type, object) {
let path = object?.url || window.location.origin
const lang = object?.lang || "zh_CN"
if (type === "esnCodeNew") {
object.url = `${path}/rest/v1/mobile/user/yht/auth/code?lang=${lang}`
} else {
object.url = `${path}/mobile-app/rest/v1/mobile/user/yht/auth/code?lang=${lang}`
}
requestAction({
requestType: object?.requestType || "",
url: object.url,
method: "GET",
params: {
wb_at: object?.wb_at,
yhtAccessToken: object?.yht_access_token,
tenantId: object?.tenantId,
lang: lang,
},
headers: {
"content-type": "application/json;",
},
responseType: "json",
success(res) {
let dataObj = convertToObject(res)
handleSuccessCallBack(object, dataObj)
object.complete && object.complete(res)
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
}
//根据authCode获取wb_at和yht_access_token
function getYhtTokenWithCode(object = {}) {
console.warn("'getYhtTokenWithCode:' is deprecated; first deprecated in 6.2.13; use 'getYhtTokenWithCodeNew' function.")
getYhtTokenWithCodeRequest("tokenCode", object)
}
function getYhtTokenWithCodeNew(object = {}) {
getYhtTokenWithCodeRequest("tokenCodeNew", object)
}
function getYhtTokenWithCodeRequest(type, object) {
let path = object.url ? object.url : baseUrl
const lang = object.lang || "zh_CN"
if (type === "tokenCodeNew") {
object.url = `${path}/rest/v1/mobile/login/yqcode?lang=${lang}`
} else {
object.url = `${path}/mobile-app/rest/v1/mobile/login/yqcode?lang=${lang}`
}
requestAction({
requestType: object.requestType,
url: object.url,
method: "GET",
params: {
code: object.code,
lang: object.lang || "",
},
headers: {
"content-type": "application/json;",
},
withCredentials: true,
responseType: "json",
success(res) {
let dataObj = convertToObject(res)
handleSuccessCallBack(object, dataObj)
object.complete && object.complete(res)
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
}
//获取banner列表
function getBannerList(object = {}) {
console.warn("'getBannerList:' is deprecated; first deprecated in 6.2.13; use 'getBannerListNew' function.")
getBannerListRequest("banner", object)
}
function getBannerListNew(object = {}) {
getBannerListRequest("bannerNew", object)
}
function getBannerListRequest(type, object) {
let path = object.url ? object.url : baseUrl
let category = object.category
const lang = object.lang || "zh_CN"
if (type === "bannerNew") {
object.url = `${path}/rest/v1/mobile/banner/list?lang=${lang}`
} else {
object.url = `${path}/mobile-app/rest/v1/mobile/banner/list?lang=${lang}`
}
requestAction({
requestType: object.requestType,
url: object.url,
method: "GET",
params: {
category: category,
platform: mtl.platform,
// lang: object.lang || "",
},
headers: object.headers,
withCredentials: true,
responseType: "json",
success(res) {
let dataObj = convertToObject(res)
handleSuccessCallBack(object, dataObj)
object.complete && object.complete(res)
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
}
//匿名情况下获取用户基本信息
function getBaseUserInfo(object) {
let path = object.url ? object.url : baseUrl
const userId = object.userId
object.url = `${path}/rest/v1/mobile/user/anonymous/${userId}/info/simple`
requestAction({
requestType: object.requestType,
url: object.url,
method: "GET",
params: {
tenantId: object.tenantId,
},
headers: {
"content-type": "application/json;",
},
withCredentials: true,
responseType: "json",
success(res) {
handleSuccessCallBack(object, res)
object.complete && object.complete(res)
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
}
//小程序登录
function loginOfMiniProgram(object = {}) {
console.warn("'loginOfMiniProgram:' is deprecated; first deprecated in 6.2.13; use 'loginOfMiniProgramNew' function.")
loginOfMiniProgramRequest("miniLogin", object)
}
function loginOfMiniProgramNew(object = {}) {
loginOfMiniProgramRequest("miniLoginNew", object)
}
function loginOfMiniProgramRequest(type, object) {
let path = object.url ? object.url : baseUrl
const lang = object.lang || "zh_CN"
let url = `${path}/mobile-app/rest/v1/mobile/login/weChat?lang=${lang}`
if (type === "miniLoginNew") {
url = `${path}/rest/v1/mobile/login/weChat?lang=${lang}`
}
const paramsurl = getUrlParams() || {}
const { appCode, authCode, encryptedData, iv } = paramsurl
let ed = encryptedData + "=="
let niv = iv + "=="
let data = {
wxAppId: appCode,
wxCode: authCode,
encryptedData: ed,
iv: niv,
lang: object.lang || "",
}
requestAction({
requestType: 1,
url: url,
method: "POST",
data: data,
headers: {
"content-type": "application/json;",
},
responseType: "json",
success(res) {
let dataObj = convertToObject(res)
if (dataObj && dataObj.data) {
const code = dataObj.code
if (code === "1002") {
localStorage.setItem("wxOpenId", dataObj.data.attributes.openId)
} else if (code === "0") {
mtl.setStorage({
domain: "mtlLoginInfo",
key: "data",
data: dataObj.data,
})
localStorage.setItem("wxAppId", appCode)
if (dataObj.data.attributes?.openId) {
localStorage.setItem("wxOpenId", dataObj.data.attributes?.openId)
}
}
}
handleSuccessCallBack(object, dataObj)
object.complete && object.complete(dataObj)
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
}
//微信绑定方法
function bindUser(object, type) {
const openId = localStorage.getItem("wxOpenId")
const paramsurl = getUrlParams() || {}
const { appCode } = paramsurl
if (openId && openId !== "") {
const data = {
username: object.username,
password: object?.password,
tenantId: object.tenantId,
openId: openId,
wxAppId: appCode,
validateCodeType: "username",
lang: object.lang || "",
validateCode: "",
}
if (type === 2) {
data.validateCode = object.validateCode
data.username = object.mobile
data.validateCodeType = "mobile"
}
requestAction({
requestType: 1,
url: object.url,
method: "POST",
data: data,
headers: {
"content-type": "application/json;",
},
responseType: "json",
success(res) {
let dataObj = convertToObject(res)
if (dataObj && dataObj.data) {
mtl.setStorage({
domain: "mtlLoginInfo",
key: "data",
data: dataObj.data,
})
localStorage.setItem("wxAppId", appCode)
}
handleSuccessCallBack(object, dataObj)
object.complete && object.complete(dataObj)
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
} else {
const err = {
code: "1",
message: "no found openId",
}
handleFailCallBack(object, err)
object.complete && object.complete(err)
}
}
//微信解绑
function unBindUser(object = {}) {
console.warn("'unBindUser:' is deprecated; first deprecated in 6.2.13; use 'unBindUserNew' function.")
unBindUserRequest("miniUnbind", object)
}
function unBindUserNew(object = {}) {
unBindUserRequest("miniUnbindNew", object)
}
function unBindUserRequest(type, object) {
mtl.getStorage({
domain: "mtlLoginInfo",
key: "data",
success: function (res) {
const path = object.url ? object.url : baseUrl
const lang = object.lang || "zh_CN"
let url = `${path}/mobile-app/rest/v1/mobile/user/weChatUnbind?lang=${lang}`
if (type === "miniUnbindNew") {
url = `${path}/rest/v1/mobile/user/weChatUnbind?lang=${lang}`
}
const openId = localStorage.getItem("wxOpenId")
const wxAppId = localStorage.getItem("wxAppId")
const dataObj = convertToObject(res.data)
const yhtToken = dataObj.yhtToken.yhtAccessToken
const data = {
yhtToken: yhtToken,
openId: openId,
wxAppId: wxAppId,
lang: object.lang || "",
}
requestAction({
requestType: 1,
url: url,
method: "POST",
data: data,
headers: {
"content-type": "application/json;",
},
responseType: "json",
success(res) {
let dataObj = convertToObject(res)
handleSuccessCallBack(object, dataObj)
object.complete && object.complete(dataObj)
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
},
})
}
// 内部方法
function loginRequest(type, object) {
let path = object.url ? object.url : baseUrl
let lang = object.lang || "zh_CN"
let data = {}
switch (type) {
case "login":
case "loginNew":
if (mtl.platform === "wx") {
if (type === "loginNew") {
object.url = `${path}/rest/v1/mobile/login/weChatBindAndLogin?lang=${lang}`
} else {
object.url = `${path}/mobile-app/rest/v1/mobile/login/weChatBindAndLogin?lang=${lang}`
}
bindUser(object, 1)
return
} else {
if (type === "loginNew") {
object.url = `${path}/rest/v1/mobile/login/password?lang=${lang}`
} else {
object.url = `${path}/mobile-app/rest/v1/mobile/login/password?lang=${lang}`
}
data = {
...object,
tenantId: object.tenantId ? object.tenantId : "",
}
}
break
case "validateCodeLogin":
case "validateCodeLoginNew":
if (mtl.platform === "wx") {
if (type === "validateCodeLoginNew") {
object.url = `${path}/rest/v1/mobile/login/weChatBindAndLogin?lang=${lang}`
} else {
object.url = `${path}/mobile-app/rest/v1/mobile/login/weChatBindAndLogin?lang=${lang}`
}
bindUser(object, 2)
return
} else {
if (type === "validateCodeLoginNew") {
object.url = `${path}/rest/v1/mobile/login/validateCode?lang=${lang}`
} else {
object.url = `${path}/mobile-app/rest/v1/mobile/login/validateCode?lang=${lang}`
}
data = {
...object,
username: object.mobile,
tenantId: object.tenantId ? object.tenantId : "",
}
}
break
default:
break
}
requestAction({
requestType: object.requestType,
url: object.url,
method: "POST",
data: data,
headers: {
"content-type": "application/json;",
},
responseType: "json",
success(res) {
let dataObj = convertToObject(res)
if (dataObj && dataObj.data) {
mtl.setStorage({
domain: "mtlLoginInfo",
key: "data",
data: dataObj.data,
})
}
handleSuccessCallBack(object, dataObj)
object.complete && object.complete(dataObj)
},
fail(err) {
handleFailCallBack(object, err)
object.complete && object.complete(err)
},
})
}
//处理原生和H5的成功回调
function handleSuccessCallBack(object, res) {
if (mtl.platform === "ios" || mtl.platform === "android") {
window.mtl_handleCallback({
callbackId: object.callbackId,
data: res,
code: 0,
})
} else {
object.success && object.success(res)
}
}
//处理原生和H5的失败回调
function handleFailCallBack(object, err) {
if (mtl.platform === "ios" || mtl.platform === "android") {
window.mtl_handleCallback({
callbackId: object.callbackId,
msg: err.message,
code: err.code,
})
} else {
object.fail && object.fail(err)
}
}
// 内部方法
function requestAction(object = {}) {
const { requestType = "" } = object
if (requestType === "") {
delete object.requestType
axios(object)
.then((response) => {
let { status: code, statusText: message, data } = response
if (code === 200) {
object.success && object.success(data)
} else {
object.fail && object.fail({ code, message, data })
}
object.complete && object.complete({ code, message, data })
})
.catch((err) => {
// const result = { code: FAIL_CODE, message: err.message };
object.fail && object.fail(err)
object.complete && object.complete(err)
})
} else {
mtl.request({
url: object.url,
method: object.method,
params: object.method === "POST" ? object.data : object.params,
headers: object.headers,
paramsType: object.method === "POST" ? 1 : 0,
responseType: "json",
success(res) {
let { status: code, statusText: message, data } = res
if (code === 200) {
object.success && object.success(data)
} else {
object.fail && object.fail({ code, message, data })
}
object.complete && object.complete({ code, message, data })
},
fail: function (err) {
object.fail && object.fail(err)
object.complete && object.complete(err)
},
})
}
}
function convertToObject(res) {
let dataObj = res
if (typeof res === "string") {
try {
dataObj = JSON.parse(res)
} catch (error) {
dataObj = res
}
}
return dataObj
}
function getUrlParams() {
let res = {}
let serach = window.location.search
if (!serach || serach === "") {
serach = window.location.href.split("?").pop()
}
let str = decodeURIComponent(serach)
str = str.trim().replace(/^[?#&]/, "")
if (!str) {
return res
}
str.split("&").forEach((strItem) => {
if (strItem) {
let parts = strItem.split("=")
let partKey = parts[0],
partValue = parts[1] || ""
res[partKey] = partValue
}
})
return res
}
// 获取语言
function getExclusiveLanguage(obj = {}) {
let config = mtl.getStorageSync({
key: "key_lang",
})
if (!!!config) {
let useragent = window.navigator.userAgent.toLocaleLowerCase()
if (useragent.includes("youzonelanguage")) {
let newUas = useragent.split("youoneLanguage=")
if (newUas.length > 1) {
newUas = newUas[1].split(" ")
if (newUas > 0) {
config = newUas[0]
}
}
}
}
if (config) {
if (config === "tw") {
config = "zht"
} else if (config === "zh") {
config = "zhs"
}
} else {
config = "zhs"
}
obj.success && obj.success({ language: config })
obj.complete && obj.complete({ language: config })
}
// 获取平台(区分友空间专属版、海外版)
function getCurrentPlatform() {
let platform = getPlatform()
// 友空间公有云
let userAgent = window.navigator.userAgent
if (userAgent.indexOf("QYZone_YonYouPrivateCloud") !== -1) {
platform = "PrivateCloud"
} else if (userAgent.indexOf("QYZone_OverSea") !== -1) {
platform = "OverSea"
} else if (userAgent.indexOf("QYZone_OverSea_HarmonyOS") !== -1) {
platform = "QYZone_OverSea_HarmonyOS"
} else if (userAgent.indexOf("QYZone_Exclusive_HarmonyOS") !== -1) {
// 鸿蒙专属版
platform = "QYZone_Exclusive_HarmonyOS"
}
if (userAgent.indexOf("QYZone_OverSea_PrivateCloud") !== -1) {
// 友空间私有版 海外发布
platform = "QYZone_OverSea_PrivateCloud"
} else if (userAgent.indexOf("QYZone_OverSea_PrivateCloud_HarmonyOS") !== -1) {
// 友空间鸿蒙私有版 海外发布
platform = "QYZone_OverSea_PrivateCloud_HarmonyOS"
}
return platform
}
/**
* 获取指定的多数据中心域名
* @param {string} serviceCode 服务编码
* @param {string} tenantId 租户ID
* @param {string} success 成功的回调
* @param {string} fail 失败的回调
*/
function getDomain(params) {
if (params?.serviceCode) {
return
}
let serviceCode = params?.serviceCode
let tenantId = params?.tenantId
// 获取域名
mtl.getMultiDataCenterConfig({
success: (res) => {
if (Object.keys(res).length === 0) {
params?.success(window.location.origin)
return
}
let domainUrl = ''
// 如果 serviceCode 存在需要查询是否在多数据中心环境
let multidataCodeList = res.multidata?.multidataCode // 多数据中心域名
let domainCodeList = res.domain?.domainCode // 社会化服务域名
if (multidataCodeList[serviceCode]) {
domainUrl = res.multidata.multidataUrl[tenantId || res.currentTenantID]
} else if (domainCodeList[serviceCode]) {
domainUrl = res.domain.domainUrl // 社会化域名
} else {
domainUrl = window.location.origin // 当前环境域名
}
params?.success(domainUrl)
},
fail: (err) => {
console.log("getMultiDataCenterConfig bridge no exist");
// 处理私有版
if (mtl.platform === "APIIos" || mtl.platform === "APIAndroid") {
// 友空间私有版 需要额外处理
mtl.getStorage({
key: 'key_base_url',
success: (res) => {
console.log("API key_base_url = ", res)
params?.success(res?.data || window.location.origin)
},
fail: (err) => {
params?.success(window.location.origin)
},
})
} else {
params?.success(window.location.origin)
}
}
})
}
export default {
platform: getPlatform(),
systemType: getSystemType,
apiUpesn: apiUpesn,
upesnVersion,
isWxH5: isWxH5(),
NAVITYPE,
getDomain,
setContext,
login,
loginNew,
validateCodeLogin,
validateCodeLoginNew,
autoLogin,
autoLoginNew,
sendValidateCode,
sendValidateCodeNew,
changeTenant,
changeTenantNew,
getAppList,
getAppListNew,
getEsnCode,
getEsnCodeNew,
getYhtTokenWithCode,
getYhtTokenWithCodeNew,
getBannerList,
getBannerListNew,
getBaseUserInfo,
getIndependenceAppList,
loadMtlCDNJs,
loadCDNJS,
loginOfMiniProgram,
loginOfMiniProgramNew,
unBindUser,
unBindUserNew,
getExclusiveLanguage,
logout,
initMobileService,
currentPlatform: getCurrentPlatform(),
isTrustedPlatform,
}