From a2eb30c9bbaf58967c51c3abfdf6311ed36bd37a Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期一, 28 四月 2025 22:52:16 +0800
Subject: [PATCH] 2025-04-28

---
 src/views/login/loginform.jsx |   95 ++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 84 insertions(+), 11 deletions(-)

diff --git a/src/views/login/loginform.jsx b/src/views/login/loginform.jsx
index 55df6ad..8d19904 100644
--- a/src/views/login/loginform.jsx
+++ b/src/views/login/loginform.jsx
@@ -1,6 +1,6 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
-import { Form, Input, Button, Checkbox, Select, Modal, message, AutoComplete } from 'antd'
+import { Form, Input, Button, Checkbox, Select, Modal, message, AutoComplete, Tooltip } from 'antd'
 import { UserOutlined, LockOutlined, QrcodeOutlined, RedoOutlined, CloseCircleOutlined } from '@ant-design/icons'
 import md5 from 'md5'
 import moment from 'moment'
@@ -15,6 +15,25 @@
 const { warning } = Modal
 let LoginVerCodeTimer = null
 const QrCode = asyncLoadComponent(() => import('@/components/qrcode'))
+
+const CheckWrap = ({checked, prolType, onChange, prolCont}) => {
+  const change = (e) => {
+    onChange(e.target.checked)
+
+    if (prolType === 'once') {
+      localStorage.setItem(window.GLOB.sysSign + 'protocol', e.target.checked)
+    }
+  }
+
+  let content = window.decodeURIComponent(window.atob(prolCont))
+
+  return (
+    <>
+      {prolType !== 'not_required' ? <Checkbox defaultChecked={checked} onChange={change} style={{marginRight: '8px'}}></Checkbox> : null}
+      <span dangerouslySetInnerHTML={{__html: content}}></span>
+    </>
+  )
+}
 
 class LoginTabForm extends Component {
   static propTpyes = {
@@ -33,6 +52,7 @@
     username: '',
     password: '',
     remember: true,
+    protocol: null,
     delay: null,
     loginWays: [],
     smsId: '',
@@ -48,9 +68,21 @@
 
   timer = null
   splitTime = 0
+  scanParam = null
 
   UNSAFE_componentWillMount () {
-    const { loginWays } = this.props
+    const { loginWays, prolType } = this.props
+
+    let protocol = null
+
+    if (prolType === 'once') {
+      protocol = localStorage.getItem(window.GLOB.sysSign + 'protocol') === 'true'
+    } else if (prolType === 'every_time') {
+      protocol = false
+    } else if (prolType === 'not_required') {
+      protocol = true
+    }
+
     let remember = true
     
     if (localStorage.getItem(window.GLOB.sysSign + 'remember') === 'false') {
@@ -111,6 +143,7 @@
       scanId: activeKey === 'app_scan' || activeKey === 'weixin_scan' ? Utils.getuuid() : '',
       timeout: false,
       remember,
+      protocol,
       wayLabels,
       hasScan
     })
@@ -124,9 +157,10 @@
   }
 
   checkResult = () => {
-    const { scanId } = this.state
+    const { scanId, protocol, dict } = this.state
 
     this.splitTime += 10000
+    this.scanParam = null
 
     let _param = {
       func: 'webapi_get_binding_key',
@@ -150,6 +184,14 @@
         message.warning(res.message)
         return
       } else if (res.thd_party_appid && res.thd_party_member_id && res.thd_party_openid) {
+        if (protocol === false) {
+          this.scanParam = {
+            ...res,
+            scanId
+          }
+          message.warning(dict['protocol_check'] || '璇烽槄璇诲苟鍚屾剰鍗忚锛�')
+          return
+        }
         this.props.authLogin(res.thd_party_appid, res.thd_party_openid, res.thd_party_member_id, scanId)
       } else {
         this.timer = setTimeout(() => {
@@ -160,7 +202,10 @@
   }
 
   handleConfirm = () => {
-    const { activeKey } = this.state
+    const { activeKey, protocol } = this.state
+
+    if (protocol === false) return Promise.reject()
+
     // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
     return new Promise((resolve, reject) => {
       this.props.form.validateFieldsAndScroll((err, values) => {
@@ -423,6 +468,14 @@
     localStorage.setItem(window.GLOB.sysSign + 'users', window.btoa(window.encodeURIComponent(JSON.stringify(_users))))
   }
 
+  changeAgree = (val) => {
+    this.setState({protocol: val})
+
+    if (this.scanParam && val) {
+      this.props.authLogin(this.scanParam.thd_party_appid, this.scanParam.thd_party_openid, this.scanParam.thd_party_member_id, this.scanParam.scanId)
+    }
+  }
+
   /**
    * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊
    */
@@ -434,9 +487,9 @@
   }
 
   render() {
-    const { langList } = this.props
+    const { langList, isDisabled, prolType, prolCont } = this.props
     const { getFieldDecorator } = this.props.form
-    const { activeKey, verdisabled, delay, loginWays, remember, scanId, timeout, hasScan, users, wayLabels, dict, lang, vispwd } = this.state
+    const { activeKey, verdisabled, delay, loginWays, remember, scanId, timeout, hasScan, users, wayLabels, dict, lang, vispwd, protocol } = this.state
 
     return (
       <Form className="login-form" id="login-form" onSubmit={this.handleSubmit}>
@@ -500,10 +553,17 @@
             )}
           </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}>
-              {dict['log_in'] || '鐧诲綍'}
-            </Button>
+            {protocol === false ? <Tooltip placement="top" trigger="click" title={dict['protocol_check'] || '璇烽槄璇诲苟鍚屾剰鍗忚锛�'}>
+              <Button type="primary" htmlType="submit" className="login-form-button disabled">
+                {dict['log_in'] || '鐧诲綍'}
+              </Button>
+            </Tooltip> : <Button type="primary" htmlType="submit" className="login-form-button" disabled={isDisabled} loading={isDisabled}>
+            {dict['log_in'] || '鐧诲綍'}
+            </Button>}
           </Form.Item>
+          {prolType ? <Form.Item className="proline">
+            <CheckWrap checked={protocol} onChange={(val) => this.setState({protocol: val})} prolCont={prolCont} prolType={prolType}/>
+          </Form.Item> : null}
           {window.GLOB.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>
@@ -557,10 +617,17 @@
             )}
           </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}>
+            {protocol === false ? <Tooltip placement="top" trigger="click" title={dict['protocol_check'] || '璇烽槄璇诲苟鍚屾剰鍗忚锛�'}>
+              <Button type="primary" htmlType="submit" className="login-form-button disabled">
+                {dict['log_in'] || '鐧诲綍'}
+              </Button>
+            </Tooltip> : <Button type="primary" htmlType="submit" className="login-form-button" disabled={isDisabled} loading={isDisabled}>
               {dict['log_in'] || '鐧诲綍'}
-            </Button>
+            </Button>}
           </Form.Item>
+          {prolType ? <Form.Item className="proline">
+            <CheckWrap checked={protocol} onChange={(val) => this.setState({protocol: val})} prolCont={prolCont} prolType={prolType}/>
+          </Form.Item> : null}
           {window.GLOB.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>
@@ -577,6 +644,9 @@
             </div>
             <img src={wxicon} alt=""/>{dict['wechat_scan'] || '璇蜂娇鐢ㄥ井淇℃壂涓�鎵櫥褰�'}
           </div>
+          {prolType ? <Form.Item className="proline">
+            <CheckWrap checked={protocol} onChange={this.changeAgree} prolCont={prolCont} prolType={prolType}/>
+          </Form.Item> : null}
         </div> : null}
         {activeKey === 'app_scan' ? <div className="form-item-wrap">
           <div className="form-scan-wrap">
@@ -589,6 +659,9 @@
             </div>
             {dict['client_scan'] || '璇蜂娇鐢ㄥ鎴风鎵竴鎵櫥褰�'}
           </div>
+          {prolType ? <Form.Item className="proline">
+            <CheckWrap checked={protocol} onChange={this.changeAgree} prolCont={prolCont} prolType={prolType}/>
+          </Form.Item> : null}
         </div> : null}
         <div className={'login-ways ' + (activeKey === 'app_scan' || activeKey === 'weixin_scan' ? 'center' : '')}>
           {loginWays.map(item => {

--
Gitblit v1.8.0