From 50db7ad27e1171c86d43d743e0a5ed0e8ed2b8e3 Mon Sep 17 00:00:00 2001
From: ali <ali9696@163.com>
Date: 星期四, 13 二月 2025 17:36:28 +0800
Subject: [PATCH] 屏蔽密码、个人信息、头像的修改提交

---
 zhitan-vue/src/views/system/user/profile/index.vue      |  152 +++++++++---------
 zhitan-vue/src/views/system/user/profile/userInfo.vue   |   98 ++++++-----
 zhitan-vue/src/views/system/user/profile/resetPwd.vue   |   71 ++++----
 zhitan-vue/src/views/system/user/profile/userAvatar.vue |  101 ++++++------
 4 files changed, 218 insertions(+), 204 deletions(-)

diff --git a/zhitan-vue/src/views/system/user/profile/index.vue b/zhitan-vue/src/views/system/user/profile/index.vue
index e34c98b..56ba9bc 100644
--- a/zhitan-vue/src/views/system/user/profile/index.vue
+++ b/zhitan-vue/src/views/system/user/profile/index.vue
@@ -1,87 +1,89 @@
 <template>
-   <div class="app-container">
-      <el-row :gutter="20">
-         <el-col :span="6" :xs="24">
-            <el-card class="box-card">
-               <template v-slot:header>
-                 <div class="clearfix">
-                   <span>涓汉淇℃伅</span>
-                 </div>
-               </template>
-               <div>
-                  <div class="text-center">
-                     <userAvatar />
-                  </div>
-                  <ul class="list-group list-group-striped">
-                     <li class="list-group-item">
-                        <svg-icon icon-class="user" />鐢ㄦ埛鍚嶇О
-                        <div class="pull-right">{{ state.user.userName }}</div>
-                     </li>
-                     <li class="list-group-item">
-                        <svg-icon icon-class="phone" />鎵嬫満鍙风爜
-                        <div class="pull-right">{{ state.user.phoneNumber }}</div>
-                     </li>
-                     <li class="list-group-item">
-                        <svg-icon icon-class="email" />鐢ㄦ埛閭
-                        <div class="pull-right">{{ state.user.email }}</div>
-                     </li>
-                     <li class="list-group-item">
-                        <svg-icon icon-class="tree" />鎵�灞為儴闂�
-                        <div class="pull-right" v-if="state.user.dept">{{ state.user.dept.deptName }} / {{ state.postGroup }}</div>
-                     </li>
-                     <li class="list-group-item">
-                        <svg-icon icon-class="peoples" />鎵�灞炶鑹�
-                        <div class="pull-right">{{ state.roleGroup }}</div>
-                     </li>
-                     <li class="list-group-item">
-                        <svg-icon icon-class="date" />鍒涘缓鏃ユ湡
-                        <div class="pull-right">{{ state.user.createTime }}</div>
-                     </li>
-                  </ul>
-               </div>
-            </el-card>
-         </el-col>
-         <el-col :span="18" :xs="24">
-            <el-card>
-               <template v-slot:header>
-                 <div class="clearfix">
-                   <span>鍩烘湰璧勬枡</span>
-                 </div>
-               </template>
-               <el-tabs v-model="activeTab">
-                  <el-tab-pane label="鍩烘湰璧勬枡" name="userinfo">
-                     <userInfo :user="state.user" />
-                  </el-tab-pane>
-                  <el-tab-pane label="淇敼瀵嗙爜" name="resetPwd">
-                     <resetPwd />
-                  </el-tab-pane>
-               </el-tabs>
-            </el-card>
-         </el-col>
-      </el-row>
-   </div>
+  <div class="app-container">
+    <el-row :gutter="20">
+      <el-col :span="6" :xs="24">
+        <el-card class="box-card">
+          <template v-slot:header>
+            <div class="clearfix">
+              <span>涓汉淇℃伅</span>
+            </div>
+          </template>
+          <div>
+            <div class="text-center">
+              <userAvatar />
+            </div>
+            <ul class="list-group list-group-striped">
+              <li class="list-group-item">
+                <svg-icon icon-class="user" />鐢ㄦ埛鍚嶇О
+                <div class="pull-right">{{ state.user.userName }}</div>
+              </li>
+              <li class="list-group-item">
+                <svg-icon icon-class="phone" />鎵嬫満鍙风爜
+                <div class="pull-right">{{ state.user.phoneNumber }}</div>
+              </li>
+              <li class="list-group-item">
+                <svg-icon icon-class="email" />鐢ㄦ埛閭
+                <div class="pull-right">{{ state.user.email }}</div>
+              </li>
+              <li class="list-group-item">
+                <svg-icon icon-class="tree" />鎵�灞為儴闂�
+                <div class="pull-right" v-if="state.user.dept">
+                  {{ state.user.dept.deptName }} / {{ state.postGroup }}
+                </div>
+              </li>
+              <li class="list-group-item">
+                <svg-icon icon-class="peoples" />鎵�灞炶鑹�
+                <div class="pull-right">{{ state.roleGroup }}</div>
+              </li>
+              <li class="list-group-item">
+                <svg-icon icon-class="date" />鍒涘缓鏃ユ湡
+                <div class="pull-right">{{ state.user.createTime }}</div>
+              </li>
+            </ul>
+          </div>
+        </el-card>
+      </el-col>
+      <el-col :span="18" :xs="24">
+        <el-card>
+          <template v-slot:header>
+            <div class="clearfix">
+              <span>鍩烘湰璧勬枡</span>
+            </div>
+          </template>
+          <el-tabs v-model="activeTab">
+            <el-tab-pane label="鍩烘湰璧勬枡" name="userinfo">
+              <userInfo :user="state.user" />
+            </el-tab-pane>
+            <el-tab-pane label="淇敼瀵嗙爜" name="resetPwd">
+              <resetPwd />
+            </el-tab-pane>
+          </el-tabs>
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
 </template>
 
 <script setup name="Profile">
