Переглянути джерело

Merge branch '12_4_dangyunlong' into dev

Sean 4 місяців тому
батько
коміт
3dc469d831

+ 8 - 0
src/api/cms.js

@@ -83,5 +83,13 @@ export function selectWebsiteArticleInfo(params) {
   })
 }
 
+//2.0 获取所有职能
+export function getAllDepartment(params) {
+  return request({
+    url: '/public/getAllDepartment',
+    method: 'get',
+    params
+  })
+}
 
 //C端网站请求无需token start ------------------------------------->

+ 9 - 0
src/api/user.js

@@ -50,4 +50,13 @@ export function changePassword(data) {
     method: 'post',
     data
   })
+}
+
+//修改用户头像和手机号
+export function updateUserAvatarNickname(data) {
+  return request({
+    url: '/user/updateUserAvatarNickname',
+    method: 'post',
+    data
+  })
 }

+ 1 - 0
src/api/userMember.js

@@ -73,4 +73,5 @@ export function resetPassword(data) {
     data
   })
 }
+
 //用户管理 end ------------------------------------->

+ 31 - 0
src/store/modules/cms.js

@@ -0,0 +1,31 @@
+import {getAllDepartment} from '@/api/cms'
+
+const state = {
+
+}
+
+const mutations = {
+
+}
+
+const actions = {
+  //1.获取所有职能 start ---------------------------------------->
+  getAllDepartment({commit},data) {
+    return new Promise((resolve, reject) => {
+      getAllDepartment(data).then(response => {
+        resolve(response)
+      }).catch(error => {
+        reject(error)
+      })
+    })
+  },
+  //获取所有职能 end ---------------------------------------->
+}
+
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions
+}

+ 13 - 2
src/store/modules/user.js

@@ -1,4 +1,4 @@
-import { login, logout, getInfo, getMenu ,getImgCode } from '@/api/user'
+import { login, logout, getInfo, getMenu ,getImgCode,updateUserAvatarNickname } from '@/api/user'
 import { getToken, setToken, removeToken } from '@/utils/auth'
 import router, { resetRouter } from '@/router'
 
@@ -143,7 +143,18 @@ const actions = {
 
     // reset visited views and cached views
     dispatch('tagsView/delAllViews', null, { root: true })
-  }
+  },
+
+  //修改用户名和密码
+  updateUserAvatarNickname({commit},data) {
+    return new Promise((resolve, reject) => {
+      updateUserAvatarNickname(data).then(response => {
+        resolve(response)
+      }).catch(error => {
+        reject(error)
+      })
+    })
+  },
 
 }
 

+ 266 - 128
src/views/profile/index.vue

@@ -2,103 +2,142 @@
   <div>
     <div class="userInfoBox">
       <tableTitle :name="tableDivTitle"/>
-      <div class="infoBox">
-        <div class="infoTitle">当前头像:</div>
-        <div>
-          <img :src="user.avatar" class="avatar">
-        </div>
-      </div>
-      <div class="infoBox">
-        <div class="infoTitle">昵称:</div>
-        <div class="infoInput"><el-input v-model="user.real_name" placeholder="" disabled/></div>
-      </div> 
-    </div>
-    <div class="userInfoBox">
-      <tableTitle :name="tableTitle"/>
-      <el-form ref="form" :model="form" :rules="loginRules" class="login-form" autocomplete="on" label-position="left">
-        <!--现有密码 start------------------------------------------>
-        <el-tooltip v-model="capsTooltip1" content="大小写已开启!" placement="right" manual>
-          <div class="PasswordBox">
-            <div class="PasswordTitle">现有密码:</div>
-            <el-form-item prop="password">
-              <div class="PasswordBody">
-                <el-input
-                  :key="passwordType1"
-                  ref="password1"
-                  v-model="form.password"
-                  :type="passwordType1"
-                  placeholder="请输入密码"
-                  name="password"
-                  tabindex="2"
-                  autocomplete="off"
-                  @blur="capsTooltip1 = false"
-                />
-                <span class="show-pwd" @click="showPwd(1)">
-                  <svg-icon :icon-class="passwordType1 === 'password' ? 'eye' : 'eye-open'" />
-                </span>
+      <div class="userInfoTabs">
+        <el-tabs :tab-position="tabPosition" style="height:350px" class="demo-tabs">
+          <el-tab-pane label="用户信息">
+            <el-form :model="infoform" ref="infoform" :rules="infoFormRules" autocomplete="off" label-position="left">
+              <div class="infoBox">
+                <div>
+                  <!-- <img :src="user.avatar" class="avatar"> -->
+                  <el-form-item label="头像:" prop="avatar" :label-width="formLabelWidth" :class="['custom-form-item']" class="custom-align-right">
+                    <div class="uploaderBox">
+                      <!--图片上传组件 start ------------------------------------------------------------>
+                      <div class="avatar-upload-container" @mouseenter="hovering = true" @mouseleave="hovering = false">
+                        <!-- 上传组件 -->
+                        <el-upload
+                          class="avatar-uploader"
+                          action="#"
+                          :show-file-list="false"
+                          :before-upload="beforeAvatarUpload"
+                        >
+                          <!-- 预览图片 -->
+                          <img v-if="avatarUrl" :src="avatarUrl" class="avatar">
+                          <!-- 上传图标 -->
+                          <!-- <i v-else class="el-icon-plus avatar-uploader-icon"></i> -->
+                          <div v-else class="chooseImgDiv">
+                            <div>
+                              <img src="@/assets/public/upload/noImage.png">
+                              <div>选择图片</div>
+                            </div>
+                          </div>
+                          <input type="hidden" v-model="infoform.avatar">
+                        </el-upload>
+                        <!-- 删除按钮,当鼠标悬浮时显示 -->
+                        <div v-if="hovering && avatarUrl" class="delete-button" @click="handleDelete">
+                          <i class="el-icon-delete"></i>
+                        </div>
+                      </div>
+                      <!--图片上传组件 end ------------------------------------------------------------>
+                    </div>
+                  </el-form-item>
+                  <el-form-item label="昵称:" :label-width="formLabelWidth" prop="real_name" class="custom-align-right">
+                    <el-input v-model="infoform.real_name" autocomplete="off" placeholder="请输入用户昵称.."></el-input>
+                  </el-form-item>
+                </div>
               </div>
