ZhiYeJianKang_PeiXun/Song.Site/Utility/CoreScripts/api.js
2025-02-20 15:41:53 +08:00

472 lines
19 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*!
* 主 题API调用方法
* 说 明用于调用Restful api接口的js方法。
* 功能描述:
* 1、封装api调用方法采用axios异步读取服务端支持get,post,delete,put,patch,options六种方式
* 2、数据提交与返回均经过url编码与解码
* 3、一些常用方法如$api.trimquerystring,cookies等
*
*
* 作 者:宋雷鸣 10522779@qq.com
* 开发时间: 2019年5月20日
*/
(function () {
var config = {
//api的版本号
versions: ["", "1", "2"],
versionDefault: "1", //默认版本号
//调用地址的根路径
baseURL: '',
pathUrl: "/api/v{0}/", //url路径
};
//版权信息
var copyright = {};
//一些常用方法
var methods = {
//生成axios调用的路径,
//vesion:api版本号,
//way:api方法名如/api/v1/[account/del]
url: function (version, way) {
if (way === undefined) throw 'api名称不得为空';
var url = config.pathUrl.replace("{0}", version);
//调用地址的根路径可以在此处理,(如果需要跨多台服务器请求的话)
if (config.baseURL != '') url = config.baseURL + url;
return url + way;
},
//获取url中的参数
querystring: function (url, key) {
if (arguments.length == 1) key = arguments[0];
if (arguments.length <= 1) url = String(window.document.location.href);
if (url.indexOf("?") < 0) return "";
//取所有参数
var values = new Array();
var query = url.substring(url.lastIndexOf("?") + 1).split('&');
for (var q in query) {
var arr = query[q].split('=');
if (arr.length < 2) continue;
if (arr[1].indexOf("#") > -1) arr[1] = arr[1].substring(0, arr[1].indexOf("#"));
arr[1] = decodeURI(arr[1]).replace(/<[^>]+>/g, "");
values.push({
key: arr[0],
val: arr[1]
});
}
//返回
if (arguments.length == 0) return values;
if (arguments.length == 1) {
for (var q in values) {
if (values[q].key.toLowerCase() == key.toLowerCase())
return values[q].val;
}
}
return "";
},
setpara: function (key, value) {
//获取所有参数
var values = methods.querystring();
var isExist = false;
for (var q in values) {
if (values[q].key.toLowerCase() == key.toLowerCase()) {
values[q].val = value;
isExist = true;
}
}
if (!isExist) values.push({
key: key,
val: value
});
//拼接Url
var url = String(window.document.location.href);
if (url.indexOf("?") > -1) url = url.substring(0, url.lastIndexOf("?"));
var parastr = "";
for (var i = 0; i < values.length; i++) {
parastr += values[i].key + "=" + values[i].val;
if (i < values.length - 1) parastr += "&";
}
return url + "?" + parastr;
},
//去除两端空格
trim: function (str) {
return str.replace(/^\s*|\s*$/g, '').replace(/^\n+|\n+$/g, "");
},
//将数据url解码
unescape: function (data) {
var typeName = methods.getType(data);
if (typeName == 'String') return unescape(data);
if (typeName == 'Object') return handleObject(data);
if (typeName == 'Array') return handleArray(data);
//反常时间的处理,如果时间处于一百年前,则返回空值
function abnormalTime(date) {
var now = new Date();
var y = now.getFullYear();
var m = now.getMonth();
var d = now.getDate();
now = new Date(y - 100, m < 10 ? '0' + m : m, d < 10 ? ('0' + d) : d);
if (date > now) return date;
return '';
}
//解码对象
function handleObject(data) {
for (var key in data) {
var typeName = methods.getType(data[key]);
if (typeName == 'String')
data[key] = unescape(data[key]);
if (typeName == 'Date')
data[key] = abnormalTime(data[key]);
if (typeName == 'Array')
data[key] = handleArray(data[key]);
if (typeName == 'Object')
data[key] = handleObject(data[key]);
}
return data;
}
//解码数组
function handleArray(data) {
for (var d in data) {
data[d] = handleObject(data[d]);
}
return data;
}
return data;
},
//判断数据类型
getType: function (data) {
var getType = Object.prototype.toString;
var myType = getType.call(data); //调用call方法判断类型结果返回形如[object Function]
var typeName = myType.slice(8, -1); //[object Function],即取除了“[object ”的字符串。
return typeName;
},
//storage存储
storage: function (key, value) {
var isAndroid = (/android/gi).test(navigator.appVersion);
var uzStorage = function () {
var ls = window.localStorage;
if (isAndroid) ls = window.localStorage;
return ls;
};
//如果只有一个参数,为读取
if (arguments.length === 1) {
var ls = uzStorage();
if (ls) {
var v = ls.getItem(key);
if (!v) return;
if (v.indexOf('obj-') === 0) {
v = v.slice(4);
return JSON.parse(v);
} else if (v.indexOf('str-') === 0) {
return v.slice(4);
}
}
}
//如果两个参数,为写入,第一个为键,第二个为值
if (arguments.length === 2) {
if (value != null) {
var v = typeof value == 'object' ? 'obj-' + JSON.stringify(value) : 'str-' + value;
var ls = uzStorage();
if (ls) ls.setItem(key, v);
} else {
var ls = uzStorage();
if (ls && key) {
ls.removeItem(key);
}
}
}
},
cookie: function (name, value, options) {
if (typeof value != 'undefined') { // name and value given, set cookie
options = options || {};
if (value === null) {
value = '';
options.expires = -1;
}
var expires = '';
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
var date;
if (typeof options.expires == 'number') {
date = new Date();
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
} else {
date = options.expires;
}
expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
}
var path = options.path ? '; path=' + options.path : '; path=/';
var domain = options.domain ? '; domain=' + options.domain : '';
var secure = options.secure ? '; secure' : '';
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
} else { // only name given, get cookie
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = methods.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
},
//记录或获取登录状态值
loginstatus: function (key, code) {
var storagename = 'weishakei_loginstatus';
var status = methods.storage(storagename);
//读取
if (arguments.length <= 1) {
if (status == null || !(status instanceof Array)) return '';
var str = '';
if (arguments.length == 0) {
for (var i = 0; i < status.length; i++) {
if (!!status[i].val) str += status[i].val;
if (i < status.length - 1) str += ',';
}
}
if (arguments.length == 1) {
for (var t in status) {
if (!!status[t].key && status[t].key == key)
str = status[t].val;
}
}
return str;
}
//写入
if (arguments.length == 2) {
if (status == null || !(status instanceof Array)) status = [];
var isexist = false;
for (var t in status) {
if (!!status[t].key && status[t].key == key) {
status[t].val = code;
isexist = true;
}
}
if (!isexist) status.push({
key: key,
val: code
});
methods.storage(storagename, status);
return status;
}
},
//判断变量是否是对象
isobj: function (obj) {
return Object.prototype.toString.call(obj) === '[object Object]';
},
//在线浏览pdf文件
pdfViewer: function (file) {
var viewer = "/Utility/PdfViewer/viewer.html";
if (file.indexOf("?") > -1) file = file.substring(0, file.indexOf("?"));
viewer += "?file=" + encodeURIComponent(file);
//window.location.href = viewer;
return viewer;
}
};
//api操作的具体对象和方法
var apiObj = function (version) {
//加载效果参数前者为一般loading效果后者一般为去除loading
this.effect = function (loading, loaded) {
this.loadeffect.before = loading;
this.loadeffect.after = loaded;
return this;
}
this.loadeffect = {
before: null,
after: null
};
//当前api要请求的服务端接口的版本号
this.version = version == null ? config.versionDefault : version;
var httpverb = ['get', 'post', 'delete', 'put', 'patch', 'options'];
for (var i = 0; i < httpverb.length; i++) {
var el = httpverb[i];
var tm = "this." + el + " = function (way, parameters,loading,loaded) {return this.query(way, parameters, '" + el + "',loading,loaded,'json');}";
eval(tm);
}
var self = this;
//创建请求对象,以及拦截器
//way:接口方法
//returntype:返回数据的类型Json或xml
this.query = function (way, parameters, method, loading, loaded, returntype) {
var url = methods.url(this.version, way);
if (arguments.length < 2 || parameters == null) parameters = {};
if (arguments.length < 3 || method == null || method == '') method = 'get';
//开始时间
var startTime = new Date();
//console.log(startTime);
//创建axiso对象
var instance = axios.create({
method: method != 'get' ? 'post' : 'get',
url: url,
headers: {
'X-Custom-Header': 'weishakeji',
'Access-Control-Allow-Headers': 'X-Requested-With',
'content-type': 'application/x-www-form-urlencoded',
'Access-Control-Allow-Methods': 'POST,GET,DELETE,PUT,PATCH,HEAD,OPTIONS'
},
auth: {
username: 'weishakeji ' + method + ' ' + returntype + ' ' + window.location,
password: methods.loginstatus()
},
timeout: 60 * 1000,
returntype: returntype
});
//添加请求拦截器(即请求之前)
instance.interceptors.request.use(function (config) {
if (loading == null) loading = self.loadeffect.before;
if (loading != null) loading(config);
//在发送请求之前做某件事
if (config.method != 'get') {
var formData = new FormData();
for (var d in config.data) {
var typeName = methods.getType(config.data[d]);
if (typeName == 'Date') {
formData.append(d, config.data[d].getTime());
continue;
}
//json值序列化为字符串
if (typeName === 'Object') {
formData.append(d,escape(JSON.stringify(config.data[d])));
continue;
}
formData.append(d, escape(config.data[d]));
}
config.data = formData;
} else {
//克隆参数对象因为上传的参数要escape转码需要保留原数据类型
var tmpObj = new Object();
for (var d in config.params) {
var typeName = methods.getType(config.params[d]);
if (typeName == 'Date') {
tmpObj[d] = config.params[d].getTime();
continue;
}
//json值序列化为字符串
if (typeName === 'Object') {
tmpObj[d] = escape(JSON.stringify(config.params[d]));
continue;
}
tmpObj[d] = escape(config.params[d]);
}
config.params = tmpObj;
}
return config;
}, function (error) {
console.log('错误的传参');
if (loaded == null) loaded = self.loadeffect.after;
if (loading != null) loaded(config, error);
//return Promise.reject(error);
});
//添加响应拦截器(即返回之后)
instance.interceptors.response.use(function (response) {
response.text = response.data;
//如果返回的数据是字符串这里转为json
if (response.config.returntype == "json") {
if (typeof (response.data) == 'string') {
response.data = eval("(" + response.data + ")");
}
//处理数据服务器端返回的数据是经过Url编码的此处进行解码
response.data = methods.unescape(response.data);
if (response.data.result != null) {
if (typeof (response.data.result) == 'string') {
try {
response.data.result = eval("(" + response.data.result + ")");
} catch (err) {
//alert(err);
}
}
}
}
//计算执行耗时
if (response.data) {
response.data['webspan'] = new Date() - startTime;
}
//执行加载完成后的方法
if (loaded == null) loaded = self.loadeffect.after;
if (loaded != null) loaded(response, null);
return response;
}, function (error) {
if (loaded == null) loaded = self.loadeffect.after;
if (loaded != null) loaded(null, error);
//return Promise.reject(error);
});
//如果是get方式参数名是params非get参数名是data
if (method == 'get') {
return instance.request({
params: parameters
});
} else {
return instance.request({
data: parameters
});
}
}
//一次获取多个数据
this.bat = function (queryArr) {
if (arguments.length == 0) return null;
if (arguments.length == 1) return queryArr;
return axios.all(arguments);
}
//常用方法加到$api根方便调用
for (var m in methods) {
eval("this." + m + "=" + methods[m] + ";");
}
};
//创建$api调用对象
for (var v in config.versions) {
var str = config.versions[v] == "" ?
"window.$api = new apiObj();" :
"window.$api.v" + config.versions[v] + "= new apiObj('" + config.versions[v] + "')";
eval(str);
}
})();
//异步获取数据的示例
//$api.get("/dd/xx");
/* $api.v1.post("/dd/xx",{id:1}).then(function(req){
.....
});*/
/*一次获取多个数据
$api.bat(
$api.get("Outline/tree", { couid: $api.querystring("couid") }),
$api.get("Course/ForID", { id: $api.querystring("couid") })
).then(axios.spread(function (req, cur) {
if (req.data.success) {
var outlines = req.data.result;
}
}));
*/
//日期格式化
Date.prototype.format = function (fmt) {
var o = {
"M+": this.getMonth() + 1,
"d+": this.getDate(),
"h+": this.getHours()
};
if (/(y+)/.test(fmt))
fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt))
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
//添加加载前后的事件
$api.effect(function () {
}, function (response, err) {
//请求网址
var url = response.config.url;
url = url.substring(url.indexOf('/v1/') + 3);
//请求参数
var para = JSON.stringify(response.config.params);
para = para == undefined ? '' : para;
//时长
var exec = response.data.execspan;
var span = response.data.webspan;
console.log(url + '' + para + ' 用时 ' + span + ' 毫秒,服务端 ' + exec + ' 毫秒');
//console.log(response);
});