feat: 🚀 刷新token
This commit is contained in:
parent
86ec14cae5
commit
50af6bbec9
|
@ -29,7 +29,9 @@ export interface RefreshTokenResult {
|
||||||
expires: Date;
|
expires: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 登录 */
|
/**
|
||||||
|
* 登录
|
||||||
|
*/
|
||||||
export const fetchLogin = (data?: object) => {
|
export const fetchLogin = (data?: object) => {
|
||||||
return http.request<BaseResult<UserResult>>('post', '/login', { data });
|
return http.request<BaseResult<UserResult>>('post', '/login', { data });
|
||||||
};
|
};
|
||||||
|
@ -44,5 +46,5 @@ export const fetchPostEmailCode = (data: any) => {
|
||||||
|
|
||||||
/** 刷新`token` */
|
/** 刷新`token` */
|
||||||
export const refreshTokenApi = (data?: object) => {
|
export const refreshTokenApi = (data?: object) => {
|
||||||
return http.request<BaseResult<RefreshTokenResult>>('post', '/refresh-token', { data });
|
return http.request<BaseResult<RefreshTokenResult>>('post', 'user/noAuth/refreshToken', { data });
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import { defineStore } from 'pinia';
|
import { defineStore } from 'pinia';
|
||||||
import { resetRouter, router, routerArrays, storageLocal, store, type userType } from '../utils';
|
import { resetRouter, router, routerArrays, storageLocal, store, type userType } from '../utils';
|
||||||
import { fetchLogin, fetchPostEmailCode, refreshTokenApi, type RefreshTokenResult } from '@/api/v1/user';
|
import { fetchLogin, fetchPostEmailCode, refreshTokenApi } from '@/api/v1/user';
|
||||||
import { useMultiTagsStoreHook } from './multiTags';
|
import { useMultiTagsStoreHook } from './multiTags';
|
||||||
import { type DataInfo, removeToken, setToken, userKey } from '@/utils/auth';
|
import { type DataInfo, removeToken, setToken, userKey } from '@/utils/auth';
|
||||||
import { message } from '@/utils/message';
|
import { message } from '@/utils/message';
|
||||||
|
@ -19,13 +19,14 @@ export const useUserStore = defineStore({
|
||||||
// 按钮级别权限
|
// 按钮级别权限
|
||||||
permissions: storageLocal().getItem<DataInfo<number>>(userKey)?.permissions ?? [],
|
permissions: storageLocal().getItem<DataInfo<number>>(userKey)?.permissions ?? [],
|
||||||
// 是否勾选了登录页的免登录
|
// 是否勾选了登录页的免登录
|
||||||
isRemembered: false,
|
isRemembered: true,
|
||||||
// 登录页的免登录存储几天,默认7天
|
// 登录页的免登录存储几天,默认7天
|
||||||
loginDay: 7,
|
readMeDay: 7,
|
||||||
}),
|
}),
|
||||||
actions: {
|
actions: {
|
||||||
/** 登入 */
|
/** 登入 */
|
||||||
async loginByUsername(data: any) {
|
async loginByUsername(data: any) {
|
||||||
|
data = this.isRemembered ? { ...data, readMeDay: this.readMeDay } : data;
|
||||||
const result = await fetchLogin(data);
|
const result = await fetchLogin(data);
|
||||||
|
|
||||||
if (result.code === 200) {
|
if (result.code === 200) {
|
||||||
|
@ -68,19 +69,14 @@ export const useUserStore = defineStore({
|
||||||
/**
|
/**
|
||||||
* 刷新`token`
|
* 刷新`token`
|
||||||
*/
|
*/
|
||||||
async handRefreshToken(data) {
|
async handRefreshToken(data: any) {
|
||||||
return new Promise<RefreshTokenResult>((resolve, reject) => {
|
const result = await refreshTokenApi({ ...data, readMeDay: this.readMeDay });
|
||||||
refreshTokenApi(data)
|
if (result.code === 200) {
|
||||||
.then((data: any) => {
|
setToken(data.data);
|
||||||
if (data) {
|
return true;
|
||||||
setToken(data.data);
|
}
|
||||||
resolve(data);
|
message(result.message, { type: 'error' });
|
||||||
}
|
return false;
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,47 +1,47 @@
|
||||||
import type { RouteRecordName } from "vue-router";
|
import type { RouteRecordName } from 'vue-router';
|
||||||
|
|
||||||
export type cacheType = {
|
export type cacheType = {
|
||||||
mode: string;
|
mode: string;
|
||||||
name?: RouteRecordName;
|
name?: RouteRecordName;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type positionType = {
|
export type positionType = {
|
||||||
startIndex?: number;
|
startIndex?: number;
|
||||||
length?: number;
|
length?: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type appType = {
|
export type appType = {
|
||||||
sidebar: {
|
sidebar: {
|
||||||
opened: boolean;
|
opened: boolean;
|
||||||
withoutAnimation: boolean;
|
withoutAnimation: boolean;
|
||||||
// 判断是否手动点击Collapse
|
// 判断是否手动点击Collapse
|
||||||
isClickCollapse: boolean;
|
isClickCollapse: boolean;
|
||||||
};
|
};
|
||||||
layout: string;
|
layout: string;
|
||||||
device: string;
|
device: string;
|
||||||
viewportSize: { width: number; height: number };
|
viewportSize: { width: number; height: number };
|
||||||
};
|
};
|
||||||
|
|
||||||
export type multiType = {
|
export type multiType = {
|
||||||
path: string;
|
path: string;
|
||||||
name: string;
|
name: string;
|
||||||
meta: any;
|
meta: any;
|
||||||
query?: object;
|
query?: object;
|
||||||
params?: object;
|
params?: object;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type setType = {
|
export type setType = {
|
||||||
title: string;
|
title: string;
|
||||||
fixedHeader: boolean;
|
fixedHeader: boolean;
|
||||||
hiddenSideBar: boolean;
|
hiddenSideBar: boolean;
|
||||||
};
|
};
|
||||||
|
|
||||||
export type userType = {
|
export type userType = {
|
||||||
avatar?: string;
|
avatar?: string;
|
||||||
username?: string;
|
username?: string;
|
||||||
nickname?: string;
|
nickname?: string;
|
||||||
roles?: Array<string>;
|
roles?: Array<string>;
|
||||||
permissions?: Array<string>;
|
permissions?: Array<string>;
|
||||||
isRemembered?: boolean;
|
isRemembered?: boolean;
|
||||||
loginDay?: number;
|
readMeDay?: number;
|
||||||
};
|
};
|
||||||
|
|
|
@ -47,13 +47,13 @@ export function setToken(data: any) {
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
let expires = 0;
|
let expires = 0;
|
||||||
const { token, refreshToken } = data;
|
const { token, refreshToken } = data;
|
||||||
const { isRemembered, loginDay } = useUserStoreHook();
|
const { isRemembered, readMeDay } = useUserStoreHook();
|
||||||
expires = new Date(data.expires).getTime(); // 如果后端直接设置时间戳,将此处代码改为expires = data.expires,然后把上面的DataInfo<Date>改成DataInfo<number>即可
|
expires = new Date(data.expires).getTime(); // 如果后端直接设置时间戳,将此处代码改为expires = data.expires,然后把上面的DataInfo<Date>改成DataInfo<number>即可
|
||||||
const cookieString = JSON.stringify({ token, expires, refreshToken });
|
const cookieString = JSON.stringify({ token, expires, refreshToken });
|
||||||
|
|
||||||
expires > 0 ? Cookies.set(TokenKey, cookieString, { expires: (expires - Date.now()) / 86400000 }) : Cookies.set(TokenKey, cookieString);
|
expires > 0 ? Cookies.set(TokenKey, cookieString, { expires: (expires - Date.now()) / 86400000 }) : Cookies.set(TokenKey, cookieString);
|
||||||
|
|
||||||
Cookies.set(multipleTabsKey, 'true', isRemembered ? { expires: loginDay } : {});
|
Cookies.set(multipleTabsKey, 'true', isRemembered ? { expires: readMeDay } : {});
|
||||||
|
|
||||||
function setUserKey({ avatar, username, nickname, roles, permissions }) {
|
function setUserKey({ avatar, username, nickname, roles, permissions }) {
|
||||||
userStore.avatar = avatar;
|
userStore.avatar = avatar;
|
||||||
|
|
|
@ -128,6 +128,9 @@ onBeforeUnmount(() => {
|
||||||
</el-link>
|
</el-link>
|
||||||
</template>
|
</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
|
<el-checkbox v-model="userStore.isRemembered">
|
||||||
|
<el-text size="small" type="primary">{{ userStore.readMeDay }}天免登录</el-text>
|
||||||
|
</el-checkbox>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</Motion>
|
</Motion>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue