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