From a100dacc6eb9d6a7a46e0c1ba547d382ac89db00 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com>
Date: Fri, 6 Dec 2019 10:57:52 +0800
Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=90=8D=E7=A7=B0=E8=BE=93?=
 =?UTF-8?q?=E5=85=A5=E7=89=B9=E6=AE=8A=E5=AD=97=E7=AC=A6=E5=92=8C=E8=A1=A8?=
 =?UTF-8?q?=E6=83=85?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../modules/user/account/AccountBasicEdit.js  | 122 ++++++++++++------
 1 file changed, 86 insertions(+), 36 deletions(-)

diff --git a/public/react/src/modules/user/account/AccountBasicEdit.js b/public/react/src/modules/user/account/AccountBasicEdit.js
index 033f433b0..9d292a168 100644
--- a/public/react/src/modules/user/account/AccountBasicEdit.js
+++ b/public/react/src/modules/user/account/AccountBasicEdit.js
@@ -136,7 +136,7 @@ class AccountBasic extends Component {
   }
 
   handleSubmit = () => {
-    this.props.form.validateFieldsAndScroll((err, values) => {
+    this.props.form.validateFieldsAndScroll({ force: true }, (err, values) => {
       console.log(values);
       let {basicInfo}=this.props;
       if(!err ){
@@ -148,12 +148,12 @@ class AccountBasic extends Component {
           this.props.showNotification('请先选择院系/部门')
           return;
         }
-        
+
         let url=`/users/accounts/${basicInfo.id}.json`
         axios.put((url),{
           nickname:values.nickname,
           // 认证中的不能修改
-          name: basicInfo.authentication == 'uncertified' ? 
+          name: basicInfo.authentication == 'uncertified' ?
               (this.state.showRealName ? values.name : this.state.realName ) : basicInfo.name,
           show_realname:this.state.showRealName,
           gender:parseInt(values.sex),
@@ -173,7 +173,7 @@ class AccountBasic extends Component {
             }
             this.props.getBasicInfo();
             this.props.history.push('/account/profile')
-            
+
           }
         }).catch((error)=>{
           console.log(error);
@@ -357,7 +357,7 @@ class AccountBasic extends Component {
     })
   }
 
-  
+
 
   addOrgSuccess = (name) => {
     // const schoolList = this.state.schoolList.slice(0)
@@ -377,7 +377,7 @@ class AccountBasic extends Component {
   }
 
   showApplyForAddOrgModal = () => {
-    this.applyForAddOrgForm.setVisible(true)    
+    this.applyForAddOrgForm.setVisible(true)
   }
   showApplyForAddChildOrgModal = () => {
     let{school,schoolList}=this.state;
@@ -385,18 +385,18 @@ class AccountBasic extends Component {
       return item.name == school;
     });
     if(arr.length > 0){
-      this.applyForAddChildOrgForm.setVisible(true)    
+      this.applyForAddChildOrgForm.setVisible(true)
     }else{
       this.props.showNotification("请先选择正确的单位或者学校!");
     }
   }
-  checkNameLength = (rule, value, callback) => {
-    if (value && value.length <= MAX_NAME_LENGTH) {
-      callback();
-      return;
-    }
-    callback(`请输入真实姓名,最大限制${MAX_NAME_LENGTH}个字符`);
-  }
+  // checkNameLength = (rule, value, callback) => {
+  //   if (value && value.length <= MAX_NAME_LENGTH) {
+  //     callback();
+  //     return;
+  //   }
+  //   callback(`请输入真实姓名,最大限制${MAX_NAME_LENGTH}个字符`);
+  // }
   // 切换职称
   changeJob=(e)=>{
     this.setState({
@@ -410,9 +410,53 @@ class AccountBasic extends Component {
       })
     }
   }
-  
+  //昵称
+	handleSubmitName(rule, value, callback){
+		if (value) {
+			let iconRule1 = /[`~!@#$%^&*()\-+=<>?:"{}|,.\/;'\\[\]·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、]/im;
+// 判断是否含有emoji表情
+			let iconRule2 = /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\A9|\AE]\u3030|\uA9|\uAE|\u3030/ig;
+// 如果为true,字符串含有emoji表情 ,false不含
+			const iconRule2s =iconRule2.test(value);
+// 如果为true,字符串含有特殊符号 ,false不
+			const iconRule1s =iconRule1.test(value);
+
+			if (iconRule2s===true|| iconRule1s===true) {
+				callback('2-20位中英文、数字及下划线');
+			}
+			else if(value.length<2){
+				callback('2-20位中英文、数字及下划线');
+			}else if(value.length>=21){
+				callback('2-20位中英文、数字及下划线');
+			}
+		}
+		callback();
+	}
+
+	// 姓名
+	handleSubmitNames(rule, value, callback){
+		if (value) {
+			let iconRule1 = /[`~!@#$%^&*()_\-+=<>?:"{}|,.\/;'\\[\]·~!@#¥%……&*()——\-+={}|《》?:“”【】、;‘’,。、]/im;
+// 判断是否含有emoji表情
+			let iconRule2 = /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\A9|\AE]\u3030|\uA9|\uAE|\u3030/ig;
+// 如果为true,字符串含有emoji表情 ,false不含
+			const iconRule2s =iconRule2.test(value);
+// 如果为true,字符串含有特殊符号 ,false不
+			const iconRule1s =iconRule1.test(value);
+
+			if (iconRule2s===true|| iconRule1s===true) {
+				callback('2-10位中英文、数字');
+			}
+			else if(value.length<2){
+				callback('2-10位中英文、数字');
+			}else if(value.length>=11){
+				callback('2-10位中英文、数字');
+			}
+		}
+		callback();
+	}
   render() {
-    let{ 
+    let{
       nameLength,
       showRealName,
       filterSchoolList,
@@ -446,10 +490,10 @@ class AccountBasic extends Component {
         {...propsWithoutForm} addOrgSuccess={this.addOrgSuccess}
         ></ApplyForAddOrgModal>
         <ApplyForAddChildOrgModal ref="applyForAddChildOrgModal" schoolName={school} schoolId={school_id} departmentName={departmentsName}
-        {...propsWithoutForm} wrappedComponentRef={(form) => this.applyForAddChildOrgForm = form} 
+        {...propsWithoutForm} wrappedComponentRef={(form) => this.applyForAddChildOrgForm = form}
         addChildOrgSuccess={this.addChildOrgSuccess}
         ></ApplyForAddChildOrgModal>
-        
+
         <div className="basicForm courseNormalForm">
           <style>{`
             .formItemInline {    
@@ -525,9 +569,12 @@ class AccountBasic extends Component {
               {getFieldDecorator('nickname', {
                 rules: [{
                   // initialValue: this.state.cityDefaultValue,
-                  required: true, 
+                  required: true,
                   message: '请输入您的昵称',
-                }],
+                },
+									{ validator: this.handleSubmitName },
+                ],
+								validateTrigger: 'onSubmit', // 设置进行表单验证的时机为onSubmit
               })(
                 <Input placeholder={`请输入您的昵称,最大限制${MAX_NICKNAME_LENGTH}个字符`} className="exercicenewinputysl" onInput={this.changeNickName} maxLength={MAX_NICKNAME_LENGTH} addonAfter ={
                   <span className="color-grey-6 font-13">{String(nameLength)}/{MAX_NICKNAME_LENGTH}</span>
@@ -552,18 +599,21 @@ class AccountBasic extends Component {
               { basicInfo.authentication == 'uncertified' ? <React.Fragment>{getFieldDecorator('name', {
                   rules: [{
                     // initialValue: this.state.cityDefaultValue,
-                    required: true, 
+                    required: true,
                     message: `请输入真实姓名,最大限制${MAX_NAME_LENGTH}个字符`,
-                    validator: this.checkNameLength
-                  }],
+                  },
+										{ validator: this.handleSubmitNames },
+
+                  ],
+									validateTrigger: 'onSubmit', // 设置进行表单验证的时机为onSubmit
                 })(
                   <Input placeholder={`请输入真实姓名,最大限制${MAX_NAME_LENGTH}个字符`} className="yslgraduainputedit"  disabled={!showRealName && this.state.forDisable == true } addonAfter={
                     <i className={showRealName?"iconfont icon-xianshi font-18 color-blue":"iconfont icon-yincang font-18 color-blue"}
                           onClick={()=>this.showOrHide(showRealName)}></i>
                   }></Input>
-                )} 
+                )}
                 <span>{ showRealName ? '(显示:平台将显示您的真实姓名)' : '(隐藏:平台将显示你的昵称)' }</span>
-                </React.Fragment> : 
+                </React.Fragment> :
                 <div className="df" style={{}}>
                   <Tooltip title="已完成实名认证,不能修改">
                     <span className="mr8" >{showRealName ? this.props.basicInfo.name : getHiddenName(this.props.basicInfo.name)}</span>
@@ -573,7 +623,7 @@ class AccountBasic extends Component {
                   <span>{ showRealName ? '(显示:平台将显示您的真实姓名)' : '(隐藏:平台将显示你的昵称)' }</span>
                 </div>
               }
-            </Form.Item> 
+            </Form.Item>
 
             <Form.Item
               label="性别"
@@ -581,7 +631,7 @@ class AccountBasic extends Component {
             >
               {getFieldDecorator('sex', {
                 rules: [{
-                  required: true, 
+                  required: true,
                   message: '请选择性别',
                 }],
               })(
@@ -589,7 +639,7 @@ class AccountBasic extends Component {
                   <ConditionToolTip title="已完成实名认证,不能修改" condition={basicInfo.authentication != 'uncertified'} >
                     <Radio value="0" disabled={basicInfo.authentication != 'uncertified'}>男</Radio>
                     <Radio value="1" disabled={basicInfo.authentication != 'uncertified'}>女</Radio>
-                  </ConditionToolTip>                  
+                  </ConditionToolTip>
                 </RadioGroup>
               )}
             </Form.Item>
@@ -602,19 +652,19 @@ class AccountBasic extends Component {
               {getFieldDecorator('city', {
                 rules: [{
                   type: 'array',
-                  required: true, 
+                  required: true,
                   message: '请先选择所在地',
                 }],
               })(
                 <City></City>
               )}
             </Form.Item>
-            <AccountBasicEditItem 
-                identity={identity} 
-                getFieldDecorator = {getFieldDecorator} 
-                professionalFlag = {professionalFlag} 
-                basicInfo = {basicInfo} 
-                {...this.props} 
+            <AccountBasicEditItem
+                identity={identity}
+                getFieldDecorator = {getFieldDecorator}
+                professionalFlag = {professionalFlag}
+                basicInfo = {basicInfo}
+                {...this.props}
                 {...this.state}
                 {...common}
                 form={this.props.form}
@@ -630,7 +680,7 @@ class AccountBasic extends Component {
               <div className="clearfix mt30 mb30"> */}
                 <Button type="primary" onClick={this.handleSubmit} size="middle" className="saveBtn mr20 mt30">{"保存"}</Button>
 
-                {this.props.basicInfo.base_info_completed && 
+                {this.props.basicInfo.base_info_completed &&
                   <Button type="" onClick={() => { this.props.history.push('/account/profile') }} size="middle" className="saveBtn cancelBtn mr20 mt30">{"取消"}</Button>}
               {/* </div>
             </Form.Item> */}