diff --git a/CHANGELOG.zh_CN.md b/CHANGELOG.zh_CN.md index 61d9e5c9e70..05c416c369a 100644 --- a/CHANGELOG.zh_CN.md +++ b/CHANGELOG.zh_CN.md @@ -3,7 +3,8 @@ ### ✨ Features - 移除左侧菜单搜索,新增顶部菜单搜索功能 -- layout 移动端适配。页面未适配 +- layout 移动端适配。业务页面未适配 +- axios 加入 joinTime 配置。控制响应是否加入时间戳 ### ⚡ Performance Improvements @@ -19,6 +20,10 @@ - 刷新按钮布局调整 - `route.meta` 移除 `externalLink` 属性 +### ✨ Refactor + +- `openModal`与`openDrawer`第三个参数`openOnSet`默认设置为 true + ### 🐛 Bug Fixes - 修复多级路由缓存导致组件渲染多次的问题 @@ -31,6 +36,7 @@ - 修复 `Modal`与`Drawer`组件在使用 emits 数据传递失效问题 - 修复菜单已知问题 - 修复上传组件 api 失效问题 +- 修复菜单权限过滤失效问题 ## 2.0.0-rc.13 (2020-12-10) diff --git a/src/components/Drawer/src/useDrawer.ts b/src/components/Drawer/src/useDrawer.ts index 1781bea5845..35817bd7682 100644 --- a/src/components/Drawer/src/useDrawer.ts +++ b/src/components/Drawer/src/useDrawer.ts @@ -56,7 +56,7 @@ export function useDrawer(): UseDrawerReturnType { getInstance().setDrawerProps(props); }, - openDrawer: (visible = true, data?: T, openOnSet = false): void => { + openDrawer: (visible = true, data?: T, openOnSet = true): void => { getInstance().setDrawerProps({ visible: visible, }); diff --git a/src/components/Modal/src/useModal.ts b/src/components/Modal/src/useModal.ts index 05de307618c..83c26c492f9 100644 --- a/src/components/Modal/src/useModal.ts +++ b/src/components/Modal/src/useModal.ts @@ -60,7 +60,7 @@ export function useModal(): UseModalReturnType { getInstance().setModalProps(props); }, - openModal: (visible = true, data?: T, openOnSet = false): void => { + openModal: (visible = true, data?: T, openOnSet = true): void => { getInstance().setModalProps({ visible: visible, }); diff --git a/src/utils/dateUtil.ts b/src/utils/dateUtil.ts index a95f0e928b4..0ef2b57e166 100644 --- a/src/utils/dateUtil.ts +++ b/src/utils/dateUtil.ts @@ -1,4 +1,3 @@ -import { isObject, isString } from '/@/utils/is'; import moment from 'moment'; const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm'; @@ -34,28 +33,5 @@ export const formatAgo = (str: string | number) => { 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; diff --git a/src/utils/http/axios/helper.ts b/src/utils/http/axios/helper.ts new file mode 100644 index 00000000000..8372a0f8d5a --- /dev/null +++ b/src/utils/http/axios/helper.ts @@ -0,0 +1,45 @@ +import { isObject, isString } from '/@/utils/is'; + +export function createNow( + 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]); + } + } +} diff --git a/src/utils/http/axios/index.ts b/src/utils/http/axios/index.ts index 710a5bc0a6d..cd7b2652477 100644 --- a/src/utils/http/axios/index.ts +++ b/src/utils/http/axios/index.ts @@ -3,7 +3,6 @@ import type { AxiosResponse } from 'axios'; import type { CreateAxiosOptions, RequestOptions, Result } from './types'; - import { VAxios } from './Axios'; import { getToken } from '/@/utils/auth'; import { AxiosTransform } from './axiosTransform'; @@ -16,11 +15,11 @@ import { useMessage } from '/@/hooks/web/useMessage'; import { RequestEnum, ResultEnum, ContentTypeEnum } from '/@/enums/httpEnum'; import { isString } from '/@/utils/is'; -import { formatRequestDate } from '/@/utils/dateUtil'; import { setObjToUrlParams, deepMerge } from '/@/utils'; import { errorStore } from '/@/store/modules/error'; import { errorResult } from './const'; import { useI18n } from '/@/hooks/web/useI18n'; +import { createNow, formatRequestDate } from './helper'; const globSetting = useGlobSetting(); const prefix = globSetting.urlPrefix; @@ -97,7 +96,7 @@ const transform: AxiosTransform = { // 请求之前处理config beforeRequestHook: (config, options) => { - const { apiUrl, joinPrefix, joinParamsToUrl, formatDate } = options; + const { apiUrl, joinPrefix, joinParamsToUrl, formatDate, joinTime = true } = options; if (joinPrefix) { config.url = `${prefix}${config.url}`; @@ -107,17 +106,14 @@ const transform: AxiosTransform = { config.url = `${apiUrl}${config.url}`; } if (config.method?.toUpperCase() === RequestEnum.GET) { - const now = new Date().getTime(); if (!isString(config.params)) { config.data = { // 给 get 请求加上时间戳参数,避免从缓存中拿数据。 - params: Object.assign(config.params || {}, { - _t: now, - }), + params: Object.assign(config.params || {}, createNow(joinTime, false)), }; } else { // 兼容restful风格 - config.url = config.url + config.params + `?_t=${now}`; + config.url = config.url + config.params + `${createNow(joinTime, true)}`; config.params = undefined; } } else { @@ -187,6 +183,8 @@ function createAxios(opt?: Partial) { // 接口可能会有通用的地址部分,可以统一抽取出来 prefixUrl: prefix, headers: { 'Content-Type': ContentTypeEnum.JSON }, + // 如果是form-data格式 + // headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED }, // 数据处理方式 transform, // 配置项,下面的选项都可以在独立的接口请求中覆盖 @@ -203,6 +201,8 @@ function createAxios(opt?: Partial) { errorMessageMode: 'message', // 接口地址 apiUrl: globSetting.apiUrl, + // 是否加入时间戳 + joinTime: true, }, }, opt || {} diff --git a/src/utils/http/axios/types.ts b/src/utils/http/axios/types.ts index 486eaab1d4a..90b16198a87 100644 --- a/src/utils/http/axios/types.ts +++ b/src/utils/http/axios/types.ts @@ -16,6 +16,8 @@ export interface RequestOptions { apiUrl?: string; // 错误消息提示类型 errorMessageMode?: ErrorMessageMode; + // 是否加入时间戳 + joinTime?: boolean; } export interface CreateAxiosOptions extends AxiosRequestConfig { diff --git a/vite.config.ts b/vite.config.ts index 57d67ce9ae8..29e4ae8c14d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -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 optimizeDeps: { include: [ + 'qs', 'echarts/map/js/china', 'ant-design-vue/es/locale/zh_CN', 'ant-design-vue/es/locale/en_US',