| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- import { isDev, ignoreTokens, config } from "@/config";
- import { locale, t } from "../locale";
- import { isNull, isObject, parse, storage } from "../utils";
- import { useStore } from "../store";
- // 请求参数类型定义
- export type RequestOptions = {
- url: string; // 请求地址
- method?: RequestMethod; // 请求方法
- data?: any; // 请求体数据
- params?: any; // URL参数
- header?: any; // 请求头
- timeout?: number; // 超时时间
- withCredentials?: boolean; // 是否携带凭证
- firstIpv4?: boolean; // 是否优先使用IPv4
- enableChunked?: boolean; // 是否启用分块传输
- };
- // 响应数据类型定义
- export type Response = {
- code?: number;
- message?: string;
- data?: any;
- };
- // 请求队列(用于等待token刷新后继续请求)
- let requests: ((token: string) => void)[] = [];
- // 标记token是否正在刷新
- let isRefreshing = false;
- // 判断当前url是否忽略token校验
- const isIgnoreToken = (url: string) => {
- return ignoreTokens.some((e) => {
- const pattern = e.replace(/\*/g, ".*");
- return new RegExp(pattern).test(url);
- });
- };
- /**
- * 通用请求方法
- * @param options 请求参数
- * @returns Promise<T>
- */
- export function request(options: RequestOptions): Promise<any | null> {
- let { url, method = "GET", data = {}, header = {}, timeout = 60000 } = options;
- const { user } = useStore();
-
- // 拼接基础url
- if (!url.startsWith("http")) {
- url = config.baseUrl + url;
- }
- // 开发环境下打印请求信息
- if (isDev) {
- console.log(`[${method}] ${url}`);
- }
- // 获取当前token
- let Authorization: string | null = user.token;
- // 如果是忽略token的接口,则不携带token
- if (isIgnoreToken(url)) {
- Authorization = null;
- }
- return new Promise((resolve, reject) => {
- // 发起请求的实际函数
- const next = () => {
- uni.request({
- url,
- method,
- data,
- header: {
- Authorization,
- language: locale.value,
- ...(header as UTSJSONObject)
- },
- timeout,
- success(res) {
- // 401 无权限
- if (res.statusCode == 401) {
- user.logout();
- reject({ message: t("无权限") } as Response);
- }
- // 502 服务异常
- else if (res.statusCode == 502) {
- reject({
- message: t("服务异常")
- } as Response);
- }
- // 404 未找到
- else if (res.statusCode == 404) {
- return reject({
- message: `[404] ${url}`
- } as Response);
- }
- // 200 正常响应
- else if (res.statusCode == 200) {
- if (res.data == null) {
- resolve(null);
- } else if (!isObject(res.data as any)) {
- resolve(res.data);
- } else {
- // 解析响应数据
- const { code, message, data } = parse<Response>(
- res.data ?? { code: 0 }
- )!;
- switch (code) {
- case 1000:
- resolve(data);
- break;
- default:
- reject({ message, code } as Response);
- break;
- }
- }
- } else {
- reject({ message: t("服务异常") } as Response);
- }
- },
- // 网络请求失败
- fail(err) {
- reject({ message: err.errMsg } as Response);
- }
- });
- };
- next();
- });
- }
- export function useGet(url: string, params?: any, config?: RequestOptions): Promise<Response> {
- const options: RequestOptions = {
- url,
- params,
- method: 'GET',
- ...config,
- }
- return request(options)
- }
- export function usePost(url: string, data?: any, config?: RequestOptions): Promise<Response> {
- const options: RequestOptions = {
- url,
- data,
- method: 'POST',
- ...config,
- }
- return request(options)
- }
- export function usePut(url: string, data?: any, config?: RequestOptions): Promise<Response> {
- const options: RequestOptions = {
- url,
- data,
- method: 'PUT',
- ...config,
- }
- return request(options)
- }
- export function useDelete(url: string, data?: any, config?: RequestOptions): Promise<Response> {
- const options: RequestOptions = {
- url,
- data,
- method: 'DELETE',
- ...config,
- }
- return request(options)
- }
|