Compare commits
	
		
			4 Commits
		
	
	
		
			fdf6d3ac0a
			...
			98c8a2ad86
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 98c8a2ad86 | |||
| 8ac11bbd28 | |||
| 05f0373834 | |||
| e0bf83f062 | 
							
								
								
									
										24
									
								
								.turbo/turbo-build.log
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								.turbo/turbo-build.log
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  |  | ||||||
|  | [33m[43m[30m WARN [39m[49m Issue while reading "/home/ubuntu/kevisual/center/submodules/query-login/.npmrc". Failed to replace env in config: ${ME_NPM_TOKEN} | ||||||
|  | [43m[30m WARN [39m[49m Issue while reading "/home/ubuntu/kevisual/center/.npmrc". Failed to replace env in config: ${ME_NPM_TOKEN}[39m | ||||||
|  |  | ||||||
|  | > @kevisual/query-login@0.0.2 build /home/ubuntu/kevisual/center/submodules/query-login | ||||||
|  | > tsup | ||||||
|  |  | ||||||
|  | [34mCLI[39m Building entry: src/query-login-browser.ts, src/query-login-node.ts, src/query-login.ts | ||||||
|  | [34mCLI[39m Using tsconfig: tsconfig.json | ||||||
|  | [34mCLI[39m tsup v8.4.0 | ||||||
|  | [34mCLI[39m Using tsup config: /home/ubuntu/kevisual/center/submodules/query-login/tsup.config.ts | ||||||
|  | [34mCLI[39m Target: esnext | ||||||
|  | [34mCLI[39m Cleaning output folder | ||||||
|  | [34mESM[39m Build start | ||||||
|  | [33mESM[39m [33mYou have emitDecoratorMetadata enabled but @swc/core was not installed, skipping swc plugin[39m | ||||||
|  | [32mESM[39m [1mdist/query-login-node.js    [22m[32m15.31 KB[39m | ||||||
|  | [32mESM[39m [1mdist/query-login-browser.js [22m[32m11.80 KB[39m | ||||||
|  | [32mESM[39m [1mdist/query-login.js         [22m[32m11.58 KB[39m | ||||||
|  | [32mESM[39m ⚡️ Build success in 10ms | ||||||
|  | DTS Build start | ||||||
|  | DTS ⚡️ Build success in 873ms | ||||||
|  | DTS dist/query-login-browser.d.ts 332.00 B | ||||||
|  | DTS dist/query-login-node.d.ts    701.00 B | ||||||
|  | DTS dist/query-login.d.ts         4.80 KB | ||||||
| @@ -16,9 +16,18 @@ export interface Cache { | |||||||
|    */ |    */ | ||||||
|   init?: () => Promise<any>; |   init?: () => Promise<any>; | ||||||
| } | } | ||||||
|  | type User = { | ||||||
|  |   avatar?: string; | ||||||
|  |   description?: string; | ||||||
|  |   id?: string; | ||||||
|  |   needChangePassword?: boolean; | ||||||
|  |   orgs?: string[]; | ||||||
|  |   type?: string; | ||||||
|  |   username?: string; | ||||||
|  | }; | ||||||
|  |  | ||||||
| export type CacheLoginUser = { | export type CacheLoginUser = { | ||||||
|   user?: any; |   user?: User; | ||||||
|   id?: string; |   id?: string; | ||||||
|   accessToken?: string; |   accessToken?: string; | ||||||
|   refreshToken?: string; |   refreshToken?: string; | ||||||
| @@ -29,9 +38,13 @@ type CacheLogin = { | |||||||
|  |  | ||||||
| export type CacheStore<T = Cache> = { | export type CacheStore<T = Cache> = { | ||||||
|   name: string; |   name: string; | ||||||
|  |   /** | ||||||
|  |    * 缓存数据 | ||||||
|  |    * @important 需要先调用init | ||||||
|  |    */ | ||||||
|   cacheData: CacheLogin; |   cacheData: CacheLogin; | ||||||
|   /** |   /** | ||||||
|    * 实际操作的cache |    * 实际操作的cache, 需要先调用init | ||||||
|    */ |    */ | ||||||
|   cache: T; |   cache: T; | ||||||
|  |  | ||||||
| @@ -42,7 +55,7 @@ export type CacheStore<T = Cache> = { | |||||||
|   /** |   /** | ||||||
|    * 获取当前用户 |    * 获取当前用户 | ||||||
|    */ |    */ | ||||||
|   getCurrentUser(): Promise<CacheLoginUser>; |   getCurrentUser(): Promise<User>; | ||||||
|   /** |   /** | ||||||
|    * 获取当前用户列表 |    * 获取当前用户列表 | ||||||
|    */ |    */ | ||||||
|   | |||||||
| @@ -1,15 +1,21 @@ | |||||||
| import { Cache, LoginCacheStore, LoginCacheStoreOpts } from './login-cache.ts'; | import { Cache } from './login-cache.ts'; | ||||||
| import { homedir } from 'node:os'; | import { homedir } from 'node:os'; | ||||||
| import { join, dirname } from 'node:path'; | import { join, dirname } from 'node:path'; | ||||||
| import fs from 'node:fs'; | import fs from 'node:fs'; | ||||||
| import { readFileSync, writeFileSync, accessSync } from 'node:fs'; | import { readFileSync, writeFileSync, accessSync } from 'node:fs'; | ||||||
| import { readFile, writeFile, unlink, mkdir } from 'node:fs/promises'; | import { readFile, writeFile, unlink, mkdir } from 'node:fs/promises'; | ||||||
| export const fileExists = async (filePath: string, createIfNotExists = false) => { | export const fileExists = async ( | ||||||
|  |   filePath: string, | ||||||
|  |   { createIfNotExists = true, isFile = true, isDir = false }: { createIfNotExists?: boolean; isFile?: boolean; isDir?: boolean } = {}, | ||||||
|  | ) => { | ||||||
|   try { |   try { | ||||||
|     accessSync(filePath, fs.constants.F_OK); |     accessSync(filePath, fs.constants.F_OK); | ||||||
|     return true; |     return true; | ||||||
|   } catch (error) { |   } catch (error) { | ||||||
|     if (createIfNotExists) { |     if (createIfNotExists && isDir) { | ||||||
|  |       await mkdir(filePath, { recursive: true }); | ||||||
|  |       return true; | ||||||
|  |     } else if (createIfNotExists && isFile) { | ||||||
|       await mkdir(dirname(filePath), { recursive: true }); |       await mkdir(dirname(filePath), { recursive: true }); | ||||||
|       return false; |       return false; | ||||||
|     } |     } | ||||||
| @@ -25,6 +31,9 @@ export const readConfigFile = (filePath: string) => { | |||||||
|     return {}; |     return {}; | ||||||
|   } |   } | ||||||
| }; | }; | ||||||
|  | export const writeConfigFile = (filePath: string, data: any) => { | ||||||
|  |   writeFileSync(filePath, JSON.stringify(data, null, 2)); | ||||||
|  | }; | ||||||
| export const getHostName = () => { | export const getHostName = () => { | ||||||
|   const configDir = join(homedir(), '.config', 'envision'); |   const configDir = join(homedir(), '.config', 'envision'); | ||||||
|   const configFile = join(configDir, 'config.json'); |   const configFile = join(configDir, 'config.json'); | ||||||
| @@ -41,14 +50,13 @@ export class StorageNode implements Storage { | |||||||
|     const configDir = join(homedir(), '.config', 'envision'); |     const configDir = join(homedir(), '.config', 'envision'); | ||||||
|     const hostname = getHostName(); |     const hostname = getHostName(); | ||||||
|     this.filePath = join(configDir, 'config', `${hostname}-storage.json`); |     this.filePath = join(configDir, 'config', `${hostname}-storage.json`); | ||||||
|     fileExists(this.filePath, true); |     fileExists(this.filePath, { isFile: true }); | ||||||
|   } |   } | ||||||
|   async loadCache() { |   async loadCache() { | ||||||
|     const filePath = this.filePath; |     const filePath = this.filePath; | ||||||
|     try { |     try { | ||||||
|       const data = await readFile(filePath, 'utf-8'); |       const data = await readConfigFile(filePath); | ||||||
|       const jsonData = JSON.parse(data); |       this.cacheData = data; | ||||||
|       this.cacheData = jsonData; |  | ||||||
|     } catch (error) { |     } catch (error) { | ||||||
|       this.cacheData = {}; |       this.cacheData = {}; | ||||||
|       await writeFile(filePath, JSON.stringify(this.cacheData, null, 2)); |       await writeFile(filePath, JSON.stringify(this.cacheData, null, 2)); | ||||||
| @@ -81,24 +89,23 @@ export class LoginNodeCache implements Cache { | |||||||
|  |  | ||||||
|   constructor(filepath?: string) { |   constructor(filepath?: string) { | ||||||
|     this.filepath = filepath || join(homedir(), '.config', 'envision', 'config', `${getHostName()}-login.json`); |     this.filepath = filepath || join(homedir(), '.config', 'envision', 'config', `${getHostName()}-login.json`); | ||||||
|     fileExists(this.filepath, true); |     fileExists(this.filepath, { isFile: true }); | ||||||
|   } |   } | ||||||
|   async get(_key: string) { |   async get(_key: string) { | ||||||
|     const data = readFileSync(this.filepath, 'utf-8'); |  | ||||||
|     try { |     try { | ||||||
|       const jsonData = JSON.parse(data); |       const filePath = this.filepath; | ||||||
|       return jsonData; |       const data = readConfigFile(filePath); | ||||||
|  |       return data; | ||||||
|     } catch (error) { |     } catch (error) { | ||||||
|       console.log('get error', error); |       console.log('get error', error); | ||||||
|       return null; |       return {}; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   async set(_key: string, value: any) { |   async set(_key: string, value: any) { | ||||||
|     const data = readFileSync(this.filepath, 'utf-8'); |  | ||||||
|     try { |     try { | ||||||
|       const jsonData = JSON.parse(data); |       const data = readConfigFile(this.filepath); | ||||||
|       const newData = { ...jsonData, ...value }; |       const newData = { ...data, ...value }; | ||||||
|       writeFileSync(this.filepath, JSON.stringify(newData, null, 2)); |       writeConfigFile(this.filepath, newData); | ||||||
|     } catch (error) { |     } catch (error) { | ||||||
|       console.log('set error', error); |       console.log('set error', error); | ||||||
|     } |     } | ||||||
| @@ -114,7 +121,7 @@ export class LoginNodeCache implements Cache { | |||||||
|     } catch (error) { |     } catch (error) { | ||||||
|       console.log('loadCache error', error); |       console.log('loadCache error', error); | ||||||
|       const defaultData = { loginUsers: [] }; |       const defaultData = { loginUsers: [] }; | ||||||
|       await writeFile(filePath, JSON.stringify(defaultData, null, 2)); |       writeConfigFile(filePath, defaultData); | ||||||
|       return defaultData; |       return defaultData; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -86,6 +86,32 @@ export class QueryLogin { | |||||||
|     } |     } | ||||||
|     return res; |     return res; | ||||||
|   } |   } | ||||||
|  |   async loginByWechat(data: { code: string }) { | ||||||
|  |     const res = await this.post<QueryLoginResult>({ path: 'wx', key: 'open-login', code: data.code }); | ||||||
|  |     if (res.code === 200) { | ||||||
|  |       const { accessToken, refreshToken } = res?.data || {}; | ||||||
|  |       this.storage.setItem('token', accessToken || ''); | ||||||
|  |       await this.beforeSetLoginUser({ accessToken, refreshToken }); | ||||||
|  |     } | ||||||
|  |     return res; | ||||||
|  |   } | ||||||
|  |   /** | ||||||
|  |    * 检测微信登录,登陆成功后,调用onSuccess,否则调用onError | ||||||
|  |    * @param param0 | ||||||
|  |    */ | ||||||
|  |   async checkWechat({ onSuccess, onError }: { onSuccess?: (res: QueryLoginResult) => void; onError?: (res: any) => void }) { | ||||||
|  |     const url = new URL(window.location.href); | ||||||
|  |     const code = url.searchParams.get('code'); | ||||||
|  |     const state = url.searchParams.get('state'); | ||||||
|  |     if (code && state) { | ||||||
|  |       const res = await this.loginByWechat({ code }); | ||||||
|  |       if (res.code === 200) { | ||||||
|  |         onSuccess?.(res.data); | ||||||
|  |       } else { | ||||||
|  |         onError?.(res); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|   /** |   /** | ||||||
|    * 登陆成功,需要获取用户信息进行缓存 |    * 登陆成功,需要获取用户信息进行缓存 | ||||||
|    * @param param0 |    * @param param0 | ||||||
| @@ -177,7 +203,7 @@ export class QueryLogin { | |||||||
|   /** |   /** | ||||||
|    * 一个简单的401处理, 如果401,则刷新token, 如果refreshToken不存在,则返回401 |    * 一个简单的401处理, 如果401,则刷新token, 如果refreshToken不存在,则返回401 | ||||||
|    * refetch 是否重新请求, 会有bug,无限循环,按需要使用 |    * refetch 是否重新请求, 会有bug,无限循环,按需要使用 | ||||||
|    * TODO:  |    * TODO: | ||||||
|    * @param response |    * @param response | ||||||
|    * @param ctx |    * @param ctx | ||||||
|    * @param opts |    * @param opts | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user