123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- import { refreshToken } from '../core/libs/requests'
- import { CustomRequestOptions } from '../interceptors/request'
- import { useUserStore } from '../store'
- import dayjs from 'dayjs'
- export const http = async <T>(options: CustomRequestOptions) => {
- const userStore = useUserStore()
- const Authorization = userStore.userInfo?.token
- const header: { 'tenant-id': number; Authorization?: string } = {
- 'tenant-id': 1,
- Authorization,
- }
- // console.log(dayjs(userStore.userInfo.expiresTime).format('YYYY-MM-DD HH:mm:ss'))
- const diff = dayjs(userStore.userInfo.expiresTime).diff(dayjs(), 'minutes')
- // console.log(diff)
- if (userStore.isLogined && diff < 10 && options.url !== '/app-api/member/auth/refresh-token') {
- const { data } = await refreshToken(userStore.userInfo.refreshToken)
- userStore.setUserInfo({
- ...userStore.userInfo,
- token: data.accessToken,
- userId: data.userId,
- accessToken: data.accessToken,
- refreshToken: data.refreshToken,
- expiresTime: data.expiresTime,
- // openid: data.openid,
- })
- }
- // 1. 返回 Promise 对象
- return new Promise<IResData<T>>((resolve, reject) => {
- uni.request({
- ...options,
- header,
- dataType: 'json',
- // #ifndef MP-WEIXIN
- responseType: 'json',
- // #endif
- // 响应成功
- success(res) {
- // console.log(res)
- // 状态码 2xx,参考 axios 的设计
- if (res.statusCode >= 200 && res.statusCode < 300) {
- // 2.1 提取核心数据 res.data
- if ((res.data as IResData<T>).code === 0) {
- resolve(res.data as IResData<T>)
- } else if ((res.data as IResData<T>).code === 401) {
- userStore.clearUserInfo()
- uni.navigateTo({ url: '/pages-sub/login/index' })
- reject(res)
- } else {
- !options.hideErrorToast &&
- uni.showToast({
- icon: 'none',
- title: (res.data as IResData<T>).msg || '请求错误',
- })
- reject(res.data)
- }
- } else if (res.statusCode === 401) {
- // 401错误 -> 清理用户信息,跳转到登录页
- userStore.clearUserInfo()
- reject(res)
- } else {
- // 其他错误 -> 根据后端错误信息轻提示
- !options.hideErrorToast &&
- uni.showToast({
- icon: 'none',
- title: (res.data as IResData<T>).msg || '请求错误',
- })
- reject(res)
- }
- },
- // 响应失败
- fail(err) {
- uni.showToast({
- icon: 'none',
- title: '网络错误,换个网络试试',
- })
- reject(err)
- },
- })
- })
- }
- /**
- * GET 请求
- * @param url 后台地址
- * @param query 请求query参数
- * @returns
- */
- export const httpGet = <T>(url: string, query?: Record<string, any>) => {
- return http<T>({
- url,
- query,
- method: 'GET',
- })
- }
- /**
- * POST 请求
- * @param url 后台地址
- * @param data 请求body参数
- * @param query 请求query参数,post请求也支持query,很多微信接口都需要
- * @returns
- */
- export const httpPost = <T>(
- url: string,
- data?: Record<string, any>,
- query?: Record<string, any>,
- ) => {
- return http<T>({
- url,
- query,
- data,
- method: 'POST',
- })
- }
- export const httpPut = <T>(url: string, data?: Record<string, any>) =>
- http<T>({
- url,
- query: {},
- data,
- method: 'PUT',
- })
- export const httpDelete = <T>(url: string, query?: Record<string, any>) =>
- http<T>({ url, query, method: 'DELETE' })
- http.get = httpGet
- http.post = httpPost
|