request.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. import { useUserStore } from '@/store/user.js';
  2. import { nextTick } from 'vue';
  3. import { BASE_API_URL } from '@/settings/siteSetting.js';
  4. import { REDIRECT_KEY } from '@/settings/enums.js';
  5. import { rewriteM2DocumentedApiPath } from '@/utils/m2GenericApiPath.js';
  6. let requestCount = 0,
  7. isShowingDialog = false;
  8. const showLoading = () => {
  9. if (requestCount === 0) {
  10. uni.showLoading({ mask: true });
  11. }
  12. requestCount++;
  13. };
  14. //隐藏loading
  15. const hideLoading = () => {
  16. requestCount--;
  17. if (requestCount <= 0) {
  18. uni.hideLoading();
  19. }
  20. };
  21. // 将对象转为 x-www-form-urlencoded 字符串(兼容小程序环境无 URLSearchParams)
  22. function toFormUrlEncoded(obj) {
  23. if (obj == null || typeof obj !== 'object') return '';
  24. return Object.keys(obj)
  25. .filter((k) => obj[k] != null && obj[k] !== '')
  26. .map((k) => encodeURIComponent(k) + '=' + encodeURIComponent(obj[k]))
  27. .join('&');
  28. }
  29. // 获取当前页面路径以及参数
  30. export function getCurrentPageUrlWithArgs() {
  31. const pages = getCurrentPages();
  32. const currentPage = pages[pages.length - 1];
  33. const route = currentPage.route;
  34. const options = currentPage.options;
  35. let url = `/${route}?`;
  36. for (let key in options) {
  37. const value = options[key];
  38. url += `${key}=${value}&`;
  39. }
  40. url = url.substring(0, url.length - 1);
  41. return url;
  42. }
  43. export class Request {
  44. #request(config) {
  45. const userStore = useUserStore();
  46. let {
  47. headers = {
  48. 'Content-Type': 'application/json;charset=UTF-8',
  49. },
  50. url,
  51. method, // 请求类型
  52. loading = true, // 是否触发 loading
  53. timeout = 60 * 3000, // 请求超时时间
  54. returnResponse = false, // 是否返回原生数据
  55. message = true,
  56. hideErrorModal = false, // 报误弹窗
  57. params, // 请求参数
  58. formUrlEncoded = false, // 是否以 application/x-www-form-urlencoded 发送
  59. customizeUrl = '' //自定义url
  60. } = config;
  61. const header = {
  62. ...headers,
  63. Authorization: userStore.getToken
  64. };
  65. if (method.toUpperCase() === 'GET') {
  66. const now = Date.now();
  67. params = Object.assign(params || {}, { _t: now });
  68. }
  69. url = rewriteM2DocumentedApiPath(url);
  70. let data = params;
  71. if (formUrlEncoded && params && typeof params === 'object') {
  72. data = toFormUrlEncoded(params);
  73. header['Content-Type'] = 'application/x-www-form-urlencoded';
  74. }
  75. loading && showLoading();
  76. return new Promise((resolve, reject) => {
  77. uni.request({
  78. url: BASE_API_URL + url,
  79. header,
  80. method,
  81. timeout,
  82. data,
  83. dataType: 'json',
  84. success: async (res) => {
  85. const { data } = res;
  86. // 返回原生接口请求
  87. if (returnResponse) {
  88. resolve(res);
  89. return;
  90. }
  91. switch (data.code) {
  92. case 200:
  93. resolve(data.data);
  94. break;
  95. case 400:
  96. uni.showModal({
  97. title: data.msg || '系统异常,请联系管理员',
  98. confirmText: '确定',
  99. success: () => {}
  100. });
  101. reject();
  102. break;
  103. default:
  104. if (hideErrorModal) return;
  105. uni.showModal({
  106. title: data.msg || '系统异常,请联系管理员',
  107. confirmText: '确定',
  108. success: () => {}
  109. });
  110. reject();
  111. break;
  112. }
  113. },
  114. fail: async (err) => {
  115. uni.showToast({
  116. title: '网络不稳定,请稍后刷新重试',
  117. icon: 'none'
  118. });
  119. await nextTick();
  120. reject(err);
  121. },
  122. complete: () => {
  123. loading && hideLoading();
  124. }
  125. });
  126. });
  127. }
  128. get(options) {
  129. return this.#request({
  130. ...options,
  131. method: 'GET'
  132. });
  133. }
  134. post(options) {
  135. return this.#request({
  136. ...options,
  137. method: 'POST'
  138. });
  139. }
  140. put(options) {
  141. return this.#request({
  142. ...options,
  143. method: 'PUT'
  144. });
  145. }
  146. delete(options) {
  147. return this.#request({
  148. ...options,
  149. method: 'DELETE'
  150. });
  151. }
  152. }
  153. export const api = new Request();