requestConfig.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. import request from "./request";
  2. // 全局配置的请求域名
  3. let baseUrl = "http://www.xxx.com/api/";
  4. //可以new多个request来支持多个域名请求
  5. let $http = new request({
  6. //接口请求地址
  7. baseUrl: baseUrl,
  8. //服务器本地上传文件地址
  9. fileUrl: baseUrl,
  10. // 服务器上传图片默认url
  11. defaultUploadUrl: "api/common/v1/upload_image",
  12. //设置请求头(如果使用报错跨域问题,可能是content-type请求类型和后台那边设置的不一致)
  13. header: {
  14. 'content-type': 'application/json;charset=UTF-8'
  15. },
  16. // 请求超时时间(默认6000)
  17. timeout: 6000,
  18. // 默认配置(可不写)
  19. config: {
  20. // 是否自动提示错误
  21. isPrompt: true,
  22. // 是否显示加载动画
  23. load: true,
  24. // 是否使用数据工厂
  25. isFactory: true
  26. }
  27. });
  28. // 添加获取七牛云token的方法
  29. $http.getQnToken = function(callback){
  30. //该地址需要开发者自行配置(每个后台的接口风格都不一样)
  31. $http.get("api/kemean/aid/qn_upload").then(data => {
  32. /*
  33. *接口返回参数:
  34. *visitPrefix:访问文件的域名
  35. *token:七牛云上传token
  36. *folderPath:上传的文件夹
  37. *region: 地区 默认为:SCN
  38. */
  39. callback({
  40. visitPrefix: data.visitPrefix,
  41. token: data.token,
  42. folderPath: data.folderPath,
  43. region: "SCN"
  44. });
  45. });
  46. }
  47. // 添加获取阿里云token的方法
  48. $http.getAliToken = function(callback){
  49. //该地址需要开发者自行配置(每个后台的接口风格都不一样)
  50. $http.get("api/open/v1/ali_oss_upload").then(data => {
  51. /*
  52. *接口返回参数:
  53. *visitPrefix: 访问文件的域名
  54. *folderPath: 上传的文件夹
  55. *region: 地区
  56. *bucket: 阿里云的 bucket
  57. *accessKeyId: 阿里云的访问ID
  58. *accessKeySecret: 阿里云的访问密钥
  59. *stsToken: 阿里云的访问token
  60. */
  61. callback({
  62. accessKeyId: data.accessKeyId,
  63. accessKeySecret: data.accessKeySecret,
  64. bucket: data.bucket,
  65. region: data.region,
  66. visitPrefix: data.visitPrefix,
  67. token: data.token,
  68. folderPath: data.folderPath,
  69. stsToken: data.securityToken,
  70. });
  71. });
  72. }
  73. //当前接口请求数
  74. let requestNum = 0;
  75. //请求开始拦截器
  76. $http.requestStart = function(options) {
  77. if (options.load) {
  78. if (requestNum <= 0) {
  79. //打开加载动画
  80. uni.showLoading({
  81. title: '加载中',
  82. mask: true
  83. });
  84. }
  85. requestNum += 1;
  86. }
  87. // 图片、视频上传大小限制
  88. if (options.method == "FILE") {
  89. // 文件最大字节: options.maxSize 可以在调用方法的时候加入参数
  90. let maxSize = options.maxSize || '';
  91. for (let item of options.files) {
  92. if(item.fileType == 'image'){
  93. if (maxSize && item.size > maxSize) {
  94. setTimeout(() => {
  95. uni.showToast({
  96. title: "图片过大,请重新上传",
  97. icon: "none"
  98. });
  99. }, 500);
  100. return false;
  101. }
  102. } else if(item.fileType == "video"){
  103. if (item.duration < 3) {
  104. setTimeout(() => {
  105. uni.showToast({
  106. title: "视频长度不足3秒,请重新上传",
  107. icon: "none"
  108. });
  109. }, 500);
  110. return false;
  111. }
  112. }
  113. }
  114. }
  115. //请求前加入token
  116. options.header['token'] = "你的项目登录token";
  117. return options; // return false 表示请求拦截,不会继续请求
  118. }
  119. //请求结束
  120. $http.requestEnd = function(options) {
  121. //判断当前接口是否需要加载动画
  122. if (options.load) {
  123. requestNum = requestNum - 1;
  124. if (requestNum <= 0) {
  125. uni.hideLoading();
  126. }
  127. }
  128. }
  129. //登录弹窗次数
  130. let loginPopupNum = 0;
  131. //所有接口数据处理(可在接口里设置不调用此方法)
  132. //此方法需要开发者根据各自的接口返回类型修改,以下只是模板
  133. $http.dataFactory = async function(res) {
  134. console.log("接口请求数据", {
  135. url: res.url,
  136. resolve: res.response,
  137. header: res.header,
  138. data: res.data,
  139. method: res.method,
  140. });
  141. if (res.response.statusCode && res.response.statusCode == 200) {
  142. let httpData = res.response.data;
  143. if (typeof (httpData) == "string") {
  144. httpData = JSON.parse(httpData);
  145. }
  146. /*********以下只是模板(及共参考),需要开发者根据各自的接口返回类型修改*********/
  147. //判断数据是否请求成功
  148. if (httpData.success || httpData.code == 200) {
  149. // 返回正确的结果(then接受数据)
  150. return Promise.resolve(httpData.data);
  151. } else if (httpData.code == "1000" || httpData.code == "1001" || httpData.code == 1100) {
  152. let content = '此时此刻需要您登录喔~';
  153. if (loginPopupNum <= 0) {
  154. loginPopupNum++;
  155. uni.showModal({
  156. title: '温馨提示',
  157. content: content,
  158. confirmText: "去登录",
  159. cancelText: "再逛会",
  160. success: function (res) {
  161. loginPopupNum--;
  162. if (res.confirm) {
  163. uni.navigateTo({
  164. url: "/pages/user/login"
  165. });
  166. }
  167. }
  168. });
  169. }
  170. // 返回错误的结果(catch接受数据)
  171. return Promise.reject({
  172. statusCode: 0,
  173. errMsg: "【request】" + (httpData.info || httpData.msg)
  174. });
  175. } else { //其他错误提示
  176. if (res.isPrompt) {
  177. uni.showToast({
  178. title: httpData.info || httpData.msg,
  179. icon: "none",
  180. duration: 3000
  181. });
  182. }
  183. // 返回错误的结果(catch接受数据)
  184. return Promise.reject({
  185. statusCode: 0,
  186. errMsg: "【request】" + (httpData.info || httpData.msg)
  187. });
  188. }
  189. /*********以上只是模板(及共参考),需要开发者根据各自的接口返回类型修改*********/
  190. } else {
  191. // 返回错误的结果(catch接受数据)
  192. return Promise.reject({
  193. statusCode: res.response.statusCode,
  194. errMsg: "【request】数据工厂验证不通过"
  195. });
  196. }
  197. };
  198. // 错误回调
  199. $http.requestError = function (e) {
  200. // e.statusCode === 0 是参数效验错误抛出的
  201. if (e.statusCode === 0) {
  202. throw e;
  203. } else {
  204. uni.showToast({
  205. title: "网络错误,请检查一下网络",
  206. icon: "none"
  207. });
  208. }
  209. }
  210. export default $http;