From da64ab0923bf8817fc8599a6e37b953ce38f64c8 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期日, 27 八月 2023 18:37:36 +0800 Subject: [PATCH] 2023-08-27 --- src/views/login/loginform.jsx | 303 ++++++++++++++++++++++++-------------------------- 1 files changed, 144 insertions(+), 159 deletions(-) diff --git a/src/views/login/loginform.jsx b/src/views/login/loginform.jsx index cb74ecf..dbbcaa3 100644 --- a/src/views/login/loginform.jsx +++ b/src/views/login/loginform.jsx @@ -1,13 +1,11 @@ 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, AutoComplete } from 'antd' +import { UserOutlined, LockOutlined, CloseCircleOutlined } from '@ant-design/icons' import md5 from 'md5' import moment from 'moment' import Api from '@/api' -import options from '@/store/options.js' import './index.scss' const { warning } = Modal @@ -23,23 +21,23 @@ touristLogin: PropTypes.bool, lang: PropTypes.string, langList: PropTypes.array, - loginWays: PropTypes.array, - platName: PropTypes.string + loginWays: PropTypes.array } state = { - activeKey: 'uname_pwd', username: '', password: '', remember: true, delay: null, loginWays: [], smsId: '', - verdisabled: false + verdisabled: false, + hasScan: false, + timeout: false, + users: [] } UNSAFE_componentWillMount () { - const { loginWays } = this.props let remember = true let _url = window.location.href.split('#')[0] @@ -52,58 +50,43 @@ let smsId = '' let _loginWays = [] - loginWays.forEach(item => { - if (item.type === 'sms_vcode') { - smsId = item.smsId - _loginWays.push(item) - } else if (item.type === 'uname_pwd') { - _loginWays.push(item) + + let users = localStorage.getItem(_url + 'users') + let _user = null + + if (users) { + try { + users = JSON.parse(window.decodeURIComponent(window.atob(users))) + } catch (e) { + users = [] } - }) + } else { + users = [] + } + + if (users[0]) { + _user = users[0] + } this.setState({ + users: users, + username: _user ? _user.username : '', + password: _user ? _user.password : '', smsId: smsId, loginWays: _loginWays, - activeKey: _loginWays[0].type, remember }) } - 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) - } - }) - - this.setState({ - smsId: smsId, - loginWays: _loginWays, - activeKey: _loginWays[0].type - }) - } - } - handleConfirm = () => { - const { activeKey } = this.state // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭� return new Promise((resolve, reject) => { this.props.form.validateFieldsAndScroll((err, values) => { if (!err) { - if (activeKey === 'uname_pwd') { - values.username = values.username.replace(/\t*|\v*|\s*/g, '') - values.password = values.password.replace(/\t*|\v*|\s*/g, '') - } else if (activeKey === 'sms_vcode') { - values.phone = values.phone.replace(/\t*|\v*|\s*/g, '') - values.vercode = values.vercode.replace(/\t*|\v*|\s*/g, '') - } - resolve({type: activeKey, ...values}) + values.username = values.username.replace(/\t+|\v+|\s+/g, '') + values.password = values.password.replace(/\t+|\v+|\s+/g, '') + + resolve({type: 'uname_pwd', ...values}) } else { reject(err) } @@ -116,9 +99,8 @@ } handleSubmit = e => { - const { activeKey } = this.state // 鐧诲綍鍙傛暟妫�楠� - e.preventDefault() + e && e.preventDefault() if (!this.props.auth) { warning({ title: this.props.dict['login.auth.tip'], @@ -130,70 +112,28 @@ return } - if (activeKey === 'uname_pwd') { - if (!this.props.form.getFieldValue('username')) { - const input = document.getElementById('username') - if (input) { - input.focus() - } - } else if (!this.props.form.getFieldValue('password')) { - const input = document.getElementById('password') - if (input) { - input.focus() - } - } else { - this.props.handleSubmit() + if (!this.props.form.getFieldValue('username')) { + const wrap = document.getElementById('username') + const input = wrap ? wrap.getElementsByTagName('input')[0] : null + if (input) { + input.focus() } - } else if (activeKey === 'sms_vcode') { - if (!this.props.form.getFieldValue('phone')) { - const input = document.getElementById('phone') - if (input) { - input.focus() - } - } else if (!this.props.form.getFieldValue('vercode')) { - const input = document.getElementById('vercode') - if (input) { - input.focus() - } - } else { - this.props.handleSubmit() + } else if (!this.props.form.getFieldValue('password')) { + const input = document.getElementById('password') + if (input) { + input.focus() } + } else { + this.props.handleSubmit() } } componentDidMount () { - let _url = window.location.href.split('#')[0] - let _user = localStorage.getItem(_url) - - if (_user) { - try { - _user = JSON.parse(window.decodeURIComponent(window.atob(_user))) - } catch { - console.warn('Parse Failure') - _user = '' - } + const wrap = document.getElementById('username') + const input = wrap ? wrap.getElementsByTagName('input')[0] : null + if (input) { + input.focus() } - - if (_user) { - this.setState({ - username: _user.username, - password: _user.password - }, () => { - const input = document.getElementById('username') - if (input) { - input.focus() - } - }) - } else { - const input = document.getElementById('username') - if (input) { - input.focus() - } - } - } - - onChangeTab = (activeKey) => { - this.setState({activeKey}) } getvercode = () => { @@ -264,7 +204,30 @@ }) message.warning(res.message) } - }, () => { + }, (error) => { + if (error && error.ErrCode === 'LoginError') { + let param = { + func: 's_visitor_login', + timestamp: moment().format('YYYY-MM-DD HH:mm:ss'), + SessionUid: 'bh0bapabtd45epsgra79segbch6c1ibk', + TypeCharOne: 'pc', + appkey: '202004041613277377A6A2456D34A4948AE84' + } + + param.LText = md5(window.btoa('bh0bapabtd45epsgra79segbch6c1ibk' + param.timestamp)) + param.secretkey = md5(param.LText + 'mingke' + param.timestamp) + + let params = { + url: 'https://sso.mk9h.cn/webapi/dologon', + method: 'post', + data: JSON.stringify(param) + } + + Api.directRequest(params) + + return + } + if (LoginVerCodeTimer) { clearTimeout(LoginVerCodeTimer) } @@ -296,6 +259,36 @@ localStorage.setItem(_url + 'remember', val) } + complete = (val) => { + const { users } = this.state + + let user = users.filter(m => m.username === val)[0] + let password = user && user.password ? user.password : '' + + this.props.form.setFieldsValue({password: password}) + + if (!password) { + const input = document.getElementById('password') + if (input) { + input.focus() + } + } + } + + deleteUser = (e, val) => { + const { users } = this.state + + e.stopPropagation() + + let _users = users.filter(m => m.username !== val) + + this.setState({users: _users}) + + let _url = window.location.href.split('#')[0] + + localStorage.setItem(_url + 'users', window.btoa(window.encodeURIComponent(JSON.stringify(_users)))) + } + /** * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊 */ @@ -306,26 +299,40 @@ } render() { + const { langList } = this.props const { getFieldDecorator } = this.props.form - const { activeKey, verdisabled, delay, loginWays } = this.state + const { remember, users } = this.state return ( - <Form className={`login-form login-form-${loginWays.length}`} id="login-form" onSubmit={this.handleSubmit}> + <Form className={`login-form login-form-1`} id="login-form" onSubmit={this.handleSubmit}> <p className="title">{this.props.platName}</p> <div className="form-item-wrap"> - {activeKey === 'uname_pwd' ? <Form.Item> + <Form.Item> {getFieldDecorator('username', { rules: [{ required: true, message: this.props.dict['login.username.empty'] }], initialValue: this.state.username || '', })( - <Input - prefix={<UserOutlined style={{ color: 'rgba(0,0,0,.25)' }} />} - placeholder={this.props.dict['login.username']} - autoComplete="off" - />, + <AutoComplete + className + dataSource={users.map((cell, i) => <AutoComplete.Option className="mk-user-option" value={cell.username} key={i}> + {cell.username} + <CloseCircleOutlined onClick={(e) => this.deleteUser(e, cell.username)}/> + </AutoComplete.Option>)} + filterOption={false} + onSelect={this.complete} + defaultActiveFirstOption={false} + defaultOpen={false} + optionLabelProp="value" + > + <Input + prefix={<UserOutlined style={{ color: 'rgba(0,0,0,.25)' }} />} + placeholder={this.props.dict['login.username']} + autoComplete="off" + /> + </AutoComplete> )} - </Form.Item> : null} - {activeKey === 'uname_pwd' ? <Form.Item> + </Form.Item> + <Form.Item> {getFieldDecorator('password', { initialValue: this.state.password || '', rules: [ @@ -334,55 +341,33 @@ 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)' }} />} />)} - </Form.Item> : null} - {activeKey === 'sms_vcode' ? <Form.Item> - {getFieldDecorator('phone', { - rules: [{ required: true, message: this.props.dict['login.phone.empty'] }], - initialValue: '', - })( - <Input - placeholder={this.props.dict['login.phone']} - autoComplete="off" - /> - )} - </Form.Item> : null} - {activeKey === 'sms_vcode' ? <Form.Item className="vercode"> - {getFieldDecorator('vercode', { - initialValue: '', - rules: [ - { - required: true, - message: this.props.dict['login.vercode.empty'], - } - ] - })( - <Input - addonAfter={ - <Button type="link" className="vercode" size="small" disabled={verdisabled} onClick={this.getvercode}> - {delay ? `${delay}s鍚庨噸鏂拌幏鍙朻 : '鑾峰彇楠岃瘉鐮�'} - </Button> - } - placeholder={this.props.dict['login.vercode']} - autoComplete="off" - /> - )} - </Form.Item> : null} - {/* {activeKey === 'uname_pwd' ? <Form.Item className="minline"> + })(<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> : null} */} - {['uname_pwd', 'sms_vcode'].includes(activeKey) ? <Form.Item className="btn-login"> + </Form.Item> : <div style={{height: '30px', float: 'left'}}></div>} + {langList && 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')} + > + {langList.map((item, index) => { + return <Select.Option key={index} value={item.Lang}>{item.LangName}</Select.Option> + })} + </Select> + )} + </Form.Item> : null} + <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} - {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> - </Form.Item> : null} + </Form.Item> </div> </Form> ) -- Gitblit v1.8.0