user.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { defineStore } from "pinia";
  2. import { ref } from "vue";
  3. import {
  4. login as apiLogin,
  5. register as apiRegister,
  6. profile,
  7. newGuest,
  8. } from "@/services/api";
  9. import { useStorage } from "@vueuse/core";
  10. import { VipLevel } from "@/types/vip";
  11. // 主页浏览状态接口定义
  12. interface HomePageState {
  13. selectedMenu: string;
  14. currentPage: number;
  15. selectedSort: string;
  16. scrollPosition: number;
  17. isSearchMode: boolean;
  18. currentSearchKeyword: string;
  19. videoList?: any[];
  20. totalPages?: number;
  21. totalCount?: number;
  22. }
  23. export const useUserStore = defineStore("user", () => {
  24. const token = useStorage("token", "");
  25. const userInfo = ref<any>({});
  26. const userManuallyLoggedOut = useStorage("userManuallyLoggedOut", false);
  27. // 添加主页浏览状态存储
  28. const homePageState = ref<HomePageState>({
  29. selectedMenu: "",
  30. currentPage: 1,
  31. selectedSort: "time",
  32. scrollPosition: 0,
  33. isSearchMode: false,
  34. currentSearchKeyword: "",
  35. });
  36. const setToken = (newToken: string) => {
  37. token.value = newToken;
  38. };
  39. const setUserInfo = (info: any) => {
  40. userInfo.value = info;
  41. };
  42. // 保存主页浏览状态
  43. const saveHomePageState = (state: Partial<HomePageState>) => {
  44. homePageState.value = { ...homePageState.value, ...state };
  45. };
  46. // 获取主页浏览状态
  47. const getHomePageState = (): HomePageState => {
  48. return homePageState.value;
  49. };
  50. // 获取用户VIP等级
  51. const getVipLevel = (): VipLevel => {
  52. return userInfo.value?.vipLevel || VipLevel.GUEST;
  53. };
  54. const login = async (username: string, password: string) => {
  55. const response = await apiLogin(username, password);
  56. setToken(response.token);
  57. setUserInfo(response.user);
  58. userManuallyLoggedOut.value = false;
  59. return response;
  60. };
  61. const register = async (
  62. name: string,
  63. password: string,
  64. email?: string,
  65. phone?: string,
  66. code?: string
  67. ) => {
  68. const response = await apiRegister(name, password, email, phone, code);
  69. setToken(response.token);
  70. setUserInfo(response.user);
  71. userManuallyLoggedOut.value = false;
  72. return response;
  73. };
  74. const sync = async () => {
  75. const response = await profile();
  76. setUserInfo(response);
  77. };
  78. const logout = () => {
  79. token.value = "";
  80. userInfo.value = {};
  81. userManuallyLoggedOut.value = true;
  82. };
  83. const createGuest = async (code?: string, ref?: string) => {
  84. try {
  85. const response = await newGuest(code, ref);
  86. setToken(response.token);
  87. setUserInfo(response.user);
  88. userManuallyLoggedOut.value = false;
  89. return response;
  90. } catch (error) {
  91. console.error("创建游客账号失败", error);
  92. return null;
  93. }
  94. };
  95. return {
  96. token,
  97. userInfo,
  98. userManuallyLoggedOut,
  99. setUserInfo,
  100. getVipLevel,
  101. login,
  102. register,
  103. logout,
  104. sync,
  105. createGuest,
  106. homePageState,
  107. saveHomePageState,
  108. getHomePageState,
  109. };
  110. });