feat: 🚀 刷新token

This commit is contained in:
Bunny 2024-09-26 23:09:43 +08:00
parent 86ec14cae5
commit 50af6bbec9
5 changed files with 50 additions and 49 deletions

View File

@ -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 });
}; };

View File

@ -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);
});
});
}, },
}, },
}); });

View File

@ -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;
}; };

View File

@ -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;

View File

@ -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>