user.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. import { defineStore } from "pinia";
  2. import {
  3. type userType,
  4. store,
  5. router,
  6. resetRouter,
  7. routerArrays,
  8. storageLocal
  9. } from "../utils";
  10. import {
  11. type UserResult,
  12. type RefreshTokenResult,
  13. getLogin,
  14. refreshTokenApi
  15. } from "@/api/user";
  16. import { useMultiTagsStoreHook } from "./multiTags";
  17. import { type DataInfo, setToken, removeToken, userKey } from "@/utils/auth";
  18. import { ROLES } from '@/global/constDefine.js';
  19. export const useUserStore = defineStore("pure-user", {
  20. state: (): userType => ({
  21. // 头像
  22. avatar: storageLocal().getItem<DataInfo<number>>(userKey)?.avatar ?? "",
  23. // 用户名
  24. username: storageLocal().getItem<DataInfo<number>>(userKey)?.username ?? "",
  25. // 昵称
  26. nickname: storageLocal().getItem<DataInfo<number>>(userKey)?.nickname ?? "",
  27. // 页面级别权限
  28. roles: storageLocal().getItem<DataInfo<number>>(userKey)?.roles ?? [],
  29. // 按钮级别权限
  30. permissions:
  31. storageLocal().getItem<DataInfo<number>>(userKey)?.permissions ?? [],
  32. // 前端生成的验证码(按实际需求替换)
  33. verifyCode: "",
  34. // 判断登录页面显示哪个组件(0:登录(默认)、1:手机登录、2:二维码登录、3:注册、4:忘记密码)
  35. currentPage: 0,
  36. // 是否勾选了登录页的免登录
  37. isRemembered: false,
  38. // 登录页的免登录存储几天,默认7天
  39. loginDay: 7
  40. }),
  41. actions: {
  42. /** 存储头像 */
  43. SET_AVATAR(avatar: string) {
  44. this.avatar = avatar;
  45. },
  46. /** 存储用户名 */
  47. SET_USERNAME(username: string) {
  48. this.username = username;
  49. },
  50. /** 存储昵称 */
  51. SET_NICKNAME(nickname: string) {
  52. this.nickname = nickname;
  53. },
  54. /** 存储角色 */
  55. SET_ROLES(roles: Array<string>) {
  56. this.roles = roles;
  57. },
  58. /** 存储按钮级别权限 */
  59. SET_PERMS(permissions: Array<string>) {
  60. this.permissions = permissions;
  61. },
  62. /** 存储前端生成的验证码 */
  63. SET_VERIFYCODE(verifyCode: string) {
  64. this.verifyCode = verifyCode;
  65. },
  66. /** 存储登录页面显示哪个组件 */
  67. SET_CURRENTPAGE(value: number) {
  68. this.currentPage = value;
  69. },
  70. /** 存储是否勾选了登录页的免登录 */
  71. SET_ISREMEMBERED(bool: boolean) {
  72. this.isRemembered = bool;
  73. },
  74. /** 设置登录页的免登录存储几天 */
  75. SET_LOGINDAY(value: number) {
  76. this.loginDay = Number(value);
  77. },
  78. /** 登入 */
  79. async loginByUsername(data) {
  80. return new Promise<UserResult>((resolve, reject) => {
  81. getLogin(data)
  82. .then(data => {
  83. console.log("rsp getLogin:", data);
  84. const userData = data.user;
  85. console.log("rsp userData:", userData);
  86. if (data?.success) setToken(userData);
  87. resolve(data);
  88. })
  89. .catch(error => {
  90. reject(error);
  91. });
  92. });
  93. },
  94. /** 前端登出(不调用接口) */
  95. logOut() {
  96. this.username = "";
  97. this.roles = [];
  98. this.permissions = [];
  99. const vGlobal = window.vueGlobal;
  100. console.log('vGlobal 重置')
  101. vGlobal.clearSchedule();
  102. vGlobal.resetInit();
  103. removeToken();
  104. useMultiTagsStoreHook().handleTags("equal", [...routerArrays]);
  105. resetRouter();
  106. router.push("/login");
  107. },
  108. /** 刷新`token` */
  109. async handRefreshToken(data) {
  110. return new Promise<RefreshTokenResult>((resolve, reject) => {
  111. refreshTokenApi(data)
  112. .then(data => {
  113. if (data) {
  114. console.log('refresh token data', data);
  115. setToken(data.data);
  116. resolve(data);
  117. }
  118. })
  119. .catch(error => {
  120. reject(error);
  121. });
  122. });
  123. },
  124. existsRole(rolenames) {
  125. for (const name of rolenames) {
  126. if (this.roles.indexOf(name) >= 0) {
  127. return true;
  128. }
  129. }
  130. return false;
  131. }
  132. }
  133. });
  134. export function useUserStoreHook() {
  135. return useUserStore(store);
  136. }