-import userAvatar from "./userAvatar";
-import userInfo from "./userInfo";
-import resetPwd from "./resetPwd";
-import { getUserProfile } from "@/api/system/user";
+import userAvatar from "./userAvatar"
+import userInfo from "./userInfo"
+import resetPwd from "./resetPwd"
+import { getUserProfile } from "@/api/system/user"
 
-const activeTab = ref("userinfo");
+const activeTab = ref("userinfo")
 const state = reactive({
   user: {},
   roleGroup: {},
-  postGroup: {}
-});
+  postGroup: {},
+})
 
 function getUser() {
-  getUserProfile().then(response => {
-    state.user = response.data;
-    state.roleGroup = response.roleGroup;
-    state.postGroup = response.postGroup;
-  });
-};
+  getUserProfile().then((response) => {
+    state.user = response.data
+    state.roleGroup = response.roleGroup
+    state.postGroup = response.postGroup
+  })
+}
 
-getUser();
+getUser()
 </script>
diff --git a/zhitan-vue/src/views/system/user/profile/resetPwd.vue b/zhitan-vue/src/views/system/user/profile/resetPwd.vue
index 96daef3..f4ab06f 100644
--- a/zhitan-vue/src/views/system/user/profile/resetPwd.vue
+++ b/zhitan-vue/src/views/system/user/profile/resetPwd.vue
@@ -1,57 +1,64 @@
 <template>
