index.ts 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import { hideLoading, showLoading } from '../../utils/message/index'
  2. import { getLoginCode, loginid, setLoginCode, xtoken } from '../utils'
  3. import { Method, HttpConfig, HttpRequest, HttpResponse, ResultCode } from './interface'
  4. import { addPending, removePending } from './pending/index'
  5. /**
  6. * 根据url参数生成唯一key
  7. */
  8. function getRequestKey<T>(config: HttpConfig<T>) {
  9. const { method, url, data } = config
  10. const requestKey: string[] = [method, url]
  11. if (data) {
  12. // 参数转换查询字符串
  13. const queryString = Object.entries(data).reduce((res, property, index) => {
  14. const str = property[0] + '=' + property[1]
  15. return index > 0 ? res + '&' + str : str
  16. }, '')
  17. requestKey.push(queryString)
  18. }
  19. return requestKey.join('&')
  20. }
  21. function logout() {
  22. /// 获取上次登录账号
  23. const username = getLoginCode()
  24. /// 清楚所有的缓存数据
  25. wx.clearStorage()
  26. /// 设置登录账号
  27. setLoginCode(username)
  28. /// loding....
  29. showLoading(()=>{
  30. /// 登出
  31. setTimeout(function () {
  32. hideLoading(()=>{
  33. // on confirm
  34. wx.reLaunch({ url: '/pages/login/index' })
  35. })
  36. }, 3000)
  37. }, '登出中....')
  38. }
  39. /**
  40. * Http请求
  41. */
  42. function httpMiddleware<T>(config: HttpConfig<T>) {
  43. const { url, method, enableAuthorization, data } = config
  44. // 过滤字符串前面所有 '/' 字符
  45. const requestUrl = url.replace(/^\/+/, '')
  46. // 请求头
  47. const header = {
  48. 'Authorization': xtoken(),
  49. 'Group': 5,
  50. 'LoginID': loginid(),
  51. 'x-token': xtoken()
  52. }
  53. return new Promise((resolve, reject) => {
  54. const requestKey = getRequestKey(config)
  55. // 在请求开始前,对之前的请求做检查取消操作
  56. removePending(requestKey)
  57. const requestTask = wx.request({
  58. url: requestUrl,
  59. method,
  60. header: enableAuthorization ? header : {},
  61. data: data ?? {},
  62. success: (res) => {
  63. resolve(res.data)
  64. },
  65. fail: (err) => {
  66. reject('请求异常,请稍后再试'+err)
  67. },
  68. complete: () => {
  69. // 在请求结束后,移除本次请求
  70. removePending(requestKey)
  71. }
  72. })
  73. // 将当前请求添加到列表中
  74. addPending(requestKey, requestTask)
  75. })
  76. }
  77. /**
  78. * Http请求结果
  79. */
  80. export async function httpRequest<T extends { req?: unknown, rsp?: unknown }>(url: string, method: Method, params: HttpRequest<T>): Promise<void> {
  81. const { data, enableAuthorization, success, fail, complete } = params;
  82. const config: HttpConfig<T['req']> = {
  83. url,
  84. method,
  85. enableAuthorization: enableAuthorization ?? true,
  86. data,
  87. }
  88. await httpMiddleware(config).then((res) => {
  89. const data = res as HttpResponse<T['rsp']>
  90. switch (data.code) {
  91. case ResultCode.InvalidToken:
  92. // 退出登录
  93. // logout();
  94. return Promise.reject('令牌无效')
  95. case ResultCode.UnvalidToken:
  96. logout();
  97. return Promise.reject('异地登录,请重新登录')
  98. case ResultCode.Success:
  99. success && success(data)
  100. return Promise.resolve()
  101. case ResultCode.Code:
  102. success && success(data)
  103. return Promise.resolve()
  104. default:
  105. return Promise.reject(data.msg)
  106. }
  107. }).catch((err) => {
  108. fail && fail(err);
  109. return Promise.reject(err);
  110. }).finally(() => {
  111. complete && complete()
  112. })
  113. }