| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- import { stringify } from 'querystring';
- import type { Reducer, Effect } from 'umi';
- import { history } from 'umi';
- import { fakeAccountLogin } from '@/services/login';
- import { setAuthority } from '@/utils/authority';
- import { getPageQuery } from '@/utils/utils';
- import { message } from 'antd';
- export type StateType = {
- status?: 'ok' | 'error';
- type?: string;
- currentAuthority?: 'user' | 'guest' | 'admin';
- };
- export type LoginModelType = {
- namespace: string;
- state: StateType;
- effects: {
- login: Effect;
- logout: Effect;
- };
- reducers: {
- changeLoginStatus: Reducer<StateType>;
- };
- };
- const Model: LoginModelType = {
- namespace: 'login',
- state: {
- status: undefined,
- },
- effects: {
- *login({ payload }, { call, put }) {
- const response = yield call(fakeAccountLogin, payload);
- yield put({
- type: 'changeLoginStatus',
- payload: response,
- });
- // Login successfully
- if (response.status === 'ok') {
- const urlParams = new URL(window.location.href);
- const params = getPageQuery();
- message.success('🎉 🎉 🎉 登录成功!');
- let { redirect } = params as { redirect: string };
- if (redirect) {
- const redirectUrlParams = new URL(redirect);
- if (redirectUrlParams.origin === urlParams.origin) {
- redirect = redirect.substr(urlParams.origin.length);
- if (window.routerBase !== '/') {
- redirect = redirect.replace(window.routerBase, '/');
- }
- if (redirect.match(/^\/.*#/)) {
- redirect = redirect.substr(redirect.indexOf('#') + 1);
- }
- } else {
- window.location.href = '/';
- return;
- }
- }
- history.replace(redirect || '/');
- }
- },
- logout() {
- const { redirect } = getPageQuery();
- // Note: There may be security issues, please note
- if (window.location.pathname !== '/user/login' && !redirect) {
- history.replace({
- pathname: '/user/login',
- search: stringify({
- redirect: window.location.href,
- }),
- });
- }
- },
- },
- reducers: {
- changeLoginStatus(state, { payload }) {
- setAuthority(payload.currentAuthority);
- return {
- ...state,
- status: payload.status,
- type: payload.type,
- };
- },
- },
- };
- export default Model;
|