-   <el-form ref="pwdRef" :model="user" :rules="rules" label-width="80px">
-      <el-form-item label="鏃у瘑鐮�" prop="oldPassword">
-         <el-input v-model="user.oldPassword" placeholder="璇疯緭鍏ユ棫瀵嗙爜" type="password" show-password />
-      </el-form-item>
-      <el-form-item label="鏂板瘑鐮�" prop="newPassword">
-         <el-input v-model="user.newPassword" placeholder="璇疯緭鍏ユ柊瀵嗙爜" type="password" show-password />
-      </el-form-item>
-      <el-form-item label="纭瀵嗙爜" prop="confirmPassword">
-         <el-input v-model="user.confirmPassword" placeholder="璇风‘璁ゆ柊瀵嗙爜" type="password" show-password/>
-      </el-form-item>
-      <el-form-item>
-      <el-button type="primary" @click="submit">淇濆瓨</el-button>
+  <el-form ref="pwdRef" :model="user" :rules="rules" label-width="80px">
+    <el-form-item label="鏃у瘑鐮�" prop="oldPassword">
+      <el-input v-model="user.oldPassword" placeholder="璇疯緭鍏ユ棫瀵嗙爜" type="password" show-password />
+    </el-form-item>
+    <el-form-item label="鏂板瘑鐮�" prop="newPassword">
+      <el-input v-model="user.newPassword" placeholder="璇疯緭鍏ユ柊瀵嗙爜" type="password" show-password />
+    </el-form-item>
+    <el-form-item label="纭瀵嗙爜" prop="confirmPassword">
+      <el-input v-model="user.confirmPassword" placeholder="璇风‘璁ゆ柊瀵嗙爜" type="password" show-password />
+    </el-form-item>
+    <el-form-item>
+      <!-- <el-button type="primary" @click="submit">淇濆瓨</el-button> -->
       <el-button type="danger" @click="close">鍏抽棴</el-button>
-      </el-form-item>
-   </el-form>
+    </el-form-item>
+  </el-form>
 </template>
 
 <script setup>
-import { updateUserPwd } from "@/api/system/user";
+import { updateUserPwd } from "@/api/system/user"
 
-const { proxy } = getCurrentInstance();
+const { proxy } = getCurrentInstance()
 
 const user = reactive({
   oldPassword: undefined,
   newPassword: undefined,
-  confirmPassword: undefined
-});
+  confirmPassword: undefined,
+})
 
 const equalToPassword = (rule, value, callback) => {
   if (user.newPassword !== value) {
-    callback(new Error("涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�"));
+    callback(new Error("涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�"))
   } else {
-    callback();
+    callback()
   }
-};
+}
 const rules = ref({
   oldPassword: [{ required: true, message: "鏃у瘑鐮佷笉鑳戒负绌�", trigger: "blur" }],
-  newPassword: [{ required: true, message: "鏂板瘑鐮佷笉鑳戒负绌�", trigger: "blur" }, { min: 6, max: 20, message: "闀垮害鍦� 6 鍒� 20 涓瓧绗�", trigger: "blur" }, { pattern: /^[^<>"'|\\]+$/, message: "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |", trigger: "blur" }],
-  confirmPassword: [{ required: true, message: "纭瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" }, { required: true, validator: equalToPassword, trigger: "blur" }]
-});
+  newPassword: [
+    { required: true, message: "鏂板瘑鐮佷笉鑳戒负绌�", trigger: "blur" },
+    { min: 6, max: 20, message: "闀垮害鍦� 6 鍒� 20 涓瓧绗�", trigger: "blur" },
+    { pattern: /^[^<>"'|\\]+$/, message: "涓嶈兘鍖呭惈闈炴硶瀛楃锛�< > \" ' \\\ |", trigger: "blur" },
+  ],
+  confirmPassword: [
+    { required: true, message: "纭瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" },
+    { required: true, validator: equalToPassword, trigger: "blur" },
+  ],
+})
 
 /** 鎻愪氦鎸夐挳 */
 function submit() {
-  proxy.$refs.pwdRef.validate(valid => {
+  proxy.$refs.pwdRef.validate((valid) => {
     if (valid) {
-      updateUserPwd(user.oldPassword, user.newPassword).then(response => {
-        proxy.$modal.msgSuccess("淇敼鎴愬姛");
-      });
+      updateUserPwd(user.oldPassword, user.newPassword).then((response) => {
+        proxy.$modal.msgSuccess("淇敼鎴愬姛")
+      })
     }
-  });
-};
+  })
+}
 /** 鍏抽棴鎸夐挳 */
 function close() {
-  proxy.$tab.closePage();
-};
+  proxy.$tab.closePage()
+}
 </script>
