Skip to content

Commit d049614

Browse files
author
sunshine824
committed
fetch.js优化,更好支持typescript
1 parent 9e320e4 commit d049614

File tree

8 files changed

+111
-41
lines changed

8 files changed

+111
-41
lines changed

src/api/types/user.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// 登录参数
2+
export interface ILoginApiParams {
3+
username: string // 用户名
4+
password: string // 密码
5+
captcha: string // 验证码
6+
uuid: string // 验证码uuid
7+
}
8+
9+
// 登录返回结果
10+
export interface ILoginData {
11+
token: string
12+
userInfo: {
13+
address: string
14+
username: string
15+
}
16+
}
17+
18+
// 注销登录参数
19+
export interface ILogoutParams {}
20+
21+
// 获取用户权限参数
22+
export interface IPermissionsParams {}
23+
24+
export interface IUserApi {
25+
login: (params: ILoginApiParams) => Promise<StoreState.ResType<ILoginData>>
26+
logout: (params: ILogoutParams) => Promise<StoreState.ResType<any>>
27+
getPermissionsList: (
28+
params: IPermissionsParams,
29+
) => Promise<StoreState.ResType<any>>
30+
}

src/api/user.ts

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,32 @@
1-
import service from '@/utils/fetch';
21
import qs from 'qs'
2+
import fetch from '@/utils/fetch'
3+
import { IUserApi } from './types/user'
34

4-
// 用户登录
5-
export const login = (params: any): any => service({
6-
method: 'post',
7-
url: '/login',
8-
data: params,
9-
});
5+
const UserApi: IUserApi = {
6+
// 登录
7+
login: (params) => {
8+
return fetch({
9+
method: 'post',
10+
url: '/login',
11+
data: params,
12+
})
13+
},
14+
// 注销登录
15+
logout: (params) => {
16+
return fetch({
17+
method: 'get',
18+
url: '/logout',
19+
data: params,
20+
})
21+
},
22+
// 获取权限列表
23+
getPermissionsList: (params) => {
24+
return fetch({
25+
method: 'get',
26+
url: '/navPerson',
27+
data: qs.stringify(params),
28+
})
29+
},
30+
}
1031

11-
// 用户登出
12-
export const logout = (params: any) => service({
13-
method: 'get',
14-
url: '/logout',
15-
data: params,
16-
});
17-
18-
// 获取权限列表
19-
export const getPermissionsList = (params: any) => service({
20-
method: 'get',
21-
url: '/navPerson',
22-
data: qs.stringify(params),
23-
});
32+
export default UserApi

src/layouts/LevelBasicLayout.tsx

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { defineComponent, computed } from 'vue'
22
import { RouterView, RouteRecordRaw, useRouter, useRoute } from 'vue-router'
3-
import { Layout, Dropdown } from 'ant-design-vue'
3+
import { Layout, Dropdown, Menu } from 'ant-design-vue'
44
import { GlobalHeader, Menus, LevelMenus } from '@/components/GlobalHeader'
55

