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, '&nbsp;') }}></a> :
-            <p dangerouslySetInnerHTML={{ __html: this.state.copyright.replace(/\s/ig, '&nbsp;') }}></p>
+          {webSite && copyRight ?
+            <a target="blank" href={webSite} dangerouslySetInnerHTML={{ __html: copyRight.replace(/\s/ig, '&nbsp;') }}></a> :
+            <p dangerouslySetInnerHTML={{ __html: copyRight ? copyRight.replace(/\s/ig, '&nbsp;') : '' }}></p>
           }
-          <p dangerouslySetInnerHTML={{ __html: this.state.ICP.replace(/\s/ig, '&nbsp;') }}></p>
+          {ICP ? <p dangerouslySetInnerHTML={{ __html: ICP.replace(/\s/ig, '&nbsp;') }}></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