diff --git a/libs/query-login/package.json b/libs/query-login/package.json index d0524e1..b7dbb76 100644 --- a/libs/query-login/package.json +++ b/libs/query-login/package.json @@ -5,7 +5,8 @@ "main": "dist/query-login.js", "types": "dist/query-login.d.ts", "scripts": { - "build": "tsup" + "build": "tsup", + "watch": "tsup --watch" }, "keywords": [], "author": "abearxiong ", diff --git a/libs/query-login/src/query-login.ts b/libs/query-login/src/query-login.ts index 7c80b6d..8257edd 100644 --- a/libs/query-login/src/query-login.ts +++ b/libs/query-login/src/query-login.ts @@ -103,19 +103,6 @@ export class QueryLogin { }, ); } - /** - * 检查401错误,并刷新token, 如果refreshToken存在,则刷新token, 否则返回401 - * @param res - * @returns - */ - async check401ToRefreshToken(res: Result) { - const refreshToken = await this.cache.getRefreshToken(); - if (refreshToken) { - const res = await this.queryRefreshToken(refreshToken); - return res; - } - return res; - } /** * 检查401错误,并刷新token, 如果refreshToken存在,则刷新token, 否则返回401 * @param response @@ -153,6 +140,7 @@ export class QueryLogin { return res; } } + return response as any; } /** * 获取用户信息 @@ -180,8 +168,12 @@ export class QueryLogin { }, ); } - - async postSwitchUser(username: string) { + /** + * 请求更新,切换用户, 使用switchUser + * @param username + * @returns + */ + private async postSwitchUser(username: string) { return this.post({ key: 'switchCheck', data: { username } }); } /** @@ -194,7 +186,7 @@ export class QueryLogin { const user = localUserList.find((userItem) => userItem.user.username === username); if (user) { this.storage.setItem('token', user.accessToken || ''); - await this.cache.setLoginUser(user); + await this.beforeSetLoginUser({ accessToken: user.accessToken, refreshToken: user.refreshToken }); return { code: 200, data: { @@ -208,8 +200,9 @@ export class QueryLogin { const res = await this.postSwitchUser(username); if (res.code === 200) { - this.cache.setLoginUser(res.data); - await this.beforeSetLoginUser({ accessToken: res.data.accessToken, refreshToken: res.data.refreshToken }); + const { accessToken, refreshToken } = res?.data || {}; + this.storage.setItem('token', accessToken || ''); + await this.beforeSetLoginUser({ accessToken, refreshToken }); } return res; } diff --git a/package.json b/package.json index 35fbe28..2112b79 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,9 @@ "@kevisual/center-components": "workspace:*", "@kevisual/codemirror": "workspace:*", "@kevisual/container": "1.0.0", - "@kevisual/query": "^0.0.12", + "@kevisual/query": "^0.0.13", "@kevisual/query-config": "workspace:*", + "@kevisual/query-login": "workspace:*", "@kevisual/resources": "workspace:*", "@kevisual/system-ui": "^0.0.3", "@kevisual/ui": "^0.0.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b52338..8dc5af6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,11 +30,14 @@ importers: specifier: 1.0.0 version: 1.0.0(@emotion/css@11.13.4)(@types/react@19.0.12)(crypto-js@4.2.0)(eventemitter3@5.0.1)(immer@10.1.1)(react@19.0.0)(rollup@4.36.0)(typescript@5.8.2) '@kevisual/query': - specifier: ^0.0.12 - version: 0.0.12(ws@8.18.1) + specifier: ^0.0.13 + version: 0.0.13(ws@8.18.1) '@kevisual/query-config': specifier: workspace:* version: link:libs/query-config + '@kevisual/query-login': + specifier: workspace:* + version: link:libs/query-login '@kevisual/resources': specifier: workspace:* version: link:packages/resources @@ -1162,6 +1165,9 @@ packages: '@kevisual/query@0.0.12': resolution: {integrity: sha512-/1lZJhNCdcNG4a2Nncl55XC/nha5+GZiJPQdP77lufv2dnZfcssA7NHSZ2Ubh0Pm0HWV22IiGfQMiaYl2pkK1Q==} + '@kevisual/query@0.0.13': + resolution: {integrity: sha512-gSEIDiCvwSaLLAFZv4vam4wSrMsaCuQ3VGjE3kwRwZ8urlVH1TOA+NUO908A22p9m1Iij7Y1Q/JlfSJi2QzuKQ==} + '@kevisual/router@0.0.7': resolution: {integrity: sha512-4n1Tp4YLoraJv7jtfy7jbuLGyAj0B2QkTlnlEDHCUTlEUOvOkjtf7DHAe2SL92fTgXhSbod0I/0vUcDF85oj/w==} @@ -4825,6 +4831,14 @@ snapshots: - ws - zod + '@kevisual/query@0.0.13(ws@8.18.1)': + dependencies: + openai: 4.89.0(ws@8.18.1) + transitivePeerDependencies: + - encoding + - ws + - zod + '@kevisual/router@0.0.7': dependencies: path-to-regexp: 8.2.0 diff --git a/src/modules/layout/store/index.ts b/src/modules/layout/store/index.ts index 7df4cc6..3f286c0 100644 --- a/src/modules/layout/store/index.ts +++ b/src/modules/layout/store/index.ts @@ -1,4 +1,4 @@ -import { query } from '@/modules/query'; +import { query, queryLogin } from '@/modules'; import { create } from 'zustand'; import { message } from '@/modules/message'; export const getIsMac = async () => { @@ -69,10 +69,7 @@ export const useLayoutStore = create((set) => ({ me: {}, setMe: (me) => set({ me }), getMe: async () => { - const res = await query.post({ - path: 'user', - key: 'me', - }); + const res = await queryLogin.getMe(); if (res.code === 200) { set({ me: res.data }); } @@ -80,19 +77,12 @@ export const useLayoutStore = create((set) => ({ openUser: false, setOpenUser: (openUser) => set({ openUser }), switchOrg: async (username?: string, type?: string) => { - const res = await query.post({ - path: 'user', - key: 'switchOrg', - data: { - username, - type, - }, - }); + const res = await queryLogin.switchUser(username || ''); if (res.code === 200) { - const { token } = res.data; - query.saveToken(token); message.success('Switch success'); - window.location.reload(); + setTimeout(() => { + window.location.reload(); + }, 1000); } else { message.error(res.message || 'Request failed'); } diff --git a/src/modules/query.ts b/src/modules/query.ts index 6a4b746..26d1f97 100644 --- a/src/modules/query.ts +++ b/src/modules/query.ts @@ -2,7 +2,27 @@ import { QueryClient } from '@kevisual/query'; import { modal } from './redirect-to-login'; import { create } from 'zustand'; import { message } from './message'; +import { QueryLogin } from '@kevisual/query-login'; + export const query = new QueryClient(); + +/** + * 登录查询 + */ +export const queryLogin = new QueryLogin({ + query, +}); +// @ts-ignore +if (window.context) { + // @ts-ignore + window.context.queryLogin = queryLogin; +} else { + // @ts-ignore + window.context = { + queryLogin, + }; +} +// 在请求之前,如果stop了 query.beforeRequest = async (config) => { if (config.headers) { const token = localStorage.getItem('token'); @@ -12,16 +32,21 @@ query.beforeRequest = async (config) => { } return config; }; -query.afterResponse = async (res) => { - if (res.code === 401) { - modal.setOpen(true); - } - if (res.code === 403) { - if (!res?.message) { - message.error('Unauthorized'); +query.afterResponse = async (res, ctx) => { + if (res?.code === 401) { + if (query?.stop) { + return { code: 500, success: false, message: '登录已过期' }; } + query.stop = true; + const queryLoginRes = await queryLogin.afterCheck401ToRefreshToken(res, ctx); + query.stop = false; + if (queryLoginRes.code === 401) { + modal.setOpen(true); + } + return queryLoginRes; } - return res; + + return res as any; }; export const request = query.post; diff --git a/src/pages/user/store/index.ts b/src/pages/user/store/index.ts index 719ad29..65d0fc2 100644 --- a/src/pages/user/store/index.ts +++ b/src/pages/user/store/index.ts @@ -1,5 +1,5 @@ import { create } from 'zustand'; -import { query } from '@/modules'; +import { query, queryLogin } from '@/modules'; import { message } from '@/modules/message'; type UserStore = { showEdit: boolean; diff --git a/src/pages/user/store/login.ts b/src/pages/user/store/login.ts index 87e4808..66f3256 100644 --- a/src/pages/user/store/login.ts +++ b/src/pages/user/store/login.ts @@ -1,7 +1,8 @@ -import { query } from '@/modules'; +import { query, queryLogin } from '@/modules'; import { basename } from '@/modules/basename'; import { message } from '@/modules/message'; import { create } from 'zustand'; + // 如果自己是在iframe中登录,需要调用这个方法 export const postLoginInIframe = (token: string) => { console.log('window.parent !== window', window.parent !== window); @@ -54,16 +55,14 @@ export const useLoginStore = create((set, get) => { } set({ loading: true }); const loaded = message.loading('loading...', 0); - const res = await query.post({ path: 'user', key: 'login', username, password }); + const res = await queryLogin.login({ username, password }); setTimeout(loaded, 200); if (res.code === 200) { - const { token } = res.data; message.success('Success'); set({ isLogin: true }); - query.saveToken(token); await new Promise((resolve) => setTimeout(resolve, 1000)); if (window.parent !== window) { - postLoginInIframe(token); + postLoginInIframe(res.data?.accessToken || ''); await new Promise((resolve) => setTimeout(resolve, 3000)); } const search = new URLSearchParams(window.location.search);