diff --git a/zhitan-vue/src/views/system/user/profile/userAvatar.vue b/zhitan-vue/src/views/system/user/profile/userAvatar.vue
index 3b39636..94b898e 100644
--- a/zhitan-vue/src/views/system/user/profile/userAvatar.vue
+++ b/zhitan-vue/src/views/system/user/profile/userAvatar.vue
@@ -26,12 +26,7 @@
       <br />
       <el-row>
         <el-col :lg="2" :md="2">
-          <el-upload
-            action="#"
-            :http-request="requestUpload"
-            :show-file-list="false"
-            :before-upload="beforeUpload"
-          >
+          <el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload">
             <el-button>
               閫夋嫨
               <el-icon class="el-icon--right"><Upload /></el-icon>
@@ -51,7 +46,7 @@
           <el-button icon="RefreshRight" @click="rotateRight()"></el-button>
         </el-col>
         <el-col :lg="{ span: 2, offset: 6 }" :md="2">
-          <el-button type="primary" @click="uploadImg()">鎻� 浜�</el-button>
+          <!-- <el-button type="primary" @click="uploadImg()">鎻� 浜�</el-button> -->
         </el-col>
       </el-row>
     </el-dialog>
@@ -59,92 +54,92 @@
 </template>
 
 <script setup>
-import "vue-cropper/dist/index.css";
-import { VueCropper } from "vue-cropper";
-import { uploadAvatar } from "@/api/system/user";
-import useUserStore from "@/store/modules/user";
+import "vue-cropper/dist/index.css"
+import { VueCropper } from "vue-cropper"
+import { uploadAvatar } from "@/api/system/user"
+import useUserStore from "@/store/modules/user"
 
-const userStore = useUserStore();
-const { proxy } = getCurrentInstance();
+const userStore = useUserStore()
+const { proxy } = getCurrentInstance()
 
