🐛 fix qrlogin refresh issue

This commit is contained in:
landaiqing
2024-09-08 16:44:51 +08:00
parent 5e361422c6
commit c260ca642a
4 changed files with 66 additions and 18 deletions

View File

@@ -1,10 +1,54 @@
import {defineStore} from 'pinia'; import {defineStore} from 'pinia';
import {ref} from "vue"; import {ref} from "vue";
const expiresTime: number = 60 * 30; // 自定义过期时间 30 分钟
const expiredStorage: Storage = getExpiredStorage(localStorage, expiresTime);
function getExpiredStorage(storage: Storage, expiresTime: string | number | Date) {
return {
getItem(key: string) {
const itemStr = storage.getItem(key);
if (!itemStr) {
return null;
}
// 读取的时候是字符串,需要转换为对象
const item = JSON.parse(itemStr);
const now: Date = new Date();
if (now.getTime() > item.expiry) {
storage.removeItem(key);
return null;
}
// pinia 的持久化插件要求返回JSON字符串
return JSON.stringify(item.value);
},
setItem(key: string, value: string) {
const now = new Date();
const item = {
value: JSON.parse(value), // value是JSON字符串需要转换为对象
expiry: now.getTime() + Number(expiresTime) * 1000,
};
storage.setItem(key, JSON.stringify(item)); // 存储又要转为JSON字符串
},
removeItem(key: string) {
storage.removeItem(key);
},
clear() {
Object.keys(storage).forEach((key: string) => {
storage.removeItem(key);
});
},
key(index: number): string | null {
const keys = Object.keys(storage);
return keys[index] || null;
},
length: Object.keys(storage).length,
} as Storage;
}
export const useClientStore = defineStore( export const useClientStore = defineStore(
'clientId', 'clientId',
() => { () => {
const clientId = ref<string>(''); const clientId = ref<string>();
function setClientId(id: string) { function setClientId(id: string) {
clientId.value = id; clientId.value = id;
@@ -20,12 +64,13 @@ export const useClientStore = defineStore(
getClientId getClientId
}; };
}, },
// { {
// // 开启数据持久化 // 开启数据持久化
// persist: { persist: {
// key: 'clientId', key: 'clientId',
// storage: localStorage, storage: expiredStorage,
// paths: ["clientId"], paths: ["clientId"],
// } }
// } }
); );

View File

@@ -84,7 +84,7 @@ async function getClientId() {
* 获取本地client_id * 获取本地client_id
*/ */
async function getLocalClientId() { async function getLocalClientId() {
if (client.getClientId() !== '' && client.getClientId() !== null) { if (client.getClientId()) {
return client.getClientId(); return client.getClientId();
} else { } else {
await getClientId(); await getClientId();

View File

@@ -68,7 +68,7 @@ import {generateClientId, getUserDevice} from "@/api/oauth";
const {t} = useI18n(); const {t} = useI18n();
const router = useRouter(); const router = useRouter();
const client = useStore().client;
const qrcode = ref<string>(''); const qrcode = ref<string>('');
const status = ref<string>('loading'); const status = ref<string>('loading');
@@ -76,7 +76,6 @@ const status = ref<string>('loading');
* 获取client_id * 获取client_id
*/ */
async function getClientId() { async function getClientId() {
const client = useStore().client;
const res: any = await generateClientId(); const res: any = await generateClientId();
if (res.code === 0 && res.data) { if (res.code === 0 && res.data) {
client.setClientId(res.data); client.setClientId(res.data);
@@ -88,7 +87,6 @@ async function getClientId() {
* 获取二维码 * 获取二维码
*/ */
async function getQrCode() { async function getQrCode() {
const client = useStore().client;
if (!client.getClientId()) { if (!client.getClientId()) {
status.value = 'expired'; status.value = 'expired';
await getClientId(); await getClientId();
@@ -98,6 +96,7 @@ async function getQrCode() {
if (res.code === 0 && res.data) { if (res.code === 0 && res.data) {
status.value = 'active'; status.value = 'active';
qrcode.value = res.data; qrcode.value = res.data;
await handleListenMessage();
} else { } else {
status.value = 'expired'; status.value = 'expired';
} }
@@ -108,7 +107,6 @@ async function getQrCode() {
* 获取本地client_id * 获取本地client_id
*/ */
function getLocalClientId() { function getLocalClientId() {
const client = useStore().client;
if (client.getClientId()) { if (client.getClientId()) {
return client.getClientId(); return client.getClientId();
} else { } else {
@@ -123,8 +121,10 @@ const wsOptions = {
const {open, close, on} = useWebSocket(wsOptions); const {open, close, on} = useWebSocket(wsOptions);
onMounted(async () => { /**
await getQrCode(); * 监听消息
*/
async function handleListenMessage() {
open(); open();
// 注册消息接收处理函数 // 注册消息接收处理函数
on('message', async (data: any) => { on('message', async (data: any) => {
@@ -143,8 +143,11 @@ onMounted(async () => {
}, 1000); }, 1000);
} }
}); });
}); }
onMounted(async () => {
await getQrCode();
});
onUnmounted(async () => { onUnmounted(async () => {
close(true); close(true);

View File

@@ -85,7 +85,7 @@ async function getClientId() {
* 获取本地client_id * 获取本地client_id
*/ */
async function getLocalClientId() { async function getLocalClientId() {
if (client.getClientId() !== '' && client.getClientId() !== null) { if (client.getClientId()) {
return client.getClientId(); return client.getClientId();
} else { } else {
await getClientId(); await getClientId();