store.tsx 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. import { makeAutoObservable } from 'mobx';
  2. import { message } from 'antd';
  3. import { apis, LoginApiParams } from '@/apis';
  4. import LocalStorage from '@/LocalStorage';
  5. import router from '@/router';
  6. import { State, ReadonlyState, StateAction, LoginStore } from './types';
  7. // 定义状态
  8. const stateGenerator = (): ReadonlyState => ({
  9. buttonLoading: false,
  10. });
  11. // 修改状态
  12. const stateActionsGenerator = (state: State): StateAction => {
  13. return {
  14. setButtonLoading: (loading) => {
  15. state.buttonLoading = loading;
  16. },
  17. };
  18. };
  19. // 使用仓库
  20. const useLoginStore = (): LoginStore => {
  21. const state = makeAutoObservable(stateGenerator());
  22. const actions = stateActionsGenerator(state);
  23. const api = {
  24. // 登录
  25. login: async (data: LoginApiParams, remember: boolean) => {
  26. actions.setButtonLoading(true);
  27. try {
  28. const res = await apis.login(data);
  29. const info = res.data;
  30. if (remember) {// 记住密码
  31. LocalStorage.setAccountPassword({
  32. account: data.userName,
  33. password: data.password,
  34. });
  35. } else {// 不记住密码
  36. LocalStorage.setAccountPassword(undefined);
  37. }
  38. // 首次登陆,重置菜单类型
  39. LocalStorage.setMenuType(1);
  40. LocalStorage.setToken(info.token);
  41. LocalStorage.setUserInfo({
  42. id: info.userId,
  43. name: info.nickName,
  44. });
  45. // 获取用户详细信息(permissions,role, user)
  46. const resUserInfo = await apis.fetchUserInfo(info.userId);
  47. if (resUserInfo.code === 200) {
  48. LocalStorage.setPermissions(resUserInfo.permissions);
  49. LocalStorage.setRoles(resUserInfo.roles);
  50. if (!LocalStorage.getStatusFlag('deepseek:application:list') &&
  51. !LocalStorage.getStatusFlag('deepseek:knowledge:list') &&
  52. !LocalStorage.getStatusFlag('deepseek:dialog:list') &&
  53. !LocalStorage.getStatusFlag('system:audit:list')) {
  54. message.error('权限不足,请联系管理员');
  55. LocalStorage.clear();
  56. router.navigate({ pathname: '/login' }, { replace: true });
  57. return;
  58. }
  59. if (LocalStorage.getStatusFlag('deepseek:application:list')) {
  60. router.navigate({ pathname: '/deepseek/questionAnswer' }, { replace: true });
  61. } else {
  62. router.navigate({ pathname: '/404' }, { replace: true });
  63. }
  64. message.success('登录成功');
  65. }
  66. } catch (error: any) {
  67. LocalStorage.clear();
  68. message.error(error.msg);
  69. } finally {
  70. actions.setButtonLoading(false);
  71. }
  72. },
  73. }
  74. // 点击登录
  75. const onClickLogin: LoginStore['onClickLogin'] = async (data, remember) => {
  76. // 登录
  77. await api.login(data, remember);
  78. }
  79. // 初始渲染
  80. const init: LoginStore['init'] = (form) => {
  81. const accountPassword = LocalStorage.getAccountPassword();
  82. if (accountPassword) {
  83. form.setFieldsValue({
  84. account: accountPassword.account,
  85. password: accountPassword.password,
  86. remember: true,
  87. });
  88. }
  89. }
  90. // 状态重置
  91. const reset: LoginStore['reset'] = () => {
  92. const initialButtonLoading = stateGenerator().buttonLoading;
  93. actions.setButtonLoading(initialButtonLoading);
  94. }
  95. return {
  96. state,
  97. onClickLogin,
  98. init,
  99. reset
  100. };
  101. };
  102. export default useLoginStore();