-const open = ref(false);
-const visible = ref(false);
-const title = ref("淇敼澶村儚");
+const open = ref(false)
+const visible = ref(false)
+const title = ref("淇敼澶村儚")
 
 //鍥剧墖瑁佸壀鏁版嵁
 const options = reactive({
-  img: userStore.avatar,     // 瑁佸壀鍥剧墖鐨勫湴鍧�
-  autoCrop: true,            // 鏄惁榛樿鐢熸垚鎴浘妗�
-  autoCropWidth: 200,        // 榛樿鐢熸垚鎴浘妗嗗搴�
-  autoCropHeight: 200,       // 榛樿鐢熸垚鎴浘妗嗛珮搴�
-  fixedBox: true,            // 鍥哄畾鎴浘妗嗗ぇ灏� 涓嶅厑璁告敼鍙�
-  outputType: "png",         // 榛樿鐢熸垚鎴浘涓篜NG鏍煎紡
-  filename: 'avatar',        // 鏂囦欢鍚嶇О
-  previews: {}               //棰勮鏁版嵁
-});
+  img: userStore.avatar, // 瑁佸壀鍥剧墖鐨勫湴鍧�
+  autoCrop: true, // 鏄惁榛樿鐢熸垚鎴浘妗�
+  autoCropWidth: 200, // 榛樿鐢熸垚鎴浘妗嗗搴�
+  autoCropHeight: 200, // 榛樿鐢熸垚鎴浘妗嗛珮搴�
+  fixedBox: true, // 鍥哄畾鎴浘妗嗗ぇ灏� 涓嶅厑璁告敼鍙�
+  outputType: "png", // 榛樿鐢熸垚鎴浘涓篜NG鏍煎紡
+  filename: "avatar", // 鏂囦欢鍚嶇О
+  previews: {}, //棰勮鏁版嵁
+})
 
 /** 缂栬緫澶村儚 */
 function editCropper() {
-  open.value = true;
+  open.value = true
 }
 /** 鎵撳紑寮瑰嚭灞傜粨鏉熸椂鐨勫洖璋� */
 function modalOpened() {
-  visible.value = true;
+  visible.value = true
 }
 /** 瑕嗙洊榛樿涓婁紶琛屼负 */
 function requestUpload() {}
 /** 鍚戝乏鏃嬭浆 */
 function rotateLeft() {
-  proxy.$refs.cropper.rotateLeft();
+  proxy.$refs.cropper.rotateLeft()
 }
 /** 鍚戝彸鏃嬭浆 */
 function rotateRight() {
-  proxy.$refs.cropper.rotateRight();
+  proxy.$refs.cropper.rotateRight()
 }
 /** 鍥剧墖缂╂斁 */
 function changeScale(num) {
-  num = num || 1;
-  proxy.$refs.cropper.changeScale(num);
+  num = num || 1
+  proxy.$refs.cropper.changeScale(num)
 }
 /** 涓婁紶棰勫鐞� */
 function beforeUpload(file) {
   if (file.type.indexOf("image/") == -1) {
-    proxy.$modal.msgError("鏂囦欢鏍煎紡閿欒锛岃涓婁紶鍥剧墖绫诲瀷,濡傦細JPG锛孭NG鍚庣紑鐨勬枃浠躲��");
+    proxy.$modal.msgError("鏂囦欢鏍煎紡閿欒锛岃涓婁紶鍥剧墖绫诲瀷,濡傦細JPG锛孭NG鍚庣紑鐨勬枃浠躲��")
   } else {
-    const reader = new FileReader();
-    reader.readAsDataURL(file);
+    const reader = new FileReader()
+    reader.readAsDataURL(file)
     reader.onload = () => {
-      options.img = reader.result;
-      options.filename = file.name;
-    };
+      options.img = reader.result
+      options.filename = file.name
+    }
   }
 }
 /** 涓婁紶鍥剧墖 */
 function uploadImg() {
-  proxy.$refs.cropper.getCropBlob(data => {
-    let formData = new FormData();
-    formData.append("avatarfile", data, options.filename);
-    uploadAvatar(formData).then(response => {
-      open.value = false;
-      options.img = import.meta.env.VITE_APP_BASE_API + response.imgUrl;
-      userStore.avatar = options.img;
-      proxy.$modal.msgSuccess("淇敼鎴愬姛");
-      visible.value = false;
-    });
-  });
+  proxy.$refs.cropper.getCropBlob((data) => {
+    let formData = new FormData()
+    formData.append("avatarfile", data, options.filename)
+    uploadAvatar(formData).then((response) => {
+      open.value = false
+      options.img = import.meta.env.VITE_APP_BASE_API + response.imgUrl
+      userStore.avatar = options.img
+      proxy.$modal.msgSuccess("淇敼鎴愬姛")
+      visible.value = false
+    })
+  })
 }
 /** 瀹炴椂棰勮 */
 function realTime(data) {
-  options.previews = data;
+  options.previews = data
 }
 /** 鍏抽棴绐楀彛 */
 function closeDialog() {
-  options.img = userStore.avatar;
-  options.visible = false;
+  options.img = userStore.avatar
+  options.visible = false
 }
 </script>
 
