user.ts 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import { to } from 'await-to-js';
  2. import defAva from '@/assets/images/profile.jpg';
  3. import store from '@/store';
  4. import { getToken, removeToken, setToken } from '@/utils/auth';
  5. import { login as loginApi, logout as logoutApi, getInfo as getUserInfo } from '@/api/login';
  6. import { LoginData } from '@/api/types';
  7. export const useUserStore = defineStore('user', () => {
  8. const token = ref(getToken());
  9. const name = ref('');
  10. const nickname = ref('');
  11. const userId = ref<string | number>('');
  12. const avatar = ref('');
  13. const roles = ref<Array<string>>([]); // 用户角色编码集合 → 判断路由权限
  14. const permissions = ref<Array<string>>([]); // 用户权限编码集合 → 判断按钮权限
  15. /**
  16. * 登录
  17. * @param userInfo
  18. * @returns
  19. */
  20. const login = async (userInfo: LoginData): Promise<void> => {
  21. const [err, res] = await to(loginApi(userInfo));
  22. if (res) {
  23. const data = res.data;
  24. setToken(data.access_token);
  25. token.value = data.access_token;
  26. return Promise.resolve();
  27. }
  28. return Promise.reject(err);
  29. };
  30. // 获取用户信息
  31. const getInfo = async (): Promise<void> => {
  32. const [err, res] = await to(getUserInfo());
  33. if (res) {
  34. const data = res.data;
  35. const user = data.user;
  36. const profile = user.avatar == '' || user.avatar == null ? defAva : user.avatar;
  37. if (data.roles && data.roles.length > 0) {
  38. // 验证返回的roles是否是一个非空数组
  39. roles.value = data.roles;
  40. permissions.value = data.permissions;
  41. } else {
  42. roles.value = ['ROLE_DEFAULT'];
  43. }
  44. name.value = user.userName;
  45. nickname.value = user.nickName;
  46. avatar.value = profile;
  47. userId.value = user.userId;
  48. return Promise.resolve();
  49. }
  50. return Promise.reject(err);
  51. };
  52. // 注销
  53. const logout = async (): Promise<void> => {
  54. await logoutApi();
  55. token.value = '';
  56. roles.value = [];
  57. permissions.value = [];
  58. removeToken();
  59. };
  60. const setAvatar = (value: string) => {
  61. avatar.value = value;
  62. };
  63. return {
  64. userId,
  65. token,
  66. nickname,
  67. avatar,
  68. roles,
  69. permissions,
  70. login,
  71. getInfo,
  72. logout,
  73. setAvatar
  74. };
  75. });
  76. export default useUserStore;
  77. // 非setup
  78. export function useUserStoreHook() {
  79. return useUserStore(store);
  80. }