import { routerRedux } from 'dva/router'; import { stringify } from 'qs'; import { fakeAccountLogin, getFakeCaptcha } from '@/services/api'; import { setAuthority } from '@/utils/authority'; import { getPageQuery } from '@/utils/utils'; import { reloadAuthorized } from '@/utils/Authorized'; import { setLoginToken } from '../utils/cache'; export default { namespace: 'login', state: { status: undefined, }, effects: { *login({ payload }, { call, put }) { const response = yield call(fakeAccountLogin, payload); yield put({ type: 'changeLoginStatus', payload: response, }); yield put(routerRedux.replace('/')); // Login successfully if (response.code === 0) { // 保存 token 到 localStorage,发送请求的时候,会自动取 token 放到 header setLoginToken(response.data.token.accessToken, response.data.token.refreshToken); // 此处直接设置为 admin、和 user 角色,因为暂时不做服务控制前段 角色 setAuthority(['admin', 'user']); reloadAuthorized(); const urlParams = new URL(window.location.href); const params = getPageQuery(); let { redirect } = params; if (redirect) { const redirectUrlParams = new URL(redirect); if (redirectUrlParams.origin === urlParams.origin) { redirect = redirect.substr(urlParams.origin.length); if (redirect.match(/^\/.*#/)) { redirect = redirect.substr(redirect.indexOf('#') + 1); } } else { window.location.href = redirect; return; } } yield put(routerRedux.replace(redirect || '/')); } }, *getCaptcha({ payload }, { call }) { yield call(getFakeCaptcha, payload); }, *logout(_, { put }) { yield put({ type: 'changeLoginStatus', payload: { status: false, currentAuthority: 'guest', }, }); reloadAuthorized(); yield put( routerRedux.push({ pathname: '/user/login', search: stringify({ redirect: window.location.href, }), }) ); }, }, reducers: { changeLoginStatus(state, { payload }) { setAuthority(payload.currentAuthority); return { ...state, status: payload.status, type: payload.type, }; }, }, };