-            </el-form-item>
-          </div>
-        </el-tooltip>
-        <!--现有密码 end------------------------------------------>
-        <!--新密码 start------------------------------------------>
-        <el-tooltip v-model="capsTooltip2" content="大小写已开启!" placement="right" manual>
-          <div class="PasswordBox">
-            <div class="PasswordTitle">新密码</div>
-            <el-form-item prop="new_password">
-              <div class="PasswordBody">
-                <el-input
-                  :key="passwordType2"
-                  ref="password2"
-                  v-model="form.new_password"
-                  :type="passwordType2"
-                  placeholder="请输入密码"
-                  name="password"
-                  tabindex="2"
-                  autocomplete="off"
-                  @blur="capsTooltip2 = false"
-                />
-                <span class="show-pwd" @click="showPwd(2)">
-                  <svg-icon :icon-class="passwordType2 === 'password' ? 'eye' : 'eye-open'" />
-                </span>
-              </div>
-            </el-form-item>
-          </div>
-        </el-tooltip>
-        <!--新密码 end------------------------------------------>
-        <!--新密码 start------------------------------------------>
-        <el-tooltip v-model="capsTooltip3" content="大小写已开启!" placement="right" manual>
-          <div class="PasswordBox">
-            <div class="PasswordTitle">确认新密码:</div>
-            <el-form-item prop="new_password1">
-              <div class="PasswordBody">
-                <el-input
-                  :key="passwordType3"
-                  ref="password3"
-                  v-model="form.new_password1"
-                  :type="passwordType3"
-                  placeholder="请输入密码"
-                  name="password"
-                  tabindex="2"
-                  autocomplete="off"
-                  @blur="capsTooltip3 = false"
-                />
-                <span class="show-pwd" @click="showPwd(3)">
-                  <svg-icon :icon-class="passwordType3 === 'password' ? 'eye' : 'eye-open'" />
-                </span>
-              </div>
-            </el-form-item>
-          </div>
-        </el-tooltip>
-        <!--新密码 end------------------------------------------>
-      </el-form>
-    </div>
+            </el-form>
+            <div class="infoBtnBox">
+              <el-button type="primary" @click="changeInfo">保存</el-button>
+            </div>
+          </el-tab-pane>
 