-<style lang='scss' scoped>
+<style lang="scss" scoped>
 .user-info-head {
   position: relative;
   display: inline-block;
@@ -168,4 +163,4 @@
   line-height: 110px;
   border-radius: 50%;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/zhitan-vue/src/views/system/user/profile/userInfo.vue b/zhitan-vue/src/views/system/user/profile/userInfo.vue
index f1d67b5..187c02e 100644
--- a/zhitan-vue/src/views/system/user/profile/userInfo.vue
+++ b/zhitan-vue/src/views/system/user/profile/userInfo.vue
@@ -1,67 +1,77 @@
 <template>
-   <el-form ref="userRef" :model="form" :rules="rules" label-width="80px">
-      <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
-         <el-input v-model="form.nickName" maxlength="30" />
-      </el-form-item>
-      <el-form-item label="鎵嬫満鍙风爜" prop="phoneNumber">
-         <el-input v-model="form.phoneNumber" maxlength="11" />
-      </el-form-item>
-      <el-form-item label="閭" prop="email">
-         <el-input v-model="form.email" maxlength="50" />
-      </el-form-item>
-      <el-form-item label="鎬у埆">
-         <el-radio-group v-model="form.sex">
-            <el-radio label="0">鐢�</el-radio>
-            <el-radio label="1">濂�</el-radio>
-         </el-radio-group>
-      </el-form-item>
-      <el-form-item>
-      <el-button type="primary" @click="submit">淇濆瓨</el-button>
+  <el-form ref="userRef" :model="form" :rules="rules" label-width="80px">
+    <el-form-item label="鐢ㄦ埛鏄电О" prop="nickName">
+      <el-input v-model="form.nickName" maxlength="30" />
+    </el-form-item>
+    <el-form-item label="鎵嬫満鍙风爜" prop="phoneNumber">
+      <el-input v-model="form.phoneNumber" maxlength="11" />
+    </el-form-item>
+    <el-form-item label="閭" prop="email">
+      <el-input v-model="form.email" maxlength="50" />
+    </el-form-item>
+    <el-form-item label="鎬у埆">
+      <el-radio-group v-model="form.sex">
+        <el-radio label="0">鐢�</el-radio>
+        <el-radio label="1">濂�</el-radio>
+      </el-radio-group>
+    </el-form-item>
+    <el-form-item>
+      <!-- <el-button type="primary" @click="submit">淇濆瓨</el-button> -->
       <el-button type="danger" @click="close">鍏抽棴</el-button>
-      </el-form-item>
-   </el-form>
+    </el-form-item>
+  </el-form>
 </template>
 
 <script setup>
-import { updateUserProfile } from "@/api/system/user";
+import { updateUserProfile } from "@/api/system/user"
 
 const props = defineProps({
   user: {
-    type: Object
-  }
-});
+    type: Object,
+  },
+})
 
-const { proxy } = getCurrentInstance();
+const { proxy } = getCurrentInstance()
 
-const form = ref({});
+const form = ref({})
 const rules = ref({
   nickName: [{ required: true, message: "鐢ㄦ埛鏄电О涓嶈兘涓虹┖", trigger: "blur" }],
-  email: [{ required: true, message: "閭鍦板潃涓嶈兘涓虹┖", trigger: "blur" }, { type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] }],
-  phoneNumber: [{ required: true, message: "鎵嬫満鍙风爜涓嶈兘涓虹┖", trigger: "blur" }, { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" }],
-});
+  email: [
+    { required: true, message: "閭鍦板潃涓嶈兘涓虹┖", trigger: "blur" },
+    { type: "email", message: "璇疯緭鍏ユ纭殑閭鍦板潃", trigger: ["blur", "change"] },
+  ],
+  phoneNumber: [
+    { required: true, message: "鎵嬫満鍙风爜涓嶈兘涓虹┖", trigger: "blur" },
+    { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: "璇疯緭鍏ユ纭殑鎵嬫満鍙风爜", trigger: "blur" },
+  ],
+})
 
 /** 鎻愪氦鎸夐挳 */
 function submit() {
-  proxy.$refs.userRef.validate(valid => {
+  proxy.$refs.userRef.validate((valid) => {
     if (valid) {
-      updateUserProfile(form.value).then(response => {
-        proxy.$modal.msgSuccess("淇敼鎴愬姛");
-        props.user.phoneNumber = form.value.phoneNumber;
-        props.user.email = form.value.email;
-      });
+      updateUserProfile(form.value).then((response) => {
+        proxy.$modal.msgSuccess("淇敼鎴愬姛")
+        props.user.phoneNumber = form.value.phoneNumber
+        props.user.email = form.value.email
+      })
     }
-  });
-};
+  })
+}
 
 /** 鍏抽棴鎸夐挳 */
 function close() {
-  proxy.$tab.closePage();
-};
+  proxy.$tab.closePage()
+}
 
 // 鍥炴樉褰撳墠鐧诲綍鐢ㄦ埛淇℃伅
-watch(() => props.user, user => {
-  if (user) {
-    form.value = { nickName: user.nickName, phoneNumber: user.phoneNumber, email: user.email, sex: user.sex };
-  }
-},{ immediate: true });
+watch(
+  () => props.user,
+  (user) => {
+    if (user) {
+      form.value = { nickName: user.nickName, phoneNumber: user.phoneNumber, email: user.email, sex: user.sex }
+    }
+  },
+  { immediate: true }
+)
 </script>

--
Gitblit v1.9.3