ttk-app-core
Version:
enterprise develop framework
254 lines (241 loc) • 8.61 kB
JavaScript
import React from 'react';
import { action as MetaAction, AppLoader } from 'edf-meta-engine';
import config from './config';
import md5 from 'md5';
import { consts } from 'edf-consts';
class action {
constructor(option) {
this.metaAction = option.metaAction;
this.config = config.current;
this.webapi = this.config.webapi;
}
onInit = async ({ component, injections }) => {
this.component = component
let props = this.component.props
//外部对接:一键登录判断
if (props != null && props.appParams != null) {
let appkey = props.appParams.appkey
if (appkey != null) {
let code = props.appParams.code, token = props.appParams.token
if ((code != null || token != null) || appkey == consts.app.APPKEY_FORESEE_ECS_SINGLE) {
const response = await this.webapi.connector.accessLogin(props.appParams)
if (appkey != consts.app.APPKEY_FORESEE_ECS_SINGLE) {
sessionStorage['mobile'] = response.value.mobile
sessionStorage['username'] = response.value.nickname
sessionStorage['currentOrgStatus'] = response.value.currentOrgStatus
}
sessionStorage['_accessToken'] = response.token
sessionStorage['ompArgs'] = JSON.stringify(response.value.appSource)
//登录时切换皮肤
let skin = (response.value.skin && response.value.skin.toUpperCase()) || '#1EB5AD'
localStorage['skin'] = skin
if (props.appParams && props.appParams.appkey) {
localStorage['ompKey'] = JSON.stringify({ appkey: props.appParams.appkey })
}
if (props.onRedirect && this.config.goAfterLogin) {
props.onRedirect(this.config.goAfterLogin)
}
return false
}
}
}
let info = { mobile: '', password: '', remember: false }, currentTimestamp = (new Date()).getTime();
//从cookie中读取mobile
function getCookie(c_name) {
if (document.cookie.length > 0) {
let c_start = document.cookie.indexOf(c_name + '=');
if (c_start != -1) {
c_start = c_start + c_name.length + 1;
let c_end = document.cookie.indexOf(';', c_start);
if (c_end == -1) c_end = document.cookie.length;
return unescape(document.cookie.substring(c_start, c_end));
}
}
return '';
}
info.mobile = getCookie('THE_LAST_LOGIN');
// if (currentTimestamp < localStorage.remember) {
// info.remember = true;
// if (info.mobile == localStorage['mobile']) {
// info.password = localStorage['password'];
// }
// } else {
// localStorage.clear();
// }
// info.version = this.getVersion();
injections.reduce('init', info)
//绑定回车事件
this.bindEnter();
};
// getVersion = () => {
// var rawFile = {};
// if (window.XMLHttpRequest) {
// rawFile = new XMLHttpRequest();
// } else {
// rawFile = new ActiveXObject('Microsoft.XMLHTTP');
// }
// var allText = '';
// rawFile.open('GET', './version.txt', false);
// rawFile.onreadystatechange = function () {
// if (rawFile.readyState === 4) {
// if (rawFile.status === 200 || rawFile.status == 0) {
// allText = rawFile.responseText;
// }
// }
// };
// rawFile.send(null);
// return allText;
// };
bindEnter = () => {
let that = this;
document.onkeydown = function (e) {
e = e || window.event;
let keyCode = e.keyCode;
if (keyCode !== 13) return;
let form = that.metaAction.gf('data.form')
.toJS();
that.fieldChange('data.form.mobile', form.mobile);
that.fieldChange('data.form.password', form.password);
that.login();
};
};
login = async () => {
let form = this.metaAction.gf('data.form').toJS();
//登录前校验
const basicInfo = await this.check([{
path: 'data.form.mobile', value: form.mobile
}, {
path: 'data.form.password', value: form.password
}], 'login');
if (!basicInfo) return;
if (!(Object.keys(this.component.props.appParams).includes('appkey'))) {
this.metaAction.toast('warn', '请在url中携带参数appkey');
return false;
}
// if (other.userInput) {
if (form.password) {
form.clearText = Base64.encode(form.password);
form.password = md5(form.password + '*the3Kingdom*');
form.appkey = this.component.props.appParams.appkey;
}
// }
const response = await this.webapi.user.login(form);
if (!response.result) {
if (response.error.code == 50111) {
this.metaAction.sf('data.other.error.password', '密码不正确,请重新输入');
}
return;
}
//cookie中存储上次登录的用户名
function setCookie(c_name, value, expiredays) {
let exdate = new Date();
exdate.setDate(exdate.getDate() + expiredays);
document.cookie = c_name + '=' + escape(value) +
((expiredays == null) ? '' : ';expires=' + exdate.toGMTString());
}
setCookie('THE_LAST_LOGIN', form.mobile, 7);
this.metaAction.context.set('user', response.value);
//判断是否保存登录信息
// if (form.remember) {
// let time = (new Date()).getTime() + 7 * 24 * 60 * 60 * 1000;
// localStorage.remember = time;
// localStorage['mobile'] = form.mobile;
// localStorage['password'] = form.password;
// } else {
// localStorage.clear();
// }
sessionStorage['mobile'] = form.mobile;
sessionStorage['username'] = response.value.nickname;
sessionStorage['_accessToken'] = response.token;
sessionStorage['password'] = form.password;
sessionStorage['currentOrgStatus'] = response.value.currentOrgStatus;
sessionStorage['ompArgs'] = JSON.stringify(response.value.appSource);
document.onkeydown = null;
//登录时切换皮肤
let skin = (response.value.skin && response.value.skin.toUpperCase()) || '#1EB5AD';
localStorage['skin'] = skin;
localStorage['ompKey'] = JSON.stringify(this.component.props.appParams);
if (this.component.props.onRedirect && this.config.goAfterLogin) {
this.component.props.onRedirect(this.config.goAfterLogin);
}
};
// closeTips = () => {
// this.metaAction.sf('data.other.checkTips', false);
// };
fieldChange = async (fieldPath, value) => {
this.metaAction.sf(fieldPath, value);
await this.check([{ path: fieldPath, value }]);
};
check = async (fieldPathAndValues, action) => {
if (!fieldPathAndValues) {
return;
}
let checkResults = [];
for (let o of fieldPathAndValues) {
let r = { ...o };
if (o.path == 'data.form.mobile') {
Object.assign(r, await this.checkMobile(o.value, action));
}
else if (o.path == 'data.form.password') {
Object.assign(r, await this.checkPassword(o.value, action));
}
checkResults.push(r);
}
let json = {}, hasError = true;
checkResults.forEach(o => {
// json[o.path] = o.value
json[o.errorPath] = o.message;
if (o.message) {
hasError = false;
}
});
this.metaAction.sfs(json);
return hasError;
};
checkMobile = async (mobile, action) => {
let message;
if (action && action == 'login') {
if (!mobile) {
message = '请输入手机号';
} else if (mobile.length != 11) {
message = '请输入正确的手机号';
} else {
let flag = await this.webapi.user.existsMobile(mobile);
!flag && (message = '该手机号未注册,请重新输入');
}
} else {
if (!mobile) {
message;
} else if (mobile.length == 1 && !(mobile == '1')) {
message = '请输入正确的手机号';
} else if (mobile.length > 1 && mobile.length < 11 && !/^1[3|4|5|8|7]/.test(mobile)) {
message = '请输入正确的手机号';
} else if (mobile.length > 11) {
message = '请输入正确的手机号';
} else if (mobile.length == 11) {
let flag = await this.webapi.user.existsMobile(mobile);
!flag && (message = '该手机号未注册,请重新输入');
}
}
return { errorPath: 'data.other.error.mobile', message };
};
checkPassword = (password) => {
// let message;
// if (!password) {
// message = '请输入密码';
// }
return { errorPath: 'data.other.error.password', message: !password ? '请输入密码' : undefined };
};
//检查是否要置灰登录
checkLogin = () => {
let data = this.metaAction.gf('data').toJS();
return !((data.form.mobile && !data.other.error.mobile) && (data.form.password && !data.other.error.password));
};
}
export default function creator(option) {
const metaAction = new MetaAction(option),
o = new action({ ...option, metaAction }),
ret = { ...metaAction, ...o }
metaAction.config({ metaHandlers: ret })
return ret
}