api.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. import $app from './app';
  2. import $config from './config';
  3. const api = {};
  4. // 网络请求封装
  5. const Request = function(opts){
  6. const originalComplete = opts.complete;
  7. return new Promise((resolve,reject)=>{
  8. uni.request(Object.assign({},opts,{
  9. complete:(res)=>{
  10. const hasSuccess = Boolean(res.errMsg=='request:ok' && res.statusCode >= 200 && res.statusCode < 300);
  11. hasSuccess?resolve(res.data):reject(res);
  12. if(originalComplete && typeof originalComplete=='function') originalComplete(res);
  13. }
  14. }));
  15. });
  16. }
  17. // 路径拼接
  18. const pathJoin = function(...args){
  19. return args.join('/').replace(/(?<!:)(\/{2,})/g,'/');
  20. }
  21. // 显示LOADING
  22. const showLoading = function(){
  23. uni.showLoading({title: '',mask: true});
  24. }
  25. // 关闭LOADING
  26. const hideLoading = function(){
  27. uni.hideLoading();
  28. }
  29. // 获取用户TOKEN
  30. const getUserToken = function(){
  31. return uni.getStorageSync($config.keyname.userToken);
  32. }
  33. /**
  34. * 基础请求
  35. * @param {String} method 请求类型
  36. * @param {String} url 请求地址
  37. * @param {Object} data 请求数据
  38. * @param {Object} opts 配置参数
  39. */
  40. api.base = function(method,url,data,opts){
  41. return new Promise(async (resolve,reject)=>{
  42. const options = Object.assign({
  43. // 请求地址
  44. url: pathJoin($config.url.request,url),
  45. // 请求数据
  46. data: data || {},
  47. // 请求类型
  48. method: method || 'post',
  49. // 数据类型
  50. dataType: 'json',
  51. // 自动显示LOADING
  52. loading: true,
  53. // 启用错误自动拦截
  54. error: true,
  55. // 请求头设定
  56. header:{
  57. 'content-type': 'application/json',
  58. 'token': getUserToken()
  59. },
  60. // 设置显示LOADING的方法
  61. showLoading: showLoading,
  62. // 设置关闭LOADING的方法
  63. hideLoading: hideLoading
  64. },opts || {});
  65. if(options.loading && typeof options.showLoading =='function'){
  66. options.showLoading();
  67. }
  68. Request(options).then(async res=>{
  69. if(options.loading && typeof options.hideLoading =='function'){
  70. options.hideLoading();
  71. }
  72. switch(res.code){
  73. // 请求正常
  74. case 0:
  75. resolve(res);
  76. break;
  77. // 约定401为未登录状态
  78. case 201:
  79. try{
  80. await api.login();
  81. }catch(err){
  82. reject(err);
  83. }
  84. options.header.token = getUserToken();
  85. try{
  86. const db = await Request(options);
  87. resolve(db);
  88. }catch(err){
  89. reject(err);
  90. }
  91. break;
  92. // 其他错误请求
  93. default:
  94. if(options.error){
  95. $app.popup.alert(res.msg || `${url}\r\n未知错误`,'数据请求');
  96. }else{
  97. reject(res);
  98. }
  99. break;
  100. }
  101. }).catch(async err=>{
  102. /*失败处理,此处为非200状态码引起的错误*/
  103. options.hideLoading();
  104. $app.popup.alert( `服务器响应失败\r\n${err.errMsg}`,'数据请求');
  105. });
  106. });
  107. }
  108. /**
  109. * POST请求
  110. * @param {String} url 请求地址
  111. * @param {Object} data 请求数据
  112. * @param {Object} opts 配置参数
  113. */
  114. api.post = function(url,data,opts){
  115. return api.base('post',url,data,Object.assign({},opts));
  116. }
  117. /**
  118. * GET请求
  119. * @param {String} url 请求地址
  120. * @param {Object} data 请求数据
  121. * @param {Object} opts 配置参数
  122. */
  123. api.get = function(url,data,opts){
  124. return api.base('get',url,data,Object.assign({},opts));
  125. }
  126. /**
  127. * 获取静态数据
  128. * @param {String} url 静态文件地址
  129. * @param {Object} data 参数数据
  130. * @param {Object} opts 配置参数
  131. */
  132. api.static = function(url,data,opts){
  133. return new Promise(async (resolve,reject)=>{
  134. // 设置选项
  135. var _opts = Object.assign({
  136. url: /^http/.test(url)?url:API_BASE+(url||''),
  137. data: Object.assign({cache:Date.now()},data),
  138. },opts || {});
  139. uni.request({
  140. ..._opts,
  141. success: res =>{
  142. resolve(res.data);
  143. }
  144. });
  145. });
  146. }
  147. /**
  148. * 文件上传
  149. * @param {String} file 文件临时路径
  150. * @param {Object} opts 上传参数
  151. */
  152. api.upload = function(file,opts){
  153. return new Promise((resolve,reject)=>{
  154. const options = Object.assign({
  155. // 请求地址
  156. url: pathJoin($config.url.upload,opts?.url || ''),
  157. // 请求数据
  158. filePath: file,
  159. // 自动显示LOADING
  160. loading: true,
  161. // 启用错误自动拦截
  162. error: true,
  163. // 请求头设定
  164. header:{
  165. 'token': uni.getStorageSync($config.keyname.userToken)
  166. },
  167. // 设置显示LOADING的方法
  168. showLoading: showLoading,
  169. // 设置关闭LOADING的方法
  170. hideLoading: hideLoading
  171. },opts || {});
  172. });
  173. }
  174. /**
  175. * 获取登录code
  176. */
  177. api.userCode = function(){
  178. return new Promise((resolve,reject)=>{
  179. uni.login({
  180. provider: 'weixin',
  181. success: res => resolve(res.code),
  182. fail: err => reject(err)
  183. });
  184. });
  185. }
  186. /**
  187. * 自动登录
  188. * @param {Object} data 登录数据(非必填)
  189. */
  190. api.login = function(data){
  191. return new Promise(async (resolve,reject)=>{
  192. const code = await api.userCode();
  193. api.post($config.api.login,{...data||{},code}).then(async res=>{
  194. uni.setStorageSync($config.keyname.userToken,res?.token);
  195. uni.setStorageSync($config.keyname.userInfo,res?.userInfo);
  196. resolve(res.token);
  197. }).catch(err=>reject(err));
  198. });
  199. }
  200. export default api;