66
import styles from './index.module.less'
@@ -49,14 +49,31 @@ const LevelBasicLayout = defineComponent({
4949
})
5050
return JSON.parse(JSON.stringify(menuList))
5151
}
52+
53+
// 退出
54+
const exit = () => {
55+
sessionStorage.clear()
56+
router.push('/login')
57+
}
58+
59+
const menuSlots = {
60+
overlay: () => (
61+
<Menu>
62+
<Menu.Item>
63+
<span onClick={exit}>退出</span>
64+
</Menu.Item>
65+
</Menu>
66+
),
67+
}
68+
5269
const slots = {
5370
content: () => (
5471
<>
5572
{/* 导航栏 */}
5673
<LevelMenus menuLists={menuLists['value']}></LevelMenus>
5774
{/* 用户信息 */}
5875
<div class={styles['user-info']}>
59-
<Dropdown>
76+
<Dropdown v-slots={menuSlots}>
6077
<div>
6178
<img src={UserIcon} class={styles['user-head']} />
6279
<a class={styles['user-name']}>admin</a>

src/main.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { store, key } from './store'
33
import router from './router'
44
import moment from 'moment'
55
import App from './App'
6-
import { setupAntd } from './plugins/antd'
6+
import Antd from 'ant-design-vue'
77

88
moment.locale('zh-cn')
99

@@ -16,8 +16,4 @@ import 'ant-design-vue/dist/antd.css'
1616

1717
const app = createApp(App)
1818

19-
setupAntd(app)
20-
app.use(router)
21-
app.use(store, key)
22-
23-
app.mount('#app')
19+
app.use(router).use(store, key).use(Antd).mount('#app')

src/router/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {
99
} from 'vue-router'
1010
import { mainRoutes, baseRoutes, Routes } from './router.config'
1111
import { getToken } from '@/utils/token'
12-
import { getPermissionsList } from '@/api/user'
12+
import UserApi from '@/api/user'
1313
import { RouteLayout, BlankLayout } from '@/layouts'
1414

1515
let isAddDynamicMenuRoutes = false // 是否请求路由表
@@ -69,7 +69,7 @@ router.beforeEach(
6969
if (!isAddDynamicMenuRoutes) {
7070
try {
7171
//获取动态路由表
72-
const res: any = await getPermissionsList({})
72+
const res: any = await UserApi.getPermissionsList({})
7373
if (res.code == 200) {
7474
isAddDynamicMenuRoutes = true
7575
const menu = res.data

src/types/interfaces.d.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77
*/
88
declare namespace StoreState {
99
// 接口返回结构
10-
export interface Result {
10+
export interface ResType<T> {
1111
code: number
12-
data: any
12+
data: T
13+
msg?: string
1314
status: boolean
14-
msg: string
1515
}
1616

1717
// 请求参数结构

src/utils/fetch.ts

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import axios, { AxiosRequestConfig, AxiosResponse, AxiosInstance } from 'axios'
2-
import { getToken, removeToken } from './token'
2+
import { getToken } from './token'
33
import { Modal } from 'ant-design-vue'
44
import { Message, Notification } from '@/utils/resetMessage'
55

@@ -37,22 +37,22 @@ service.interceptors.response.use(
3737
title: 'token出错',
3838
content: 'token失效,请重新登录!',
3939
onOk: () => {
40-
removeToken()
40+
sessionStorage.clear()
4141
},
4242
})
4343
} else if (code == 200) {
4444
if (status) {
4545
// 接口请求成功
4646
msg && Message.success(msg) // 后台如果返回了msg,则将msg提示出来
47-
return Promise.resolve(response.data) // 返回成功数据
47+
return Promise.resolve(response) // 返回成功数据
4848
}
4949
// 接口异常
5050
msg && Message.warning(msg) // 后台如果返回了msg,则将msg提示出来
51-
return Promise.reject(response.data) // 返回异常数据
51+
return Promise.reject(response) // 返回异常数据
5252
} else {
5353
// 接口异常
5454
msg && Message.error(msg)
55-
return Promise.reject(response.data)
55+
return Promise.reject(response)
5656
}
5757
}
5858
return response
@@ -96,4 +96,22 @@ service.interceptors.response.use(
9696
},
9797
)
9898

99-
export default service
99+
interface Http {
100+
fetch<T>(params: AxiosRequestConfig): Promise<StoreState.ResType<T>>
101+
}
102+
103+
const http: Http = {
104+
fetch(params) {
105+
return new Promise((resolve, reject) => {
106+
service(params)
107+
.then((res) => {
108+
resolve(res.data)
109+
})
110+
.catch((err) => {
111+
reject(err.data)
112+
})
113+
})
114+
},
115+
}
116+
117+
export default http['fetch']

src/views/user/login/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useRouter } from 'vue-router'
33
import { Form, Input, Button, Row, Col, message } from 'ant-design-vue'
44
import { uuid } from '@/utils/util'
55
import GlobalBg from '@/components/GlobalBg'
6-
import { login } from '@/api/user.ts'
6+
import UserApi from '@/api/user.ts'
77

88
import styles from './index.module.less'
99

@@ -46,7 +46,7 @@ const Login = defineComponent({
4646
await formRef.value.validate()
4747
loading.value = true
4848
try {
49-
const { data } = await login(formData)
49+
const { data } = await UserApi.login(formData)
5050
sessionStorage.setItem('token', data.token)
5151
sessionStorage.setItem('userInfo', JSON.stringify(data.userInfo))
5252
router.push('/dataProtal')

0 commit comments

Comments
 (0)