From c090cd7b022216cc5c84ccbe7cd66d9f6ff5aaa1 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期四, 31 十月 2024 20:03:22 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/personal-center/index.vue |  212 ++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 184 insertions(+), 28 deletions(-)

diff --git a/src/views/personal-center/index.vue b/src/views/personal-center/index.vue
index 26980b4..b50c891 100644
--- a/src/views/personal-center/index.vue
+++ b/src/views/personal-center/index.vue
@@ -23,12 +23,12 @@
                   ref="fileHeadPortrait"
                   id="fileHeadPortrait"
                 />
-                  <img
-                    class="img"
-                    id="headPortrait"
-                    @click="uploadImage"
-                    :src="'api/files/' + userData.imagePath"
-                  />
+                <img
+                  class="img"
+                  id="headPortrait"
+                  @click="uploadImage"
+                  :src="userData.imagePath?'api/files/' + userData.imagePath:'/static/icons/touxiang.png'"
+                />
                 <span>{{ userData.userName }}</span>
               </div>
               <div>
@@ -40,7 +40,7 @@
                     {{ userData.className.join(",") }}
                   </el-form-item>
                   <el-form-item label="娉ㄥ唽鏃堕棿">
-                    {{ timestampToDate(userData.createTime) }}
+                    {{ userData.createTime }}
                   </el-form-item>
                 </el-form>
               </div>
@@ -55,9 +55,11 @@
                   :model="informationForm"
                   label-width="auto"
                   style="max-width: 600px"
+                  :rules="informationRules"
+                  ref="informationFormRef"
                 >
-                  <el-form-item label="鐪熷疄濮撳悕">
-                    <el-input v-model="informationForm.name" />
+                  <el-form-item label="鐪熷疄濮撳悕" prop="realName">
+                    <el-input v-model="informationForm.realName" />
                   </el-form-item>
                   <el-form-item label="骞撮緞">
                     <el-input v-model="informationForm.age" />
@@ -67,8 +69,8 @@
                       v-model="informationForm.sex"
                       style="width: 100px"
                     >
-                      <el-option label="鐢�" value="1" />
-                      <el-option label="濂�" value="2" />
+                      <el-option label="鐢�" :value="1" />
+                      <el-option label="濂�" :value="2" />
                     </el-select>
                   </el-form-item>
                   <el-form-item label="鍑虹敓骞存湀">
@@ -76,28 +78,59 @@
                       v-model="informationForm.birthDay"
                       type="date"
                       placeholder="Pick a day"
-                      :size="size"
                     />
                   </el-form-item>
-                  <el-form-item label="鎵嬫満">
-                    <el-input
-                      v-model="informationForm.phone"
-                    /> </el-form-item></el-form
-              ></el-tab-pane>
+                  <el-form-item label="鎵嬫満" prop="phone">
+                    <el-input v-model="informationForm.phone" />
+                  </el-form-item>
+                  <el-form-item>
+                    <div class="submit-box">
+                      <el-button
+                        type="primary"
+                        @click="informationSubmit(informationFormRef)"
+                        >鏇存柊</el-button
+                      >
+                    </div>
+                  </el-form-item></el-form
+                ></el-tab-pane
+              >
               <el-tab-pane label="瀵嗙爜淇敼" name="password">
                 <el-form
                   :model="passwordForm"
                   label-width="auto"
                   style="max-width: 600px"
+                  :rules="passwordRules"
+                  ref="passwordFormRef"
                 >
-                  <el-form-item label="鏃у瘑鐮�">
-                    <el-input v-model="passwordForm.name" />
+                  <el-form-item label="鏃у瘑鐮�" prop="oldPassword">
+                    <el-input
+                      v-model="passwordForm.oldPassword"
+                      type="password"
+                      show-password
+                    />
                   </el-form-item>
-                  <el-form-item label="鏂板瘑鐮�">
-                    <el-input v-model="passwordForm.name" />
+                  <el-form-item label="鏂板瘑鐮�" prop="newPassword">
+                    <el-input
+                      v-model="passwordForm.newPassword"
+                      type="password"
+                      show-password
+                    />
                   </el-form-item>
-                  <el-form-item label="纭瀵嗙爜">
-                    <el-input v-model="passwordForm.name" />
+                  <el-form-item label="纭瀵嗙爜" prop="newPasswordA">
+                    <el-input
+                      v-model="passwordForm.newPasswordA"
+                      type="password"
+                      show-password
+                    />
+                  </el-form-item>
+                  <el-form-item>
+                    <div class="submit-box">
+                      <el-button
+                        type="primary"
+                        @click="passwordSubmit(passwordFormRef)"
+                        >淇濆瓨</el-button
+                      >
+                    </div>
                   </el-form-item>
                 </el-form>
               </el-tab-pane>
@@ -111,19 +144,73 @@
 
 <script setup>
 import { ref } from "vue";
-import { uploadImg } from "@/api/modules/personalCenter.js";
+import { uploadImg, userUpdate,passwordUpdate } from "@/api/modules/personalCenter.js";
 import { ElMessage } from "element-plus";
 
 const activeName = ref("information");
 const userData = ref(JSON.parse(localStorage.getItem("user")).userInfo);
+const informationFormRef = ref();
+const passwordFormRef = ref();
 const informationForm = ref({
-  name: userData.value.realName,
+  realName: userData.value.realName,
   sex: userData.value.sex,
   age: userData.value.age,
   phone: userData.value.phone,
   birthDay: userData.value.birthDay,
 });
