From 4506560a9de9c54e5b41cdc46c3ca84bf234386e Mon Sep 17 00:00:00 2001
From: kongdeqiang <123456>
Date: 星期六, 21 三月 2026 15:05:31 +0800
Subject: [PATCH] fix: 修改前端

---
 src/layout/MainLayout.vue |  104 +++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 99 insertions(+), 5 deletions(-)

diff --git a/src/layout/MainLayout.vue b/src/layout/MainLayout.vue
index 7894884..db13252 100644
--- a/src/layout/MainLayout.vue
+++ b/src/layout/MainLayout.vue
@@ -2,7 +2,7 @@
   <el-container class="main-layout">
     <el-aside :width="isCollapse ? '64px' : '220px'" class="aside">
       <div class="logo">
-        <span v-if="!isCollapse">鏁版嵁绠$悊绯荤粺</span>
+        <span v-if="!isCollapse">鏁版嵁褰曞叆绯荤粺</span>
         <span v-else>鏁版嵁</span>
       </div>
       <el-menu
@@ -37,11 +37,11 @@
         <el-sub-menu index="data">
           <template #title>
             <el-icon><Upload /></el-icon>
-            <span>鏁版嵁瀵煎叆绠$悊</span>
+            <span>鏁版嵁绠$悊</span>
           </template>
           <el-menu-item index="/data/excel">
             <el-icon><Document /></el-icon>
-            <template #title>Excel涓婁紶</template>
+            <template #title>鍗曚綅鏁版嵁涓婁紶</template>
           </el-menu-item>
         </el-sub-menu>
       </el-menu>
@@ -50,8 +50,8 @@
     <el-container>
       <el-header class="header">
         <div class="header-left">
-          <el-icon 
-            class="collapse-btn" 
+          <el-icon
+            class="collapse-btn"
             :size="20"
             @click="isCollapse = !isCollapse"
           >
@@ -68,6 +68,7 @@
             </span>
             <template #dropdown>
               <el-dropdown-menu>
+                <el-dropdown-item command="editPassword">淇敼瀵嗙爜</el-dropdown-item>
                 <el-dropdown-item command="logout">閫�鍑虹櫥褰�</el-dropdown-item>
               </el-dropdown-menu>
             </template>
@@ -79,6 +80,24 @@
         <router-view />
       </el-main>
     </el-container>
+
+    <el-dialog v-model="passwordDialogVisible" title="淇敼瀵嗙爜" width="400px">
+      <el-form ref="passwordFormRef" :model="passwordForm" :rules="passwordRules" label-width="80px">
+        <el-form-item label="鍘熷瘑鐮�" prop="oldPassword">
+          <el-input v-model="passwordForm.oldPassword" type="password" placeholder="璇疯緭鍏ュ師瀵嗙爜" show-password />
+        </el-form-item>
+        <el-form-item label="鏂板瘑鐮�" prop="newPassword">
+          <el-input v-model="passwordForm.newPassword" type="password" placeholder="璇疯緭鍏ユ柊瀵嗙爜" show-password />
+        </el-form-item>
+        <el-form-item label="纭瀵嗙爜" prop="confirmPassword">
+          <el-input v-model="passwordForm.confirmPassword" type="password" placeholder="璇峰啀娆¤緭鍏ユ柊瀵嗙爜" show-password />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="passwordDialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary" @click="handlePasswordChange" :loading="passwordLoading">纭畾</el-button>
+      </template>
+    </el-dialog>
   </el-container>
 </template>
 
@@ -86,12 +105,56 @@
 import { ref, computed } from 'vue'
 import { useRoute, useRouter } from 'vue-router'
 import { useUserStore } from '@/stores/user'
+import { changePassword } from '@/api/user'
+import { ElMessage } from 'element-plus'
 
 const route = useRoute()
 const router = useRouter()
 const userStore = useUserStore()
 
 const isCollapse = ref(false)
+const passwordDialogVisible = ref(false)
+const passwordLoading = ref(false)
+const passwordFormRef = ref(null)
+
+const passwordForm = ref({
+  oldPassword: '',
+  newPassword: '',
+  confirmPassword: ''
+})
+
+const validateConfirmPassword = (rule, value, callback) => {
+  if (value === '') {
+    callback(new Error('璇峰啀娆¤緭鍏ユ柊瀵嗙爜'))
+  } else if (value !== passwordForm.value.newPassword) {
+    callback(new Error('涓ゆ杈撳叆鐨勫瘑鐮佷笉涓�鑷�'))
+  } else {
+    callback()
+  }
+}
+
+const validateNotSameAsOld = (rule, value, callback) => {
+  if (value === '') {
+    callback(new Error('璇疯緭鍏ユ柊瀵嗙爜'))
+  } else if (value === passwordForm.value.oldPassword) {
+    callback(new Error('鏂板瘑鐮佷笉鑳戒笌鍘熷瘑鐮佺浉鍚�'))
+  } else {
+    callback()
+  }
+}
+
+const passwordRules = {
+  oldPassword: [
+    { required: true, message: '璇疯緭鍏ュ師瀵嗙爜', trigger: 'blur' }
+  ],
+  newPassword: [
+    { required: true, validator: validateNotSameAsOld, trigger: 'blur' },
+    { min: 6, message: '瀵嗙爜闀垮害涓嶈兘灏戜簬6浣�', trigger: 'blur' }
+  ],
+  confirmPassword: [
+    { required: true, validator: validateConfirmPassword, trigger: 'blur' }
+  ]
+}
 
 const activeMenu = computed(() => {
   return route.path
@@ -101,8 +164,39 @@
   if (command === 'logout') {
     userStore.logout()
     router.push('/login')
+  } else if (command === 'editPassword') {
+    passwordDialogVisible.value = true
+    passwordForm.value = {
+      oldPassword: '',
+      newPassword: '',
+      confirmPassword: ''
+    }
   }
 }
+
+const handlePasswordChange = async () => {
+  if (!passwordFormRef.value) return
+
+  await passwordFormRef.value.validate(async (valid) => {
+    if (valid) {
+      passwordLoading.value = true
+      try {
+        await changePassword({
+          oldPassword: passwordForm.value.oldPassword,
+          newPassword: passwordForm.value.newPassword
+        })
+        ElMessage.success('瀵嗙爜淇敼鎴愬姛')
+        passwordDialogVisible.value = false
+        userStore.logout()
+        router.push('/login')
+      } catch (error) {
+        ElMessage.error(error.message || '瀵嗙爜淇敼澶辫触')
+      } finally {
+        passwordLoading.value = false
+      }
+    }
+  })
+}
 </script>
 
 <style scoped>

--
Gitblit v1.9.1