From 8ed1e158001e1a3f6f988c2037f7ef6f82df343d Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期三, 07 六月 2023 21:02:25 +0800 Subject: [PATCH] 2023-06-07 --- public/options.json | 4 src/index.js | 1 src/views/login/loginform.jsx | 223 ++++++++++++++++++++++++------- src/api/index.js | 1 src/views/login/index.scss | 59 ++++---- src/tabviews/zshare/actionList/changeuserbutton/index.jsx | 2 src/views/login/index.jsx | 114 ++++++++++++--- 7 files changed, 295 insertions(+), 109 deletions(-) diff --git a/public/options.json b/public/options.json index 47723bd..d9bbbc4 100644 --- a/public/options.json +++ b/public/options.json @@ -11,12 +11,12 @@ "WXAppID": "", "WXminiAppID": "", "WXNotice": "false", - "nginx": "true", + "nginx": "false", "debugger": true, "licenseKey": "", "probation": "", "transfer": true, - "keepPassword": "true", + "keepPassword": "false", "platforms": ["H5", "wechat", "android", "ios", "wxMiniProgram"], "host": "http://bms-test.kresstools.cn", "service": "oc/" diff --git a/src/api/index.js b/src/api/index.js index 318b47d..e74fa6e 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -53,7 +53,6 @@ localStorage.removeItem('debug') localStorage.removeItem('role_id') localStorage.removeItem('mk_user_type') - localStorage.removeItem('localRole_id') sessionStorage.clear() sessionStorage.setItem('loginError', JSON.stringify({url: res.config ? res.config.url : '', request: res.config ? res.config.data : '', response: JSON.stringify(res.data)})) diff --git a/src/index.js b/src/index.js index d66e92a..761e47e 100644 --- a/src/index.js +++ b/src/index.js @@ -57,7 +57,6 @@ sessionStorage.setItem('departmentcode', localStorage.getItem('departmentcode') || '') sessionStorage.setItem('organization', localStorage.getItem('organization') || '') sessionStorage.setItem('mk_user_type', localStorage.getItem('mk_user_type') || '') -sessionStorage.setItem('localRole_id', localStorage.getItem('localRole_id') || '') sessionStorage.setItem('lang', 'zh-CN') if (sessionStorage.getItem('loginError')) { diff --git a/src/tabviews/zshare/actionList/changeuserbutton/index.jsx b/src/tabviews/zshare/actionList/changeuserbutton/index.jsx index fc411f4..9311874 100644 --- a/src/tabviews/zshare/actionList/changeuserbutton/index.jsx +++ b/src/tabviews/zshare/actionList/changeuserbutton/index.jsx @@ -190,7 +190,6 @@ // sessionStorage.setItem('debug', res.debug || '') // sessionStorage.setItem('role_id', res.role_id || '') // sessionStorage.setItem('mk_user_type', res.mk_user_type || '') - // sessionStorage.setItem('localRole_id', res.role_id || '') localStorage.setItem('UserID', res.UserID) localStorage.setItem('LoginUID', res.LoginUID) @@ -204,7 +203,6 @@ localStorage.setItem('departmentcode', res.departmentcode || '') localStorage.setItem('organization', res.organization || '') localStorage.setItem('mk_user_type', res.mk_user_type || '') - localStorage.setItem('localRole_id', res.role_id || '') sessionStorage.removeItem('CloudAvatar') sessionStorage.removeItem('cloudDataM') diff --git a/src/views/login/index.jsx b/src/views/login/index.jsx index a654d81..115e679 100644 --- a/src/views/login/index.jsx +++ b/src/views/login/index.jsx @@ -5,7 +5,7 @@ import Api from '@/api' import Utils from '@/utils/utils.js' -// import MKEmitter from '@/utils/events.js' +import MKEmitter from '@/utils/events.js' import options, { styles } from '@/store/options.js' import zhCN from '@/locales/zh-CN/login.js' import enUS from '@/locales/en-US/login.js' @@ -52,7 +52,6 @@ localStorage.removeItem('localDataM') localStorage.removeItem('debug') localStorage.removeItem('role_id') - localStorage.removeItem('localRole_id') sessionStorage.clear() } @@ -112,19 +111,36 @@ localStorage.setItem('departmentcode', res.departmentcode || '') localStorage.setItem('organization', res.organization || '') localStorage.setItem('mk_user_type', res.mk_user_type || '') - localStorage.setItem('localRole_id', res.role_id || '') localStorage.setItem('lang', 'zh-CN') - let _url = window.location.href.split('#')[0] + sessionStorage.setItem('UserID', res.UserID) + sessionStorage.setItem('LoginUID', res.LoginUID) + sessionStorage.setItem('User_Name', res.UserName) + sessionStorage.setItem('Full_Name', res.FullName) + sessionStorage.setItem('avatar', res.icon || '') + sessionStorage.setItem('dataM', res.dataM ? 'true' : '') + sessionStorage.setItem('debug', res.debug || '') + sessionStorage.setItem('role_id', res.role_id || '') + sessionStorage.setItem('departmentcode', res.departmentcode || '') + sessionStorage.setItem('organization', res.organization || '') + sessionStorage.setItem('mk_user_type', res.mk_user_type || '') - // 璁颁綇瀵嗙爜鏃惰处鍙峰瘑鐮佸瓨鍏ocalStorage - localStorage.setItem(_url, window.btoa(window.encodeURIComponent(JSON.stringify({username: param.username, password: param.password})))) + if (res.paas_externalDatabase) { + sessionStorage.setItem('externalDatabase', res.paas_externalDatabase) + window.GLOB.externalDatabase = `[${res.paas_externalDatabase}]..` + } - let _param = { - UserName: param.username, - Password: param.password, - BasePath: '/' + localStorage.setItem(_href + 'lang', param.lang || 'zh-CN') + sessionStorage.setItem('lang', param.lang || 'zh-CN') + + sessionStorage.removeItem('visitorUserID') + sessionStorage.removeItem('visitorLoginUID') + + if (param.remember) { // 璁颁綇瀵嗙爜鏃惰处鍙峰瘑鐮佸瓨鍏ocalStorage + localStorage.setItem(_href, window.btoa(window.encodeURIComponent(JSON.stringify({username: param.username, password: param.password})))) + } else { + localStorage.removeItem(_href) } // positecgroup @@ -137,19 +153,47 @@ return } - sessionStorage.setItem('UserID', res.UserID) - sessionStorage.setItem('LoginUID', res.LoginUID) - sessionStorage.setItem('User_Name', res.UserName) - sessionStorage.setItem('Full_Name', res.FullName) - sessionStorage.setItem('avatar', res.icon || '') - sessionStorage.setItem('dataM', res.dataM ? 'true' : '') - sessionStorage.setItem('localDataM', res.dataM ? 'true' : '') - sessionStorage.setItem('debug', res.debug || '') - sessionStorage.setItem('role_id', res.role_id || '') - sessionStorage.setItem('mk_user_type', res.mk_user_type || '') - sessionStorage.setItem('localRole_id', res.role_id || '') + let level = localStorage.getItem(_href + 'pwdlevel') + + if (level && process.env.NODE_ENV === 'production') { + let visible = false + let tip = '瀵嗙爜寮哄害涓嶅锛岃淇敼瀵嗙爜锛�' + if (param.password.length < 8) { + visible = true + } else if (level === 'letter_num' && /^([^0-9]*|[^a-zA-Z]*)$/.test(param.password)) { + visible = true + } else if ((level === 'char_num' || level === 'char_num_90' || level === 'char_num_90_sms') && /^([^0-9]*|[^a-zA-Z]*|[^!@#$%^&*()_]*)$/.test(param.password)) { + visible = true + } else if ((level === 'char_num_90' || level === 'char_num_90_sms') && res.modifydate) { + let s = (new Date().getTime() - new Date(res.modifydate).getTime()) / (1000 * 24 * 60 * 60) + if (!isNaN(s) && s > 90) { + visible = true + tip = '鎮ㄥ凡90澶╂湭淇敼瀵嗙爜锛岃鏇存崲瀵嗙爜鍚庝娇鐢紒' + } + } + + if (visible) { + message.warning(tip) + this.setState({ + isDisabled: false + }) + + MKEmitter.emit('resetpassword', () => { + const input = document.getElementById('password') + if (input) { + input.select() + } + }) + return + } + } if (process.env.NODE_ENV === 'production') { + let _param = { + UserName: param.username, + Password: param.password, + BasePath: '/' + } Api.loginAndRedirect(_param).then(result => { if (result.IsError) { this.setState({ @@ -164,6 +208,7 @@ } else { this.props.history.replace('/main') } + this.props.history.replace('/main') } else if (res.ErrCode === 'Need_Get_Appkey' && options.sysType === 'SSO') { message.warning('搴旂敤灏氭湭鍒涘缓锛岃鍚戜簯绔悓姝ュ簲鐢紒') @@ -561,6 +606,26 @@ res.indexlogo = res.indexlogo ? res.indexlogo.replace(/:8080/ig, '').replace(/http:/ig, 'https:') : '' res.loginlogo = res.loginlogo ? res.loginlogo.replace(/:8080/ig, '').replace(/http:/ig, 'https:') : '' + // if (options.sysType === 'local' && window.GLOB.systemType !== 'production') { + // if (md5(('mk' + window.GLOB.appkey + res.sys_datetime + res.member_type + res.registry_date).toLowerCase()) !== res.secret_key) { + // Modal.warning({ + // title: '瀵嗛挜閿欒锛岃鑱旂郴绠$悊鍛橈紒', + // okText: '鐭ラ亾浜�' + // }) + // this.setState({ + // auth: false, + // authError: '瀵嗛挜閿欒锛岃鑱旂郴绠$悊鍛橈紒' + // }) + // return + // } else if (res.member_type === 'personal' && res.registry_date) { + // let saveDelay = 0 + // try { + // saveDelay = parseInt((new Date().getTime() - new Date(res.registry_date).getTime()) / 4320000) + // sessionStorage.setItem('mkDelay', saveDelay) + // } catch(e) {} + // } + // } + if (!['shutter', 'linkage_navigation', 'linkage', 'menu_board', 'menu_board_navigation'].includes(res.menu_type)) { res.menu_type = 'shutter' } @@ -876,14 +941,15 @@ } render () { - const { lineColor, loginlogo, bgImage, copyRight, webSite, ICP, loginWays, touristLogin } = this.state + const { lineColor, bgImage, loginlogo, copyRight, webSite, ICP, loginWays, touristLogin } = this.state return ( - <div className="login-container" id="mk-login-view"> + <div className="login-container" id="mk-login-view" style={bgImage ? {backgroundImage: 'url(' + bgImage + ')'} : {}}> <div className="logo" style={lineColor ? {borderColor: lineColor} : {}}> {loginlogo ? <img src={loginlogo} alt=""/> : null} + {this.state.platName ? <p className="plat-name">{this.state.platName}</p> : null} </div> - <div className="login-middle" style={bgImage ? {backgroundImage: 'url(' + bgImage + ')'} : null}> + <div className="login-middle" style={lineColor ? {borderColor: lineColor} : {}}> {loginWays ? <LoginForm platName={this.state.platName} dict={this.state.dict} diff --git a/src/views/login/index.scss b/src/views/login/index.scss index 650aa0e..5447f5a 100644 --- a/src/views/login/index.scss +++ b/src/views/login/index.scss @@ -1,18 +1,18 @@ .login-container { height: 100vh; min-height: 600px; - background-color: #ffffff!important; + background-color: var(--mk-sys-background); background-size: cover; background-repeat: no-repeat; background-position: center center; .logo { position: relative; - height: 70px; - padding-top: 10px; - width: 990px; - margin: 0 auto; + height: 100px; + padding-top: 30px; + line-height: 80px; + border-bottom: 2px solid var(--mk-sys-color); img { - height: 47px; + max-height: 100%; } .plat-name { position: absolute; @@ -29,17 +29,30 @@ .login-middle { position: relative; height: calc(100vh - 194px); - min-height: 475px; - background-color: #427CAA; - background-image: url('http://bms-test.kresstools.cn/Content/images/login2/bg_mid.png'); - background-size: contain; - background-repeat: no-repeat; + min-height: 420px; + background-size: cover; background-position: center center; + border-bottom: 2px solid var(--mk-sys-color); + + .login-form-button { + background-color: var(--mk-sys-color); + border-color: var(--mk-sys-color); + } + .login-form-button[disabled] { + background-color: var(--mk-sys-color5); + border-color: var(--mk-sys-color5); + } + + .login-way-wrap { + .login-way.active, .login-way:hover { + color: var(--mk-sys-color); + } + } .login-form { position: relative; float: right; - margin-top: 6%; + margin-top: 5%; margin-right: 20%; background: #ffffff; width: 22vw; @@ -100,14 +113,8 @@ margin: 0 1.6vw 0 10px; } .form-item-wrap { - padding: 0.6vw 1.6vw 1.6vw; - // padding: 0.6vw 1.6vw 0vw; - } - .title { - color: #427CAA; - font-size: 22px; - font-weight: bold; - margin: 20px 1.6vw 5px; + // padding: 0.6vw 1.6vw 1.6vw; + padding: 0.6vw 1.6vw 0vw; } h4 { @@ -199,7 +206,6 @@ font-size: 16px; height: calc(2vw + 5px); min-height: 30px; - border-radius: 0; } .ant-form label { font-size: 16px; @@ -210,11 +216,6 @@ .anticon-eye { color: var(--mk-sys-color); } - .login-form-button { - border-radius: 0; - background: #6fb3e9!important; - border: 1px solid #6fb3e9!important; - } } .login-sync-button { position: absolute; @@ -224,17 +225,15 @@ } .login-bottom { text-align: center; - color: #666!important; + color: var(--mk-sys-font-color); padding-top: 20px; - font: 12px/150% Arial,Verdana,"\5b8b\4f53"; p span.split { margin-right: 15px; } a { display: inline-block; margin-bottom: 5px; - color: #666!important; - font: 12px/150% Arial,Verdana,"\5b8b\4f53"; + color: var(--mk-sys-font-color); } } .ant-btn-primary[disabled] { diff --git a/src/views/login/loginform.jsx b/src/views/login/loginform.jsx index cb74ecf..eda2530 100644 --- a/src/views/login/loginform.jsx +++ b/src/views/login/loginform.jsx @@ -1,25 +1,29 @@ import React, {Component} from 'react' import PropTypes from 'prop-types' -import { is, fromJS } from 'immutable' -import { Form, Icon, Input, Button, Modal, message } from 'antd' -import { UserOutlined } from '@ant-design/icons' +import { Form, Input, Button, Checkbox, Select, Modal, message } from 'antd' +import { UserOutlined, LockOutlined, QrcodeOutlined, RedoOutlined } from '@ant-design/icons' import md5 from 'md5' import moment from 'moment' import Api from '@/api' +import Utils from '@/utils/utils.js' import options from '@/store/options.js' +import asyncLoadComponent from '@/utils/asyncLoadComponent' import './index.scss' const { warning } = Modal let LoginVerCodeTimer = null +const QrCode = asyncLoadComponent(() => import('@/components/qrcode')) class LoginTabForm extends Component { static propTpyes = { isDisabled: PropTypes.bool, changelang: PropTypes.func, handleSubmit: PropTypes.func, + authLogin: PropTypes.func, dict: PropTypes.object, auth: PropTypes.bool, + authError: PropTypes.string, touristLogin: PropTypes.bool, lang: PropTypes.string, langList: PropTypes.array, @@ -29,14 +33,20 @@ state = { activeKey: 'uname_pwd', + scanId: '', username: '', password: '', remember: true, delay: null, loginWays: [], smsId: '', - verdisabled: false + verdisabled: false, + hasScan: false, + timeout: false } + + timer = null + splitTime = 0 UNSAFE_componentWillMount () { const { loginWays } = this.props @@ -51,43 +61,76 @@ } let smsId = '' + let hasScan = false let _loginWays = [] loginWays.forEach(item => { if (item.type === 'sms_vcode') { + item.label = '鐭俊鐧诲綍' smsId = item.smsId _loginWays.push(item) } else if (item.type === 'uname_pwd') { + item.label = '璐﹀彿鐧诲綍' _loginWays.push(item) + } else if (item.type === 'app_scan') { + _loginWays.push(item) + hasScan = true } }) + + let activeKey = _loginWays[0].type this.setState({ smsId: smsId, loginWays: _loginWays, - activeKey: _loginWays[0].type, - remember + activeKey, + scanId: activeKey === 'app_scan' ? Utils.getuuid() : '', + timeout: false, + remember, + hasScan }) + + if (activeKey === 'app_scan') { + this.splitTime = 0 + this.timer = setTimeout(() => { + this.checkResult() + }, 10000) + } } - UNSAFE_componentWillReceiveProps (nextProps) { - if (!is(fromJS(this.props.loginWays), fromJS(nextProps.loginWays))) { - let smsId = '' - let _loginWays = [] - nextProps.loginWays.forEach(item => { - if (item.type === 'sms_vcode') { - smsId = item.smsId - _loginWays.push(item) - } else if (item.type === 'uname_pwd') { - _loginWays.push(item) - } - }) + checkResult = () => { + const { scanId } = this.state - this.setState({ - smsId: smsId, - loginWays: _loginWays, - activeKey: _loginWays[0].type - }) + this.splitTime += 10000 + + let _param = { + func: 'webapi_get_binding_key', + scan_type: 'pc', + id: scanId, + UserName: '' } + + _param.userid = sessionStorage.getItem('visitorUserID') + _param.LoginUID = sessionStorage.getItem('visitorLoginUID') + + if (this.splitTime >= 180000) { + this.setState({ + timeout: true + }) + return + } + + Api.getSystemConfig(_param).then(res => { + if (!res.status) { + message.warning(res.message) + return + } else if (res.thd_party_appid && res.thd_party_member_id && res.thd_party_openid) { + this.props.authLogin(res.thd_party_appid, res.thd_party_openid, res.thd_party_member_id, scanId) + } else { + this.timer = setTimeout(() => { + this.checkResult() + }, 10000) + } + }) } handleConfirm = () => { @@ -121,9 +164,9 @@ e.preventDefault() if (!this.props.auth) { warning({ - title: this.props.dict['login.auth.tip'], - okText: this.props.dict['login.auth.ok'], - cancelText: this.props.dict['login.auth.cancel'], + title: this.props.authError || this.props.dict['login.auth.tip'], + okText: this.props.dict['login.ok'], + cancelText: this.props.dict['login.cancel'], onOk() {}, onCancel() {} }) @@ -168,7 +211,7 @@ if (_user) { try { _user = JSON.parse(window.decodeURIComponent(window.atob(_user))) - } catch { + } catch (e) { console.warn('Parse Failure') _user = '' } @@ -193,7 +236,29 @@ } onChangeTab = (activeKey) => { - this.setState({activeKey}) + this.setState({activeKey, scanId: activeKey === 'app_scan' ? Utils.getuuid() : ''}) + + if (this.state.activeKey === 'app_scan') { + this.timer && clearTimeout(this.timer) + } + + if (activeKey === 'app_scan') { + this.splitTime = 0 + this.setState({timeout: false}) + this.timer = setTimeout(() => { + this.checkResult() + }, 10000) + } + } + + reCode = () => { + this.splitTime = 0 + + this.setState({timeout: false, scanId: Utils.getuuid()}) + + this.timer = setTimeout(() => { + this.checkResult() + }, 10000) } getvercode = () => { @@ -303,17 +368,20 @@ this.setState = () => { return } + this.timer && clearTimeout(this.timer) } render() { const { getFieldDecorator } = this.props.form - const { activeKey, verdisabled, delay, loginWays } = this.state + const { activeKey, verdisabled, delay, loginWays, remember, scanId, timeout, hasScan } = this.state + const wayLabels = {app_scan: '鎵爜鐧诲綍', uname_pwd: '璐﹀彿鐧诲綍', sms_vcode: '鐭俊鐧诲綍'} return ( - <Form className={`login-form login-form-${loginWays.length}`} id="login-form" onSubmit={this.handleSubmit}> - <p className="title">{this.props.platName}</p> - <div className="form-item-wrap"> - {activeKey === 'uname_pwd' ? <Form.Item> + <Form className="login-form" id="login-form" onSubmit={this.handleSubmit}> + <div className="login-way-title">{wayLabels[activeKey]}</div> + {hasScan && activeKey !== 'app_scan' ? <div className="scan-icon" onClick={() => this.onChangeTab('app_scan')}><QrcodeOutlined /></div> : null} + {activeKey === 'uname_pwd' ? <div className="form-item-wrap"> + <Form.Item> {getFieldDecorator('username', { rules: [{ required: true, message: this.props.dict['login.username.empty'] }], initialValue: this.state.username || '', @@ -324,8 +392,8 @@ autoComplete="off" />, )} - </Form.Item> : null} - {activeKey === 'uname_pwd' ? <Form.Item> + </Form.Item> + <Form.Item> {getFieldDecorator('password', { initialValue: this.state.password || '', rules: [ @@ -334,9 +402,40 @@ message: this.props.dict['login.password.empty'], } ] - })(<Input.Password placeholder={this.props.dict['login.password']} prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }} />} />)} + })(<Input.Password placeholder={this.props.dict['login.password']} prefix={<LockOutlined style={{ color: 'rgba(0,0,0,.25)' }} />} />)} + </Form.Item> + {window.GLOB.keepKey ? <Form.Item className="minline"> + {getFieldDecorator('remember', { + valuePropName: 'checked', + initialValue: remember, + })(<Checkbox onChange={this.rememberChange}>{this.props.dict['login.remember']}</Checkbox>)} + </Form.Item> : <div style={{height: '30px', float: 'left'}}></div>} + {this.props.langList && this.props.langList.length > 0 ? <Form.Item className="minline right"> + {getFieldDecorator('lang', { + initialValue: this.props.lang, + })( + <Select + onChange={(value) => {this.changelang(value)}} + getPopupContainer={() => document.getElementById('login-form')} + > + {this.props.langList.map((item, index) => { + return <Select.Option key={index} value={item.Lang}>{item.LangName}</Select.Option> + })} + </Select> + )} </Form.Item> : null} - {activeKey === 'sms_vcode' ? <Form.Item> + <Form.Item className="btn-login"> + <Button type="primary" htmlType="submit" className="login-form-button" disabled={this.props.isDisabled} loading={this.props.isDisabled}> + {this.props.dict['login.submit']} + </Button> + </Form.Item> + {options.sysType === 'cloud' && options.cdomain.indexOf('mk9h') > -1 ? <Form.Item className="register-line"> + <a href="http://www.minkesoft.com/signup" target="_blank" rel="noopener noreferrer" className="register">娉ㄥ唽</a> + <a href="http://www.minkesoft.com/forgotPwd" target="_blank" rel="noopener noreferrer" className="forgot">蹇樿瀵嗙爜锛�</a> + </Form.Item> : null} + </div> : null} + {activeKey === 'sms_vcode' ? <div className="form-item-wrap"> + <Form.Item> {getFieldDecorator('phone', { rules: [{ required: true, message: this.props.dict['login.phone.empty'] }], initialValue: '', @@ -346,8 +445,8 @@ autoComplete="off" /> )} - </Form.Item> : null} - {activeKey === 'sms_vcode' ? <Form.Item className="vercode"> + </Form.Item> + <Form.Item className="vercode"> {getFieldDecorator('vercode', { initialValue: '', rules: [ @@ -367,22 +466,48 @@ autoComplete="off" /> )} + </Form.Item> + {this.props.langList && this.props.langList.length > 0 ? <Form.Item className="minline right"> + {getFieldDecorator('lang', { + initialValue: this.props.lang, + })( + <Select + onChange={(value) => {this.changelang(value)}} + getPopupContainer={() => document.getElementById('login-form')} + > + {this.props.langList.map((item, index) => { + return <Select.Option key={index} value={item.Lang}>{item.LangName}</Select.Option> + })} + </Select> + )} </Form.Item> : null} - {/* {activeKey === 'uname_pwd' ? <Form.Item className="minline"> - {getFieldDecorator('remember', { - valuePropName: 'checked', - initialValue: remember, - })(<Checkbox onChange={this.rememberChange}>{this.props.dict['login.remember']}</Checkbox>)} - </Form.Item> : null} */} - {['uname_pwd', 'sms_vcode'].includes(activeKey) ? <Form.Item className="btn-login"> + <Form.Item className="btn-login"> <Button type="primary" htmlType="submit" className="login-form-button" disabled={this.props.isDisabled} loading={this.props.isDisabled}> {this.props.dict['login.submit']} </Button> - </Form.Item> : null} + </Form.Item> {options.sysType === 'cloud' && options.cdomain.indexOf('mk9h') > -1 ? <Form.Item className="register-line"> - <a href="http://minkesoft.com/#/signup" target="_blank" rel="noopener noreferrer" className="register">娉ㄥ唽</a> - <a href="http://minkesoft.com/#/forgotPwd" target="_blank" rel="noopener noreferrer" className="forgot">蹇樿瀵嗙爜锛�</a> + <a href="http://www.minkesoft.com/signup" target="_blank" rel="noopener noreferrer" className="register">娉ㄥ唽</a> + <a href="http://www.minkesoft.com/forgotPwd" target="_blank" rel="noopener noreferrer" className="forgot">蹇樿瀵嗙爜锛�</a> </Form.Item> : null} + </div> : null} + {activeKey === 'app_scan' ? <div className="form-item-wrap"> + <div className="form-scan-wrap"> + <div className="qr-wrap"> + {scanId ? <QrCode card={{qrWidth: 500, color: '#000000'}} value={`mkpcscan,${window.GLOB.appkey},${scanId}`}/> : null} + {timeout ? <div className="qrcode-out"> + <RedoOutlined onClick={this.reCode} /> + 浜岀淮鐮佸凡澶辨晥銆� + </div> : null} + </div> + 璇蜂娇鐢ㄥ鎴风鎵竴鎵櫥褰� + </div> + </div> : null} + <div className={'login-ways ' + (activeKey === 'app_scan' ? 'center' : '')}> + {loginWays.map(item => { + if (item.type === 'app_scan' || activeKey === item.type) return null + return (<span key={item.type} onClick={() => this.onChangeTab(item.type)}>{item.label}</span>) + })} </div> </Form> ) -- Gitblit v1.8.0