소스 검색

从dev增加的修正补丁

从dev增加的修正补丁
Sean 3 달 전
부모
커밋
6906b84ba1

+ 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
+  })
 }

+ 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)
+      })
+    })
+  },
 
 }
 

+ 2 - 3
src/views/complaint/complaintList.vue

@@ -261,8 +261,8 @@ export default {
     //0.全局操作 start ------------------------------------------------------------>
     //表单验证
     const validateEmpty = (rule,value,callback) => {
-      if (value == 0 || value == null) {
-        callback(new Error('状态不能为空!'))
+      if (value.length == 0) {
+        callback(new Error('该项不能为空!'))
       } else {
         callback()
       }
@@ -761,7 +761,6 @@ export default {
       //   this.form.other = "";
       // }
 
-
       let data = {
         id:this.editId,
         //提交编辑

+ 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

+ 32 - 2
src/views/role/components/userAdmin.vue

@@ -83,7 +83,8 @@
     <div class="bottomBtnBox">
       <el-button type="info" @click="goList">返回</el-button>
       <el-button type="primary" @click="addData" v-if="editId==''">提交</el-button>
-      <el-button type="primary" @click="editData" v-else>修改</el-button>
+      <el-button type="primary" @click="editData" v-if="editId!=''">修改</el-button>
+      <el-button type="warning" @click="resetPassword" v-if="editId!=''">重置密码</el-button>
     </div>
   </div>
 </template>
@@ -102,6 +103,17 @@ export default {
         callback()
       }
     }
+    const validatePhone = (rule, value, callback) => {
+      const phoneRegex = /^1[34578]\d{9}$/g; // 正则表达式验证手机号
+      if (!value || value.trim() === "") {
+        callback(new Error('该项不能为空!'));
+      } else if (!phoneRegex.test(value.trim())) {
+        callback(new Error('请输入有效的手机号')); // 更新错误信息
+      } else {
+        console.log("手机号验证通过!")
+        callback();
+      }
+    }
     const validateEmpty = (rule,value,callback) => {
       if (value.length == 0) {
         callback(new Error('该项不能为空!'))
@@ -130,7 +142,7 @@ export default {
       passwordType2: 'password',
       //配置from表单验证规则
       loginRules: { 
-        user_name: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        user_name: [{ required: true, trigger: 'blur', validator: validatePhone }],
         role_id: [{ required: true, trigger: 'blur', validator: validateEmpty }],
         password: [{ required: true, trigger: 'blur', validator: validatePassword }],
         confirm_password: [{ required: true, trigger: 'blur', validator: validatePassword }],
@@ -261,6 +273,24 @@ export default {
         });
       })
     },
+    //重置密码
+    resetPassword(){
+      let password = Math.random().toString(36).slice(-6); // 随机生成6个字母的组合
+
+      this.$store.dispatch('userMember/resetPassword',{id:this.editId,password:password}).then(res=> {
+        if(res.code==200){
+          this.$message({
+            type: 'success',
+            message: '密码重置为:' + password
+          });
+        }
+      }).catch(() => {
+        this.$message({
+          type: 'warning',
+          message: '网络错误,请重试!'
+        });
+      })
+    },
     //编辑表单 end ------------------------------------------------------------>
     goList(){
       this.$router.push({

+ 78 - 11
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"
@@ -172,7 +174,8 @@
     <div class="bottomBtnBox">
       <el-button type="info" @click="goList">返回</el-button>
       <el-button type="primary" @click="addData" v-if="editId==''">提交</el-button>
-      <el-button type="primary" @click="editData" v-else>修改</el-button>
+      <el-button type="primary" @click="editData" v-if="editId!=''">修改</el-button>
+      <el-button type="warning" @click="resetPassword" v-if="editId!=''">重置密码</el-button>
     </div>
   </div>
 </template>
@@ -193,6 +196,7 @@ export default {
     CityCascader, //城市级联选择器
   },
   data() {
+    let self = this;
     // 配置验证规则:用于表单验证
     const validatePassword = (rule, value, callback) => {
       if (value.length < 6) {
@@ -215,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:"",
@@ -268,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: {
@@ -559,12 +595,43 @@ export default {
         }
       })
     },
+    //重置密码
+    resetPassword(){
+      let password = Math.random().toString(36).slice(-6); // 随机生成6个字母的组合
+
+      this.$store.dispatch('userMember/resetPassword',{id:this.editId,password:password}).then(res=> {
+        if(res.code==200){
+          this.$message({
+            type: 'success',
+            message: '密码重置为:' + password
+          });
+        }
+      }).catch(() => {
+        this.$message({
+          type: 'warning',
+          message: '网络错误,请重试!'
+        });
+      })
+    },
     //编辑表单 end ------------------------------------------------------------>
     goList(){
       this.$router.push({
         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();

+ 46 - 3
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"
@@ -146,7 +146,8 @@
     <div class="bottomBtnBox">
       <el-button type="info" @click="goList">返回</el-button>
       <el-button type="primary" @click="addData" v-if="editId==''">提交</el-button>
-      <el-button type="primary" @click="editData" v-else>修改</el-button>
+      <el-button type="primary" @click="editData" v-if="editId!=''">修改</el-button>
+      <el-button type="warning" @click="resetPassword" v-if="editId!=''">重置密码</el-button>
     </div>
   </div>
 </template>
@@ -167,6 +168,7 @@ export default {
     CityCascader, //城市级联选择器
   },
   data() {
+    let self = this;
     // 配置验证规则:用于表单验证
     const validatePassword = (rule, value, callback) => {
       if (value.length < 6) {
@@ -189,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:"",
@@ -261,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: {
@@ -362,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]);
@@ -513,6 +538,24 @@ export default {
         }
       })
     },
+    //重置密码
+    resetPassword(){
+      let password = Math.random().toString(36).slice(-6); // 随机生成6个字母的组合
+
+      this.$store.dispatch('userMember/resetPassword',{id:this.editId,password:password}).then(res=> {
+        if(res.code==200){
+          this.$message({
+            type: 'success',
+            message: '密码重置为:' + password
+          });
+        }
+      }).catch(() => {
+        this.$message({
+          type: 'warning',
+          message: '网络错误,请重试!'
+        });
+      })
+    },
     //编辑表单 end ------------------------------------------------------------>
     goList(){
       this.$router.push({

+ 104 - 11
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"
@@ -180,7 +182,8 @@
     <div class="bottomBtnBox">
       <el-button type="info" @click="goList">返回</el-button>
       <el-button type="primary" @click="addData" v-if="editId==''">提交</el-button>
-      <el-button type="primary" @click="editData" v-else>修改</el-button>
+      <el-button type="primary" @click="editData" v-if="editId!=''">修改</el-button>
+      <el-button type="warning" @click="resetPassword" v-if="editId!=''">重置密码</el-button>
     </div>
   </div>
 </template>
@@ -200,6 +203,7 @@ export default {
     CityCascader, //城市级联选择器
   },
   data() {
+    let self = this;
     // 配置验证规则:用于表单验证
     const validatePassword = (rule, value, callback) => {
       if (value.length < 6) {
@@ -208,6 +212,17 @@ export default {
         callback()
       }
     }
+    const validatePhone = (rule, value, callback) => {
+      const phoneRegex = /^1[34578]\d{9}$/g; // 正则表达式验证手机号
+      if (!value || value.trim() === "") {
+        callback(new Error('该项不能为空!'));
+      } else if (!phoneRegex.test(value.trim())) {
+        callback(new Error('请输入有效的手机号')); // 更新错误信息
+      } else {
+        console.log("手机号验证通过!")
+        callback();
+      }
+    }
     const validateEmpty = (rule,value,callback) => {
       if (!value || value.trim() === "") {
         callback(new Error('该项不能为空!'));
@@ -222,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:"",
@@ -269,7 +313,7 @@ export default {
         //1.角色id
         role_id: [{ required: true, trigger: 'blur', validator: validateArray }],
         //2.登录账号
-        user_name: [{ required: true, trigger: 'blur', validator: validateEmpty }],
+        user_name: [{ required: true, trigger: 'blur', validator: validatePhone }],
         //3.密码和确认密码
         password: [{ required: true, trigger: 'blur', validator: validatePassword }],
         confirm_password: [{ required: true, trigger: 'blur', validator: validatePassword }],
@@ -280,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: {
@@ -336,6 +386,8 @@ export default {
     update_city_arr_id(value){
       console.log("工作区域ID已更新:", value);
       this.form.city_arr_id = value;
+
+      console.log(this.form.city_arr_id);
     },
     //1.4更新籍贯
     update_native_place_arr_id(value){
@@ -429,6 +481,7 @@ export default {
     },
     //提交表单
     addData(){
+      console.log(this.timeList)
       //1.格式化时间戳
       this.form.birthday = formatLocalDate(this.form.birthday);
       if(this.form.long_time==0){
@@ -442,7 +495,7 @@ export default {
       }
       //判断用户工作区域是否为全国
       if(this.isNational==1){
-        this.form.city_arr_id = ["0"];
+        this.form.city_arr_id = [0];
       }
       console.log(this.form)
       //2.开始验证
@@ -562,15 +615,24 @@ export default {
           this.$store.dispatch('userMember/verifyUserInfo',{id:this.editId,user_name:this.form.user_name}).then(res=>{
             if(res.code==0){
               console.log(this.form);
-              this.form.address_arr_id = JSON.parse(this.form.address_arr_id);
-              this.form.native_place_arr_id = JSON.parse(this.form.native_place_arr_id);
-              this.form.city_arr_id = JSON.parse(this.form.address_arr_id);
+              if(!Array.isArray(this.form.address_arr_id)){
+                this.form.address_arr_id = JSON.parse(this.form.address_arr_id);
+              }
+              if(!Array.isArray(this.form.native_place_arr_id)){
+                this.form.native_place_arr_id = JSON.parse(this.form.native_place_arr_id);
+              }
+              if(!Array.isArray(this.form.city_arr_id)){
+                this.form.city_arr_id = JSON.parse(this.form.address_arr_id);
+              }
+              //this.form.address_arr_id = JSON.parse(this.form.address_arr_id);
+              //this.form.native_place_arr_id = JSON.parse(this.form.native_place_arr_id);
+              //this.form.city_arr_id = JSON.parse(this.form.address_arr_id);
 
               //2.设置修改的用户id
               this.form.id = this.editId;
               //判断用户工作区域是否为全国
               if(this.isNational==1){
-                this.form.city_arr_id = ["0"];
+                this.form.city_arr_id = [0];
               }
               //3.提交用户修改
               //如果code为0表示用户不存在,提交表单
@@ -598,12 +660,43 @@ export default {
         }
       })
     },
+    //重置密码
+    resetPassword(){
+      let password = Math.random().toString(36).slice(-6); // 随机生成6个字母的组合
+
+      this.$store.dispatch('userMember/resetPassword',{id:this.editId,password:password}).then(res=> {
+        if(res.code==200){
+          this.$message({
+            type: 'success',
+            message: '密码重置为:' + password
+          });
+        }
+      }).catch(() => {
+        this.$message({
+          type: 'warning',
+          message: '网络错误,请重试!'
+        });
+      })
+    },
     //编辑表单 end ------------------------------------------------------------>
     goList(){
       this.$router.push({
         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();

+ 37 - 6
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"
@@ -149,7 +149,8 @@
     <div class="bottomBtnBox">
       <el-button type="info" @click="goList">返回</el-button>
       <el-button type="primary" @click="addData" v-if="editId==''">提交</el-button>
-      <el-button type="primary" @click="editData" v-else>修改</el-button>
+      <el-button type="primary" @click="editData" v-if="editId!=''">修改</el-button>
+      <el-button type="warning" @click="resetPassword" v-if="editId!=''">重置密码</el-button>
     </div>
   </div>
 </template>
@@ -170,6 +171,7 @@ export default {
     CityCascader, //城市级联选择器
   },
   data() {
+    let self = this;
     // 配置验证规则:用于表单验证
     const validatePassword = (rule, value, callback) => {
       if (value.length < 6) {
@@ -192,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:"",
@@ -215,7 +224,7 @@ export default {
         email:"",//电子邮箱
         other:[],//相关资料
         remark:"",//提示词
-        administrative_unit_arr_id:[0],//行政级别
+        administrative_unit_arr_id:[],//行政级别
         //企业相关字段
         fax:"",//传真
         business_name:"",//企业名称
@@ -267,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: {
@@ -515,6 +528,24 @@ export default {
         }
       })
     },
+    //重置密码
+    resetPassword(){
+      let password = Math.random().toString(36).slice(-6); // 随机生成6个字母的组合
+
+      this.$store.dispatch('userMember/resetPassword',{id:this.editId,password:password}).then(res=> {
+        if(res.code==200){
+          this.$message({
+            type: 'success',
+            message: '密码重置为:' + password
+          });
+        }
+      }).catch(() => {
+        this.$message({
+          type: 'warning',
+          message: '网络错误,请重试!'
+        });
+      })
+    },
     //编辑表单 end ------------------------------------------------------------>
     goList(){
       this.$router.push({

+ 3 - 1
src/views/role/userList.vue

@@ -58,6 +58,8 @@
             <el-table-column prop="real_name" label="用户姓名" width=""></el-table-column>
             <el-table-column prop="mobile" label="联系方式" width=""></el-table-column>
             <el-table-column prop="type_name" label="用户类型" width=""></el-table-column>
+            <el-table-column prop="role_name" label="角色类型" width=""></el-table-column>
+            <el-table-column prop="admin_real_name" label="操作人" width=""></el-table-column>
             <el-table-column prop="created_at" label="创建时间" width=""></el-table-column>
             <el-table-column prop="status" label="账号状态" width="">
               <template slot-scope="scope">
@@ -69,7 +71,7 @@
                 ></el-switch>
               </template>
             </el-table-column>
-            <el-table-column fixed="right" label="操作" width="200" header-align="center">
+            <el-table-column fixed="right" label="操作" width="100" header-align="center">
               <template slot-scope="scope">
                 <div class="listBtnBox">
                   <div class="listEditBtn" @click="goEdit(scope.row.id,scope.row.type_id)"><i class="el-icon-edit-outline"></i>编辑</div>

+ 56 - 40
src/views/website/WebsiteList.vue

@@ -16,12 +16,12 @@
             <el-cascader v-model="getApiData.website_column_id" :props="{checkStrictly:true}" :options="website_column_arr" clearable></el-cascader>
           </div>
         </el-col>
-        <el-col :span="8">
+        <!-- <el-col :span="8">
           <div class="searchBox">
-            <div class="searchTitle">网站城市:</div>
+            <div class="searchTitle">行政区划:</div>
             <CityCascader v-model="getApiData.city_arr_id" @update-city-id="updateCityId"></CityCascader>
           </div>
-        </el-col>
+        </el-col> -->
       </el-row>
       </div>
     </div>
@@ -41,7 +41,7 @@
       <el-row>
         <template>
           <el-table :data="tableData" style="width: 100%">
-            <el-table-column fixed prop="id" label="编号" width="50"></el-table-column>
+            <el-table-column fixed prop="index" label="编号" width="50"></el-table-column>
             <el-table-column prop="website_name" label="网站名称"></el-table-column>
             <el-table-column prop="column_name" label="上级网系"></el-table-column>
             <el-table-column label="网站地址">
@@ -53,7 +53,7 @@
                 </div>
               </template>
             </el-table-column>
-            <el-table-column prop="city_name" label="网站城市"></el-table-column>
+            <!-- <el-table-column prop="city_name" label="行政区划"></el-table-column> -->
             <el-table-column prop="created_at" label="创建时间"></el-table-column>
             <el-table-column prop="updated_at" label="修改时间"></el-table-column>
             <el-table-column fixed="right" label="操作" width="240" header-align="center">
@@ -61,7 +61,7 @@
                 <div class="listBtnBox">
                   <div class="listDeleteBtn" @click="deleteData(scope.row.id, tableData)"><i class="el-icon-delete"></i>移除</div>
                   <div class="listEditBtn" @click="getDataMain(scope.row.id, tableData)"><i class="el-icon-edit-outline"></i>编辑</div>
-                  <!-- <div class="listMainBtn" @click="creatWebsite(scope.row.id)"><i class="el-icon-brush"></i>搭建</div> -->
+                  <!-- <div class="listMainBtn" @click="creatWebsite(scope.row.id)"><i class="el-icon-brush"></i>模板</div> -->
                 </div>
                 <!-- <div class="listMainBtn"><i class="el-icon-view"></i>详情</div> -->
                 <!-- <el-button @click.native.prevent="deleteData(scope.row.id, tableData)" type="text" size="small">移除</el-button>
@@ -148,9 +148,9 @@
           <el-form-item label="上级网系:" :label-width="formLabelWidth" prop="website_column_arr_id" class="custom-align-right">
             <el-cascader v-model="form.website_column_arr_id" :props="{checkStrictly:true}" :options="website_column_arr"></el-cascader>
           </el-form-item>
-          <el-form-item label="城市:" :label-width="formLabelWidth" class="custom-align-right">
+          <!-- <el-form-item label="行政区划:" :label-width="formLabelWidth" prop="city_arr_id" class="custom-align-right">
             <CityCascader v-model="form.city_arr_id" @update-city-id="updateFormCityId"></CityCascader>
-          </el-form-item>
+          </el-form-item> -->
           <el-form-item label="网站logo:" prop="logo" :label-width="formLabelWidth" :class="['custom-form-item']" class="custom-align-right">
             <div class="uploaderBox">
               <!-- <el-upload class="avatar-uploader" action="#" :show-file-list="false" :before-upload="beforeAvatarUpload">
@@ -219,9 +219,8 @@
             </template>
             <el-input type="textarea" v-model="form.description" class="custom-textarea" placeholder="请输入网站描述"></el-input>
           </el-form-item>
-          <el-form-item label="模板:" :label-width="formLabelWidth" class="custom-align-right" prop="template_id">
+          <!-- <el-form-item label="模板:" :label-width="formLabelWidth" class="custom-align-right" prop="template_id">
             <div class="webSiteTemplate" @click="getTemplateList">
-              <!-- <div class="webSiteTitle"></div> -->
               <div class="webSiteTemplateImg">
                 <div>
                   <img v-if="TemplateImg" :src="TemplateImg" class="selectWebSiteTemplateImg">
@@ -233,7 +232,7 @@
                 </div>
               </div>
             </div>
-          </el-form-item>
+          </el-form-item> -->
         </div>
       </el-form>
       <div slot="footer" class="dialog-footer">
@@ -282,7 +281,7 @@ export default {
     }
     const validateColumn = (rule,value,callback) => {
       if (value.length === 0) {
-          callback(new Error('必须选择一个上级网系!'))
+          callback(new Error('该项不能为空!'))
       } else {
           callback()
       }
@@ -323,12 +322,12 @@ export default {
           {url:"",show:false}
         ],
         website_column_arr_id:[],//需要提交的上级网系 数组
-        city_arr_id:[0],//需要提交的城市id
+        //city_arr_id:[0],//需要提交的城市id
         logo:"",//logo地址 提交文件换取地址
         title:"",//需要提交的网站标题
         keywords:"",//需要提交的网站标题
         description:"",//需要提交的网站描述
-        template_id:""//选择的网站皮肤
+        //template_id:""//选择的网站皮肤
       },
       //3.2 表单验证规则
       formRules: {
@@ -342,11 +341,13 @@ export default {
         //网系不能为空 注意,因为是select框,只有提交的时候才会验证
         website_column_arr_id: [{type:'array',required:true,trigger:'change',message:'必须选择一个网系!',validator:validateColumn}],
         //网站标题,关键词,描述不能为空
+        //city_arr_id:[{required:true,trigger:'blur',validator:validateColumn}],
         title:[{required:true,trigger:'blur',validator:validateEmpty}],
         keywords:[{required:true,trigger:'blur',validator:validateEmpty}],
         description:[{required:true,trigger:'blur',validator:validateEmpty}],
+        logo:[{required:true,trigger:'blur',validator:validateEmpty}],
         logoUrl:[{required:true,trigger:'blur',validator:validateEmpty}],
-        template_id:[{required:true,trigger:'blur',validator:validateEmpty}],
+        //template_id:[{required:true,trigger:'blur',validator:validateEmpty}],
       },
       //3.3 通过api获的的数据 弹窗
       website_column_arr:[],//api获得的网系列表
@@ -384,10 +385,17 @@ export default {
       //console.log(this.getApiData)
       this.$store.dispatch('pool/getWebList',this.getApiData).then(res=> {
         let newData = [];
-        for(let item of res.data.rows){
-          if(item.city_name==null){item.city_name="--"}
-          newData.push(item)
+        //显示原有的id
+        // for(let item of res.data.rows){
+        //   if(item.city_name==null){item.city_name="--"}
+        //   newData.push(item)
+        // }
+        //显示1-10编号
+        for(let i=0;i<res.data.rows.length;i++){
+          newData[i] = res.data.rows[i];
+          newData[i].index = i+1;
         }
+        console.log(newData)
         //格式化网站地址
         // res.data.rows.forEach(item => {
         //   item.website_url = item.website_url.join(', ');
@@ -396,7 +404,7 @@ export default {
         this.allCount = res.data.count; //给与总条数
       }).catch(() => {
         this.$message({
-          type: 'info',
+          type: 'warning',
           message: '网络错误,请重试!'
         });
       })
@@ -445,7 +453,7 @@ export default {
       this.getApiData.keyword = "";
       this.getApiData.website_column_id = [];
       this.getApiData.city_id = [];
-      this.getApiData.city_arr_id = [];
+      //this.getApiData.city_arr_id = [];
       this.getApiData.page = 1;
       this.getApiData.pageSize = 10;
       this.getData();
@@ -482,7 +490,7 @@ export default {
         {url:"",show:false},
         {url:"",show:false}
       ];
-      this.form.city_arr_id = [0];
+      //this.form.city_arr_id = [0];
       this.form.logo = "";
       this.form.title = "";
       this.form.keywords = "";
@@ -553,8 +561,8 @@ export default {
     },
     //3.5 弹出框的城市选择器
     updateFormCityId(value){
-      console.log("城市ID已更新:", value);
-      this.form.city_arr_id = value;
+      //console.log("城市ID已更新:", value);
+      //this.form.city_arr_id = value;
     },
     //3.6 上传图片操作
     beforeAvatarUpload(file) {
@@ -580,7 +588,7 @@ export default {
         console.log(res.data.imgUrl)
       }).catch(() => {
         this.$message({
-          type: 'info',
+          type: 'warning',
           message: '网络错误,请重试!'
         });
       })
@@ -623,7 +631,7 @@ export default {
               this.closeWindow();
             }else{
               this.$message({
-                type: 'success',
+                type: 'error',
                 message: '添加失败!请检查网络!'
               });
               //清空并退出
@@ -632,7 +640,7 @@ export default {
             
           }).catch(() => {
             this.$message({
-              type: 'info',
+              type: 'warning',
               message: '网络错误,请重试!'
             });
           })
@@ -767,7 +775,7 @@ export default {
         }
         //回显id
         //存放城市id
-        this.form.city_arr_id = res.data.city_arr_id;
+        //this.form.city_arr_id = res.data.city_arr_id;
         //当cascaderKey的值改变的时候 级联选择器会重置里面的内容
         //this.cascaderKey += 1;
         //回显网站标题,描述,关键词
@@ -776,9 +784,9 @@ export default {
         this.form.keywords = res.data.keywords;
         this.form.description = res.data.description;
         //回显模板信息
-        this.form.template_id = res.data.template_id;
-        this.TemplateName = res.data.template_name;
-        this.TemplateImg = JSON.parse(res.data.template_img)[0];
+        // this.form.template_id = res.data.template_id;
+        // this.TemplateName = res.data.template_name;
+        // this.TemplateImg = JSON.parse(res.data.template_img)[0];
       })
 
       this.editBtn = true;//显示编辑按钮
@@ -800,15 +808,23 @@ export default {
           this.form.id = this.editId;
           //提交表单
           this.$store.dispatch('pool/updateWebsite',this.form).then(res=> {
-            //汇报结果
-            this.$message({
-              type: 'success',
-              message: '已成功修改网站信息!'
-            });
-            //清空并退出
-            this.closeWindow();
-            //重新请求列表
-            this.getData();
+            console.log(res.code)
+            if(res.code==200){
+              //汇报结果
+              this.$message({
+                type: 'success',
+                message: '已成功修改网站信息!'
+              });
+              //清空并退出
+              this.closeWindow();
+              //重新请求列表
+              this.getData();
+            }else{
+              this.$message.error('修改失败!')
+              //清空并退出
+              this.closeWindow();
+            }
+            
           }).catch(() => {
             this.$message({
               type: 'warning',
@@ -823,7 +839,7 @@ export default {
     //6.搭建网站 start ------------------------------------------------------------>
     creatWebsite(id){
       this.$router.push({ 
-        path: '/creatWebsite', 
+        path: '/templateBase', 
         query: {id:id} 
       });
     } 

+ 22 - 6
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 ------------------------------------------------------------>
@@ -300,7 +302,7 @@ export default {
       formRules: {
         //网站名称不能为空
         name:[{required:true,trigger:'blur',validator:validateEmpty}],//导航池名称不能为空
-        web_url:[{required:true,trigger:'blur',validator:validateEmpty}],//外链地址���能为空
+        web_url:[{required:true,trigger:'blur',validator:validateEmpty}],//外链地址能为空
         department_arr_id: [{type:'array',required:true,trigger:'change',message:'请选择职能部门!',validator:validateDepartment}],
         city_arr_id: [{type:'array',required:true,trigger:'change',message:'请选择行政区划!',validator:validateCity}],
         //pid_arr: [{type:'array',required:true,trigger:'change',message:'请选择父级导航!',validator:validatePid}],
@@ -339,7 +341,7 @@ export default {
       //获取职能部门
       departmentKey:0,//弹窗用的key
       departmentData: {
-        checkStrictly: true,
+        checkStrictly: true,//父级不可选
         lazy: true,
         async lazyLoad (node, resolve) {
           const { level, data } = node;
@@ -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;
@@ -635,7 +644,13 @@ export default {
     },
     //修改表单
     editToServe(){
-
+      //防止提交[1,1]这种重复的数据
+      if (this.form.department_arr_id.length > 1) {
+        const lastIndex = this.form.department_arr_id.length - 1;
+        if (this.form.department_arr_id[lastIndex] === this.form.department_arr_id[lastIndex - 1]) {
+          this.form.department_arr_id.pop(); // Remove the last element if it's the same as the previous one
+        }
+      }
       this.form.id = this.editId;
       this.$refs.form.validate(valid => {
         if (valid) {
@@ -668,6 +683,7 @@ export default {
     //this.getwebsiteColumn();
     //本地转换id为文字
     //console.log(getLocationNameById("110000"))
+    this.getAllDepartment();
   }
 }
 </script>