user.ts 1.6 KB
import { defineStore } from "pinia";
import { ref, computed } from "vue";

export const useUserStore = defineStore("user", () => {
  // State
  const token = ref(localStorage.getItem("token") || "");
  const userInfo = ref(JSON.parse(localStorage.getItem("userInfo") || "null"));

  // Getters
  const isAuthenticated = computed(() => !!token.value);
  const userName = computed(() => userInfo.value?.name || "游客");
  const userAvatar = computed(() => userInfo.value?.avatar || "");

  // Actions
  function setToken(newToken: string) {
    token.value = newToken;
    localStorage.setItem("token", newToken);
  }

  function setUserInfo(info: any) {
    userInfo.value = info;
    localStorage.setItem("userInfo", JSON.stringify(info));
  }

  async function login(_credentials: any) {
    try {
      // TODO: 调用登录 API
      // const response = await loginAPI(credentials);
      // setToken(response.data.token);
      // setUserInfo(response.data.user);

      // 模拟登录
      setToken("mock-token-123456");
      setUserInfo({
        id: 1,
        name: "张三",
        email: "zhangsan@example.com",
        avatar: "",
      });

      return { success: true };
    } catch (error) {
      return { success: false, error: (error as Error).message };
    }
  }

  function logout() {
    token.value = "";
    userInfo.value = null;
    localStorage.removeItem("token");
    localStorage.removeItem("userInfo");
  }

  return {
    // state
    token,
    userInfo,
    // getters
    isAuthenticated,
    userName,
    userAvatar,
    // actions
    setToken,
    setUserInfo,
    login,
    logout,
  };
});