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