From c97e246ba7806dfaf197b4464613a7f5418530dd Mon Sep 17 00:00:00 2001 From: abearxiong Date: Sat, 21 Feb 2026 02:58:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E8=87=B3=200.0.56=EF=BC=8C=E5=A2=9E=E5=BC=BA=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E5=8A=9F=E8=83=BD=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=20token=20=E6=9C=89=E6=95=88=E6=80=A7=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- query/query-login/login-cache.ts | 39 +++++++++++++++++++++++++++----- query/query-login/query-login.ts | 4 ++++ 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 252ad84..395f3b0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/api", - "version": "0.0.55", + "version": "0.0.56", "description": "", "main": "mod.ts", "scripts": { diff --git a/query/query-login/login-cache.ts b/query/query-login/login-cache.ts index 4eeee34..8dfa36d 100644 --- a/query/query-login/login-cache.ts +++ b/query/query-login/login-cache.ts @@ -82,7 +82,8 @@ export type CacheStore = { getValue(): Promise; setValue(value: CacheLogin): Promise; delValue(): Promise; - init(): Promise; + init(): Promise; + getIsExpired(): Promise; }; export type LoginCacheStoreOpts = { @@ -124,6 +125,13 @@ export class LoginCacheStore implements CacheStore { */ async delValue() { await this.cache.del(); + this.cacheData = { + loginUsers: [], + user: undefined, + id: undefined, + accessToken: undefined, + refreshToken: undefined, + }; } getValue(): Promise { return this.cache.get(this.name); @@ -132,12 +140,14 @@ export class LoginCacheStore implements CacheStore { * 初始化,设置默认值 */ async init() { - const defaultData = { + const defaultData: CacheLogin = { loginUsers: [], - user: null, - id: null, - accessToken: null, - refreshToken: null, + user: undefined, + id: undefined, + accessToken: undefined, + refreshToken: undefined, + accessTokenExpiresIn: undefined, + createdAt: undefined, }; if (this.cache.init) { try { @@ -149,6 +159,7 @@ export class LoginCacheStore implements CacheStore { } else { this.cacheData = (await this.getValue()) || defaultData; } + return this.cacheData; } /** * 设置当前用户 @@ -184,6 +195,18 @@ export class LoginCacheStore implements CacheStore { const cacheData = this.cacheData; return Promise.resolve(cacheData.accessToken || ''); } + getIsExpired(): Promise { + const cacheData = this.cacheData; + if (!cacheData.accessToken) { + return Promise.resolve(true); + } + if (!cacheData.createdAt || !cacheData.accessTokenExpiresIn) { + return Promise.resolve(false); + } + const now = Date.now(); + const expiresIn = cacheData.createdAt + cacheData.accessTokenExpiresIn * 1000; + return Promise.resolve(now >= expiresIn); + } async clearCurrentUser() { const user = await this.getCurrentUser(); @@ -195,6 +218,8 @@ export class LoginCacheStore implements CacheStore { this.cacheData.id = undefined; this.cacheData.accessToken = undefined; this.cacheData.refreshToken = undefined; + this.cacheData.accessTokenExpiresIn = undefined; + this.cacheData.createdAt = undefined; await this.setValue(this.cacheData); } async clearAll() { @@ -203,6 +228,8 @@ export class LoginCacheStore implements CacheStore { this.cacheData.id = undefined; this.cacheData.accessToken = undefined; this.cacheData.refreshToken = undefined; + this.cacheData.accessTokenExpiresIn = undefined; + this.cacheData.createdAt = undefined; await this.setValue(this.cacheData); } } diff --git a/query/query-login/query-login.ts b/query/query-login/query-login.ts index ea08c8b..5e2c35f 100644 --- a/query/query-login/query-login.ts +++ b/query/query-login/query-login.ts @@ -305,6 +305,9 @@ export class QueryLogin extends BaseQuery { const token = this.storage.getItem('token'); return !!token; } + async checkTokenValid() { + return this.cacheStore.getIsExpired(); + } /** * 检查本地用户列表 * @returns @@ -313,6 +316,7 @@ export class QueryLogin extends BaseQuery { const token = this.storage.getItem('token'); return token || ''; } + async beforeRequest(opts: any = {}) { const token = this.storage.getItem('token'); if (token) {