2023-09-15 18:44:30 +08:00

181 lines
5.5 KiB
TypeScript

import useMemberStore from '@/stores/member'
import {t} from '@/locale'
import {getToken, getAppChannel} from './common'
import qs from 'qs';
interface RequestConfig {
showSuccessMessage?: boolean
}
interface RequestOptions extends UniNamespace.RequestOptions, RequestOptions {
}
class Request {
private baseUrl: string
private config: RequestOptions = {
url: '',
header: {}
}
constructor() {
// #ifdef H5
this.baseUrl = import.meta.env.VITE_APP_BASE_URL || `${location.origin}/api/`
// #endif
// #ifndef H5
this.baseUrl = import.meta.env.VITE_APP_BASE_URL
// #endif
this.baseUrl.substr(-1) != '/' && (this.baseUrl += '/')
try {
this.config.header[import.meta.env.VITE_REQUEST_HEADER_CHANNEL_KEY] = getAppChannel()
} catch (e) {
}
}
/**
* 请求拦截器
*/
private requestInterceptors() {
// 携带token
try {
getToken() && (this.config.header[import.meta.env.VITE_REQUEST_HEADER_TOKEN_KEY] = getToken())
this.config.header[import.meta.env.VITE_REQUEST_HEADER_CHANNEL_KEY] = getAppChannel()
} catch (e) {
}
}
public get(url: string, data: AnyObject = {}, config: RequestConfig = {}) {
config.showSuccessMessage == undefined && (config.showSuccessMessage = false)
Object.assign(this.config, config)
console.log('get request', url, data)
return this.request('GET', url, data)
}
public post(url: string, data: AnyObject = {}, config: RequestConfig = {}) {
config.showSuccessMessage == undefined && (config.showSuccessMessage = false)
Object.assign(this.config, config)
return this.request('POST', url, data)
}
public put(url: string, data: AnyObject = {}, config: RequestConfig = {}) {
config.showSuccessMessage == undefined && (config.showSuccessMessage = false)
Object.assign(this.config, config)
return this.request('PUT', url, data)
}
public delete(url: string, config: RequestConfig = {}) {
config.showSuccessMessage == undefined && (config.showSuccessMessage = false)
Object.assign(this.config, config)
return this.request('DELETE', url)
}
/**
* 发送上传请求
*/
public upload(url: string, data: AnyObject = {}, config: RequestConfig = {}) {
this.requestInterceptors()
const params = Object.assign(uni.$u.deepClone(this.config), {
url: this.baseUrl + url,
...data
})
return new Promise((resolve, reject) => {
uni.uploadFile({
...params,
success: res => {
const data = JSON.parse(res.data)
if (data.code == 1) {
this.config.showSuccessMessage && uni.showToast({title: data.msg, icon: 'none'})
resolve(data)
} else {
if (data.code == 0) {
uni.showToast({title: data.msg, icon: 'none'})
} else {
this.handleAuthError(data.code)
}
reject(data)
}
},
fail: res => {
reject(res)
}
})
})
}
/**
* 发送请求
*/
private request(method: string, url: string, data ?: AnyObject) {
this.requestInterceptors()
let source = {
url: this.baseUrl + url,
method,
};
if (source.method.toUpperCase() == 'GET') {
source.url += '?' + qs.stringify(data);
} else {
source.data = data;
}
const params = Object.assign(uni.$u.deepClone(this.config), source)
return new Promise((resolve, reject) => {
uni.request({
...params,
success: res => {
const data = res.data
if (data.code == 1) {
this.config.showSuccessMessage && uni.showToast({title: data.msg, icon: 'none'})
resolve(data)
} else {
if (data.code == 0) {
uni.showToast({title: data.msg, icon: 'none'})
} else {
this.handleAuthError(data.code)
}
reject(data)
}
},
fail: res => {
reject(res)
},
complete: (res) => {
this.handleRequestFail(res)
}
})
})
}
private handleAuthError(code: number) {
switch (code) {
case 401:
useMemberStore().logout()
break;
}
}
private handleRequestFail(res) {
if (res.errMsg && res.errMsg == "request:ok") {
if (typeof res.data == 'string') {
uni.showToast({icon: 'none', title: this.baseUrl + t('requestFail')})
return
}
}
if (res.errMsg == 'request:fail') {
uni.showToast({icon: 'none', title: this.baseUrl + t('requestFail')})
return
}
if (res.errMsg && res.errMsg == 'request:fail url not in domain list') {
uni.showToast({icon: 'none', title: this.baseUrl + t('notInDomainList')});
return
}
}
}
export default new Request()