Przeglądaj źródła

实现游客账号创建功能,更新用户状态同步逻辑,优化登录处理

wuyi 3 miesięcy temu
rodzic
commit
a53749d5cd
3 zmienionych plików z 39 dodań i 7 usunięć
  1. 17 6
      src/App.vue
  2. 8 0
      src/services/api.ts
  3. 14 1
      src/store/user.ts

+ 17 - 6
src/App.vue

@@ -27,7 +27,6 @@ function scrollToTop() {
 }
 
 function switchTab(key: TabKey) {
-  // 如果用户点击"已购买"但未登录,则显示登录弹窗
   if (key === "purchased" && !isLoggedIn.value) {
     showLoginDialog.value = true;
     return;
@@ -36,24 +35,36 @@ function switchTab(key: TabKey) {
 }
 
 function handleLoginSuccess() {
-  // 登录成功后的处理
   if (active.value === "account") {
-    // 如果在账号页面登录成功,刷新用户信息
     userStore.sync();
   }
 }
 
-onMounted(() => {
+onMounted(async () => {
   window.addEventListener("scroll", handleScroll, { passive: true });
-  // 如果有token,同步用户信息
+
   if (userStore.token) {
     userStore.sync().catch(() => {
-      // 如果同步失败,可能是token过期,清除登录状态
       userStore.logout();
+      showLoginDialog.value = true;
     });
+  } else {
+    await createGuestAccount();
   }
 });
 
+const createGuestAccount = async () => {
+  try {
+    const urlParams = new URLSearchParams(window.location.search);
+    const inviteCode = urlParams.get("code");
+
+    await userStore.createGuest(inviteCode || undefined);
+    console.log("游客账号创建成功", userStore.userInfo);
+  } catch (error) {
+    console.error("创建游客账号失败", error);
+  }
+};
+
 onBeforeUnmount(() => {
   window.removeEventListener("scroll", handleScroll);
 });

+ 8 - 0
src/services/api.ts

@@ -55,4 +55,12 @@ export const resetPassword = async (password: string): Promise<any> => {
   return response.data;
 };
 
+export const newGuest = async (code?: string): Promise<any> => {
+  const params = { code };
+  if (code) params.code = code;
+
+  const response = await api.get("/member/guest", { params });
+  return response.data;
+};
+
 export default api;

+ 14 - 1
src/store/user.ts

@@ -1,6 +1,6 @@
 import { defineStore } from "pinia";
 import { ref } from "vue";
-import { login as apiLogin, profile } from "@/services/api";
+import { login as apiLogin, profile, newGuest } from "@/services/api";
 import { useStorage } from "@vueuse/core";
 
 export const useUserStore = defineStore("user", () => {
@@ -32,11 +32,24 @@ export const useUserStore = defineStore("user", () => {
     userInfo.value = {};
   };
 
+  const createGuest = async (code?: string) => {
+    try {
+      const response = await newGuest(code);
+      setToken(response.token);
+      setUserInfo(response.user);
+      return response;
+    } catch (error) {
+      console.error("创建游客账号失败", error);
+      return null;
+    }
+  };
+
   return {
     token,
     userInfo,
     login,
     logout,
     sync,
+    createGuest,
   };
 });