胡桃云添加自动刷新功能,优化用户信息更新逻辑

This commit is contained in:
BTMuli
2026-05-19 18:47:41 +08:00
parent 482e736164
commit 4f7a7bc429
3 changed files with 49 additions and 6 deletions

View File

@@ -46,7 +46,7 @@ import useHutaoStore from "@store/hutao.js";
import { openUrl } from "@tauri-apps/plugin-opener";
import { timeStr2str } from "@utils/toolFunc.js";
import { storeToRefs } from "pinia";
import { ref } from "vue";
import { onMounted, ref } from "vue";
const hutaoStore = useHutaoStore();
const { userName, userInfo, isLogin } = storeToRefs(useHutaoStore());
@@ -54,6 +54,8 @@ const { userName, userInfo, isLogin } = storeToRefs(useHutaoStore());
const showVerify = ref<boolean>(false);
const loadInfo = ref<boolean>(false);
onMounted(async () => await hutaoStore.tryAutoRefresh());
function getAccountDesc(): string {
if (!isLogin.value) return "未登录";
if (userInfo.value) {

View File

@@ -87,6 +87,7 @@ import TGLogger from "@utils/TGLogger.js";
import { compareVersions } from "@utils/toolFunc.js";
import { storeToRefs } from "pinia";
import { defineComponent, onMounted, ref, shallowRef, watch } from "vue";
import useHutaoStore from "@store/hutao.js";
/**
* 单文件组件类型
@@ -106,6 +107,7 @@ type SelectItem = {
const homeStore = useHomeStore();
const bbsStore = useBBSStore();
const hutaoStore = useHutaoStore();
const { devMode, isLogin, lastUcts } = storeToRefs(useAppStore());
const { gameList } = storeToRefs(bbsStore);
@@ -125,9 +127,9 @@ onMounted(async () => {
// @ts-expect-error-next-line The import.meta meta-property is not allowed in files which will build into CommonJS output.
const isProdEnv = import.meta.env.MODE === "production";
if (isProdEnv && devMode.value) devMode.value = false;
await showLoading.start("正在加载首页小部件");
if (isLogin.value) {
await TSUserAccount.account.updateCk();
await showLoading.start("正在加载首页小部件");
games.value = gameList.value.map((i) => ({ icon: i.app_icon, title: i.name, gid: i.id }));
showItems.value = homeStore.getShowItems();
showItemsAll.value = ["便笺签到", "素材日历", "限时祈愿", "近期活动"];
@@ -138,6 +140,7 @@ onMounted(async () => {
oldItems.value = showItems.value;
await loadComp();
await checkAppUpdate();
await hutaoStore.tryAutoRefresh();
});
watch(

View File

@@ -1,6 +1,6 @@
/**
* 胡桃账号
* @since Beta v0.10.1
* @since Beta v0.10.2
*/
import showDialog from "@comp/func/dialog.js";
@@ -28,6 +28,8 @@ const useHutaoStore = defineStore(
const accessExpire = ref<number>(0);
/** 用户信息 */
const userInfo = ref<TGApp.Plugins.Hutao.Account.InfoRes>();
/** 上次刷新时间 */
const lastUts = ref<number>(0);
/**
* 检测是否超时
@@ -40,7 +42,11 @@ const useHutaoStore = defineStore(
}
async function tryLogin(): Promise<void> {
const inputN = await showDialog.input("请输入胡桃云账号", "邮箱:");
const inputN = await showDialog.inputF({
title: "请输入胡桃云账号",
text: "邮箱:",
type: "email",
});
if (!inputN) {
showSnackbar.cancel("已取消胡桃云账号输入");
return;
@@ -49,7 +55,11 @@ const useHutaoStore = defineStore(
showSnackbar.warn("请输入合法邮箱地址");
return;
}
const inputP = await showDialog.input("请输入密码", "密码");
const inputP = await showDialog.inputF({
title: "请输入密码",
text: "密码",
type: "password",
});
if (!inputP) {
showSnackbar.warn("已取消胡桃云登录");
return;
@@ -123,6 +133,11 @@ const useHutaoStore = defineStore(
async function tryRefreshInfo(): Promise<void> {
await tryRefreshToken();
if (!isLogin.value) return;
if (!accessToken.value || accessToken.value === "") {
showSnackbar.warn("未找到合法的AccessToken");
return;
}
try {
const resp = await hutao.Account.info(accessToken.value!);
if (resp.retcode !== 0) {
@@ -139,6 +154,7 @@ const useHutaoStore = defineStore(
}
userInfo.value = resp.data;
showSnackbar.success("成功刷新用户信息");
lastUts.value = Math.floor(Date.now() / 1000);
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`刷新用户信息失败:${errMsg}`);
@@ -155,10 +171,18 @@ const useHutaoStore = defineStore(
try {
const resp = await hutao.Token.refresh(refreshToken.value);
if (resp.retcode !== 0) {
showSnackbar.warn(`[${resp.retcode}] ${resp.message}`);
await TGLogger.Warn(
`[HutaoStore][tryRefreshToken] 刷新Token失败${resp.retcode} ${resp.message}`,
);
// 令牌无效或者过期,自动退出账号
if (resp.retcode === 514002) {
refreshToken.value = "";
accessToken.value = "";
isLogin.value = false;
showSnackbar.warn(`[${resp.retcode}] ${resp.message},已自动退出`);
} else {
showSnackbar.warn(`[${resp.retcode}] ${resp.message}`);
}
return;
}
if (!resp.data) {
@@ -184,6 +208,19 @@ const useHutaoStore = defineStore(
return Date.now() > expire;
}
async function tryAutoRefresh(): Promise<void> {
if (!isLogin.value) return;
const nowTs = Math.floor(Date.now() / 1000);
const diffTime = nowTs - lastUts.value;
if (diffTime < 60 * 60 * 24 * 3) return;
try {
await tryRefreshInfo();
} catch (e) {
await TGLogger.Error(`[HutaoStore][tryAutoRefresh]自动刷新异常: ${e}`);
lastUts.value = Math.floor(Date.now() / 1000);
}
}
return {
isLogin,
userName,
@@ -197,6 +234,7 @@ const useHutaoStore = defineStore(
tryRefreshToken,
tryRefreshInfo,
checkGachaExpire,
tryAutoRefresh,
};
},
{