| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 | import $app from './app';import $config from './config';const api = {};// 网络请求封装const Request = function(opts){	const originalComplete = opts.complete;	return new Promise((resolve,reject)=>{		uni.request(Object.assign({},opts,{			complete:(res)=>{				const hasSuccess = Boolean(res.errMsg=='request:ok' && res.statusCode >= 200 && res.statusCode < 300);				hasSuccess?resolve(res.data):reject(res);				if(originalComplete && typeof originalComplete=='function') originalComplete(res);			}		}));	});}// 路径拼接const pathJoin = function(...args){	return args.join('/').replace(/(?<!:)(\/{2,})/g,'/');}// 显示LOADINGconst showLoading = function(){	uni.showLoading({title: '',mask: true});}// 关闭LOADINGconst hideLoading = function(){	uni.hideLoading();}// 获取用户TOKENconst getUserToken = function(){	return uni.getStorageSync($config.keyname.userToken);}/** * 基础请求 * @param {String} method 请求类型 * @param {String} url 请求地址 * @param {Object} data 请求数据 * @param {Object} opts	配置参数 */api.base = function(method,url,data,opts){	return new Promise(async (resolve,reject)=>{		const options = Object.assign({			// 请求地址			url: pathJoin($config.url.request,url),			// 请求数据			data: data || {},			// 请求类型			method: method || 'post',			// 数据类型			dataType: 'json',			// 自动显示LOADING			loading: true,			// 启用错误自动拦截			error: true,			// 请求头设定			header:{				'content-type': 'application/json',				'token': getUserToken()			},			// 设置显示LOADING的方法			showLoading: showLoading,			// 设置关闭LOADING的方法			hideLoading: hideLoading		},opts || {});				if(options.loading && typeof options.showLoading =='function'){			options.showLoading();		}		Request(options).then(async res=>{			if(options.loading && typeof options.hideLoading =='function'){				options.hideLoading();			}			switch(res.code){				// 请求正常				case 0:					resolve(res);				break;				// 约定401为未登录状态				case 201:					try{						await api.login();					}catch(err){						reject(err);					}					options.header.token = getUserToken();					try{						const db = await Request(options);						resolve(db);					}catch(err){						reject(err);					}				break;				// 其他错误请求				default:					if(options.error){						$app.popup.alert(res.msg || `${url}\r\n未知错误`,'数据请求');					}else{						reject(res);					}				break;			}		}).catch(async err=>{			/*失败处理,此处为非200状态码引起的错误*/			options.hideLoading();			$app.popup.alert( `服务器响应失败\r\n${err.errMsg}`,'数据请求');		});	});}/** * POST请求 * @param {String} url 请求地址 * @param {Object} data 请求数据 * @param {Object} opts 配置参数 */api.post = function(url,data,opts){	return api.base('post',url,data,Object.assign({},opts));}/** * GET请求 * @param {String} url 请求地址 * @param {Object} data 请求数据 * @param {Object} opts 配置参数 */api.get = function(url,data,opts){	return api.base('get',url,data,Object.assign({},opts));}/** * 获取静态数据 * @param {String} url 静态文件地址 * @param {Object} data 参数数据 * @param {Object} opts 配置参数 */api.static = function(url,data,opts){	return new Promise(async (resolve,reject)=>{		// 设置选项		var _opts = Object.assign({			url: /^http/.test(url)?url:API_BASE+(url||''),			data: Object.assign({cache:Date.now()},data),		},opts || {});		uni.request({			..._opts,			success: res =>{				resolve(res.data);			}		});	});}/** * 文件上传 * @param {String} file 文件临时路径 * @param {Object} opts 上传参数 */api.upload = function(file,opts){	return new Promise((resolve,reject)=>{		const options = Object.assign({			// 请求地址			url: pathJoin($config.url.upload,opts?.url || ''),			// 请求数据			filePath: file,			// 自动显示LOADING			loading: true,			// 启用错误自动拦截			error: true,			// 请求头设定			header:{				'token': uni.getStorageSync($config.keyname.userToken)			},			// 设置显示LOADING的方法			showLoading: showLoading,			// 设置关闭LOADING的方法			hideLoading: hideLoading		},opts || {});	});}/** * 获取登录code */api.userCode = function(){	return new Promise((resolve,reject)=>{		uni.login({			provider: 'weixin',			success: res => resolve(res.code),			fail: err => reject(err)		});	});}/** * 自动登录 * @param {Object} data 登录数据(非必填) */api.login = function(data){	return new Promise(async (resolve,reject)=>{		const code = await api.userCode();		api.post($config.api.login,{...data||{},code}).then(async res=>{			uni.setStorageSync($config.keyname.userToken,res?.token);			uni.setStorageSync($config.keyname.userInfo,res?.userInfo);			resolve(res.token);		}).catch(err=>reject(err));	});}export default api;
 |