feat: axios add joinTime field

This commit is contained in:
vben 2020-12-15 21:27:45 +08:00
parent c774a6d3a0
commit f646e37754
8 changed files with 65 additions and 35 deletions

View File

@ -3,7 +3,8 @@
### ✨ Features ### ✨ Features
- 移除左侧菜单搜索,新增顶部菜单搜索功能 - 移除左侧菜单搜索,新增顶部菜单搜索功能
- layout 移动端适配。页面未适配 - layout 移动端适配。业务页面未适配
- axios 加入 joinTime 配置。控制响应是否加入时间戳
### ⚡ Performance Improvements ### ⚡ Performance Improvements
@ -19,6 +20,10 @@
- 刷新按钮布局调整 - 刷新按钮布局调整
- `route.meta` 移除 `externalLink` 属性 - `route.meta` 移除 `externalLink` 属性
### ✨ Refactor
- `openModal`与`openDrawer`第三个参数`openOnSet`默认设置为 true
### 🐛 Bug Fixes ### 🐛 Bug Fixes
- 修复多级路由缓存导致组件渲染多次的问题 - 修复多级路由缓存导致组件渲染多次的问题
@ -31,6 +36,7 @@
- 修复 `Modal`与`Drawer`组件在使用 emits 数据传递失效问题 - 修复 `Modal`与`Drawer`组件在使用 emits 数据传递失效问题
- 修复菜单已知问题 - 修复菜单已知问题
- 修复上传组件 api 失效问题 - 修复上传组件 api 失效问题
- 修复菜单权限过滤失效问题
## 2.0.0-rc.13 (2020-12-10) ## 2.0.0-rc.13 (2020-12-10)

View File

@ -56,7 +56,7 @@ export function useDrawer(): UseDrawerReturnType {
getInstance().setDrawerProps(props); getInstance().setDrawerProps(props);
}, },
openDrawer: <T = any>(visible = true, data?: T, openOnSet = false): void => { openDrawer: <T = any>(visible = true, data?: T, openOnSet = true): void => {
getInstance().setDrawerProps({ getInstance().setDrawerProps({
visible: visible, visible: visible,
}); });

View File

@ -60,7 +60,7 @@ export function useModal(): UseModalReturnType {
getInstance().setModalProps(props); getInstance().setModalProps(props);
}, },
openModal: <T = any>(visible = true, data?: T, openOnSet = false): void => { openModal: <T = any>(visible = true, data?: T, openOnSet = true): void => {
getInstance().setModalProps({ getInstance().setModalProps({
visible: visible, visible: visible,
}); });

View File

@ -1,4 +1,3 @@
import { isObject, isString } from '/@/utils/is';
import moment from 'moment'; import moment from 'moment';
const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm'; const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm';
@ -34,28 +33,5 @@ export const formatAgo = (str: string | number) => {
return parseInt(String(time / 31536000000)) + '年前'; return parseInt(String(time / 31536000000)) + '年前';
} }
}; };
/**
* @description:
*/
export function formatRequestDate(params: any) {
for (const key in params) {
if (params[key] && params[key]._isAMomentObject) {
params[key] = params[key].format(DATE_TIME_FORMAT);
}
if (isString(key)) {
const value = params[key];
if (value) {
try {
params[key] = isString(value) ? value.trim() : value;
} catch (error) {
throw new Error(error);
}
}
}
if (isObject(params[key])) {
formatRequestDate(params[key]);
}
}
}
export const dateUtil = moment; export const dateUtil = moment;

View File

@ -0,0 +1,45 @@
import { isObject, isString } from '/@/utils/is';
export function createNow<T extends boolean>(
join: boolean,
restful: T
): T extends true ? string : object;
export function createNow(join: boolean, restful = false): string | object {
if (!join) {
return restful ? '' : {};
}
const now = new Date().getTime();
if (restful) {
return `?_t=${now}`;
}
return {
_t: now,
};
}
const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm';
/**
* @description:
*/
export function formatRequestDate(params: any) {
for (const key in params) {
if (params[key] && params[key]._isAMomentObject) {
params[key] = params[key].format(DATE_TIME_FORMAT);
}
if (isString(key)) {
const value = params[key];
if (value) {
try {
params[key] = isString(value) ? value.trim() : value;
} catch (error) {
throw new Error(error);
}
}
}
if (isObject(params[key])) {
formatRequestDate(params[key]);
}
}
}

View File

