From 84748363b911c35b9b3a66159cfeeeefd13cc917 Mon Sep 17 00:00:00 2001
From: 马宇豪 <978517621@qq.com>
Date: 星期一, 09 十二月 2024 13:12:37 +0800
Subject: [PATCH] 修改导出内容

---
 src/layout/components/Navbar.vue |  153 +++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 129 insertions(+), 24 deletions(-)

diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue
index 4c30253..463aa7e 100644
--- a/src/layout/components/Navbar.vue
+++ b/src/layout/components/Navbar.vue
@@ -1,41 +1,47 @@
 <template>
   <div class="navbar">
-    <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
-    <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!settingsStore.topNav" />
-    <top-nav id="topmenu-container" class="topmenu-container" v-if="settingsStore.topNav" />
+    <hamburger id="hamburger-container" :is-active="appStore.sidebar.opened" class="hamburger-container"
+               @toggleClick="toggleSideBar"/>
+    <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!settingsStore.topNav"/>
+    <top-nav id="topmenu-container" class="topmenu-container" v-if="settingsStore.topNav"/>
 
     <div class="right-menu">
       <template v-if="appStore.device !== 'mobile'">
-<!--        <header-search id="header-search" class="right-menu-item" />-->
+        <!--        <header-search id="header-search" class="right-menu-item" />-->
 
-<!--        <el-tooltip content="源码地址" effect="dark" placement="bottom">-->
-<!--          <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />-->
-<!--        </el-tooltip>-->
+        <!--        <el-tooltip content="源码地址" effect="dark" placement="bottom">-->
+        <!--          <ruo-yi-git id="ruoyi-git" class="right-menu-item hover-effect" />-->
+        <!--        </el-tooltip>-->
 
-<!--        <el-tooltip content="文档地址" effect="dark" placement="bottom">-->
-<!--          <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />-->
-<!--        </el-tooltip>-->
+        <!--        <el-tooltip content="文档地址" effect="dark" placement="bottom">-->
+        <!--          <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />-->
+        <!--        </el-tooltip>-->
 
-<!--        <screenfull id="screenfull" class="right-menu-item hover-effect" />-->
+        <!--        <screenfull id="screenfull" class="right-menu-item hover-effect" />-->
 
-<!--        <el-tooltip content="布局大小" effect="dark" placement="bottom">-->
-<!--          <size-select id="size-select" class="right-menu-item hover-effect" />-->
-<!--        </el-tooltip>-->
+        <!--        <el-tooltip content="布局大小" effect="dark" placement="bottom">-->
+        <!--          <size-select id="size-select" class="right-menu-item hover-effect" />-->
+        <!--        </el-tooltip>-->
       </template>
       <div class="avatar-container">
         <el-dropdown @command="handleCommand" class="right-menu-item hover-effect" trigger="click">
           <div class="avatar-wrapper">
-            <img :src="avator" class="user-avatar" />
-            <el-icon><caret-bottom /></el-icon>
+            <img :src="avator" class="user-avatar"/>
+            <el-icon>
+              <caret-bottom/>
+            </el-icon>
           </div>
           <template #dropdown>
             <el-dropdown-menu>
-<!--              <router-link to="/user/profile">-->
-<!--                <el-dropdown-item>个人中心</el-dropdown-item>-->
-<!--              </router-link>-->
-<!--              <el-dropdown-item command="setLayout" v-if="settingsStore.showSettings">-->
-<!--                <span>布局设置</span>-->
-<!--              </el-dropdown-item>-->
+              <!--              <router-link to="/user/profile">-->
+              <!--                <el-dropdown-item>个人中心</el-dropdown-item>-->
+              <!--              </router-link>-->
+              <!--              <el-dropdown-item command="setLayout" v-if="settingsStore.showSettings">-->
+              <!--                <span>布局设置</span>-->
+              <!--              </el-dropdown-item>-->
+              <el-dropdown-item command="password">
+                <span>修改密码</span>
+              </el-dropdown-item>
               <el-dropdown-item command="logout">
                 <span>退出登录</span>
               </el-dropdown-item>
@@ -43,15 +49,44 @@
           </template>
         </el-dropdown>
       </div>