-const passwordForm = ref({ name: "" });
+const passwordForm = ref({
+  oldPassword: "",
+  newPassword: "",
+  newPasswordA: "",
+});
+// 鎵嬫満鍙烽獙璇侀�昏緫
+const validatePhone = (rule, value, callback) => {
+  const phoneRegex = /^1[3-9]\d{9}$/;
+  if (!phoneRegex.test(value)) {
+    callback(new Error("鎵嬫満鍙锋牸寮忎笉姝g‘"));
+  } else {
+    callback();
+  }
+};
+const validatePassword = (rule, value, callback) => {
+  if (!/[A-Z]/.test(value)) {
+    callback(new Error("瀵嗙爜蹇呴』鍖呭惈鑷冲皯涓�涓ぇ鍐欏瓧姣�"));
+  } else if (!/[a-z]/.test(value)) {
+    callback(new Error("瀵嗙爜蹇呴』鍖呭惈鑷冲皯涓�涓皬鍐欏瓧姣�"));
+  } else if (!/[0-9]/.test(value)) {
+    callback(new Error("瀵嗙爜蹇呴』鍖呭惈鑷冲皯涓�涓暟瀛�"));
+  } else {
+    callback();
+  }
+};
+const validatePasswordA = (rule, value, callback) => {
+  if (value !== passwordForm.value.newPassword) {
+    callback(new Error("涓ゆ杈撳叆瀵嗙爜涓嶅悓锛�"));
+  } else {
+    callback();
+  }
+};
+const informationRules = {
+  realName: [{ required: true, message: "璇峰~鍐欑湡瀹炲鍚�", trigger: "blur" }],
+  phone: [
+    { validator: validatePhone, trigger: "blur" },
+    { required: true, message: "璇疯緭鍏ユ墜鏈哄彿", trigger: "blur" },
+  ],
+};
+const passwordRules = {
+  oldPassword: [
+    { validator: validatePassword, trigger: "blur" },
+    { required: true, message: "璇疯緭鍏ユ棫瀵嗙爜", trigger: "blur" },
+  ],
+  newPassword: [
+    { validator: validatePasswordA, trigger: "blur" },
+    { required: true, message: "璇疯緭鍏ユ柊瀵嗙爜", trigger: "blur" },
+  ],
+  newPasswordA: [
+    { validator: validatePasswordA, trigger: "blur" },
+    { required: true, message: "璇疯緭鍏ュ啀娆¤緭鍏ユ柊瀵嗙爜", trigger: "blur" },
+  ],
+};
 //澶村儚涓婁紶
 let formData = new FormData();
 const uploadImage = () => {
@@ -158,10 +245,73 @@
     );
   }
 };
+const informationSubmit = async (formEl) => {
+  if (!formEl) return;
+  await formEl.validate((valid, fields) => {
+    if (valid) {
+      informationForm.value.birthDay = timestampToDate(
+        informationForm.value.birthDay
+      );
+      userUpdate(informationForm.value).then(
+        () => {
+          ElMessage({
+            showClose: true,
+            message: "鏇存柊鎴愬姛",
+            type: "success",
+          });
+          const newData = JSON.parse(localStorage.getItem("user"));
+          newData.userInfo.realName = informationForm.value.realName;
+          newData.userInfo.sex = informationForm.value.sex;
+          newData.userInfo.age = informationForm.value.age;
+          newData.userInfo.phone = informationForm.value.phone;
+          newData.userInfo.birthDay = informationForm.value.birthDay;
+          localStorage.setItem("user", JSON.stringify(newData));
+        },
+        (err) => {
+          ElMessage.error(err.data.errorMsg);
+        }
+      );
+    } else {
+      console.log("error submit!", fields);
+    }
+  });
+};
+const passwordSubmit = async (formEl) => {
+  if (!formEl) return;
+  await formEl.validate((valid, fields) => {
+    if (valid) {
+      let data = {
+        userId:userData.value.id,
+        newPassword:passwordForm.value.newPassword,
+        oldPassword:passwordForm.value.oldPassword,
+      }
+      passwordUpdate(data).then(
+        () => {
+          ElMessage({
+            showClose: true,
+            message: "淇敼鎴愬姛",
+            type: "success",
+          });
+        },
+        (err) => {
+          ElMessage.error(err.data.errorMsg);
+        }
+      );
+    } else {
+      console.log("error submit!", fields);
+    }
+  });
+};
 function timestampToDate(timestamp) {
   const date = new Date(timestamp); // 灏嗘椂闂存埑杞崲涓篋ate瀵硅薄
-  const options = { year: "numeric", month: "long", day: "numeric" }; // 瀹氫箟鏃ユ湡鏍煎紡
-  return new Intl.DateTimeFormat("zh-CN", options).format(date); // 浣跨敤Intl.DateTimeFormat杩涜鏍煎紡鍖�
+  const year = date.getFullYear();
+  const month = date.getMonth() + 1; // 鏈堜唤浠�0寮�濮嬶紝鎵�浠ヨ鍔�1
+  const day = date.getDate();
+  const hours = date.getHours();
+  const minutes = date.getMinutes();
+  const seconds = date.getSeconds();
+  const convertedTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+  return convertedTime; // 浣跨敤Intl.DateTimeFormat杩涜鏍煎紡鍖�
 }
 </script>
 
@@ -192,4 +342,10 @@
   overflow: hidden;
   object-fit: cover;
 }
+.submit-box {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  width: 100%;
+}
 </style>

--
Gitblit v1.8.0