user.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import { defineStore } from 'pinia';
  2. import { ref, computed } from 'vue';
  3. import { getUserInfo, login } from '@/apis/user';
  4. import tokenInfo from '@/stores/modules/token';
  5. import client from '@/stores/modules/client';
  6. import { useRouter } from 'vue-router';
  7. export const useUserInfo = defineStore('userInfo', () => {
  8. // 状态(State)
  9. const tokenInfoStore = new tokenInfo()
  10. const loginShow = ref(false); // 控制登录弹窗的显示状态
  11. const userInfo = ref({}); // 用户的详细信息
  12. // Actions(操作)
  13. /**
  14. * 更新用户信息。
  15. *
  16. * @param {any} data - 新的用户信息数据。
  17. */
  18. const updateUserInfo = (data: any) => {
  19. userInfo.value = data;
  20. };
  21. /**
  22. * 更新用户的登录令牌。
  23. *
  24. * @param {string} data - 新的登录令牌。
  25. */
  26. const updateToken = (data: string) => {
  27. tokenInfoStore.updateToken(data)
  28. };
  29. /**
  30. * 更新登录弹窗的显示状态。
  31. *
  32. * @param {boolean} data - 是否显示登录弹窗。
  33. */
  34. const updateLoginShow = (data: boolean) => {
  35. loginShow.value = data;
  36. };
  37. /**
  38. * 执行用户登录操作。
  39. *
  40. * @param {any} data - 登录所需的用户凭据。
  41. * @returns {Promise<any>} 登录接口返回的结果。
  42. * @throws {Error} 如果登录失败,抛出错误。
  43. */
  44. const loginAction = async (data: any) => {
  45. try {
  46. const res = await login(data); // 调用登录接口
  47. await updateToken(res.data.token); // 更新登录令牌
  48. // await getInfo(); // 获取用户信息
  49. return res;
  50. } catch (error) {
  51. console.error('登录失败:', error);
  52. throw error;
  53. }
  54. };
  55. /**
  56. * 执行用户退出登录操作。
  57. *
  58. * @param {any} data - 退出登录所需的参数。
  59. * @returns {Promise<any>} 退出登录的结果。
  60. * @throws {Error} 如果退出登录失败,抛出错误。
  61. */
  62. const loginOut = async (data: any) => {
  63. try {
  64. // 关闭所有子窗口
  65. try {
  66. const clientStore = client();
  67. await clientStore.ipc.invoke('controller.utils.closeAllWindows');
  68. console.log('所有子窗口已关闭');
  69. } catch (error) {
  70. console.error('关闭子窗口失败:', error);
  71. // 关闭窗口失败不影响退出登录流程
  72. }
  73. // 清空用户信息
  74. await updateToken(''); // 更新登录令牌
  75. await updateUserInfo({});
  76. // 跳转到首页
  77. try {
  78. window.location.href = '/'
  79. console.log('已跳转到首页');
  80. } catch (error) {
  81. console.error('跳转到首页失败:', error);
  82. // 跳转失败不影响退出登录流程
  83. }
  84. } catch (error) {
  85. console.error('退出登录失败:', error);
  86. throw error;
  87. }
  88. };
  89. /**
  90. * 获取用户信息并更新状态。
  91. *
  92. * @returns {Promise<any>} 用户信息数据。
  93. * @throws {Error} 如果获取用户信息失败,抛出错误。
  94. */
  95. const getInfo = async () => {
  96. try {
  97. const res = await getUserInfo({
  98. device:'aigc',
  99. }); // 调用获取用户信息接口
  100. const { data } = res;
  101. if (!data) {
  102. updateToken(''); // 如果没有数据,清空令牌
  103. throw new Error('请重新登录!');
  104. }
  105. updateUserInfo(data); // 更新用户信息
  106. return data;
  107. } catch (error) {
  108. console.error('获取用户信息失败:', error);
  109. throw error;
  110. }
  111. };
  112. return {
  113. loginShow,
  114. userInfo,
  115. updateUserInfo,
  116. updateLoginShow,
  117. loginAction,
  118. loginOut,
  119. getInfo,
  120. };
  121. });
  122. export default useUserInfo;