+      <el-dialog
+          v-model="pwdDialog"
+          title="修改密码"
+          width="550px"
+          :before-close="handleClose"
+      >
+        <el-form :model="form" size="default" ref="pwdRef" :rules="formRules" label-width="110px">
+          <el-form-item label="原密码" prop="oldPassword">
+            <el-input v-model.trim="form.oldPassword" type="password" show-password
+                      placeholder="请输入原密码"></el-input>
+          </el-form-item>
+          <el-form-item label="新密码" prop="newPassword">
+            <el-input v-model.trim="form.newPassword" type="password" show-password
+                      placeholder="请输入新密码"></el-input>
+          </el-form-item>
+          <el-form-item label="重复密码" prop="confirmPassword">
+            <el-input v-model.trim="form.confirmPassword" type="password" show-password
+                      placeholder="请再次输入新密码"></el-input>
+          </el-form-item>
+        </el-form>
+        <template #footer>
+          <span class="dialog-footer">
+              <el-button @click="handleClose" size="default">取 消</el-button>
+              <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button>
+          </span>
+        </template>
+      </el-dialog>
     </div>
   </div>
 </template>
 
 <script setup>
-import { ElMessageBox } from 'element-plus'
+import {ElMessageBox} from 'element-plus'
 import Breadcrumb from '@/components/Breadcrumb'
 import TopNav from '@/components/TopNav'
 import Hamburger from '@/components/Hamburger'
+import {reactive, ref} from 'vue'
+import {ElMessage} from "element-plus";
 import Screenfull from '@/components/Screenfull'
 import SizeSelect from '@/components/SizeSelect'
 import HeaderSearch from '@/components/HeaderSearch'
@@ -61,11 +96,72 @@
 import useUserStore from '@/store/modules/user'
 import useSettingsStore from '@/store/modules/settings'
 import avator from '@/assets/images/avator.png'
+import {updateUserPwd} from "@/api/system/user";
 
+let validatePwd = (rule, value, callback) => {
+  const regex = /^(?=.*[A-Za-z])(?=.*\d).{8,}$/
+  if (value === '') {
+    callback(new Error('请输入密码'))
+  } else {
+    if (!regex.test(value)) {
+      callback(new Error('密码须包含字母、数字,长度不少于8字符'))
+    } else {
+      callback()
+    }
+  }
+}
+
+const equalToPassword = (rule, value, callback) => {
+  if (value === '') {
+    callback(new Error('请再次确认新密码'))
+  } else if (form.newPassword !== value) {
+    callback(new Error("两次输入的密码不一致"))
+  } else {
+    callback()
+  }
+};
 
 const appStore = useAppStore()
 const userStore = useUserStore()
 const settingsStore = useSettingsStore()
+
+const pwdDialog = ref(false)
+const pwdRef = ref()
+
+const form = reactive({
+  newPassword: '',
+  oldPassword: '',
+  confirmPassword: ''
+})
+
+const formRules = reactive({
+  oldPassword: [{required: true, validator: validatePwd, trigger: 'blur'}],
+  newPassword: [{required: true, validator: validatePwd, trigger: 'blur'}],
+  confirmPassword: [{required: true, validator: equalToPassword, trigger: 'blur'}]
+})
+
+const onSubmit = async()=>{
+  const valid = await pwdRef.value.validate();
+  if(valid){
+    const res = await updateUserPwd(form.oldPassword,form.newPassword)
+    if(res.code == 200){
+      ElMessage.success('修改密码成功,请重新登录')
+      pwdDialog.value = false
+      logout()
+    }else{
+      ElMessage.warning(res.msg)
+    }
+  }
+}
+
+const handleClose = ()=>{
+  form.value = {
+    newPassword: '',
+    oldPassword: '',
+    confirmPassword: ''
+  }
+  pwdDialog.value = false
+}
 
 function toggleSideBar() {
   appStore.toggleSideBar()
@@ -78,6 +174,9 @@
       break;
     case "logout":
       logout();
+      break;
+    case "password":
+      editPsd();
       break;
     default:
       break;
@@ -93,10 +192,16 @@
     userStore.logOut().then(() => {
       location.href = '/index';
     })
-  }).catch(() => { });
+  }).catch(() => {
+  });
+}
+
+function editPsd() {
+  pwdDialog.value = true
 }
 
 const emits = defineEmits(['setLayout'])
+
 function setLayout() {
   emits('setLayout');
 }

--
Gitblit v1.9.2