From 56c0d6e2f83d72f622744fea76fdc64b09e30f1d Mon Sep 17 00:00:00 2001 From: king <18310653075@163.com> Date: 星期三, 01 四月 2020 18:54:07 +0800 Subject: [PATCH] 2020-04-01 --- src/index.js | 32 ++++ public/index.html | 4 src/views/login/loginform.jsx | 10 src/api/index.js | 34 +--- src/views/login/index.scss | 16 ++ src/components/header/index.jsx | 3 public/options.js | 11 src/locales/en-US/login.js | 3 src/views/login/logincloudform.jsx | 87 ++++++++++++ src/tabviews/zshare/normalTable/index.scss | 20 ++ src/locales/zh-CN/login.js | 3 src/views/login/index.jsx | 196 ++++++++++++++++++++++++--- 12 files changed, 350 insertions(+), 69 deletions(-) diff --git a/public/index.html b/public/index.html index d0440ac..6b3d760 100644 --- a/public/index.html +++ b/public/index.html @@ -5,8 +5,8 @@ <meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="theme-color" content="#000000" /> <link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> - <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" /> - <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo.png" /> + <!-- <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico" /> + <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo.png" /> --> <script src="%PUBLIC_URL%/options.js"></script> <title></title> </head> diff --git a/public/options.js b/public/options.js index 3df2754..3b5b015 100644 --- a/public/options.js +++ b/public/options.js @@ -3,15 +3,16 @@ appId: '201912040924165801464FF1788654BC5AC73', appkey: '20191106103859640976D6E924E464D029CF0', mainSystemApi: 'http://cloud.mk9h.cn/webapi/dostars', - title: '', + platTitle: '', platName: '', - logo: '', + favicon: '', + loginlogo: '', mainlogo: '', bgImage: '', copyRight: '', - icp: '', - bgColor: '', + ICP: '', lineColor: '', - website: '', + webSite: '', + doclogo: '', style: '' } \ No newline at end of file diff --git a/src/api/index.js b/src/api/index.js index 55c446a..956b4f9 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -61,33 +61,17 @@ // axios.defaults.baseURL = 'http://127.0.0.1:8888' } } - - /** - * @description 绯荤粺鎺堟潈 - */ - systemauth (appId, timestamp) { - return axios({ - url: '/webapi/dostar', - data: { - rduri: 'http://minkesoft.com/mksepc/webapi/dostar', - func: 'sEmpowerCloud_Get_LinkUrl', - userid: '', - AppID: appId, - TimeStamp: timestamp - } - }) - } /** - * @description 鐧诲綍绯荤粺 + * @description 浣跨敤dostar鎺ュ彛锛岃烦杩囬獙璇� + * @param {Object} param 鏌ヨ鍙婃彁浜ゅ弬鏁� */ - loginsystem (username, password) { + dostarInterface (param) { + param.userid = '' + return axios({ - url: '/zh-CN/Home/LoginAndRedirect', - data: { - Username: username, - Password: password - } + url: '/webapi/dostar', + data: param }) } @@ -99,14 +83,16 @@ // func: 'webapi_login', UserName: username, Password: password, + systemType: options.systemType, Type: 'X' } + param.Password = Utils.formatOptions(param.Password) param.appkey = window.GLOB.appkey || '' if (isCloud && options.cloudLoginApi) { param.rduri = options.cloudLoginApi - } else if (window.GLOB.mainSystemApi) { + } else if (!isCloud && window.GLOB.mainSystemApi) { param.rduri = window.GLOB.mainSystemApi.replace(/\/webapi(.*)/, '/webapi/dologon') } diff --git a/src/components/header/index.jsx b/src/components/header/index.jsx index d6df7a1..6d950fc 100644 --- a/src/components/header/index.jsx +++ b/src/components/header/index.jsx @@ -20,7 +20,6 @@ import zhCN from '@/locales/zh-CN/header.js' import enUS from '@/locales/en-US/header.js' import Utils from '@/utils/utils.js' -import logourl from '@/assets/img/main-logo.png' import avatar from '@/assets/img/avatar.jpg' import Resetpwd from './resetpwd' import LoginForm from './loginform' @@ -43,7 +42,7 @@ dict: (!localStorage.getItem('lang') || localStorage.getItem('lang') === 'zh-CN') ? zhCN : enUS, confirmLoading: false, userName: sessionStorage.getItem('User_Name'), - logourl: window.GLOB.mainlogo || logourl, + logourl: window.GLOB.mainlogo, loginVisible: false, loginLoading: false, avatar: avatar, diff --git a/src/index.js b/src/index.js index 5dfc482..d6a8961 100644 --- a/src/index.js +++ b/src/index.js @@ -24,7 +24,37 @@ window.GLOB = window.GLOB || {} -document.title = window.GLOB.title || 'MinkeSoft' +let _systemMsg = localStorage.getItem(window.location.href.split('#')[0] + 'system') + +if (_systemMsg) { + try { + _systemMsg = JSON.parse(window.decodeURIComponent(window.atob(_systemMsg))) + + window.GLOB.platTitle = _systemMsg.platTitle || window.GLOB.platTitle + window.GLOB.platName = _systemMsg.platName || window.GLOB.platName + window.GLOB.favicon = _systemMsg.favicon || window.GLOB.favicon + window.GLOB.loginlogo = _systemMsg.loginlogo || window.GLOB.loginlogo + window.GLOB.copyRight = _systemMsg.copyRight || window.GLOB.copyRight + window.GLOB.ICP = _systemMsg.ICP || window.GLOB.ICP + window.GLOB.mainlogo = _systemMsg.mainlogo || window.GLOB.mainlogo + window.GLOB.doclogo = _systemMsg.doclogo || window.GLOB.doclogo + window.GLOB.webSite = _systemMsg.webSite || window.GLOB.webSite + + + if (window.GLOB.favicon) { + let link = document.querySelector("link[rel*='icon']") || document.createElement('link') + link.type = 'image/x-icon' + link.rel = 'shortcut icon' + link.href = window.GLOB.favicon + document.getElementsByTagName('head')[0].appendChild(link) + } + } catch { + console.warn('Parse Failure') + } +} + +document.title = window.GLOB.platTitle + const option = { white: 'mk-white' diff --git a/src/locales/en-US/login.js b/src/locales/en-US/login.js index 66c78e1..1c2605c 100644 --- a/src/locales/en-US/login.js +++ b/src/locales/en-US/login.js @@ -8,5 +8,6 @@ 'login.password.empty': 'Please input your Password!', 'login.remember': 'Remember me', 'login.submit': 'Log in', - 'login.copyright': 'Copyrights by' + 'login.copyright': 'Copyrights by', + 'login.sync.cloud': '鍚屾浜戠搴旂敤' } \ No newline at end of file diff --git a/src/locales/zh-CN/login.js b/src/locales/zh-CN/login.js index 5b6f0d0..70dcb1e 100644 --- a/src/locales/zh-CN/login.js +++ b/src/locales/zh-CN/login.js @@ -8,5 +8,6 @@ 'login.password.empty': '璇疯緭鍏ュ瘑鐮�!', 'login.remember': '璁颁綇瀵嗙爜', 'login.submit': '鐧诲綍', - 'login.copyright': '鎵�鏈夌浉鍏崇増鏉冨綊' + 'login.copyright': '鎵�鏈夌浉鍏崇増鏉冨綊', + 'login.sync.cloud': '鍚屾浜戠搴旂敤' } \ No newline at end of file diff --git a/src/tabviews/zshare/normalTable/index.scss b/src/tabviews/zshare/normalTable/index.scss index c19a13f..be022e6 100644 --- a/src/tabviews/zshare/normalTable/index.scss +++ b/src/tabviews/zshare/normalTable/index.scss @@ -123,6 +123,26 @@ background: lightcoral; } } + .orange { + .content { + color: orange; + } + } + .orangebg { + .background { + background: lightsalmon; + } + } + .green { + .content { + color: green; + } + } + .greenbg { + .background { + background: lightgreen; + } + } } .ant-table-tbody > tr > td .content { p { diff --git a/src/views/login/index.jsx b/src/views/login/index.jsx index cd7dc49..e4a840c 100644 --- a/src/views/login/index.jsx +++ b/src/views/login/index.jsx @@ -1,5 +1,5 @@ import React, {Component} from 'react' -import { message } from 'antd' +import { message, Modal } from 'antd' import md5 from 'md5' import moment from 'moment' import Api from '@/api' @@ -9,11 +9,10 @@ import Utils from '@/utils/utils.js' import asyncComponent from '@/utils/asyncComponent' import asyncLoadComponent from '@/utils/asyncLoadComponent' -import logourl from '@/assets/img/login-logo.png' -import loginbg from '@/assets/img/loginbg.jpg' import './index.scss' const LoginForm = asyncLoadComponent(() => import('./loginform')) +const LoginCloudForm = asyncLoadComponent(() => import('./logincloudform')) const Action = asyncComponent(() => import('@/tabviews/zshare/actionList')) const iszhCN = !localStorage.getItem('lang') || localStorage.getItem('lang') === 'zh-CN' @@ -23,15 +22,17 @@ dict: iszhCN ? zhCN : enUS, isDisabled: false, auth: false, - logo: window.GLOB.logo || logourl, - bgImage: window.GLOB.bgImage || loginbg, - platName: window.GLOB.platName || '鏄庣鍟嗕笟鏅鸿兘寮�鏀惧钩鍙�', - copyright: window.GLOB.copyRight || 'Copyright漏2017 鎵�鏈夌浉鍏崇増鏉冨綊 鍖椾含鏄庣鏅崕淇℃伅鎶�鏈湁闄愬叕鍙�', - ICP: window.GLOB.icp || 'ICP澶囨锛� 浜琁CP澶�12007830鍙�', - bgColor: window.GLOB.bgColor || '#000000', - lineColor: window.GLOB.lineColor || '#1890ff', - website: window.GLOB.website || (!window.GLOB.copyRight && 'http://minkesoft.com'), - loaded: 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: [], + loaded: false, + syncApp: false, + syncing: false } changelang (item) { @@ -67,7 +68,7 @@ sessionStorage.setItem('Full_Name', res.FullName) sessionStorage.setItem('avatar', res.icon || '') - localStorage.setItem('lang', param.lang) + localStorage.setItem('lang', param.lang || 'zh-CN') let _url = window.location.href.split('#')[0] @@ -83,6 +84,13 @@ } else { this.props.history.replace('/main') } + } else if (res.ErrCode === 'Need_Get_Appkey' && options.systemType === 'SSO') { + message.warning('搴旂敤灏氭湭鍒涘缓锛岃鍚戜簯绔悓姝ュ簲鐢紒') + + this.setState({ + isDisabled: false, + syncApp: true + }) } else { message.warning(res.message) this.setState({ @@ -100,7 +108,15 @@ } let str = md5('MK19' + _appId + timeStamp) - Api.systemauth(_appId, timeStamp).then(res => { + + 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 = [] @@ -131,26 +147,137 @@ }) } - // let link = document.querySelector("link[rel*='icon']") || document.createElement('link') - // link.type = 'image/x-icon' - // link.rel = 'shortcut icon' - // link.href = 'http://www.stackoverflow.com/favicon.ico' - // document.getElementsByTagName('head')[0].appendChild(link) + // 鑾峰彇绯荤粺淇℃伅 + 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 || '', + webSite: res.WebSite || '' + } + + try { + localStorage.setItem(_url, window.btoa(window.encodeURIComponent(JSON.stringify(systemMsg)))) + } catch { + localStorage.removeItem(_url) + } + + this.setState({ + langList: res.lang_data || [], + ...systemMsg + }) + + 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) + } + } else { + message.warning(res.message) + } + }) + } + + syncSubmit = () => { + this.setState({ + syncing: true + }) + + let param = { + func: 's_get_app_from_cloud', + UserName: '', + Password: '', + systemType: options.systemType, + 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 || '' + } + + 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) + } + }) + }) } render () { + const { lineColor, bgImage, loginlogo, copyRight, webSite, ICP } = this.state return ( - <div className="login-container" style={{backgroundImage: 'url(' + this.state.bgImage + ')', backgroundColor: this.state.bgColor}}> - <div className="logo" style={{borderColor: this.state.lineColor}}> - <img src={this.state.logo} 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" style={{borderColor: this.state.lineColor}}> + <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()} @@ -159,12 +286,27 @@ /> </div> <div className="login-bottom"> - {this.state.website ? - <a target="blank" href={this.state.website} dangerouslySetInnerHTML={{ __html: this.state.copyright.replace(/\s/ig, ' ') }}></a> : - <p dangerouslySetInnerHTML={{ __html: this.state.copyright.replace(/\s/ig, ' ') }}></p> + {webSite && copyRight ? + <a target="blank" href={webSite} dangerouslySetInnerHTML={{ __html: copyRight.replace(/\s/ig, ' ') }}></a> : + <p dangerouslySetInnerHTML={{ __html: copyRight ? copyRight.replace(/\s/ig, ' ') : '' }}></p> } - <p dangerouslySetInnerHTML={{ __html: this.state.ICP.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> {this.state.loaded ? <div style={{position: 'fixed', bottom: '-300px'}}> <Action BID="" diff --git a/src/views/login/index.scss b/src/views/login/index.scss index 3f195b6..80e2a38 100644 --- a/src/views/login/index.scss +++ b/src/views/login/index.scss @@ -1,6 +1,7 @@ .login-container { height: 100vh; min-height: 600px; + background-color: #000000; background-size: cover; background-repeat: no-repeat; background-position: center center; @@ -8,17 +9,18 @@ height: 100px; padding-top: 30px; line-height: 80px; - border-bottom: 2px solid #06b4f7; + border-bottom: 2px solid #1890ff; img { max-height: 100%; } } .login-middle { + position: relative; height: calc(100vh - 194px); min-height: 420px; background-size: cover; background-position: center center; - border-bottom: 2px solid #06b4f7; + border-bottom: 2px solid #1890ff; .login-form { float: right; @@ -93,6 +95,11 @@ color: #1890ff; } } + .login-sync-button { + position: absolute; + bottom: 10px; + left: 20px; + } } .login-bottom { text-align: center; @@ -113,6 +120,11 @@ border-color: #40a9ff; } } +.sync-cloud-application { + .ant-modal-body { + min-height: 176px; + } +} .ant-message { top: 50px; z-index: 1080; diff --git a/src/views/login/logincloudform.jsx b/src/views/login/logincloudform.jsx new file mode 100644 index 0000000..de65e1c --- /dev/null +++ b/src/views/login/logincloudform.jsx @@ -0,0 +1,87 @@ +import React, {Component} from 'react' +import PropTypes from 'prop-types' +import { Form, Icon, Input } from 'antd' +import zhCN from '@/locales/zh-CN/login.js' +import enUS from '@/locales/en-US/login.js' +import './index.scss' + +class HeaderLoginForm extends Component { + static propTpyes = { + handleSubmit: PropTypes.func + } + + state = { + dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS + } + + handleConfirm = () => { + // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭� + return new Promise((resolve, reject) => { + this.props.form.validateFieldsAndScroll((err, values) => { + if (!err) { + resolve(values) + } else { + reject(err) + } + }) + }) + } + + handleSubmit = (e, key) => { + e.preventDefault() + if (e.target.value) { + if (!this.props.form.getFieldValue(key)) { + const input = document.getElementById(key) + if (input) { + input.focus() + } + return + } + this.props.handleSubmit() + } else { + this.handleConfirm() + } + } + + componentDidMount () { + const input = document.getElementById('username') + if (input) { + input.focus() + } + } + + render() { + const { getFieldDecorator } = this.props.form + + return ( + <Form style={{margin: '0px 10px'}}> + <Form.Item> + {getFieldDecorator('cloudusername', { + rules: [{ required: true, message: this.state.dict['login.username.empty'] }], + initialValue: '', + })( + <Input + prefix={<Icon type="user" style={{ color: 'rgba(0,0,0,.25)' }} />} + placeholder={this.state.dict['login.username']} + autoComplete="off" + onPressEnter={(e) => {this.handleSubmit(e, 'cloudpassword')}} + /> + )} + </Form.Item> + <Form.Item> + {getFieldDecorator('cloudpassword', { + initialValue: '', + rules: [ + { + required: true, + message: this.state.dict['login.password.empty'], + } + ] + })(<Input.Password onPressEnter={(e) => {this.handleSubmit(e, 'cloudusername')}} placeholder={this.state.dict['login.password']} prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }} />} />)} + </Form.Item> + </Form> + ) + } +} + +export default Form.create()(HeaderLoginForm) \ No newline at end of file diff --git a/src/views/login/loginform.jsx b/src/views/login/loginform.jsx index ac216a9..0b42bc9 100644 --- a/src/views/login/loginform.jsx +++ b/src/views/login/loginform.jsx @@ -14,6 +14,7 @@ dict: PropTypes.object, auth: PropTypes.bool, lang: PropTypes.string, + langList: PropTypes.array, platName: PropTypes.string } @@ -135,7 +136,7 @@ initialValue: true, })(<Checkbox>{this.props.dict['login.remember']}</Checkbox>)} </Form.Item> - <Form.Item className="minline right"> + {this.props.langList && this.props.langList.length > 0 ? <Form.Item className="minline right"> {getFieldDecorator('lang', { initialValue: this.props.lang, })( @@ -143,11 +144,12 @@ onChange={(value) => {this.changelang(value)}} getPopupContainer={() => document.getElementById('login-form')} > - <Select.Option value="zh-CN">涓枃绠�浣�</Select.Option> - <Select.Option value="en-US">English</Select.Option> + {this.props.langList.map((item, index) => { + return <Select.Option key={index} value={item.Lang}>{item.LangName}</Select.Option> + })} </Select> )} - </Form.Item> + </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']} -- Gitblit v1.8.0