|
|
@@ -3,20 +3,31 @@
|
|
|
*/
|
|
|
import { routerRedux } from 'dva/router'
|
|
|
import { message } from 'antd'
|
|
|
+import * as service from '../services/index'
|
|
|
+import URLS from '../constants/url'
|
|
|
+import moment from 'moment'
|
|
|
|
|
|
-
|
|
|
-const code = window.localStorage.getItem('usercode');
|
|
|
+const code = window.sessionStorage.getItem('usercode');
|
|
|
const account = window.localStorage.getItem('account');
|
|
|
const password = window.localStorage.getItem('password');
|
|
|
-const name = window.localStorage.getItem('username');
|
|
|
-const role = window.localStorage.getItem('userrole');
|
|
|
-const department = window.localStorage.getItem('department');
|
|
|
-const job = window.localStorage.getItem('job');
|
|
|
+const name = window.sessionStorage.getItem('username');
|
|
|
+const role = window.sessionStorage.getItem('userrole');
|
|
|
+const department = window.sessionStorage.getItem('department');
|
|
|
+const job = window.sessionStorage.getItem('job');
|
|
|
+const expireTime = window.sessionStorage.getItem('expireTime');
|
|
|
+const autoLogin = window.localStorage.getItem('autoLogin') ? window.localStorage.getItem('autoLogin') === 'true' : true;
|
|
|
+
|
|
|
+const t = moment(+expireTime);
|
|
|
+const isLogin = expireTime && t.isValid();
|
|
|
+const authenticated = t.isValid() && t.diff(moment()) > 0;
|
|
|
|
|
|
export default {
|
|
|
namespace: 'main',
|
|
|
state: {
|
|
|
- authenticated: false,
|
|
|
+ authenticated: authenticated,
|
|
|
+ autoLogin: autoLogin,
|
|
|
+ isLogin: isLogin,
|
|
|
+ expireTime,
|
|
|
currentUser: {
|
|
|
code,
|
|
|
account,
|
|
|
@@ -36,10 +47,13 @@ export default {
|
|
|
const { user } = action;
|
|
|
return { ...state, currentUser: user };
|
|
|
},
|
|
|
- setAuthenticated(state, action) {
|
|
|
- const { authenticated } = action;
|
|
|
- return { ...state, authenticated };
|
|
|
- }
|
|
|
+ setFields(state, action) {
|
|
|
+ const { fields } = action;
|
|
|
+ let obj = {};
|
|
|
+ fields.map(f => (obj[f.name] = f.value));
|
|
|
+ let newState = Object.assign({}, state, obj);
|
|
|
+ return Object.assign({}, newState );
|
|
|
+ },
|
|
|
},
|
|
|
effects: {
|
|
|
* redirect (action, { put }) {
|
|
|
@@ -60,16 +74,81 @@ export default {
|
|
|
window.location.reload();
|
|
|
}
|
|
|
},
|
|
|
+ *login(action, {put, call}) {
|
|
|
+ const { username, password, autoLogin } = action;
|
|
|
+
|
|
|
+ function authenticate(token, expireTime, user, autoLogin) {
|
|
|
+ window.sessionStorage.setItem("loginTime", new Date().getTime());
|
|
|
+ window.sessionStorage.setItem("token", token);
|
|
|
+ window.sessionStorage.setItem("expireTime", expireTime);
|
|
|
+
|
|
|
+ window.sessionStorage.setItem("usercode", user.code);
|
|
|
+ autoLogin ? window.localStorage.setItem("autoLogin", 'true') : window.localStorage.setItem("autoLogin", 'false');
|
|
|
+ window.localStorage.setItem("account", user.account)
|
|
|
+ window.sessionStorage.setItem("account", user.account);
|
|
|
+ autoLogin ? window.localStorage.setItem("password", user.password) : window.localStorage.removeItem('password');
|
|
|
+ window.sessionStorage.setItem("username", user.name);
|
|
|
+ window.sessionStorage.setItem("userrole", user.role);
|
|
|
+ window.sessionStorage.setItem("department", user.department);
|
|
|
+ window.sessionStorage.setItem("job", user.job);
|
|
|
+ }
|
|
|
+
|
|
|
+ const body = {
|
|
|
+ userName: username,
|
|
|
+ passWord: password
|
|
|
+ };
|
|
|
+ try {
|
|
|
+ const res = yield call(service.fetch, {
|
|
|
+ url: URLS.LOGIN,
|
|
|
+ body
|
|
|
+ });
|
|
|
+ if(!res.err && res.data.code > 0) {
|
|
|
+ const resData = res.data.data;
|
|
|
+
|
|
|
+ const token = resData.token;
|
|
|
+ const expireTime = resData.times;
|
|
|
+ const user = resData.user;
|
|
|
+ const currentUser = {
|
|
|
+ code: user.id+'',
|
|
|
+ account: user.userName,
|
|
|
+ password: user.passWord,
|
|
|
+ name: user.name,
|
|
|
+ role: user.role || 'default',
|
|
|
+ department: user.department,
|
|
|
+ job: user.post,
|
|
|
+ };
|
|
|
+ yield put({ type: 'setFields', fields: [
|
|
|
+ { name: 'isLogin', value: true },
|
|
|
+ { name: 'autoLogin', value: autoLogin },
|
|
|
+ { name: 'authenticated', value: true },
|
|
|
+ { name: 'currentUser', value: currentUser }
|
|
|
+ ]});
|
|
|
+ authenticate(token, expireTime, currentUser, autoLogin);
|
|
|
+ return true;
|
|
|
+ }else {
|
|
|
+ message.error('登录失败: ' + (res.err || res.data.msg));
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }catch(e) {
|
|
|
+ yield put({ type: 'setFields', fields: [
|
|
|
+ { name: 'isLogin', value: false },
|
|
|
+ { name: 'authenticated', value: false }
|
|
|
+ ]});
|
|
|
+ message.error('登录失败: ' + e);
|
|
|
+ console.error(body, e);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ },
|
|
|
*logout( action, { put, call, select }) {
|
|
|
try {
|
|
|
- window.localStorage.removeItem("username");
|
|
|
- window.localStorage.removeItem("userrole");
|
|
|
- window.localStorage.removeItem("usercode");
|
|
|
- window.localStorage.removeItem("department");
|
|
|
- window.localStorage.removeItem("job");
|
|
|
- window.localStorage.removeItem("loginTime");
|
|
|
- window.localStorage.removeItem("token");
|
|
|
- window.localStorage.removeItem("expireTime");
|
|
|
+ window.sessionStorage.removeItem("username");
|
|
|
+ window.sessionStorage.removeItem("userrole");
|
|
|
+ window.sessionStorage.removeItem("usercode");
|
|
|
+ window.sessionStorage.removeItem("department");
|
|
|
+ window.sessionStorage.removeItem("job");
|
|
|
+ window.sessionStorage.removeItem("loginTime");
|
|
|
+ window.sessionStorage.removeItem("token");
|
|
|
+ window.sessionStorage.removeItem("expireTime");
|
|
|
|
|
|
yield put({ type: 'dataConnect/reset' });
|
|
|
yield put({ type: 'dataSource/reset' });
|
|
|
@@ -92,6 +171,32 @@ export default {
|
|
|
duration: 2,
|
|
|
maxCount: 3,
|
|
|
});
|
|
|
+
|
|
|
+ let checkExpireTime = () => {
|
|
|
+ let expireTime = window.sessionStorage.getItem('expireTime');
|
|
|
+ let t = moment(+expireTime).diff(moment())
|
|
|
+ return t >= 0 ? t : 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ let onExpired = () => {
|
|
|
+ dispatch({ type: 'setFields', fields: [{ name: 'authenticated', value: false}] });
|
|
|
+ }
|
|
|
+
|
|
|
+ let hiddenProperty = 'hidden' in document ? 'hidden' :
|
|
|
+ 'webkitHidden' in document ? 'webkitHidden' :
|
|
|
+ 'mozHidden' in document ? 'mozHidden' :
|
|
|
+ null;
|
|
|
+ let visibilityChangeEvent = hiddenProperty.replace(/hidden/i, 'visibilitychange');
|
|
|
+ let timeoutKey = window.setTimeout(onExpired, checkExpireTime());
|
|
|
+ let onVisibilityChange = () => {
|
|
|
+ if (document[hiddenProperty]) {
|
|
|
+ window.clearTimeout(timeoutKey);
|
|
|
+ }else{
|
|
|
+ timeoutKey = window.setTimeout(onExpired, checkExpireTime());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ document.addEventListener(visibilityChangeEvent, onVisibilityChange);
|
|
|
+
|
|
|
return history.listen(({ pathname, query }) => {
|
|
|
let page = pathname.match(/\/(\w*)/)[1];
|
|
|
dispatch({ type: 'setCurrentPage', page });
|