@ -3,7 +3,6 @@
import type { AxiosResponse } from 'axios'; import type { AxiosResponse } from 'axios';
import type { CreateAxiosOptions, RequestOptions, Result } from './types'; import type { CreateAxiosOptions, RequestOptions, Result } from './types';
import { VAxios } from './Axios'; import { VAxios } from './Axios';
import { getToken } from '/@/utils/auth'; import { getToken } from '/@/utils/auth';
import { AxiosTransform } from './axiosTransform'; import { AxiosTransform } from './axiosTransform';
@ -16,11 +15,11 @@ import { useMessage } from '/@/hooks/web/useMessage';
import { RequestEnum, ResultEnum, ContentTypeEnum } from '/@/enums/httpEnum'; import { RequestEnum, ResultEnum, ContentTypeEnum } from '/@/enums/httpEnum';
import { isString } from '/@/utils/is'; import { isString } from '/@/utils/is';
import { formatRequestDate } from '/@/utils/dateUtil';
import { setObjToUrlParams, deepMerge } from '/@/utils'; import { setObjToUrlParams, deepMerge } from '/@/utils';
import { errorStore } from '/@/store/modules/error'; import { errorStore } from '/@/store/modules/error';
import { errorResult } from './const'; import { errorResult } from './const';
import { useI18n } from '/@/hooks/web/useI18n'; import { useI18n } from '/@/hooks/web/useI18n';
import { createNow, formatRequestDate } from './helper';
const globSetting = useGlobSetting(); const globSetting = useGlobSetting();
const prefix = globSetting.urlPrefix; const prefix = globSetting.urlPrefix;
@ -97,7 +96,7 @@ const transform: AxiosTransform = {
// 请求之前处理config // 请求之前处理config
beforeRequestHook: (config, options) => { beforeRequestHook: (config, options) => {
const { apiUrl, joinPrefix, joinParamsToUrl, formatDate } = options; const { apiUrl, joinPrefix, joinParamsToUrl, formatDate, joinTime = true } = options;
if (joinPrefix) { if (joinPrefix) {
config.url = `${prefix}${config.url}`; config.url = `${prefix}${config.url}`;
@ -107,17 +106,14 @@ const transform: AxiosTransform = {
config.url = `${apiUrl}${config.url}`; config.url = `${apiUrl}${config.url}`;
} }
if (config.method?.toUpperCase() === RequestEnum.GET) { if (config.method?.toUpperCase() === RequestEnum.GET) {
const now = new Date().getTime();
if (!isString(config.params)) { if (!isString(config.params)) {
config.data = { config.data = {
// 给 get 请求加上时间戳参数,避免从缓存中拿数据。 // 给 get 请求加上时间戳参数,避免从缓存中拿数据。
params: Object.assign(config.params || {}, { params: Object.assign(config.params || {}, createNow(joinTime, false)),
_t: now,
}),
}; };
} else { } else {
// 兼容restful风格 // 兼容restful风格
config.url = config.url + config.params + `?_t=${now}`; config.url = config.url + config.params + `${createNow(joinTime, true)}`;
config.params = undefined; config.params = undefined;
} }
} else { } else {
@ -187,6 +183,8 @@ function createAxios(opt?: Partial<CreateAxiosOptions>) {
// 接口可能会有通用的地址部分,可以统一抽取出来 // 接口可能会有通用的地址部分,可以统一抽取出来
prefixUrl: prefix, prefixUrl: prefix,
headers: { 'Content-Type': ContentTypeEnum.JSON }, headers: { 'Content-Type': ContentTypeEnum.JSON },
// 如果是form-data格式
// headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED },
// 数据处理方式 // 数据处理方式
transform, transform,
// 配置项,下面的选项都可以在独立的接口请求中覆盖 // 配置项,下面的选项都可以在独立的接口请求中覆盖
@ -203,6 +201,8 @@ function createAxios(opt?: Partial<CreateAxiosOptions>) {
errorMessageMode: 'message', errorMessageMode: 'message',
// 接口地址 // 接口地址
apiUrl: globSetting.apiUrl, apiUrl: globSetting.apiUrl,
// 是否加入时间戳
joinTime: true,
}, },
}, },
opt || {} opt || {}

View File

@ -16,6 +16,8 @@ export interface RequestOptions {
apiUrl?: string; apiUrl?: string;
// 错误消息提示类型 // 错误消息提示类型
errorMessageMode?: ErrorMessageMode; errorMessageMode?: ErrorMessageMode;
// 是否加入时间戳
joinTime?: boolean;
} }
export interface CreateAxiosOptions extends AxiosRequestConfig { export interface CreateAxiosOptions extends AxiosRequestConfig {

View File

@ -78,6 +78,7 @@ const viteConfig: UserConfig = {
// The package will be recompiled using rollup, and the new package compiled into the esm module specification will be put into node_modules/.vite_opt_cache // The package will be recompiled using rollup, and the new package compiled into the esm module specification will be put into node_modules/.vite_opt_cache
optimizeDeps: { optimizeDeps: {
include: [ include: [
'qs',
'echarts/map/js/china', 'echarts/map/js/china',
'ant-design-vue/es/locale/zh_CN', 'ant-design-vue/es/locale/zh_CN',
'ant-design-vue/es/locale/en_US', 'ant-design-vue/es/locale/en_US',