UNPKG

ttk-app-core

Version:
254 lines (241 loc) 8.61 kB
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 }