mtl-js-sdk
Version:
ynf-fw-mtl-api
477 lines (463 loc) • 14.7 kB
JavaScript
import xaxios from 'axios'
import utils from './utils'
const axios = xaxios?.default || xaxios
let {
getQuery,
isObject,
config: { failCode }
} = utils;
let { code: upesncode } = getQuery();
let appcode = localStorage.getItem('MTLNccAppCode');
if (!appcode || appcode === '') {
appcode = getQuery().appcode;
}
let langCode = utils.getLangCode();
//let loginInfo = utils.getLoginInfo(true, appcode);
let businessCode = "";
let loginStatus = "start";
//目前固定的
let _deviceId = utils.getDeviceId(appcode);
//默认执行 目前自动登录 关闭 调用callaction 自动登录
// first();
function failFun(options, result) {
if (options.fail) options.fail(result);
if (options.complete) options.complete(result);
}
function callAction(options) {
if (!options || !isObject(options)) {
const result = {
code: failCode,
message: "parameters is error, type is Object"
};
failFun(options, result);
}
console.log("callAction -> logionStatus is " + loginStatus);
console.log("platform -> logionStatus is " + options.isLogin);
let appcode = localStorage.getItem('MTLNccAppCode');
if (!appcode || appcode === '') {
appcode = getQuery().appcode;
}
let _token = utils.getLoginInfo(false, appcode).token || '';
if (options.inWhiteList || loginStatus === "success" || _token !== '' || options.isLogin) {
ucgajax(options);
} else if (
loginStatus === "doing" ||
loginStatus === "start" ||
loginStatus === "fail"
) {
const result = {
code: failCode,
message: "Currently not logged in!"
};
failFun(options, result);
}
}
function loginCheck(options, url, type) {
if (!options || !isObject(options)) {
const result = {
code: failCode,
message: "parameters is error, type is Object"
};
failFun(options, result);
}
console.log("callAction - logionStatus is " + loginStatus);
let _token = utils.getLoginInfo(false, appcode).token || '';
if (options.inWhiteList || loginStatus === "success" || _token !== '') {
if (type === 1) {
uploadToucg(options, url);
} else {
downloadToucg(options, url);
}
} else if (
loginStatus === "doing" ||
loginStatus === "start" ||
loginStatus === "fail"
) {
const result = {
code: failCode,
message: "Currently not logged in!"
};
failFun(options, result);
}
}
function uploadToucg(options, url) {
let host = (options.host && options.host != '') ? options.host : utils.getOrigin();
let { params = {}, headers = {}, filePath } = options;
let appcode = localStorage.getItem('MTLNccAppCode');
if (!appcode || appcode === '') {
appcode = getQuery().appcode;
}
let _token = utils.getLoginInfo(false, appcode).token;
if (!/^\//.test(url)) {
url = "/" + url;
}
headers = {
token: _token,
terminalType: "UPESN",
deviceId: _deviceId,
...headers
};
let data = {
url: host + url,
headers: headers,
header: headers,
formData: params,
filePath: filePath,
appCode: appcode,
...options
};
console.log("ncc-uploadFile: ", data);
mtl.uploadFile(data);
}
function downloadToucg(options, url) {
let host = (options.host && options.host != '') ? options.host : utils.getOrigin();
let { params = {}, headers = {} } = options;
let appcode = localStorage.getItem('MTLNccAppCode');
if (!appcode || appcode === '') {
appcode = getQuery().appcode;
}
let _token = utils.getLoginInfo(false, appcode).token;
if (!/^\//.test(url)) {
url = "/" + url;
}
headers = {
token: _token,
terminalType: "UPESN",
deviceId: _deviceId,
...headers
};
let data = {
url: host + url,
headers: headers,
header: headers,
formBody: params,
appCode: appcode,
...options
};
console.log("ncc-downFile: ", data);
mtl.downloadFile(data);
}
function uploadFile(options) {
loginCheck(options, "nccloud/mobile/file/upload", 1);
}
function downloadFile(options) {
loginCheck(options, "nccloud/mobile/file/download", 0);
}
function ucgajax(options) {
let { params = {}, headers = {}, config = {}, isCommon, router, host } = options;
let url = isCommon ? router : options.url;
// 当应用之间互相跳转时,从localStorage中拿到的appcode不能准确对应,改为从url上获取
let appcode = getQuery().appcode;
if (!appcode || appcode === '') {
appcode = localStorage.getItem('MTLNccAppCode');
}
console.log("appcode: ", appcode);
let _token = utils.getLoginInfo(false, appcode).token;
console.log("_token: ", _token);
if (!/^\//.test(url) && !/^http/.test(url)) {
url = "/" + url;
}
let _sysParamJson = {
busiaction: "ucg-api-" + appcode,
appCode: appcode,
langCode: langCode,
ts: utils.getTime(),
...params.sysParamJson
};
let body;
if (isCommon) {
body = {
url: options.url,
method: "POST",
body: {
...params,
sysParamJson: _sysParamJson
}
};
} else {
body = {
...params,
sysParamJson: _sysParamJson
};
}
let data = {
url,
_suffix: "",
appCode: appcode,
config: config,
data: body,
headers: {
token: _token,
terminalType: "UPESN",
deviceId: _deviceId,
...headers
},
fail: err => {
failFun(options, err);
},
complete: res => {
options.complete && options.complete(res);
if (res.code == "200") {
//ncc业务系统全部使用 res.data 统一适配
options.success && options.success(res.data);
}
}
};
mtl.ucg.callAction(data);
}
function clearLoginStorage(code) {
utils.clearLoginStorage(code || appcode);
loginStatus = "start";
}
function checkParams(options) {
if (!options || !isObject(options)) {
const result = {
code: failCode,
message: "parameters is error, type is Object"
};
failFun(options, result);
return false;
}
const { isCommon, appCode, upesnCode, url } = options;
if (isCommon) {
businessCode = options.businessCode;
} else {
businessCode = "common";
}
if (!url) {
options.url = getTokenUrl(businessCode);
}
//如果没有传递默认从url中获取code
if (!appCode) {
options.appCode = getQuery().appcode;
}
if (!upesnCode) {
options.upesnCode = getQuery().upesncode;
}
return true;
}
function _login(options) {
//处理请求参数
if (!checkParams(options)) {
return;
}
//如果是友空间平台动态获取友空间code
if (mtl.platform == "upesn") {
mtl.getOAuthCode({
success: function (res) {
upesncode = res.OAuthCode;
console.log("getOAuthCode :" + upesncode);
if (!upesncode) {
failFun(
options,
`appcode: ${options.appCode}, getOAuthCode upesncode: ${upesncode}`
);
return;
}
options.upesnCode = upesncode;
getToken(options);
},
fail: function () {
failFun(options, ` getOAuthCode upesncode: ${upesncode}`);
}
});
} else {
getToken(options);
}
}
//处理完参数获取token
function getToken(options) {
let promise = new Promise((resolve, reject) => {
const data = {
url: options.url,
headers: {
"Content-Type": "application/json",
},
data: {
userCode: options.userCode || '',
deviceId: _deviceId,
appCode: options.appCode,
langCode: langCode || "zh",
code: options.upesnCode,
terminalType: "UPESN"
},
method: "post",
success: res => {
loginStatus = "end";
if (isObject(res.message)) {
res = res.message
}
if (res.code == 200 && isObject(res.data)) {
loginStatus = "success";
utils.setLoginInfo(options.appCode, res.data);
localStorage.setItem('MTLNccAppCode', options.appCode);
}
resolve(res);
},
fail: err => {
loginStatus = "fail";
reject(err);
}
};
request(data);
});
promise.then(res => {
options.success && options.success(res);
options.complete && options.complete(res);
}).catch(err => {
console.log('hhh:', err);
oldGetToken(options)
// options.fail && options.fail(err);
// options.complete && options.complete(err);
});
}
function getTokenUrl(businessCode) {
return `/nccloud/${businessCode}/oauth/multiuser/getToken`;
}
function login(options) {
// let loginInfo = utils.getLoginInfo(false, options.appCode)
// if (loginInfo) {
// let { expiretime } = loginInfo
// if (Date.now() < Number(expiretime)) {
// setTimeout(() => {
// // 直接走缓存token
// let res = {
// isCache: true
// }
// loginStatus = "success";
// options.success && options.success(res);
// options.complete && options.complete(res);
// }, 0);
// return
// }
// }
// 新版登录通过url上yycode去换取token,旧版是通过友空间的jsbridge的方式拿code的
// 对于小程序,yycode由外部获取之后传入给登录方法
let yycode = options.yycode || getQuery().yycode;
if (!yycode) {
_login(options);
return;
}
options.yycode = yycode;
yqlGetToken(options).then(res => {
if (res.code == 200) {
options.success && options.success(res);
} else {
options.fail && options.fail(res);
}
options.complete && options.complete(res);
}).catch(err => {
console.log('YQL login fail:', err);
_login(options)
});
}
// 友企连 登录
function yqlGetToken(options) {
let userAgent = navigator.userAgent;
let match = userAgent.match(/yht_access_token=(\S+)(\b|\s*)/)
let yhttoken = (match && match[1]) || '';
const { host = utils.getOrigin() } = options;
return new Promise((resolve, reject) => {
let data = {
loginType: "7",
userCode: options.userCode || '',
deviceId: _deviceId,
appCode: options.appCode,
langCode: langCode || "zh",
terminalType: "UPESN",
yhttoken,
yycode: options.yycode,
...options.otherParams
}
// 多用户处理
if (options.userCode) {
let { tenantId, yhtUserId } = getQuery();
let param = {
loginType: '8',
tenantId: options.tenantId || tenantId, // 当option里拿不到就从url上拿
yhtUserId: options.yhtUserId || yhtUserId,
phone: options.phone
}
Object.assign(data, param)
}
const requestParams = {
url: host + '/nccloud/mobile/oauth/getToken',
headers: {
"Content-Type": "application/json",
},
data,
method: "post",
success: res => {
loginStatus = "end";
if (res.code == 200 && res.data.token) {
loginStatus = "success";
utils.setLoginInfo(options.appCode, res.data);
localStorage.setItem('MTLNccAppCode', options.appCode);
}
resolve(res);
},
fail: err => {
loginStatus = "fail"; // 重新按旧的方式登录
reject(err);
}
};
request(requestParams);
})
}
function oldGetToken(options) {
let appcode = options.appcode || options.appCode;
let { isCommon } = options;
if (isCommon) {
businessCode = options.businessCode;
} else {
businessCode = "common";
}
loginStatus = "doing";
let promise = new Promise((resolve, reject) => {
var data = {
// url: `/nccloud/${businessCode}/oauth/mobile/getToken`,
url: `/nccloud/${businessCode}/oauth/getToken`,
terminalType: "UPESN",
deviceId: _deviceId,
appCode: appcode,
_suffix: "",
langCode: langCode || "zh",
code: options.upesncode || options.upesnCode,
success: res => {
loginStatus = "success";
utils.setLoginInfo(appcode, res.data);
localStorage.setItem('MTLNccAppCode', appcode);
resolve(res);
},
fail: err => {
loginStatus = "fail";
reject(err);
}
};
console.log('mtl.ucg.getToken success');
mtl.ucg.getToken(data);
});
promise.then(res => {
options.success && options.success(res);
options.complete && options.complete(res);
}).catch(err => {
options.fail && options.fail(err);
options.complete && options.complete(err);
});
}
function request(object) {
axios(object).then(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 });
}).catch(err => {
const result = { code: 1, message: err.message };
object.fail && object.fail(result);
object.complete && object.complete(result);
});
}
export default { callAction, login, uploadFile, downloadFile, clearLoginStorage };