From 48a18736c461ad730bd264b0ac7b40b68a0e33a1 Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期日, 28 六月 2020 20:30:20 +0800 Subject: [PATCH] 2020-06-28 --- src/views/login/index.jsx | 432 +++++++++++++++++++++++++++++++++++------------------- 1 files changed, 280 insertions(+), 152 deletions(-) diff --git a/src/views/login/index.jsx b/src/views/login/index.jsx index cc52bf1..b6cf556 100644 --- a/src/views/login/index.jsx +++ b/src/views/login/index.jsx @@ -1,51 +1,44 @@ -import React, {Component} from 'react' -import { Form, Icon, Input, Button, Checkbox, Dropdown, Menu, message, Modal } from 'antd' +import React, { Component } from 'react' +import { message, Modal } from 'antd' +import { connect } from 'react-redux' 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 zhCN from '@/locales/zh-CN/login.js' import enUS from '@/locales/en-US/login.js' -import options from '@/store/options.js' -import Utils from '@/utils/utils.js' -import logourl from '../../assets/img/login-logo.png' +import asyncLoadComponent from '@/utils/asyncLoadComponent' +import { modifyMemberLevel } from '@/store/action' import './index.scss' -const { confirm } = Modal +const LoginForm = asyncLoadComponent(() => import('./loginform')) +const LoginCloudForm = asyncLoadComponent(() => import('./logincloudform')) +const iszhCN = localStorage.getItem('lang') !== 'en-US' class Login extends Component { - constructor (props) { - super(props) - - const iszhCN = !localStorage.getItem('lang') || localStorage.getItem('lang') === 'zh-CN' - - this.state = { - langs: [{ - name: '涓枃绠�浣�', - value: 'zh-CN' - }, { - name: 'English', - value: 'en-US' - }], - selectedlang: iszhCN ? - { - name: '涓枃绠�浣�', - value: 'zh-CN' - } : - { - name: 'English', - value: 'en-US' - }, - dict: iszhCN ? zhCN : enUS, - isDisabled: false, - auth: false - } + state = { + selectedlang: iszhCN ? 'zh-CN' : 'en-US', + dict: iszhCN ? zhCN : enUS, + isDisabled: false, + auth: false, + loginlogo: window.GLOB.loginlogo || '', + bgImage: window.GLOB.bgImage || '', + platName: window.GLOB.platName || '', + copyRight: window.GLOB.copyRight || '', + ICP: window.GLOB.ICP || '', + lineColor: window.GLOB.lineColor || '', + webSite: window.GLOB.webSite || '', + langList: [], + syncApp: false, + syncing: false } changelang (item) { // 鍒囨崲璇█ this.setState({ - selectedlang: item, - dict: item.value === 'zh-CN' ? zhCN : enUS + dict: item === 'zh-CN' ? zhCN : enUS }) } @@ -55,45 +48,41 @@ return md5(md5(pwd + salt)) } - handleSubmit = e => { - // 鐧诲綍鍙傛暟妫�楠� - e.preventDefault() - if (!this.state.auth) { - confirm({ - title: this.state.dict['login.auth.tip'], - okText: this.state.dict['login.auth.ok'], - cancelText: this.state.dict['login.auth.cancel'], - onOk() {}, - onCancel() {} - }) - return - } - this.props.form.validateFields((err, values) => { - if (err) return + handleSubmit = () => { + this.loginformRef.handleConfirm().then(res => { this.setState({ isDisabled: true }) - this.loginsubmit(values) + this.loginsubmit(res) }) } async loginsubmit (param) { + if (options.sysType === 'local' && !window.GLOB.mainSystemApi) { // 涓氬姟绯荤粺蹇呴』璁剧疆鍗曠偣鍦板潃 + Modal.warning({ + title: '鏈缃崟鐐规湇鍔″櫒鍦板潃锛岃鑱旂郴绠$悊鍛橈紒' + }) + return + } + // 鐧诲綍鎻愪氦 - // let password = this.md5Password(param.password) - let password = param.password - let result = await Api.loginsystem(param.username, password) - if (!result.IsError) { - sessionStorage.setItem('UserID', result.userid || 'U000000001') + let res = await Api.getusermsg(param.username, param.password) + if (res.status) { + sessionStorage.setItem('UserID', res.UserID) sessionStorage.setItem('SessionUid', Utils.getuuid()) - sessionStorage.setItem('LoginUID', '') - localStorage.setItem('lang', this.state.selectedlang.value) + sessionStorage.setItem('LoginUID', res.LoginUID) + sessionStorage.setItem('User_Name', res.UserName) + sessionStorage.setItem('Full_Name', res.FullName) + sessionStorage.setItem('avatar', res.icon || '') + + localStorage.setItem('lang', param.lang || 'zh-CN') + + let _url = window.location.href.split('#')[0] if (param.remember) { // 璁颁綇瀵嗙爜鏃惰处鍙峰瘑鐮佸瓨鍏ocalStorage - localStorage.setItem('username', param.username) - localStorage.setItem('password', param.password) + localStorage.setItem(_url, window.btoa(window.encodeURIComponent(JSON.stringify({username: param.username, password: param.password})))) } else { - localStorage.removeItem('username') - localStorage.removeItem('password') + localStorage.removeItem(_url) } if (this.props.location.state && this.props.location.state.from.pathname) { @@ -102,40 +91,65 @@ } else { this.props.history.replace('/main') } + } else if (res.ErrCode === 'Need_Get_Appkey' && options.sysType === 'SSO') { + message.warning('搴旂敤灏氭湭鍒涘缓锛岃鍚戜簯绔悓姝ュ簲鐢紒') + + this.setState({ + isDisabled: false, + syncApp: true + }) } else { - message.warning(result.Message) + message.warning(res.message) this.setState({ isDisabled: false }) } } - UNSAFE_componentWillMount () { + componentDidMount () { let timeStamp = new Date().getTime() - let str = md5('MK19' + options.AppId + timeStamp) - Api.systemauth(options.AppId, timeStamp).then(res => { - if (res.status && res.EPC === str) { - let box = [] - for (let i = 0; i < 15; i++) { - let s = 'mksoft' + moment().add(i, 'days').format('YYYYMMDD') - box.push(md5(s)) - } - box = box.join(',') - localStorage.setItem('AuthCode', box) + let _appId = window.GLOB.appId - this.setState({ - auth: true - }) - } else { + if (options.sysType === 'cloud') { // 浜戠浣跨敤绯荤粺閰嶇疆appid + _appId = options.caId + } + + let str = md5('MK19' + _appId + timeStamp) + + let param = { + rduri: 'http://minkesoft.com/mksepc/webapi/dostar', + func: 'sEmpowerCloud_Get_LinkUrl', + AppID: _appId, + TimeStamp: timeStamp + } + + Api.dostarInterface(param).then(res => { + if (res.status) { + if (res.EPC === str) { + let box = [] + for (let i = 0; i < 15; i++) { + let s = 'mksoft' + moment().add(i, 'days').format('YYYYMMDD') + box.push(md5(s)) + } + box = box.join(',') + localStorage.setItem('AuthCode', box) + + this.setState({ + auth: true + }) + } else { + localStorage.removeItem('AuthCode') + this.setState({ + auth: false + }) + } + } else if (res.ErrCode === 'N') { localStorage.removeItem('AuthCode') this.setState({ auth: false }) } }) - - // console.log(options) - // localStorage.setItem('AuthCode', [md5('mksoft' + moment().format('YYYYMMDD'))]) let authCode = localStorage.getItem('AuthCode') let _s = md5('mksoft' + moment().format('YYYYMMDD')) @@ -144,91 +158,205 @@ auth: true }) } + + // 鑾峰彇绯荤粺淇℃伅 + let _param = { + func: 's_Get_style', + Appkey: window.GLOB.appkey || '', + TypeCharOne: 'PC', + LText: `select '${window.GLOB.appkey}'`, + } + + _param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000' + _param.secretkey = Utils.encrypt(_param.LText, _param.timestamp) + + if (window.GLOB.mainSystemApi) { + _param.rduri = window.GLOB.mainSystemApi.replace('dostars', 'dostar') + } + + Api.dostarInterface(_param).then(res => { + if (res.status) { + let _url = window.location.href.split('#')[0] + 'system' + let systemMsg = { + favicon: res.titlelogo || '', + platTitle: res.titleName || '', + platName: res.SysName || '', + bgImage: res.Banner || '', + loginlogo: res.loginlogo || '', + copyRight: res.CopyRightYear && res.CopyRightOrg ? `Copyright漏${res.CopyRightYear} 鎵�鏈夌浉鍏崇増鏉冨綊 ${res.CopyRightOrg}` : '', + ICP: res.ICP || '', + mainlogo: res.indexlogo || '', + doclogo: res.doclogo || '', + style: res.CSS || '', + webSite: res.WebSite || '' + } + + // url鏍囬 + document.title = systemMsg.platTitle + + try { + localStorage.setItem(_url, window.btoa(window.encodeURIComponent(JSON.stringify(systemMsg)))) + } catch { + localStorage.removeItem(_url) + } + + this.setState({ + langList: res.lang_data || [], + ...systemMsg + }) + + window.GLOB.mainlogo = systemMsg.mainlogo + + if (res.titlelogo && window.GLOB.favicon !== res.titlelogo) { + let link = document.querySelector("link[rel*='icon']") || document.createElement('link') + link.type = 'image/x-icon' + link.rel = 'shortcut icon' + link.href = res.titlelogo + document.getElementsByTagName('head')[0].appendChild(link) + } + + let memberLevel = res.member_level + + if (typeof(memberLevel) === 'number' && memberLevel > 10 && parseInt(memberLevel / 10) * 10 === memberLevel) { + sessionStorage.setItem('Member_Level', md5('mksoft' + moment().format('YYYYMM') + memberLevel)) + this.props.modifyMemberLevel(memberLevel) + } + } else { + message.warning(res.message) + } + }) } - componentDidMount () { - const input = document.getElementById('username') - if (input) { - input.focus() + syncSubmit = () => { + this.setState({ + syncing: true + }) + + let param = { + func: 's_get_app_from_cloud', + UserName: '', + Password: '', + systemType: options.sysType, + Type: 'X', + debug: 'Y' + } + + param.appkey = window.GLOB.appkey || '' + + if (options.cloudServiceApi) { + param.rduri = options.cloudServiceApi.replace('dostars', 'dostar') + } + + + this.logincloudRef.handleConfirm().then(result => { + param.UserName = result.cloudusername + param.Password = result.cloudpassword + + param.Password = Utils.formatOptions(param.Password) + + Api.dostarInterface(param).then(res => { + if (res.status) { + let _param = { + func: 's_sDataDictb_TBBack', + LTextOut: res.LTextOut, + lid: res.Lid, + Appkey: window.GLOB.appkey || '' + } + + _param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000' + _param.secretkey = Utils.encrypt(_param.LTextOut, _param.timestamp) + _param.open_key = Utils.encrypt(_param.secretkey, _param.timestamp, true) + + Api.dostarInterface(_param).then(response => { + if (response.status) { + message.success('搴旂敤鍒涘缓鎴愬姛銆�') + this.setState({ + syncing: false, + syncApp: false + }) + } else { + this.setState({ + syncing: false + }) + message.warning(response.message) + } + }) + + } else { + this.setState({ + syncing: false + }) + message.warning(res.message) + } + }) + }) + } + + /** + * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊 + */ + componentWillUnmount () { + this.setState = () => { + return } } render () { - const { getFieldDecorator } = this.props.form - const menu = ( - <Menu> - {this.state.langs.map((item, index) => { - return ( - <Menu.Item key={index} onClick={() => {this.changelang(item)}}> - <span>{item.name}</span> - </Menu.Item> - ) - })} - </Menu> - ) + const { lineColor, bgImage, loginlogo, copyRight, webSite, ICP } = this.state + return ( - <div className="login-container"> - <div className="logo"> - <img src={logourl} alt=""/> + <div className="login-container" style={bgImage ? {backgroundImage: 'url(' + bgImage + ')'} : {}}> + <div className="logo" style={lineColor ? {borderColor: lineColor} : {}}> + {loginlogo ? <img src={loginlogo} alt=""/> : null} </div> - <div className="login-middle"> - <Form onSubmit={this.handleSubmit} className="login-form"> - <h4>鏄庣鍟嗕笟鏅鸿兘寮�鏀惧钩鍙�</h4> - <Form.Item> - {getFieldDecorator('username', { - rules: [{ required: true, message: this.state.dict['login.username.empty'] }], - initialValue: localStorage.getItem('username') || '', - })( - <Input - prefix={<Icon type="user" style={{ color: 'rgba(0,0,0,.25)' }} />} - placeholder={this.state.dict['login.username']} - />, - )} - </Form.Item> - <Form.Item> - {getFieldDecorator('password', { - rules: [{ required: true, message: this.state.dict['login.password.empty'] }], - initialValue: localStorage.getItem('password') || '', - })( - <Input - prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }} />} - type="password" - placeholder={this.state.dict['login.password']} - />, - )} - </Form.Item> - <Form.Item className="minline"> - {getFieldDecorator('remember', { - valuePropName: 'checked', - initialValue: true, - })(<Checkbox>{this.state.dict['login.remember']}</Checkbox>)} - <Dropdown overlay={menu} trigger={['click']} placement="bottomRight"> - <span className="ant-dropdown-link"> - {this.state.selectedlang.name} <Icon type="down" /> - </span> - </Dropdown> - </Form.Item> - <Form.Item> - <Button type="primary" htmlType="submit" className="login-form-button" disabled={this.state.isDisabled} loading={this.state.isDisabled}> - {this.state.dict['login.submit']} - </Button> - </Form.Item> - </Form> + <div className="login-middle" style={lineColor ? {borderColor: lineColor} : {}}> + <LoginForm + platName={this.state.platName} + dict={this.state.dict} + auth={this.state.auth} + lang={this.state.selectedlang} + langList={this.state.langList} + isDisabled={this.state.isDisabled} + changelang={(value) => this.changelang(value)} + handleSubmit={() => this.handleSubmit()} + wrappedComponentRef={(inst) => this.loginformRef = inst} + /> </div> <div className="login-bottom"> - <p> - <span className="split">Copyright漏2017</span> - <span className="split">{this.state.dict['login.copyright']}</span> - <span>鍖椾含鏄庣鏅崕淇℃伅鎶�鏈湁闄愬叕鍙�</span> - </p> - <p> - <span>ICP澶囨锛�</span> - <span>浜琁CP澶�12007830鍙�</span> - </p> + {webSite && copyRight ? + <a target="blank" href={webSite} dangerouslySetInnerHTML={{ __html: copyRight.replace(/\s/ig, ' ') }}></a> : + <p dangerouslySetInnerHTML={{ __html: copyRight ? copyRight.replace(/\s/ig, ' ') : '' }}></p> + } + {ICP ? <p dangerouslySetInnerHTML={{ __html: ICP.replace(/\s/ig, ' ') }}></p> : null} </div> + {/* 缂栬緫鐘舵�佺櫥褰� */} + <Modal + title={this.state.dict['login.sync.cloud']} + okText={this.state.dict['login.auth.ok']} + cancelText={this.state.dict['login.auth.cancel']} + visible={this.state.syncApp} + onOk={this.syncSubmit} + className="sync-cloud-application" + width={'430px'} + confirmLoading={this.state.syncing} + onCancel={() => {this.setState({ syncApp: false, syncing: false })}} + destroyOnClose + > + <LoginCloudForm handleSubmit={() => this.syncSubmit()} wrappedComponentRef={(inst) => this.logincloudRef = inst}/> + </Modal> </div> ) } } -export default Form.create()(Login) \ No newline at end of file +const mapStateToProps = () => { + return {} +} + +const mapDispatchToProps = (dispatch) => { + return { + modifyMemberLevel: (memberLevel) => dispatch(modifyMemberLevel(memberLevel)) + } +} + +export default connect(mapStateToProps, mapDispatchToProps)(Login) \ No newline at end of file -- Gitblit v1.8.0