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

---
 src/utils/request.js      |    2 
 src/api/user.js           |    8 ++
 src/layout/MainLayout.vue |  104 +++++++++++++++++++++++++++++++++-
 src/views/Dashboard.vue   |    2 
 src/views/data/Excel.vue  |    8 +-
 src/views/system/User.vue |   12 ++--
 6 files changed, 119 insertions(+), 17 deletions(-)

diff --git a/src/api/user.js b/src/api/user.js
index 4e7ad49..eabea12 100644
--- a/src/api/user.js
+++ b/src/api/user.js
@@ -58,3 +58,11 @@
     responseType: 'blob'
   })
 }
+
+export const changePassword = (data) => {
+  return request({
+    url: '/user/change-password',
+    method: 'post',
+    data
+  })
+}
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>
diff --git a/src/utils/request.js b/src/utils/request.js
index 00f43bf..ab5c2a2 100644
--- a/src/utils/request.js
+++ b/src/utils/request.js
@@ -5,7 +5,7 @@
 
 const request = axios.create({
   baseURL: '/api',
-  timeout: 300000
+  timeout: 3600000
 })
 
 request.interceptors.request.use(
diff --git a/src/views/Dashboard.vue b/src/views/Dashboard.vue
index 6b18244..8c40caa 100644
--- a/src/views/Dashboard.vue
+++ b/src/views/Dashboard.vue
@@ -31,7 +31,7 @@
         <el-card class="box-card">
           <template #header>
             <div class="card-header">
-              <span>妯℃澘鎬绘暟</span>
+              <span>鏁版嵁鎬绘暟</span>
             </div>
           </template>
           <div class="card-content">
diff --git a/src/views/data/Excel.vue b/src/views/data/Excel.vue
index a18c53b..d56d5fe 100644
--- a/src/views/data/Excel.vue
+++ b/src/views/data/Excel.vue
@@ -146,7 +146,7 @@
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="BP鍚堝悓鍙�" prop="bpContractNo">
-              <el-input v-model="form.bpContractNo" placeholder="璇疯緭鍏P鍚堝悓鍙�" />
+              <el-input v-model="form.bpContractNo" placeholder="璇疯緭鍏IP鍚堝悓鍙�" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
@@ -158,19 +158,19 @@
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="BP鍙戠エ鍙�" prop="bpInvoiceNo">
-              <el-input v-model="form.bpInvoiceNo" placeholder="璇疯緭鍏P鍙戠エ鍙�" />
+              <el-input v-model="form.bpInvoiceNo" placeholder="璇疯緭鍏IP鍙戠エ鍙�" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="鍙ゆ帶绯荤粺瀵瑰簲鍙戠エ鍙�" prop="gkInvoiceNo">
-              <el-input v-model="form.gkInvoiceNo" placeholder="璇疯緭鍏ュ彜鎺х郴缁熷搴斿彂绁ㄥ彿" />
+              <el-input v-model="form.gkInvoiceNo" placeholder="璇疯緭鍏ョ櫨鏃虹郴缁熷搴斿彂绁ㄥ彿" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row :gutter="20">
           <el-col :span="12">
             <el-form-item label="涓氬姟鍏宠仈鍏崇郴" prop="businessRelation">
-              <el-input v-model="form.businessRelation" placeholder="璇疯緭鍏ヤ笟鍔″叧鑱斿叧绯�" />
+              <el-input v-model="form.businessRelation" placeholder="璇疯緭鍏ュ洓鑰呮湭鍏宠仈鍘熷洜" />
             </el-form-item>
           </el-col>
 <!--          <el-col :span="12">-->
diff --git a/src/views/system/User.vue b/src/views/system/User.vue
index bb6f9e5..2a47d67 100644
--- a/src/views/system/User.vue
+++ b/src/views/system/User.vue
@@ -34,11 +34,11 @@
 
       <el-table :data="tableData" v-loading="loading" border stripe>
         <el-table-column prop="id" label="ID" width="80" />
-        <el-table-column prop="username" label="鐢ㄦ埛鍚�" width="120" />
-        <el-table-column prop="realName" label="鐪熷疄濮撳悕" width="120" />
-        <el-table-column prop="email" label="閭" width="180" />
-        <el-table-column prop="phone" label="鎵嬫満鍙�" width="130" />
-        <el-table-column prop="deptName" label="鎵�灞為儴闂�" width="150" />
+        <el-table-column prop="username" label="鐢ㄦ埛鍚�" width="150" />
+        <el-table-column prop="realName" label="鐪熷疄濮撳悕" width="150" />
+        <el-table-column prop="email" label="閭" width="220" />
+        <el-table-column prop="phone" label="鎵嬫満鍙�" width="150" />
+        <el-table-column prop="deptName" label="鎵�灞為儴闂�" width="220" />
         <el-table-column prop="status" label="鐘舵��" width="80">
           <template #default="{ row }">
             <el-tag :type="row.status === 1 ? 'success' : 'danger'">
@@ -46,7 +46,7 @@
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="180" />
+        <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" />
         <el-table-column label="鎿嶄綔" fixed="right" width="180">
           <template #default="{ row }">
             <el-button type="primary" link :icon="Edit" @click="handleEdit(row)">缂栬緫</el-button>

--
Gitblit v1.9.1