-    <div class="infoBtnBox">
-      <el-button type="info" @click="clearInput">重置</el-button>
-      <el-button type="primary" @click="changePassword">保存</el-button>
+          <el-tab-pane label="修改密码">
+            <el-form ref="form" :model="form" :rules="loginRules" class="login-form" autocomplete="on" label-position="left">
+              <!--现有密码 start------------------------------------------>
+              <el-tooltip v-model="capsTooltip1" content="大小写已开启!" placement="right" manual>
+                <div class="PasswordBox">
+                  <div class="PasswordTitle">现有密码:</div>
+                  <el-form-item prop="password">
+                    <div class="PasswordBody">
+                      <el-input
+                        :key="passwordType1"
+                        ref="password1"
+                        v-model="form.password"
+                        :type="passwordType1"
+                        placeholder="请输入密码"
+                        name="password"
+                        tabindex="2"
+                        autocomplete="off"
+                        @blur="capsTooltip1 = false"
+                      />
+                      <span class="show-pwd" @click="showPwd(1)">
+                        <svg-icon :icon-class="passwordType1 === 'password' ? 'eye' : 'eye-open'" />
+                      </span>
+                    </div>
+                  </el-form-item>
+                </div>
+              </el-tooltip>
+              <!--现有密码 end------------------------------------------>
+              <!--新密码 start------------------------------------------>
+              <el-tooltip v-model="capsTooltip2" content="大小写已开启!" placement="right" manual>
+                <div class="PasswordBox">
+                  <div class="PasswordTitle">新密码:</div>
+                  <el-form-item prop="new_password">
+                    <div class="PasswordBody">
+                      <el-input
+                        :key="passwordType2"
+                        ref="password2"
+                        v-model="form.new_password"
+                        :type="passwordType2"
+                        placeholder="请输入密码"
+                        name="password"
+                        tabindex="2"
+                        autocomplete="off"
+                        @blur="capsTooltip2 = false"
+                      />
+                      <span class="show-pwd" @click="showPwd(2)">
+                        <svg-icon :icon-class="passwordType2 === 'password' ? 'eye' : 'eye-open'" />
+                      </span>
+                    </div>
+                  </el-form-item>
+                </div>
+              </el-tooltip>
+              <!--新密码 end------------------------------------------>
+              <!--新密码 start------------------------------------------>
+              <el-tooltip v-model="capsTooltip3" content="大小写已开启!" placement="right" manual>
+                <div class="PasswordBox">
+                  <div class="PasswordTitle">确认新密码:</div>
+                  <el-form-item prop="new_password1">
+                    <div class="PasswordBody">
+                      <el-input
+                        :key="passwordType3"
+                        ref="password3"
+                        v-model="form.new_password1"
+                        :type="passwordType3"
+                        placeholder="请输入密码"
+                        name="password"
+                        tabindex="2"
+                        autocomplete="off"
+                        @blur="capsTooltip3 = false"
+                      />
+                      <span class="show-pwd" @click="showPwd(3)">
+                        <svg-icon :icon-class="passwordType3 === 'password' ? 'eye' : 'eye-open'" />
+                      </span>
+                    </div>
+                  </el-form-item>
+                </div>
+              </el-tooltip>
+              <!--新密码 end------------------------------------------>
+            </el-form>
+            <div class="infoBtnBox">
+              <!-- <el-button type="info" @click="clearInput">重置</el-button> -->
+              <el-button type="primary" @click="changePassword">保存</el-button>
+            </div>
+          </el-tab-pane>
+        </el-tabs>
+      </div>
     </div>
-  </div>  
+  </div>
 </template>
 
 <script>
@@ -120,13 +159,29 @@ export default {
         callback()
       }
     }
