request.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  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. let requestCount = 0,
  6. isShowingDialog = false;
  7. const showLoading = () => {
  8. if (requestCount === 0) {
  9. uni.showLoading({ mask: true });
  10. }
  11. requestCount++;
  12. };
  13. //隐藏loading
  14. const hideLoading = () => {
  15. requestCount--;
  16. if (requestCount <= 0) {
  17. uni.hideLoading();
  18. }
  19. };
  20. // 获取当前页面路径以及参数
  21. export function getCurrentPageUrlWithArgs() {
  22. const pages = getCurrentPages();
  23. const currentPage = pages[pages.length - 1];
  24. const route = currentPage.route;
  25. const options = currentPage.options;
  26. let url = `/${route}?`;
  27. for (let key in options) {
  28. const value = options[key];
  29. url += `${key}=${value}&`;
  30. }
  31. url = url.substring(0, url.length - 1);
  32. return url;
  33. }
  34. export class Request {
  35. #request(config) {
  36. const userStore = useUserStore();
  37. let {
  38. headers = {
  39. 'Content-Type': 'application/json;charset=UTF-8',
  40. },
  41. url,
  42. method, // 请求类型
  43. loading = true, // 是否触发 loading
  44. timeout = 60 * 3000, // 请求超时时间
  45. returnResponse = false, // 是否返回原生数据
  46. message = true,
  47. hideErrorModal = false, // 报误弹窗
  48. params, // 请求参数
  49. customizeUrl = '' //自定义url
  50. } = config;
  51. const header = {
  52. ...headers,
  53. Authorization: userStore.getToken
  54. };
  55. if (method.toUpperCase() === 'GET') {
  56. const now = Date.now();
  57. params = Object.assign(params || {}, { _t: now });
  58. }
  59. loading && showLoading();
  60. return new Promise((resolve, reject) => {
  61. uni.request({
  62. url: BASE_API_URL + url,
  63. header,
  64. method,
  65. timeout,
  66. data: params,
  67. dataType: 'json',
  68. success: async (res) => {
  69. const { data } = res;
  70. // 返回原生接口请求
  71. if (returnResponse) {
  72. resolve(res);
  73. return;
  74. }
  75. switch (data.code) {
  76. case 200:
  77. resolve(data.data);
  78. break;
  79. case 400:
  80. uni.showModal({
  81. title: data.msg || '系统异常,请联系管理员',
  82. cancelText: '回到首页',
  83. confirmText: '确定',
  84. success: (res) => {
  85. if (res.confirm) {
  86. } else if (res.cancel) {
  87. uni.redirectTo({ url: '/pages/index/index' });
  88. }
  89. }
  90. });
  91. reject();
  92. break;
  93. default:
  94. if (hideErrorModal) return;
  95. uni.showModal({
  96. title: data.msg || '系统异常,请联系管理员',
  97. cancelText: '回到首页',
  98. confirmText: '确定',
  99. success: (res) => {
  100. if (res.confirm) {
  101. } else if (res.cancel) {
  102. uni.redirectTo({ url: '/pages/index/index' });
  103. }
  104. }
  105. });
  106. reject();
  107. break;
  108. }
  109. },
  110. fail: async (err) => {
  111. uni.showToast({
  112. title: '网络不稳定,请稍后刷新重试',
  113. icon: 'none'
  114. });
  115. await nextTick();
  116. reject(err);
  117. },
  118. complete: () => {
  119. loading && hideLoading();
  120. }
  121. });
  122. });
  123. }
  124. get(options) {
  125. return this.#request({
  126. ...options,
  127. method: 'GET'
  128. });
  129. }
  130. post(options) {
  131. return this.#request({
  132. ...options,
  133. method: 'POST'
  134. });
  135. }
  136. }
  137. export const api = new Request();