update query login

This commit is contained in:
xion 2025-03-21 20:40:43 +08:00
parent ca269e5ae2
commit b2ad3da8d8
8 changed files with 75 additions and 52 deletions

View File

@ -5,7 +5,8 @@
"main": "dist/query-login.js", "main": "dist/query-login.js",
"types": "dist/query-login.d.ts", "types": "dist/query-login.d.ts",
"scripts": { "scripts": {
"build": "tsup" "build": "tsup",
"watch": "tsup --watch"
}, },
"keywords": [], "keywords": [],
"author": "abearxiong <xiongxiao@xiongxiao.me>", "author": "abearxiong <xiongxiao@xiongxiao.me>",

View File

@ -103,19 +103,6 @@ export class QueryLogin {
}, },
); );
} }
/**
* 401token, 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;
}
/** /**
* 401token, refreshToken存在token, 401 * 401token, refreshToken存在token, 401
* @param response * @param response
@ -153,6 +140,7 @@ export class QueryLogin {
return res; 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 } }); return this.post({ key: 'switchCheck', data: { username } });
} }
/** /**
@ -194,7 +186,7 @@ export class QueryLogin {
const user = localUserList.find((userItem) => userItem.user.username === username); const user = localUserList.find((userItem) => userItem.user.username === username);
if (user) { if (user) {
this.storage.setItem('token', user.accessToken || ''); this.storage.setItem('token', user.accessToken || '');
await this.cache.setLoginUser(user); await this.beforeSetLoginUser({ accessToken: user.accessToken, refreshToken: user.refreshToken });
return { return {
code: 200, code: 200,
data: { data: {
@ -208,8 +200,9 @@ export class QueryLogin {
const res = await this.postSwitchUser(username); const res = await this.postSwitchUser(username);
if (res.code === 200) { if (res.code === 200) {
this.cache.setLoginUser(res.data); const { accessToken, refreshToken } = res?.data || {};
await this.beforeSetLoginUser({ accessToken: res.data.accessToken, refreshToken: res.data.refreshToken }); this.storage.setItem('token', accessToken || '');
await this.beforeSetLoginUser({ accessToken, refreshToken });
} }
return res; return res;
} }

View File

@ -20,8 +20,9 @@
"@kevisual/center-components": "workspace:*", "@kevisual/center-components": "workspace:*",
"@kevisual/codemirror": "workspace:*", "@kevisual/codemirror": "workspace:*",
"@kevisual/container": "1.0.0", "@kevisual/container": "1.0.0",
"@kevisual/query": "^0.0.12", "@kevisual/query": "^0.0.13",
"@kevisual/query-config": "workspace:*", "@kevisual/query-config": "workspace:*",
"@kevisual/query-login": "workspace:*",
"@kevisual/resources": "workspace:*", "@kevisual/resources": "workspace:*",
"@kevisual/system-ui": "^0.0.3", "@kevisual/system-ui": "^0.0.3",
"@kevisual/ui": "^0.0.2", "@kevisual/ui": "^0.0.2",

18
pnpm-lock.yaml generated
View File

@ -30,11 +30,14 @@ importers:
specifier: 1.0.0 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) 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': '@kevisual/query':
specifier: ^0.0.12 specifier: ^0.0.13
version: 0.0.12(ws@8.18.1) version: 0.0.13(ws@8.18.1)
'@kevisual/query-config': '@kevisual/query-config':
specifier: workspace:* specifier: workspace:*
version: link:libs/query-config version: link:libs/query-config
'@kevisual/query-login':
specifier: workspace:*
version: link:libs/query-login
'@kevisual/resources': '@kevisual/resources':
specifier: workspace:* specifier: workspace:*
version: link:packages/resources version: link:packages/resources
@ -1162,6 +1165,9 @@ packages:
'@kevisual/query@0.0.12': '@kevisual/query@0.0.12':
resolution: {integrity: sha512-/1lZJhNCdcNG4a2Nncl55XC/nha5+GZiJPQdP77lufv2dnZfcssA7NHSZ2Ubh0Pm0HWV22IiGfQMiaYl2pkK1Q==} resolution: {integrity: sha512-/1lZJhNCdcNG4a2Nncl55XC/nha5+GZiJPQdP77lufv2dnZfcssA7NHSZ2Ubh0Pm0HWV22IiGfQMiaYl2pkK1Q==}
'@kevisual/query@0.0.13':
resolution: {integrity: sha512-gSEIDiCvwSaLLAFZv4vam4wSrMsaCuQ3VGjE3kwRwZ8urlVH1TOA+NUO908A22p9m1Iij7Y1Q/JlfSJi2QzuKQ==}
'@kevisual/router@0.0.7': '@kevisual/router@0.0.7':
resolution: {integrity: sha512-4n1Tp4YLoraJv7jtfy7jbuLGyAj0B2QkTlnlEDHCUTlEUOvOkjtf7DHAe2SL92fTgXhSbod0I/0vUcDF85oj/w==} resolution: {integrity: sha512-4n1Tp4YLoraJv7jtfy7jbuLGyAj0B2QkTlnlEDHCUTlEUOvOkjtf7DHAe2SL92fTgXhSbod0I/0vUcDF85oj/w==}
@ -4825,6 +4831,14 @@ snapshots:
- ws - ws
- zod - 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': '@kevisual/router@0.0.7':
dependencies: dependencies:
path-to-regexp: 8.2.0 path-to-regexp: 8.2.0

View File

@ -1,4 +1,4 @@
import { query } from '@/modules/query'; import { query, queryLogin } from '@/modules';
import { create } from 'zustand'; import { create } from 'zustand';
import { message } from '@/modules/message'; import { message } from '@/modules/message';
export const getIsMac = async () => { export const getIsMac = async () => {
@ -69,10 +69,7 @@ export const useLayoutStore = create<LayoutStore>((set) => ({
me: {}, me: {},
setMe: (me) => set({ me }), setMe: (me) => set({ me }),
getMe: async () => { getMe: async () => {
const res = await query.post({ const res = await queryLogin.getMe();
path: 'user',
key: 'me',
});
if (res.code === 200) { if (res.code === 200) {
set({ me: res.data }); set({ me: res.data });
} }
@ -80,19 +77,12 @@ export const useLayoutStore = create<LayoutStore>((set) => ({
openUser: false, openUser: false,
setOpenUser: (openUser) => set({ openUser }), setOpenUser: (openUser) => set({ openUser }),
switchOrg: async (username?: string, type?: string) => { switchOrg: async (username?: string, type?: string) => {
const res = await query.post({ const res = await queryLogin.switchUser(username || '');
path: 'user',
key: 'switchOrg',
data: {
username,
type,
},
});
if (res.code === 200) { if (res.code === 200) {
const { token } = res.data;
query.saveToken(token);
message.success('Switch success'); message.success('Switch success');
window.location.reload(); setTimeout(() => {
window.location.reload();
}, 1000);
} else { } else {
message.error(res.message || 'Request failed'); message.error(res.message || 'Request failed');
} }

View File

@ -2,7 +2,27 @@ import { QueryClient } from '@kevisual/query';
import { modal } from './redirect-to-login'; import { modal } from './redirect-to-login';
import { create } from 'zustand'; import { create } from 'zustand';
import { message } from './message'; import { message } from './message';
import { QueryLogin } from '@kevisual/query-login';
export const query = new QueryClient(); 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) => { query.beforeRequest = async (config) => {
if (config.headers) { if (config.headers) {
const token = localStorage.getItem('token'); const token = localStorage.getItem('token');
@ -12,16 +32,21 @@ query.beforeRequest = async (config) => {
} }
return config; return config;
}; };
query.afterResponse = async (res) => { query.afterResponse = async (res, ctx) => {
if (res.code === 401) { if (res?.code === 401) {
modal.setOpen(true); if (query?.stop) {
} return { code: 500, success: false, message: '登录已过期' };
if (res.code === 403) {
if (!res?.message) {
message.error('Unauthorized');
} }
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; export const request = query.post;

View File

@ -1,5 +1,5 @@
import { create } from 'zustand'; import { create } from 'zustand';
import { query } from '@/modules'; import { query, queryLogin } from '@/modules';
import { message } from '@/modules/message'; import { message } from '@/modules/message';
type UserStore = { type UserStore = {
showEdit: boolean; showEdit: boolean;

View File

@ -1,7 +1,8 @@
import { query } from '@/modules'; import { query, queryLogin } from '@/modules';
import { basename } from '@/modules/basename'; import { basename } from '@/modules/basename';
import { message } from '@/modules/message'; import { message } from '@/modules/message';
import { create } from 'zustand'; import { create } from 'zustand';
// 如果自己是在iframe中登录需要调用这个方法 // 如果自己是在iframe中登录需要调用这个方法
export const postLoginInIframe = (token: string) => { export const postLoginInIframe = (token: string) => {
console.log('window.parent !== window', window.parent !== window); console.log('window.parent !== window', window.parent !== window);
@ -54,16 +55,14 @@ export const useLoginStore = create<LoginStore>((set, get) => {
} }
set({ loading: true }); set({ loading: true });
const loaded = message.loading('loading...', 0); 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); setTimeout(loaded, 200);
if (res.code === 200) { if (res.code === 200) {
const { token } = res.data;
message.success('Success'); message.success('Success');
set({ isLogin: true }); set({ isLogin: true });
query.saveToken(token);
await new Promise((resolve) => setTimeout(resolve, 1000)); await new Promise((resolve) => setTimeout(resolve, 1000));
if (window.parent !== window) { if (window.parent !== window) {
postLoginInIframe(token); postLoginInIframe(res.data?.accessToken || '');
await new Promise((resolve) => setTimeout(resolve, 3000)); await new Promise((resolve) => setTimeout(resolve, 3000));
} }
const search = new URLSearchParams(window.location.search); const search = new URLSearchParams(window.location.search);