+    const validateEmpty = (rule,value,callback) => {
+      if (!value || value.trim() === "") {
+        callback(new Error('该项不能为空!'));
+      } else {
+        callback();
+      }
+    }
     return {
-      tableDivTitle:"用户信息",
-      tableTitle:"修改密码",
-      user: {
+      tableDivTitle:"修改个人信息",
+      tabPosition:"left",
+      formLabelWidth:"120px",
+      //修改用户信息
+      infoform:{
         avatar:"",
         real_name:""
       },
+      avatarUrl:"",//头像缩略图
+      hovering:false,//鼠标悬浮状态
+      infoFormRules:{
+        avatar: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        real_name: [{ required: true, trigger: 'blur', validator: validateEmpty }]
+      },
+      //修改密码
       form:{
         password:"",
         new_password:"",
@@ -149,13 +204,14 @@ export default {
     this.getUserInfo();
   },
   methods: {
+    //0.全局操作 start ---------------------------------------->
     //获取用户身份信息
     getUserInfo(){
       this.$store.dispatch('public/getInfo').then(res=> {
         console.log(res)
-        this.user.avatar = res.data.avatar;
-        this.user.real_name = res.data.real_name;
-
+        this.avatarUrl = res.data.avatar;
+        this.infoform.avatar = res.data.avatar;
+        this.infoform.real_name = res.data.real_name;
       }).catch(() => {
         this.$message({
           type: 'info',
@@ -163,27 +219,35 @@ export default {
         });
       })
     },
-    //修改用户密码
+    //0.全局操作 end ---------------------------------------->
+    //1.修改密码 start ---------------------------------------->
+    //1.1 修改用户密码
     changePassword(){
-      this.$store.dispatch('public/changePassword',this.form).then(res=> {
-        //console.log(res)
-        if(res.code == 200){
-          this.$message({
-            type: 'success',
-            message: "密码修改成功!"
-          });
-          this.clearInput();
+      this.$refs.form.validate(valid => {
+        if (valid) {
+          this.$store.dispatch('public/changePassword',this.form).then(res=> {
+            //console.log(res)
+            if(res.code == 200){
+              this.$message({
+                type: 'success',
+                message: "密码修改成功!"
+              });
+              this.clearInput();
+            }else{
+              this.$message({
+                type: 'warning',
+                message: res.message
+              });
+            } 
+          }).catch(() => {
+            this.$message({
+              type: 'info',
+              message: '网络错误,请重试!'
+            });
+          })
         }else{
-          this.$message({
-            type: 'warning',
-            message: res.message
-          });
-        } 
-      }).catch(() => {
-        this.$message({
-          type: 'info',
-          message: '网络错误,请重试!'
-        });
+          this.$message.error('请填写完整信息!');
+        }
       })
     },
     // 切换密码框的显示与隐藏
@@ -210,7 +274,68 @@ export default {
         new_password:"",
         new_password1:""
       }
+    },
+    //1.修改密码 end ---------------------------------------->
+    //2.修改头像和昵称 start ---------------------------------------->
+    //2.1上传图片操作
+    beforeAvatarUpload(file) {
+      const isJPG = file.type === 'image/jpeg';
+      const isPNG = file.type === 'image/png';
+      const isLt2M = file.size / 1024 / 1024 < 2;
+
+      if (!isJPG && !isPNG) {
+        this.$message.error('上传头像图片只能是 JPG 或 PNG 格式!');
+        return false;
+      }
+      if (!isLt2M) {
+        this.$message.error('上传头像图片大小不能超过 2MB!');
+        return false;
+      }
+
+      const formData = new FormData();
+      formData.append('file', file);
+
+      this.$store.dispatch('pool/uploadFile',formData).then(res=> {
+        this.avatarUrl = res.data.imgUrl;//显示缩略图
+        this.infoform.avatar = res.data.imgUrl;//提供表单地址
+        console.log(res.data.imgUrl)
+        console.log(this.infoform.avatar)
+      }).catch(() => {
+        this.$message({
+          type: 'warning',
+          message: '网络错误,请重试!'
+        });
+      })
+
+      // 阻止默认的上传行为
+      return false;
+    },
+    //2.2 删除图片
+    handleDelete() {
+      // 删除图片
+      this.avatarUrl = ''; // 清空图片 URL
+    },
+    //2.3 修改用户信息
+    changeInfo(){
+      console.log(this.infoform)
+      this.$refs.infoform.validate(valid => {
+        if (valid) {
+          this.$store.dispatch('user/updateUserAvatarNickname',this.infoform).then(res=> {
+            if(res.code == 200){
+              this.$message.success("修改成功!");
+              //更新store中的头像和昵称
+              this.$store.commit('user/SET_AVATAR', this.infoform.avatar);
+              this.$store.commit('user/SET_NAME', this.infoform.real_name);
+            }
+          }).catch(() => {  
+            this.$message.error('网络错误,请重试!');
+          })
+        }else{
+          this.$message.error('请填写完整信息!');
+        }
+      })
     }
+    //2.修改头像和昵称 end ---------------------------------------->
   }
 }
 </script>
@@ -228,10 +353,14 @@ export default {
     -webkit-box-sizing: border-box;
     box-sizing: border-box;
     padding-bottom: @spacingPx;
+    .userInfoTabs {
+      padding: 20px 40px 20px 0;
+      background: #F5F7FB
+    }
     .avatar {
       border-radius: 50%;
-      width: 100px;
-      height: 100px;
+      width: 140px;
+      height: 140px;
       border: 1px solid @avatarBorderColor;
       border-radius: 12px;
       padding:15px;
@@ -240,15 +369,9 @@ export default {
       margin-left: @spacingPx;
     }
     .infoBox {
-      display: flex;
-      align-items: center;
       margin-top: @spacingPx;
     }
-    .infoTitle {
-      width:120px;
-      text-align: right;
-      margin-right: 10px;
-    }
+    
     .infoInput {
       flex: 1;
     }
@@ -282,6 +405,9 @@ export default {
       text-align: right;
       margin-right: 10px;
       margin-bottom:22px;
+      font-size: 14px;
+      color: #666;
+      font-weight: bold;
     }
     .PasswordBody {
       flex: 1;
@@ -294,4 +420,16 @@ export default {
     padding-bottom: @spacingPx;
     text-align: center;
   }
+
+  //执行v-deep穿透scope选择器 start------------------------------------------------------------>*/
+  ::v-deep .custom-form-item > .el-form-item__label {
+    line-height: 140px !important;
+  }
+  ::v-deep .custom-textarea .el-textarea__inner {
+    resize: none; /* 禁止用户拖拽调整大小 */
+  }
+  ::v-deep .custom-align-right .el-form-item__label {
+    text-align: right; /* 设置标签文字右对齐 */
+  }
+  //执行v-deep穿透scope选择器 end------------------------------------------------------------>*/
 </style>

+ 1 - 1
src/views/role/components/CityCascader.vue

@@ -2,7 +2,7 @@
   <el-cascader
     :key="cascaderKey"
     v-model="internalValue"
-    placeholder="选择您要绑定的城市"
+    placeholder="请选择地址.."
     :props="SearchCityData"
     filterable
     clearable

+ 58 - 10
src/views/role/components/userDefault.vue

@@ -69,7 +69,7 @@
           <el-form-item label="真实姓名:" :label-width="formLabelWidth" prop="real_name" class="custom-align-right">
             <el-input v-model="form.real_name" autocomplete="off" placeholder="请输入真实姓名.."></el-input>
           </el-form-item>
-          <el-form-item label="照片:" :label-width="formLabelWidth" prop="" :class="['custom-form-item']" class="custom-align-right">
+          <el-form-item label="照片:" :label-width="formLabelWidth" prop="photoUrl" :class="['custom-form-item']" class="custom-align-right">
             <div class="uploaderBox">
               <!--图片上传组件 start ------------------------------------------------------------>
               <div class="avatar-upload-container" @mouseenter="hovering = true" @mouseleave="hovering = false">
@@ -101,6 +101,15 @@
           <el-form-item label="身份证号:" :label-width="formLabelWidth" prop="id_card" class="custom-align-right">
             <el-input v-model="form.id_card" autocomplete="off" placeholder="请输入身份证号.."></el-input>
           </el-form-item>
+          <el-form-item label="出生年月:" :label-width="formLabelWidth" prop="birthday" class="custom-align-right">
+            <el-date-picker
+              v-model="form.birthday"
+              type="date"
+              placeholder="选择日期"
+              disabled
+            >
+            </el-date-picker>
+          </el-form-item>
           <el-form-item label="性别:" :label-width="formLabelWidth" prop="gender" class="custom-align-right">
             <el-radio v-model="form.gender" label="1">男</el-radio>
             <el-radio v-model="form.gender" label="2">女</el-radio>  
@@ -108,14 +117,7 @@
           <el-form-item label="手机号:" :label-width="formLabelWidth" prop="mobile" class="custom-align-right">
             <el-input v-model="form.mobile" autocomplete="off" placeholder="请输入手机号.."></el-input>
           </el-form-item>
-          <el-form-item label="出生年月:" :label-width="formLabelWidth" prop="birthday" class="custom-align-right">
-            <el-date-picker
-              v-model="form.birthday"
-              type="date"
-              placeholder="选择日期">
-            </el-date-picker>
-          </el-form-item>
-          <el-form-item label="有效期:" :label-width="formLabelWidth" prop="" class="custom-align-right">
+          <el-form-item label="有效期:" :label-width="formLabelWidth" prop="timeList" class="custom-align-right">
             <el-date-picker
               v-model="timeList"
               type="daterange"
@@ -194,6 +196,7 @@ export default {
     CityCascader, //城市级联选择器
   },
   data() {
+    let self = this;
     // 配置验证规则:用于表单验证
     const validatePassword = (rule, value, callback) => {
       if (value.length < 6) {
@@ -216,6 +219,32 @@ export default {
         callback()
       }
     }
+    const validateTime = (rule,value,callback) => {
+      if(value==="NaN-NaN-NaN NaN:NaN:NaN"){
+        callback(new Error('该项不能为空!'))
+      }else{
+        callback()
+      }
+    }
+    const validateTimeTo = (rule,value,callback) => {
+      if(self.timeList.length == 0&&self.form.long_time==0){
+        callback(new Error('该项不能为空!'))
+      }else{
+        callback()
+      }
+    }
+    const validateIdcard = (rule,value,callback) => {
+      const idCardRegex = /^(?:\d{15}|\d{18}|\d{17}[\dXx])$/; // 正则表达式验证身份证号
+      if (!value || value.trim() === "") {
+        callback(new Error('该项不能为空!'));
+      } else if (!idCardRegex.test(value.trim())) {
+        callback(new Error('请输入有效的身份证号')); // 更新错误信息
+      } else {
+        console.log("身份证号验证通过!");
+        self.extractBirthdayFromIdcard();
+        callback();
+      }
+    }
     return {
       formLabelWidth:"120px",
       editId:"",
@@ -269,11 +298,17 @@ export default {
         //6.手机号
         mobile: [{ required: true, trigger: 'blur', validator: validateEmpty }],
         //7.身份证号
-        id_card: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        id_card: [{ required: true, trigger: 'blur', validator: validateIdcard }],
         //8.性别
         gender: [{ required: true, trigger: 'blur', validator: validateEmpty }],
         //9.手机号
         mobile: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        //10.照片
+        photoUrl: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        //11.出生年月
+        birthday: [{ required: true, trigger: 'blur', validator: validateTime }],
+        //12.有效期
+        timeList:[{ required: true, trigger: 'blur', validator: validateTimeTo }]
       },
       //时间跨度
       pickerOptions: {
@@ -584,6 +619,19 @@ export default {
         path: '/userList',
       });
     },
+    //提取身份证号中的出生日期
+    extractBirthdayFromIdcard(){
+      let idCard = this.form.id_card;
+      // 1. 取出身份证中的生日部分,例如 "20250129"
+      let birthStr = idCard.substring(6, 14); 
+      // 2. 截取年、月、日
+      let year = birthStr.substring(0, 4);    // 2025
+      let month = birthStr.substring(4, 6);   // 01
+      let day = birthStr.substring(6, 8);     // 29
+      // 3. 拼接成需要的格式 "YYYY-MM-DD 00:00:00"
+      let birthDateTime = `${year}-${month}-${day} 00:00:00`;
+      this.form.birthday = birthDateTime;
+    },
   },
   mounted(){
     this.getRoleList();

+ 26 - 2
src/views/role/components/userEnterprise.vue

@@ -69,7 +69,7 @@
           <el-form-item label="企业名称:" :label-width="formLabelWidth" prop="business_name" class="custom-align-right">
             <el-input v-model="form.business_name" autocomplete="off" placeholder="请输入企业名称.."></el-input>
           </el-form-item>
-          <el-form-item label="详细地址:" :label-width="formLabelWidth" prop="" class="custom-align-right">
+          <el-form-item label="详细地址:" :label-width="formLabelWidth" prop="address_arr_id" class="custom-align-right">
             <CityCascader v-model="form.address_arr_id" @update-city-id="update_address_arr_id"></CityCascader>
           </el-form-item>
           <el-form-item label="" :label-width="formLabelWidth" prop="" class="custom-align-right">
@@ -96,7 +96,7 @@
           <el-form-item label="法人身份证:" :label-width="formLabelWidth" prop="legal_person_id_card" class="custom-align-right">
             <el-input v-model="form.legal_person_id_card" autocomplete="off" placeholder="请输入法人身份证号.."></el-input>
           </el-form-item>
-          <el-form-item label="有效期:" :label-width="formLabelWidth" prop="" class="custom-align-right">
+          <el-form-item label="有效期:" :label-width="formLabelWidth" prop="timeList" class="custom-align-right">
             <el-date-picker
               v-model="timeList"
               type="daterange"
@@ -168,6 +168,7 @@ export default {
     CityCascader, //城市级联选择器
   },
   data() {
+    let self = this;
     // 配置验证规则:用于表单验证
     const validatePassword = (rule, value, callback) => {
       if (value.length < 6) {
@@ -190,6 +191,25 @@ export default {
         callback()
       }
     }
+    const validateTimeTo = (rule,value,callback) => {
+      if(self.timeList.length == 0&&self.form.long_time==0){
+        callback(new Error('该项不能为空!'))
+      }else{
+        callback()
+      }
+    }
+    const validateIdcard = (rule,value,callback) => {
+      const idCardRegex = /^(?:\d{15}|\d{18}|\d{17}[\dXx])$/; // 正则表达式验证身份证号
+      if (!value || value.trim() === "") {
+        callback(new Error('该项不能为空!'));
+      } else if (!idCardRegex.test(value.trim())) {
+        callback(new Error('请输入有效的身份证号')); // 更新错误信息
+      } else {
+        console.log("身份证号验证通过!");
+        self.extractBirthdayFromIdcard();
+        callback();
+      }
+    }
     return {
       formLabelWidth:"120px",
       editId:"",
@@ -262,6 +282,8 @@ export default {
         legal_person_mobile: [{ required: true, trigger: 'blur', validator: validateEmpty }],
         //14.法人身份证号
         legal_person_id_card: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        //15.有效期
+        timeList:[{ required: true, trigger: 'blur', validator: validateTimeTo }]
       },
       //时间跨度
       pickerOptions: {
@@ -363,6 +385,8 @@ export default {
     },
     //提交表单
     addData(){
+      console.log(this.timeList)
+      //console.log(this.form.address_arr_id)
       //1.格式化时间戳
       if(this.form.long_time==0){
         this.form.from_time = formatLocalDate(this.timeList[0]);

+ 56 - 4
src/views/role/components/userInvestigate.vue

@@ -72,7 +72,7 @@
           <el-form-item label="真实姓名:" :label-width="formLabelWidth" prop="real_name" class="custom-align-right">
             <el-input v-model="form.real_name" autocomplete="off" placeholder="请输入真实姓名.."></el-input>
           </el-form-item>
-          <el-form-item label="照片:" :label-width="formLabelWidth" prop="" :class="['custom-form-item']" class="custom-align-right">
+          <el-form-item label="照片:" :label-width="formLabelWidth" prop="photoUrl" :class="['custom-form-item']" class="custom-align-right">
             <div class="uploaderBox">
               <!--图片上传组件 start ------------------------------------------------------------>
               <div class="avatar-upload-container" @mouseenter="hovering = true" @mouseleave="hovering = false">
@@ -108,7 +108,9 @@
             <el-date-picker
               v-model="form.birthday"
               type="date"
-              placeholder="选择日期">
+              placeholder="选择日期"
+              disabled
+            >
             </el-date-picker>
           </el-form-item>
           <el-form-item label="性别:" :label-width="formLabelWidth" prop="gender" class="custom-align-right">
@@ -124,7 +126,7 @@
             <el-cascader :options="options" :show-all-levels="false" disabled v-else></el-cascader>
             <el-checkbox v-model="isNational" :true-label="1" :false-label="0" class="longTimeCheckbox">全国</el-checkbox>
           </el-form-item>
-          <el-form-item label="有效期:" :label-width="formLabelWidth" prop="" class="custom-align-right">
+          <el-form-item label="有效期:" :label-width="formLabelWidth" prop="timeList" class="custom-align-right">
             <el-date-picker
               v-model="timeList"
               type="daterange"
@@ -201,6 +203,7 @@ export default {
     CityCascader, //城市级联选择器
   },
   data() {
+    let self = this;
     // 配置验证规则:用于表单验证
     const validatePassword = (rule, value, callback) => {
       if (value.length < 6) {
@@ -234,6 +237,35 @@ export default {
         callback()
       }
     }
+    const validateTime = (rule,value,callback) => {
+      if(value==="NaN-NaN-NaN NaN:NaN:NaN"){
+        callback(new Error('该项不能为空!'))
+      }else{
+        callback()
+      }
+    }
+    const validateTimeTo = (rule,value,callback) => {
+      // console.log(value)
+      // console.log(self.timeList)
+      // console.log(self.form.long_time)
+      if(self.timeList.length == 0&&self.form.long_time==0){
+        callback(new Error('该项不能为空!'))
+      }else{
+        callback()
+      }
+    }
+    const validateIdcard = (rule,value,callback) => {
+      const idCardRegex = /^(?:\d{15}|\d{18}|\d{17}[\dXx])$/; // 正则表达式验证身份证号
+      if (!value || value.trim() === "") {
+        callback(new Error('该项不能为空!'));
+      } else if (!idCardRegex.test(value.trim())) {
+        callback(new Error('请输入有效的身份证号')); // 更新错误信息
+      } else {
+        console.log("身份证号验证通过!");
+        self.extractBirthdayFromIdcard();
+        callback();
+      }
+    }
     return {
       formLabelWidth:"120px",
       editId:"",
@@ -292,13 +324,19 @@ export default {
         //6.手机号
         mobile: [{ required: true, trigger: 'blur', validator: validateEmpty }],
         //7.身份证号
-        id_card: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        id_card: [{ required: true, trigger: 'blur', validator: validateIdcard }],
         //8.性别
         gender: [{ required: true, trigger: 'blur', validator: validateEmpty }],
         //9.手机号
         mobile: [{ required: true, trigger: 'blur', validator: validateEmpty }],
         //10.工作区域
         city_arr_id: [{ required: true, trigger: 'blur', validator: validateArray }],
+        //11.照片
+        photoUrl: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        //12.出生年月
+        birthday: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        //13.有效期
+        timeList:[{ required: true, trigger: 'blur', validator: validateTimeTo }]
       },
       //时间跨度
       pickerOptions: {
@@ -443,6 +481,7 @@ export default {
     },
     //提交表单
     addData(){
+      console.log(this.timeList)
       //1.格式化时间戳
       this.form.birthday = formatLocalDate(this.form.birthday);
       if(this.form.long_time==0){
@@ -645,6 +684,19 @@ export default {
         path: '/userList',
       });
     },
+    //提取身份证号中的出生日期
+    extractBirthdayFromIdcard(){
+      let idCard = this.form.id_card;
+      // 1. 取出身份证中的生日部分,例如 "20250129"
+      let birthStr = idCard.substring(6, 14); 
+      // 2. 截取年、月、日
+      let year = birthStr.substring(0, 4);    // 2025
+      let month = birthStr.substring(4, 6);   // 01
+      let day = birthStr.substring(6, 8);     // 29
+      // 3. 拼接成需要的格式 "YYYY-MM-DD 00:00:00"
+      let birthDateTime = `${year}-${month}-${day} 00:00:00`;
+      this.form.birthday = birthDateTime;
+    },
   },
   mounted(){
     this.getRoleList();

+ 17 - 5
src/views/role/components/userPolitician.vue

@@ -66,13 +66,13 @@
             </div>
             <!--新密码 end------------------------------------------>
           </div>
-          <el-form-item label="行政级别:" :label-width="formLabelWidth" prop="" class="custom-align-right">
-            <el-input autocomplete="off" placeholder="请输入企业名称.."></el-input>
+          <el-form-item label="行政级别:" :label-width="formLabelWidth" prop="administrative_unit_arr_id" class="custom-align-right">
+            <el-input autocomplete="off" placeholder="请输入行政级别.."></el-input>
           </el-form-item>
           <el-form-item label="单位名称:" :label-width="formLabelWidth" prop="business_name" class="custom-align-right">
             <el-input v-model="form.business_name" autocomplete="off" placeholder="请输入单位名称.."></el-input>
           </el-form-item>
-          <el-form-item label="详细地址:" :label-width="formLabelWidth" prop="" class="custom-align-right">
+          <el-form-item label="详细地址:" :label-width="formLabelWidth" prop="address_arr_id" class="custom-align-right">
             <CityCascader v-model="form.address_arr_id" @update-city-id="update_address_arr_id"></CityCascader>
           </el-form-item>
           <el-form-item label="" :label-width="formLabelWidth" prop="" class="custom-align-right">
@@ -99,7 +99,7 @@
           <el-form-item label="法人身份证:" :label-width="formLabelWidth" prop="legal_person_id_card" class="custom-align-right">
             <el-input v-model="form.legal_person_id_card" autocomplete="off" placeholder="请输入法人身份证号.."></el-input>
           </el-form-item>
-          <el-form-item label="有效期:" :label-width="formLabelWidth" prop="" class="custom-align-right">
+          <el-form-item label="有效期:" :label-width="formLabelWidth" prop="timeList" class="custom-align-right">
             <el-date-picker
               v-model="timeList"
               type="daterange"
@@ -171,6 +171,7 @@ export default {
     CityCascader, //城市级联选择器
   },
   data() {
+    let self = this;
     // 配置验证规则:用于表单验证
     const validatePassword = (rule, value, callback) => {
       if (value.length < 6) {
@@ -193,6 +194,13 @@ export default {
         callback()
       }
     }
+    const validateTimeTo = (rule,value,callback) => {
+      if(value==undefined&&self.form.long_time==0){
+        callback(new Error('该项不能为空!'))
+      }else{
+        callback()
+      }
+    }
     return {
       formLabelWidth:"120px",
       editId:"",
@@ -216,7 +224,7 @@ export default {
         email:"",//电子邮箱
         other:[],//相关资料
         remark:"",//提示词
-        administrative_unit_arr_id:[0],//行政级别
+        administrative_unit_arr_id:[],//行政级别
         //企业相关字段
         fax:"",//传真
         business_name:"",//企业名称
@@ -268,6 +276,10 @@ export default {
         legal_person_id_card: [{ required: true, trigger: 'blur', validator: validateEmpty }],
         //15.行政级别
         administrative_unit_arr_id: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        //16.详细地址
+        address_arr_id: [{ required: true, trigger: 'blur', validator: validateArray }],
+        //17.有效期
+        timeList: [{ required: true, trigger: 'blur', validator: validateTimeTo }]
       },
       //时间跨度
       pickerOptions: {

+ 13 - 3
src/views/website/categoryList.vue

@@ -73,7 +73,7 @@
     <!--表格内容 end------------------------------------------------------------>
 
     <!--弹出框 start------------------------------------------------------------>
-    <el-dialog :title="editId ? '编辑导航池' : '添加导航池'" :visible.sync="windowStatus" :close-on-click-modal="false">
+    <el-dialog :title="editId ? '编辑导航池' : '添加导航池'" :visible.sync="windowStatus" :close-on-click-modal="false" @close="clearToServe(2)">
       <el-form :model="form" ref="form" :rules="formRules" autocomplete="off" label-position="left">
         <div class="formDiv">
           <el-form-item label="导航池名称:" :label-width="formLabelWidth" prop="name" class="custom-align-right">
@@ -99,7 +99,8 @@
           </div>
           <div v-if="show_url==0">
             <el-form-item label="关联职能部门:" :label-width="formLabelWidth" prop="department_arr_id" class="custom-align-right">
-              <el-cascader :key="departmentKey" v-model="form.department_arr_id" placeholder="选择要绑定的职能部门" :props="departmentData" filterable clearable></el-cascader>
+              <!-- <el-cascader :key="departmentKey" v-model="form.department_arr_id" placeholder="选择要绑定的职能部门" :props="departmentData" filterable clearable></el-cascader> -->
+              <el-cascader :key="departmentKey" :props="{value:'id',label:'name',children:'children'}" :options="allDepartment" v-model="form.department_arr_id" :show-all-levels="false" filterable />
             </el-form-item>
             <el-form-item label="关联行政区划:" :label-width="formLabelWidth" prop="city_arr_id" class="custom-align-right">
               <el-cascader :key="cascaderKey" v-model="form.city_arr_id" placeholder="选择要绑定行政区划" :props="cityData" filterable clearable></el-cascader>
@@ -213,6 +214,7 @@ export default {
         page:1,//当前是第几页
         pageSize:10,//一共多少条
       },
+      allDepartment:[],//所有职能
       //列表和分页相关 end ------------------------------------------------------------>
 
       //2.搜索相关 start ------------------------------------------------------------>
@@ -475,6 +477,13 @@ export default {
       this.getApiData.pageSize = 10;
       this.getData();
     },
+    //1.6 获取所有职能
+    getAllDepartment(){
+      this.$store.dispatch('cms/getAllDepartment').then(res=> {
+        console.log(res)
+        this.allDepartment = res.data;
+      })
+    },
     //列表和分页相关 end ------------------------------------------------------------>
 
     //2.弹出框设置 start ------------------------------------------------------------>
@@ -599,7 +608,7 @@ export default {
         //回显职能部门
         this.form.department_arr_id = JSON.parse(res.data.department_arr_id);
         this.departmentKey += 1;
-        this.loadCascaderPath(this.form.department_arr_id,"znbm");
+        // this.loadCascaderPath(this.form.department_arr_id,"znbm");
 
         //回显导航池标题,描述,关键词
         this.form.seo_title = res.data.seo_title;
@@ -674,6 +683,7 @@ export default {
     //this.getwebsiteColumn();
     //本地转换id为文字
     //console.log(getLocationNameById("110000"))
+    this.getAllDepartment();
   }
 }
 </script>