user.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import {defineStore} from "pinia";
  2. import {loginApi, logoutApi} from "@/api/auth";
  3. import {resetRouter} from "@/router";
  4. import {store} from "@/store";
  5. import {useStorage} from "@vueuse/core";
  6. import {LoginData, LoginResult} from "@/api/auth/types";
  7. export const useUserStore = defineStore("user", () => {
  8. // state
  9. const token = useStorage("accessToken", "");
  10. const userInfo = useStorage("userInfo", "");
  11. const schoolId = useStorage("schoolId", 0);
  12. const schoolNum = useStorage("schoolNum", "");
  13. const routeStatus = ref(false);
  14. const nickname = ref("");
  15. const phone = ref("");
  16. const role = ref(""); // 用户角色 → 判断路由权限
  17. const perms = ref<Array<string>>([]); // 用户权限编码集合 → 判断按钮权限
  18. // 登录调用
  19. function login(loginData: LoginData) {
  20. return new Promise<void>((resolve, reject) => {
  21. loginApi(loginData)
  22. .then(({data}) => {
  23. userInfo.value = JSON.stringify(data);
  24. setUserData(data);
  25. resolve();
  26. })
  27. .catch((error) => {
  28. console.log(error.message);
  29. reject(error);
  30. });
  31. });
  32. }
  33. // 动态路由调用
  34. function getInfo() {
  35. return new Promise<string>((resolve, reject) => {
  36. const userInfoStr = localStorage.getItem("userInfo");
  37. if (null != userInfoStr) {
  38. const userInfo = JSON.parse(userInfoStr);
  39. const role = setUserData(userInfo);
  40. resolve(role);
  41. } else {
  42. reject("本地数据丢失,请重新登录!");
  43. }
  44. });
  45. }
  46. // 设置用户信息
  47. function setUserData(data: LoginResult) {
  48. token.value = data.token;
  49. nickname.value = data.name;
  50. phone.value = data.phone;
  51. schoolId.value = data.school_id;
  52. schoolNum.value = data.num;
  53. role.value = data.role;
  54. //role.value = "ADMIN";
  55. perms.value = data.perms;
  56. return role.value;
  57. }
  58. // 注销
  59. function logout() {
  60. return new Promise<void>((resolve, reject) => {
  61. logoutApi()
  62. .then(() => {
  63. resetRouter();
  64. resetToken();
  65. location.reload(); // 清空路由
  66. resolve();
  67. })
  68. .catch((error) => {
  69. reject(error);
  70. });
  71. });
  72. }
  73. // 重置
  74. function resetToken() {
  75. token.value = "";
  76. userInfo.value = "";
  77. nickname.value = "";
  78. phone.value = "";
  79. role.value = "";
  80. perms.value = [];
  81. }
  82. // 切换学校
  83. function changeSchool(id: number, num: string) {
  84. schoolId.value = id;
  85. schoolNum.value = num;
  86. }
  87. // 路由加载后设置
  88. function setRouteStatus(status: boolean) {
  89. routeStatus.value = status;
  90. }
  91. return {
  92. token,
  93. routeStatus,
  94. schoolId,
  95. schoolNum,
  96. nickname,
  97. phone,
  98. role,
  99. perms,
  100. login,
  101. logout,
  102. getInfo,
  103. resetToken,
  104. setRouteStatus,
  105. changeSchool,
  106. };
  107. });
  108. // 非setup
  109. export function useUserStoreHook() {
  110. return useUserStore(store);
  111. }