Commit f646e37754d21ba7c89437176bd9e375924dee03
1 parent
c774a6d3
feat: axios add joinTime field
Showing
8 changed files
with
65 additions
and
35 deletions
CHANGELOG.zh_CN.md
... | ... | @@ -3,7 +3,8 @@ |
3 | 3 | ### ✨ Features |
4 | 4 | |
5 | 5 | - 移除左侧菜单搜索,新增顶部菜单搜索功能 |
6 | -- layout 移动端适配。页面未适配 | |
6 | +- layout 移动端适配。业务页面未适配 | |
7 | +- axios 加入 joinTime 配置。控制响应是否加入时间戳 | |
7 | 8 | |
8 | 9 | ### ⚡ Performance Improvements |
9 | 10 | |
... | ... | @@ -19,6 +20,10 @@ |
19 | 20 | - 刷新按钮布局调整 |
20 | 21 | - `route.meta` 移除 `externalLink` 属性 |
21 | 22 | |
23 | +### ✨ Refactor | |
24 | + | |
25 | +- `openModal`与`openDrawer`第三个参数`openOnSet`默认设置为 true | |
26 | + | |
22 | 27 | ### 🐛 Bug Fixes |
23 | 28 | |
24 | 29 | - 修复多级路由缓存导致组件渲染多次的问题 |
... | ... | @@ -31,6 +36,7 @@ |
31 | 36 | - 修复 `Modal`与`Drawer`组件在使用 emits 数据传递失效问题 |
32 | 37 | - 修复菜单已知问题 |
33 | 38 | - 修复上传组件 api 失效问题 |
39 | +- 修复菜单权限过滤失效问题 | |
34 | 40 | |
35 | 41 | ## 2.0.0-rc.13 (2020-12-10) |
36 | 42 | ... | ... |
src/components/Drawer/src/useDrawer.ts
... | ... | @@ -56,7 +56,7 @@ export function useDrawer(): UseDrawerReturnType { |
56 | 56 | getInstance().setDrawerProps(props); |
57 | 57 | }, |
58 | 58 | |
59 | - openDrawer: <T = any>(visible = true, data?: T, openOnSet = false): void => { | |
59 | + openDrawer: <T = any>(visible = true, data?: T, openOnSet = true): void => { | |
60 | 60 | getInstance().setDrawerProps({ |
61 | 61 | visible: visible, |
62 | 62 | }); | ... | ... |
src/components/Modal/src/useModal.ts
... | ... | @@ -60,7 +60,7 @@ export function useModal(): UseModalReturnType { |
60 | 60 | getInstance().setModalProps(props); |
61 | 61 | }, |
62 | 62 | |
63 | - openModal: <T = any>(visible = true, data?: T, openOnSet = false): void => { | |
63 | + openModal: <T = any>(visible = true, data?: T, openOnSet = true): void => { | |
64 | 64 | getInstance().setModalProps({ |
65 | 65 | visible: visible, |
66 | 66 | }); | ... | ... |
src/utils/dateUtil.ts
1 | -import { isObject, isString } from '/@/utils/is'; | |
2 | 1 | import moment from 'moment'; |
3 | 2 | |
4 | 3 | const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm'; |
... | ... | @@ -34,28 +33,5 @@ export const formatAgo = (str: string | number) => { |
34 | 33 | return parseInt(String(time / 31536000000)) + '年前'; |
35 | 34 | } |
36 | 35 | }; |
37 | -/** | |
38 | - * @description: 格式化请求参数时间 | |
39 | - */ | |
40 | -export function formatRequestDate(params: any) { | |
41 | - for (const key in params) { | |
42 | - if (params[key] && params[key]._isAMomentObject) { | |
43 | - params[key] = params[key].format(DATE_TIME_FORMAT); | |
44 | - } | |
45 | - if (isString(key)) { | |
46 | - const value = params[key]; | |
47 | - if (value) { | |
48 | - try { | |
49 | - params[key] = isString(value) ? value.trim() : value; | |
50 | - } catch (error) { | |
51 | - throw new Error(error); | |
52 | - } | |
53 | - } | |
54 | - } | |
55 | - if (isObject(params[key])) { | |
56 | - formatRequestDate(params[key]); | |
57 | - } | |
58 | - } | |
59 | -} | |
60 | 36 | |
61 | 37 | export const dateUtil = moment; | ... | ... |
src/utils/http/axios/helper.ts
0 → 100644
1 | +import { isObject, isString } from '/@/utils/is'; | |
2 | + | |
3 | +export function createNow<T extends boolean>( | |
4 | + join: boolean, | |
5 | + restful: T | |
6 | +): T extends true ? string : object; | |
7 | + | |
8 | +export function createNow(join: boolean, restful = false): string | object { | |
9 | + if (!join) { | |
10 | + return restful ? '' : {}; | |
11 | + } | |
12 | + const now = new Date().getTime(); | |
13 | + if (restful) { | |
14 | + return `?_t=${now}`; | |
15 | + } | |
16 | + | |
17 | + return { | |
18 | + _t: now, | |
19 | + }; | |
20 | +} | |
21 | + | |
22 | +const DATE_TIME_FORMAT = 'YYYY-MM-DD HH:mm'; | |
23 | +/** | |
24 | + * @description: 格式化请求参数时间 | |
25 | + */ | |
26 | +export function formatRequestDate(params: any) { | |
27 | + for (const key in params) { | |
28 | + if (params[key] && params[key]._isAMomentObject) { | |
29 | + params[key] = params[key].format(DATE_TIME_FORMAT); | |
30 | + } | |
31 | + if (isString(key)) { | |
32 | + const value = params[key]; | |
33 | + if (value) { | |
34 | + try { | |
35 | + params[key] = isString(value) ? value.trim() : value; | |
36 | + } catch (error) { | |
37 | + throw new Error(error); | |
38 | + } | |
39 | + } | |
40 | + } | |
41 | + if (isObject(params[key])) { | |
42 | + formatRequestDate(params[key]); | |
43 | + } | |
44 | + } | |
45 | +} | ... | ... |
src/utils/http/axios/index.ts
... | ... | @@ -3,7 +3,6 @@ |
3 | 3 | |
4 | 4 | import type { AxiosResponse } from 'axios'; |
5 | 5 | import type { CreateAxiosOptions, RequestOptions, Result } from './types'; |
6 | - | |
7 | 6 | import { VAxios } from './Axios'; |
8 | 7 | import { getToken } from '/@/utils/auth'; |
9 | 8 | import { AxiosTransform } from './axiosTransform'; |
... | ... | @@ -16,11 +15,11 @@ import { useMessage } from '/@/hooks/web/useMessage'; |
16 | 15 | import { RequestEnum, ResultEnum, ContentTypeEnum } from '/@/enums/httpEnum'; |
17 | 16 | |
18 | 17 | import { isString } from '/@/utils/is'; |
19 | -import { formatRequestDate } from '/@/utils/dateUtil'; | |
20 | 18 | import { setObjToUrlParams, deepMerge } from '/@/utils'; |
21 | 19 | import { errorStore } from '/@/store/modules/error'; |
22 | 20 | import { errorResult } from './const'; |
23 | 21 | import { useI18n } from '/@/hooks/web/useI18n'; |
22 | +import { createNow, formatRequestDate } from './helper'; | |
24 | 23 | |
25 | 24 | const globSetting = useGlobSetting(); |
26 | 25 | const prefix = globSetting.urlPrefix; |
... | ... | @@ -97,7 +96,7 @@ const transform: AxiosTransform = { |
97 | 96 | |
98 | 97 | // 请求之前处理config |
99 | 98 | beforeRequestHook: (config, options) => { |
100 | - const { apiUrl, joinPrefix, joinParamsToUrl, formatDate } = options; | |
99 | + const { apiUrl, joinPrefix, joinParamsToUrl, formatDate, joinTime = true } = options; | |
101 | 100 | |
102 | 101 | if (joinPrefix) { |
103 | 102 | config.url = `${prefix}${config.url}`; |
... | ... | @@ -107,17 +106,14 @@ const transform: AxiosTransform = { |
107 | 106 | config.url = `${apiUrl}${config.url}`; |
108 | 107 | } |
109 | 108 | if (config.method?.toUpperCase() === RequestEnum.GET) { |
110 | - const now = new Date().getTime(); | |
111 | 109 | if (!isString(config.params)) { |
112 | 110 | config.data = { |
113 | 111 | // 给 get 请求加上时间戳参数,避免从缓存中拿数据。 |
114 | - params: Object.assign(config.params || {}, { | |
115 | - _t: now, | |
116 | - }), | |
112 | + params: Object.assign(config.params || {}, createNow(joinTime, false)), | |
117 | 113 | }; |
118 | 114 | } else { |
119 | 115 | // 兼容restful风格 |
120 | - config.url = config.url + config.params + `?_t=${now}`; | |
116 | + config.url = config.url + config.params + `${createNow(joinTime, true)}`; | |
121 | 117 | config.params = undefined; |
122 | 118 | } |
123 | 119 | } else { |
... | ... | @@ -187,6 +183,8 @@ function createAxios(opt?: Partial<CreateAxiosOptions>) { |
187 | 183 | // 接口可能会有通用的地址部分,可以统一抽取出来 |
188 | 184 | prefixUrl: prefix, |
189 | 185 | headers: { 'Content-Type': ContentTypeEnum.JSON }, |
186 | + // 如果是form-data格式 | |
187 | + // headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED }, | |
190 | 188 | // 数据处理方式 |
191 | 189 | transform, |
192 | 190 | // 配置项,下面的选项都可以在独立的接口请求中覆盖 |
... | ... | @@ -203,6 +201,8 @@ function createAxios(opt?: Partial<CreateAxiosOptions>) { |
203 | 201 | errorMessageMode: 'message', |
204 | 202 | // 接口地址 |
205 | 203 | apiUrl: globSetting.apiUrl, |
204 | + // 是否加入时间戳 | |
205 | + joinTime: true, | |
206 | 206 | }, |
207 | 207 | }, |
208 | 208 | opt || {} | ... | ... |
src/utils/http/axios/types.ts
vite.config.ts
... | ... | @@ -78,6 +78,7 @@ const viteConfig: UserConfig = { |
78 | 78 | // 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 |
79 | 79 | optimizeDeps: { |
80 | 80 | include: [ |
81 | + 'qs', | |
81 | 82 | 'echarts/map/js/china', |
82 | 83 | 'ant-design-vue/es/locale/zh_CN', |
83 | 84 | 'ant-design-vue/es/locale/en_US', | ... | ... |