uni-events-helper-wx
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

281 lines
8.8 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. import request from "@/nxTemp/request";
  2. import store from '@/nxTemp/store';
  3. import config from '@/nxTemp/config/index.config.js';
  4. //可以new多个request来支持多个域名请求
  5. let $http = new request({
  6. //接口请求地址
  7. baseUrl: config.baseUrl,
  8. //服务器本地上传文件地址
  9. fileUrl: config.baseUrl,
  10. // 服务器上传图片默认url
  11. defaultUploadUrl: "api/common/v1/upload_image",
  12. //设置请求头(如果使用报错跨域问题,可能是content-type请求类型和后台那边设置的不一致)
  13. header: {
  14. 'Content-Type': 'application/json;charset=UTF-8',
  15. // 'project_token': config.projectToken, //项目token(可删除)
  16. }
  17. });
  18. //请求开始拦截器
  19. $http.requestStart = function(options) {
  20. // console.log("请求开始", options);
  21. if (options.load) {
  22. //打开加载动画
  23. store.commit("setLoadingShow", true);
  24. }
  25. //请求前加入token & token验证
  26. if (options.url) {
  27. if (options.needLogin) {
  28. let token = uni.getStorageSync('token');
  29. if (!token) {
  30. store.dispatch('reLogin', '');//无token时,触发重新登录
  31. console.error(options.url,"缺少token,触发重新登录",options);
  32. } else {
  33. options.header['token'] = token; //header中带上token
  34. if(!options.data.token)options.data['token'] = token; //请求data中带上token,兼容自带token参数
  35. }
  36. }
  37. }
  38. // 图片上传大小限制
  39. if (options.method == "FILE" && options.maxSize) {
  40. // 文件最大字节: options.maxSize 可以在调用方法的时候加入参数
  41. let maxSize = options.maxSize;
  42. for (let item of options.files) {
  43. if (item.size > maxSize) {
  44. setTimeout(() => {
  45. uni.showToast({
  46. title: "图片过大,请重新上传",
  47. icon: "none"
  48. });
  49. }, 500);
  50. return false;
  51. }
  52. }
  53. }
  54. // if (options.url) {
  55. // //请求前加入token
  56. // let url = options.url.substring(options.url.lastIndexOf('/') + 1);
  57. // if (url != 'login') {
  58. // let token = uni.getStorageSync('token');
  59. // if (!token) {
  60. // console.log(url,"缺少token",options);
  61. // store.dispatch('reLogin', '');
  62. // } else {
  63. // options.header['token'] = uni.getStorageSync('token');
  64. // }
  65. // }
  66. // }
  67. return options;
  68. }
  69. //请求结束
  70. $http.requestEnd = function(options) {
  71. //判断当前接口是否需要加载动画
  72. if (options.load) {
  73. // 关闭加载动画
  74. store.commit("setLoadingShow", false);
  75. }
  76. }
  77. //所有接口数据处理(此方法需要开发者根据各自的接口返回类型修改,以下只是模板)
  78. $http.dataFactory = async function(res) {
  79. //显示调试信息
  80. if(config.showLog){
  81. // console.log("接口请求数据", {
  82. // url: res.url,
  83. // resolve: res.response,
  84. // header: res.header,
  85. // data: res.data,
  86. // method: res.method,
  87. // });
  88. // console.log("requestConfig:",res);
  89. showLog(res.data,res.url,res.response)
  90. }
  91. //验证需登录接口状态并给与提示
  92. if(res.needLogin&&!res.data.token){
  93. return Promise.reject({
  94. statusCode: 0,
  95. errMsg: "请先登录后尝试",
  96. data: res.url
  97. });
  98. }
  99. if (res.response.statusCode && res.response.statusCode == 200) {
  100. let httpData = res.response.data;
  101. if (typeof(httpData) == "string") {
  102. httpData = JSON.parse(httpData);
  103. }
  104. /*********以下只是模板(及共参考),需要开发者根据各自的接口返回类型修改*********/
  105. //判断数据是否请求成功
  106. // if (httpData.success || httpData.code == 200) {
  107. if (httpData.code == 0) {
  108. // 返回正确的结果(then接受数据)
  109. return Promise.resolve(httpData.data);
  110. } else if (httpData.code == "1000" || httpData.code == "1001" || httpData.code == 1100 || httpData.code == 402) {
  111. // 失败重新请求(最多重新请求3次)
  112. // if(res.resend < 3){
  113. // let result = await $http.request({
  114. // url: res.url,
  115. // data: res.data,
  116. // method: res.method,
  117. // header: res.header,
  118. // isPrompt: res.isPrompt,//(默认 true 说明:本接口抛出的错误是否提示)
  119. // load: res.load,//(默认 true 说明:本接口是否提示加载动画)
  120. // isFactory: res.isFactory, //(默认 true 说明:本接口是否调用公共的数据处理方法,设置false后isPrompt参数将失去作用)
  121. // resend: res.resend += 1 // 当前重发次数
  122. // });
  123. // // 返回正确的结果(then接受数据)
  124. // return Promise.resolve(result);
  125. // }
  126. // 返回错误的结果(catch接受数据)
  127. // return Promise.reject({
  128. // statusCode: 0,
  129. // errMsg: "【request】" + (httpData.info || httpData.msg)
  130. // });
  131. //----------------------------------------分割线---------------------------------------------------
  132. // 刷新token在重新请求(最多重新请求2次)
  133. // if(res.resend < 2){
  134. // let tokenResult = await $http.request({
  135. // url: "http://localhost:7001/api/common/v1/protocol", // 获取token接口地址
  136. // data: {
  137. // type: 1000
  138. // }, // 获取接口参数
  139. // method: "GET",
  140. // load: false,//(默认 true 说明:本接口是否提示加载动画)
  141. // });
  142. // // 储存token
  143. // store.commit("userInfo", tokenResult);
  144. // let result = await $http.request({
  145. // url: res.url,
  146. // data: res.data,
  147. // method: res.method,
  148. // header: res.header,
  149. // isPrompt: res.isPrompt,//(默认 true 说明:本接口抛出的错误是否提示)
  150. // load: res.load,//(默认 true 说明:本接口是否提示加载动画)
  151. // isFactory: res.isFactory, //(默认 true 说明:本接口是否调用公共的数据处理方法,设置false后isPrompt参数将失去作用)
  152. // resend: res.resend += 1 // 当前重发次数
  153. // });
  154. // // 返回正确的结果(then接受数据)
  155. // return Promise.resolve(result);
  156. // }
  157. // 返回错误的结果(catch接受数据)
  158. // return Promise.reject({
  159. // statusCode: 0,
  160. // errMsg: "【request】" + (httpData.info || httpData.msg)
  161. // });
  162. store.commit("emptyUserInfo");
  163. // #ifdef MP-WEIXIN
  164. // onLogin();跳转登录页面
  165. // #endif
  166. // 返回错误的结果(catch接受数据)
  167. return Promise.reject({
  168. statusCode: 0,
  169. errMsg: "请求失败:" + (httpData.info || httpData.msg),
  170. data: res.data
  171. });
  172. } else if (httpData.code == "401") { // token失效
  173. uni.showToast({
  174. title: "登录状态失效请重新登录",
  175. icon: "none"
  176. });
  177. // 返回错误的结果(catch接受数据)
  178. // return Promise.reject({
  179. // statusCode: 0,
  180. // errMsg: "【request】" + (httpData.info || httpData.msg),
  181. // data: res.data
  182. // });
  183. } else { //其他错误提示
  184. if (res.isPrompt) {
  185. uni.showToast({
  186. title: httpData.info || httpData.msg|| httpData.message,
  187. icon: "none",
  188. duration: 3000
  189. });
  190. }
  191. // 返回错误的结果(catch接受数据)
  192. return Promise.reject({
  193. statusCode: 0,
  194. errMsg: "请求失败:" + (httpData.info || httpData.msg|| httpData.message),
  195. data: res.data
  196. });
  197. }
  198. /*********以上只是模板(及共参考),需要开发者根据各自的接口返回类型修改*********/
  199. } else {
  200. // 返回错误的结果(catch接受数据)
  201. return Promise.reject({
  202. statusCode: res.response.statusCode,
  203. errMsg: "请求失败:"+res.response.statusCode,
  204. data: res.data
  205. });
  206. }
  207. };
  208. // 错误回调
  209. $http.requestError = function(e) {
  210. // e.statusCode === 0 是参数效验错误抛出的
  211. console.log("-requestError-");
  212. if (e.statusCode === 0) {
  213. throw e;
  214. } else {
  215. console.log(e);
  216. uni.showToast({
  217. title: "网络错误,请检查一下网络",
  218. icon: "none"
  219. });
  220. }
  221. }
  222. // 添加获取七牛云token的方法
  223. $http.getQnToken = function(callback) {
  224. //该地址需要开发者自行配置(每个后台的接口风格都不一样)
  225. $http.get("api/common/v1/qn_upload").then(data => {
  226. /*
  227. *接口返回参数
  228. *visitPrefix:访问文件的域名
  229. *token:七牛云上传token
  230. *folderPath:上传的文件夹
  231. *region: 地区 默认为SCN
  232. */
  233. callback({
  234. visitPrefix: data.visitPrefix,
  235. token: data.token,
  236. folderPath: data.folderPath
  237. });
  238. });
  239. }
  240. //log日志函数
  241. function showLog(data,url,response){
  242. let weburl = getWebURL(data,url)
  243. let temp = url.split("?")[0].split("/")
  244. let postName = temp[temp.length-1]
  245. console.warn("-------------------->> ["+postName+"][log]\n"
  246. +"请求 Data: \n" + JSON.stringify(data)
  247. +"\n URL:\n"+weburl
  248. +"\n 服务端返回:\n"+JSON.stringify(response.data)
  249. +"\n <<-------------------- ["+postName+"][log] ↑↑↑\n")
  250. }
  251. //获取拼接url
  252. function getWebURL(data,url){
  253. let result = ""
  254. for(var i in data){
  255. result+=`&${i}=${data[i]}`
  256. }
  257. return url+"?"+result.slice(1)
  258. }
  259. export default $http;