user.ts 2.5 KB

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