فهرست منبع

首次登录修改密码功能

xusl 2 سال پیش
والد
کامیت
4ddf55fe1e

+ 48 - 8
backend/src/main/java/com/jiayue/ssi/controller/SysUserController.java

@@ -2,6 +2,8 @@ package com.jiayue.ssi.controller;
 
 import cn.hutool.crypto.SmUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jiayue.ssi.annotation.InterfaceLimit;
 import com.jiayue.ssi.config.SendMailUtil;
@@ -11,11 +13,8 @@ import com.jiayue.ssi.util.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.mail.javamail.MimeMessageHelper;
 import org.springframework.web.bind.annotation.*;
-
-import javax.mail.internet.MimeMessage;
-import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
 
 /**
  * 用户信息controller
@@ -117,7 +116,7 @@ public class SysUserController {
     @InterfaceLimit
     public ResponseVO resetPassword(String id) {
         if (StringUtils.isEmpty(id)){
-            return ResponseVO.fail("重置密码失败!");
+            return ResponseVO.fail("重置密码缺失id!");
         }
         // id获取用户
         SysUser sysUser = sysUserService.getById(id);
@@ -126,9 +125,7 @@ public class SysUserController {
         }
         // 生成8位初始密码
         String randomPwd = RandomPwd.getRandomPwd(8);
-        sysUser.setPassword(SmUtil.sm3(randomPwd).toUpperCase());
-        sysUser.setLastUpdatePwdTime(null);
-        boolean bo = sysUserService.updateById(sysUser);
+        boolean bo = sysUserService.resetPassword(Integer.parseInt(id),SmUtil.sm3(randomPwd).toUpperCase());
         if (!bo){
             return ResponseVO.fail("密码生成失败!");
         }
@@ -166,6 +163,49 @@ public class SysUserController {
     }
 
     /**
+     * 修改密码
+     */
+    @PostMapping(value = "/updatePassword")
+    @InterfaceLimit
+    public ResponseVO updatePassword(String id,String oldPassword,String newPassword,String confirmPassword) {
+        if (StringUtils.isEmpty(id)){
+            return ResponseVO.fail("修改密码缺失id!");
+        }
+        // id获取用户
+        SysUser sysUser = sysUserService.getById(id);
+        if (sysUser == null){
+            return ResponseVO.fail("修改密码失败!");
+        }
+
+        if (StringUtils.isEmpty(oldPassword)){
+            return ResponseVO.fail("旧密码不能为空!");
+        }
+        else if (!sysUser.getPassword().equals(SmUtil.sm3(oldPassword).toUpperCase())){
+            return ResponseVO.fail("旧密码不正确!");
+        }
+
+        if (StringUtils.isEmpty(newPassword)){
+            return ResponseVO.fail("新密码不能为空!");
+        }
+        else if (StringUtils.isEmpty(confirmPassword)){
+            return ResponseVO.fail("确认密码不能为空!");
+        }
+        else if (!newPassword.equals(confirmPassword)){
+            return ResponseVO.fail("新密码两次输入的密码不一致!");
+        }
+        // 对新密码规则验证
+
+
+        sysUser.setPassword(SmUtil.sm3(newPassword).toUpperCase());
+        sysUser.setLastUpdatePwdTime(new Date());
+        boolean bo = sysUserService.updateById(sysUser);
+        if (!bo){
+            return ResponseVO.fail("修改密码失败!");
+        }
+        return ResponseVO.success();
+    }
+
+    /**
      * 更新用户信息
      *
      * @param sysUser 参数

+ 7 - 0
backend/src/main/java/com/jiayue/ssi/service/SysUserService.java

@@ -51,4 +51,11 @@ public interface SysUserService extends IService<SysUser> {
      * @return
      */
     boolean removeUserById(Integer id);
+    /**
+     * 初始/重置密码
+     * @param id            主键id
+     * @param initPassword  初始密码
+     * @return
+     */
+    boolean resetPassword(Integer id,String initPassword);
 }

+ 16 - 1
backend/src/main/java/com/jiayue/ssi/service/impl/SysUserServiceImpl.java

@@ -96,5 +96,20 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         }
         return false;
     }
-
+    /**
+     * 初始/重置密码
+     * @param id            主键id
+     * @param initPassword  初始密码
+     * @return
+     */
+    @Override
+    public boolean resetPassword(Integer id,String initPassword) {
+        LambdaUpdateWrapper<SysUser> updateWrapper = new UpdateWrapper<SysUser>().lambda();
+        updateWrapper.eq(SysUser::getId, id).set(SysUser::getLastUpdatePwdTime, null).set(SysUser::getPassword,initPassword);
+        int count = sysUserMapper.update(new SysUser(), updateWrapper);
+        if (count > 0) {
+            return true;
+        }
+        return false;
+    }
 }

+ 2 - 0
backend/src/main/resources/application.yml

@@ -72,6 +72,8 @@ mybatis:
   database:
     type: mysql #数据库类型 目前只支持mysql
 mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
   mapper-locations: classpath:/mapper/*Mapper.xml
   global-config:
     db-column-underline: true

+ 80 - 12
ui/src/layout/components/Navbar.vue

@@ -1,21 +1,41 @@
 <template>
   <div class="navbar">
-    <hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
+    <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
 
-    <breadcrumb class="breadcrumb-container" />
+    <breadcrumb id="breadcrumb-container" class="breadcrumb-container" v-if="!topNav"/>
+    <top-nav id="topmenu-container" class="topmenu-container" v-if="topNav"/>
 
     <div class="right-menu">
-      <el-dropdown class="avatar-container" trigger="click">
+<!--      <template v-if="device!=='mobile'">-->
+<!--        <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-doc id="ruoyi-doc" class="right-menu-item hover-effect" />-->
+<!--        </el-tooltip>-->
+
+<!--        <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>-->
+
+<!--      </template>-->
+
+      <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click">
         <div class="avatar-wrapper">
           <img src="@/assets/img1.jpg" class="user-avatar">
           <i class="el-icon-caret-bottom" />
         </div>
-        <el-dropdown-menu slot="dropdown" class="user-dropdown">
+        <el-dropdown-menu slot="dropdown">
           <router-link to="/user/profile">
             <el-dropdown-item>个人中心</el-dropdown-item>
           </router-link>
           <el-dropdown-item divided @click.native="logout">
-            <span style="display:block;">退出系统</span>
+            <span>退出登录</span>
           </el-dropdown-item>
         </el-dropdown-menu>
       </el-dropdown>
@@ -24,20 +44,49 @@
 </template>
 
 <script>
-  import {mapGetters} from 'vuex'
-  import Breadcrumb from '@/components/Breadcrumb'
-  import Hamburger from '@/components/Hamburger'
-  import {getBrowserToken} from '@/utils/commonFuc' // get token from cookie
-  export default {
+import { mapGetters } from 'vuex'
+import Breadcrumb from '@/components/Breadcrumb'
+import TopNav from '@/components/TopNav'
+import Hamburger from '@/components/Hamburger'
+// import Screenfull from '@/components/Screenfull'
+// import SizeSelect from '@/components/SizeSelect'
+// import Search from '@/components/HeaderSearch'
+// import RuoYiGit from '@/components/RuoYi/Git'
+// import RuoYiDoc from '@/components/RuoYi/Doc'
+
+export default {
   components: {
     Breadcrumb,
+    TopNav,
     Hamburger
+    // Screenfull,
+    // SizeSelect,
+    // Search,
+    // RuoYiGit,
+    // RuoYiDoc
   },
   computed: {
     ...mapGetters([
       'sidebar',
-      'avatar'
-    ])
+      'avatar',
+      'device'
+    ]),
+    setting: {
+      get() {
+        return this.$store.state.settings.showSettings
+      },
+      set(val) {
+        this.$store.dispatch('settings/changeSetting', {
+          key: 'showSettings',
+          value: val
+        })
+      }
+    },
+    topNav: {
+      get() {
+        return this.$store.state.settings.topNav
+      }
+    }
   },
   methods: {
     toggleSideBar() {
@@ -47,6 +96,15 @@
       sessionStorage.removeItem("token")
       //注销返回自己的登录页
       this.$router.push(`/login?redirect=${this.$route.fullPath}`)
+      // this.$confirm('确定注销并退出系统吗?', '提示', {
+      //   confirmButtonText: '确定',
+      //   cancelButtonText: '取消',
+      //   type: 'warning'
+      // }).then(() => {
+      //   this.$store.dispatch('LogOut').then(() => {
+      //     location.href = '/index';
+      //   })
+      // }).catch(() => {});
     }
   }
 }
@@ -77,6 +135,16 @@
     float: left;
   }
 
+  .topmenu-container {
+    position: absolute;
+    left: 50px;
+  }
+
+  .errLog-container {
+    display: inline-block;
+    vertical-align: top;
+  }
+
   .right-menu {
     float: right;
     height: 100%;

+ 37 - 44
ui/src/main.js

@@ -22,6 +22,7 @@ import 'vxe-table/lib/index.css'
 
 import {removeToken} from './utils/auth'
 import { resetForm} from "@/utils/index";
+import {sm2 as sm5, sm2 as sm4, sm2 as sm3, sm2} from "sm-crypto";
 Vue.prototype.$moment = moment
 Vue.prototype.$echarts = echarts
 Vue.use(VXETable)
@@ -90,6 +91,7 @@ Vue.prototype.$axios.interceptors.request.use(
           if (config.url!='/user/login'){
             config.headers.post['Content-Type'] = 'application/json';
           }
+          // console.log(config.data)
         }
       }
     }
@@ -136,13 +138,6 @@ Vue.prototype.$axios.interceptors.response.use(
       // if the custom code is not 20000, it is judged as an error.
       //console.log(res.code)
       if (data.code > 1) {
-        // alert('准备error输出')
-        // Message({
-        //   message: data.message || 'Error',
-        //   type: 'error',
-        //   duration: 5 * 1000
-        // })
-
         // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
         if (data.code === 50008 || data.code === 50012 || data.code === 50014) {
           // to re-login
@@ -248,12 +243,6 @@ Vue.prototype.$axios.interceptors.response.use(
       alert(4)
       return Promise.reject(error)
     }
-    /*    console.log('err' + error) // for debug
-    Message({
-      message: error.message,
-      type: 'error',
-      duration: 5 * 1000
-    })*/
   }
 )
 
@@ -264,30 +253,8 @@ new Vue({
   render: h => h(App)
 })
 
-export function test() {
-  let sm2 = require('sm-crypto').sm2;
-  let cipherMode = 1
-  // 加密
-  let encryptData = sm2.doEncrypt('1122加密', '0460ff8c8c306fe62f6f9d11c5c82c30d10bbbc703da094e423072cac7dc663c97fad52eccb34f311f47a07f280de157ba4f2aa659cabe749121384b9376ea2ed2', cipherMode);
-  let sm3 = require('sm-crypto').sm2;
-  // 签名
-  let sign = sm3.doSignature('1122加密', '6155d63ee27cbeca07f3e40c4f8856f1be8119fcbda1aadc7e0e595e52bad7bd')
-  // 解密
-  let sm4 = require('sm-crypto').sm2;
-  let doDecrypt = sm4.doDecrypt(encryptData, privateKey1, cipherMode);
-  alert('解密:' + doDecrypt)
-  // 验签
-  let sm5 = require('sm-crypto').sm2;
-  let verifyResult = sm5.doVerifySignature(doDecrypt, sign, publicKey2) // 验签结果
-  alert('验签:' + verifyResult)
-}
-
 // 加密:
 export function doEncrypt(msgString) {
-  // let msg = msgString;
-  // if (typeof (msgString) !== 'string') {
-  //   msg = JSON.stringify(msgString);
-  // }
   let sm2 = require('sm-crypto').sm2;
   // 1 - C1C3C2;	0 - C1C2C3;	默认为1
   let cipherMode = 1
@@ -301,21 +268,13 @@ export function doEncrypt(msgString) {
 
 // 解密
 export function doDecryptStr(enStr) {
-  // let msg = enStr;
-  // if (typeof (enStr) !== 'string') {
-  //   msg = JSON.stringify(enStr);
-  // }
-
   let sm2 = require('sm-crypto').sm2;
   // 1 - C1C3C2;	0 - C1C2C3;	默认为1
   let cipherMode = 1
-
-  // 加密后的密文,需要前去掉04。因为doDecrypt中自行添加了04,后端加密代码也自行添加了04
-  // let en = enStr.data.substr(2)
   // 解密结果
   let doDecrypt = sm2.doDecrypt(enStr, privateKey1, cipherMode);
   // 解密后类型转换
-  let objData = JSON.parse(doDecrypt)
+  // let objData = JSON.parse(doDecrypt)
   return doDecrypt;
 }
 
@@ -339,3 +298,37 @@ export function doVerifySignature(msgString, sigValueHex) {
   return verifyResult;
 }
 
+// 前端user信息加密
+export function userinfoEncrypt(str) {
+  let sm2 = require('sm-crypto').sm2;
+  let cipherMode = 1
+  // 加密
+  let encryptData = sm2.doEncrypt(str, '0460ff8c8c306fe62f6f9d11c5c82c30d10bbbc703da094e423072cac7dc663c97fad52eccb34f311f47a07f280de157ba4f2aa659cabe749121384b9376ea2ed2', cipherMode);
+  return encryptData
+}
+// 前端user信息解密
+export function userinfoDecrypt(str) {
+  let sm2 = require('sm-crypto').sm2;
+  let cipherMode = 1
+  // 加密
+  let decryptData = sm2.doDecrypt(str, "27ce6eec39dbf3b564a77c4da1e129fe1ba01a92f6d61055a33ed14ffcbc949e", cipherMode);
+  return decryptData
+}
+
+export function test() {
+  let sm2 = require('sm-crypto').sm2;
+  let cipherMode = 1
+  // 加密
+  let encryptData = sm2.doEncrypt('1122加密', '0460ff8c8c306fe62f6f9d11c5c82c30d10bbbc703da094e423072cac7dc663c97fad52eccb34f311f47a07f280de157ba4f2aa659cabe749121384b9376ea2ed2', cipherMode);
+  let sm3 = require('sm-crypto').sm2;
+  // 签名
+  let sign = sm3.doSignature('1122加密', '6155d63ee27cbeca07f3e40c4f8856f1be8119fcbda1aadc7e0e595e52bad7bd')
+  // 解密
+  let sm4 = require('sm-crypto').sm2;
+  let doDecrypt = sm4.doDecrypt(encryptData, privateKey1, cipherMode);
+  alert('解密:' + doDecrypt)
+  // 验签
+  let sm5 = require('sm-crypto').sm2;
+  let verifyResult = sm5.doVerifySignature(doDecrypt, sign, publicKey2) // 验签结果
+  alert('验签:' + verifyResult)
+}

+ 34 - 20
ui/src/permission.js

@@ -1,10 +1,11 @@
 import router from './router'
-/*import store from './store'
-import { Message } from 'element-ui'*/
+import store from '@/store'
+import { Message } from 'element-ui'
 import NProgress from 'nprogress' // progress bar
 import 'nprogress/nprogress.css' // progress bar style
 import { getBrowserToken } from './utils/commonFuc' // get token from cookie
 import getPageTitle from '@/utils/get-page-title'
+import {userinfoDecrypt} from "@/main";
 
 NProgress.configure({ showSpinner: false }) // NProgress Configuration
 
@@ -23,28 +24,41 @@ router.beforeEach(async(to, from, next) => {
       next({ path: '/' })
       NProgress.done()
     } else {
-      next()
-    /*  const hasGetUserInfo = store.getters.name
-      if (hasGetUserInfo) {
-        next()
-      } else {
-        try {
-          // get user info
-          await store.dispatch('user/getInfo')
-
-          next()
-        } catch (error) {
-          // remove token and go to login page to re-login
-          await store.dispatch('user/resetToken')
-          Message.error(error || 'Has Error')
-          next(`/login?redirect=${to.path}`)
-          NProgress.done()
+      // 验证初始密码是否修改了或者超过30天
+      if (to.path !=='/dashboard' && to.path !=='/user/profile'){
+        // 用户信息解密
+        let decryptUserInfo = userinfoDecrypt(store.getters.userinfo)
+        let user = JSON.parse(decryptUserInfo)
+        if (user.lastUpdatePwdTime==null){
+          Message({
+            type: 'warning',
+            message: '需要修改初始密码!'
+          });
+          next({ path: '/user/profile' })
         }
-      }*/
+        else{
+          var dateBegin = new Date(user.lastUpdatePwdTime);
+          var dateEnd = new Date();
+          var dateDiff = dateEnd.getTime() - dateBegin.getTime(); //时间差的毫秒数
+          var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
+          if (dayDiff>=1){
+            Message({
+              type: 'warning',
+              message: '密码超过30天需要修改!'
+            })
+            next({ path: '/user/profile' })
+          }
+          else{
+            next()
+          }
+        }
+      }
+      else{
+        next()
+      }
     }
   } else {
     /* has no token*/
-
     if (whiteList.indexOf(to.path) !== -1) {
       // in the free login whitelist, go directly
       next()

+ 1 - 21
ui/src/store/modules/user.js

@@ -1,31 +1,11 @@
-// import { login, logout, getInfo } from '@/api/user'
-// import { getToken, setToken, removeToken } from '@/utils/auth'
-import { resetRouter } from '@/router'
-import request from '@/utils/request'
-import Cookies from "js-cookie";
 
 const state = {
-  userinfo: {
-    username: '',
-    id: '',
-    nickname: '',
-    status: '',
-    mailbox: '',
-    phonenumber: '',
-    lastUpdatePwdTime: ''
-  }
+  userinfo: ''
 }
 
 const mutations = {
   updateUser: (state, user) => {
     state.userinfo = user
-    // state.user.id = user.id
-    // state.user.username = user.username
-    // state.user.nickname = user.nickname
-    // state.user.status = user.status
-    // state.user.mailbox = user.mailbox
-    // state.user.phonenumber = user.phonenumber
-    // state.user.lastUpdatePwdTime = user.lastUpdatePwdTime
   }
 }
 

+ 9 - 7
ui/src/views/dashboard/index.vue

@@ -6,6 +6,7 @@
 
 
 import {mapGetters} from "vuex";
+import {userinfoEncrypt} from "@/main";
 
 export default {
   computed: {
@@ -25,27 +26,28 @@ export default {
     /** 获取当前用户的最后修改密码时间 */
     getCurrentUser() {
       this.$axios.get('/sysUserController/getCurrentUser').then((res) => {
-        this.$store.dispatch('user/changeSetting',res.data)
+        // 用户信息加密存储
+        let encryptUserInfo = userinfoEncrypt(JSON.stringify(res.data))
+        this.$store.dispatch('user/changeSetting',encryptUserInfo)
 
-        var user1 = res.data
-        if (user1.lastUpdatePwdTime==null){
+        var user = res.data
+        if (user.lastUpdatePwdTime==null){
             this.$message({
               type: 'warning',
-              message: '需要修改密码!'
+              message: '需要修改初始密码!'
             });
           this.$router.push("/user/profile")
         }
         else{
-          var dateBegin = new Date(user1.lastUpdatePwdTime);
+          var dateBegin = new Date(user.lastUpdatePwdTime);
           var dateEnd = new Date();
           var dateDiff = dateEnd.getTime() - dateBegin.getTime(); //时间差的毫秒数
           var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
           if (dayDiff>=1){
             this.$message({
               type: 'warning',
-              message: '大于30天需要修改密码!'
+              message: '密码超过30天需要修改!'
             })
-            alert(this.userinfo.username)
             this.$router.push("/user/profile")
           }
         }

+ 1 - 1
ui/src/views/login/index.vue

@@ -242,7 +242,7 @@ export default {
             // document.cookie = "token=" + data;
             // document.cookie = "user=".concat(this.loginForm.username)
             sessionStorage.setItem('token', res.data)
-            console.log('login user is :' + this.loginForm.username)
+            // console.log('login user is :' + this.loginForm.username)
             this.$router.push('/')
             this.loading = false
           }).catch((error) => {

+ 8 - 10
ui/src/views/sysManager/userManager/profile/index.vue

@@ -10,19 +10,19 @@
             <ul class="list-group list-group-striped">
               <li class="list-group-item">
                 <svg-icon icon-class="user" />用户账号
-                <div class="pull-right">{{ this.userinfo.username }}</div>
+                <div class="pull-right">{{ this.user.username }}</div>
               </li>
               <li class="list-group-item">
                 <svg-icon icon-class="people" />用户姓名
-                <div class="pull-right">{{ this.userinfo.nickname }}</div>
+                <div class="pull-right">{{ this.user.nickname }}</div>
               </li>
               <li class="list-group-item">
                 <svg-icon icon-class="email" />用户邮箱
-                <div class="pull-right">{{ this.userinfo.mailbox }}</div>
+                <div class="pull-right">{{ this.user.mailbox }}</div>
               </li>
               <li class="list-group-item">
                 <svg-icon icon-class="phone" />手机号码
-                <div class="pull-right">{{ this.userinfo.phonenumber }}</div>
+                <div class="pull-right">{{ this.user.phonenumber }}</div>
               </li>
             </ul>
           </div>
@@ -34,11 +34,6 @@
             <span>修改密码</span>
           </div>
           <resetPwd />
-<!--          <el-tabs v-model="activeTab">-->
-<!--            <el-tab-pane label="修改密码" name="resetPwd">-->
-<!--              -->
-<!--            </el-tab-pane>-->
-<!--          </el-tabs>-->
         </el-card>
       </el-col>
     </el-row>
@@ -49,6 +44,7 @@
 
 import resetPwd from "./resetPwd";
 import { mapGetters } from 'vuex'
+import {userinfoDecrypt} from "@/main";
 export default {
   computed: {
     ...mapGetters([
@@ -63,7 +59,9 @@ export default {
     };
   },
   created() {
-    // this.getUser();
+    // 用户信息解密
+    let decryptUserInfo = userinfoDecrypt(this.userinfo)
+    this.user = JSON.parse(decryptUserInfo)
   },
   methods: {
     getUser() {

+ 35 - 13
ui/src/views/sysManager/userManager/profile/resetPwd.vue

@@ -1,13 +1,13 @@
 <template>
-  <el-form ref="form" :model="user" :rules="rules" label-width="80px">
+  <el-form ref="form" :model="pwd" :rules="rules" label-width="80px">
     <el-form-item label="旧密码" prop="oldPassword">
-      <el-input v-model="user.oldPassword" placeholder="请输入旧密码" type="password" show-password/>
+      <el-input v-model="pwd.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-input v-model="pwd.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-input v-model="pwd.confirmPassword" placeholder="请确认新密码" type="password" show-password/>
     </el-form-item>
     <el-form-item>
       <el-button type="primary" size="mini" @click="submit">保存</el-button>
@@ -17,19 +17,25 @@
 </template>
 
 <script>
-import { updateUserPwd } from "@/api/system/user";
-
+import { mapGetters } from 'vuex'
+import {userinfoDecrypt} from "@/main";
 export default {
+  computed: {
+    ...mapGetters([
+      'userinfo'
+    ])
+  },
   data() {
     const equalToPassword = (rule, value, callback) => {
-      if (this.user.newPassword !== value) {
-        callback(new Error("两次输入的密码不一致"));
+      if (this.pwd.newPassword !== value) {
+        callback(new Error("新密码两次输入的密码不一致"));
       } else {
         callback();
       }
     };
     return {
-      user: {
+      user: {},
+      pwd: {
         oldPassword: undefined,
         newPassword: undefined,
         confirmPassword: undefined
@@ -41,7 +47,7 @@ export default {
         ],
         newPassword: [
           { required: true, message: "新密码不能为空", trigger: "blur" },
-          { min: 6, max: 20, message: "长度在 6 到 20 个字符", trigger: "blur" }
+          { min: 8, max: 20, message: "长度在 8 到 20 个字符", trigger: "blur" }
         ],
         confirmPassword: [
           { required: true, message: "确认密码不能为空", trigger: "blur" },
@@ -54,9 +60,25 @@ export default {
     submit() {
       this.$refs["form"].validate(valid => {
         if (valid) {
-          updateUserPwd(this.user.oldPassword, this.user.newPassword).then(response => {
-            this.$modal.msgSuccess("修改成功");
-          });
+          // 用户信息解密
+          let decryptUserInfo = userinfoDecrypt(this.userinfo)
+          this.user = JSON.parse(decryptUserInfo)
+          const param = {
+            id: this.user.id,
+            oldPassword: this.pwd.oldPassword,
+            newPassword: this.pwd.newPassword,
+            confirmPassword: this.pwd.confirmPassword
+          }
+          this.$axios.post('/sysUserController/updatePassword', param).then((res) => {
+            if (res.code==0){
+              this.$message.success('密码修改成功')
+            }
+            if (res.code==1){
+              this.$message.error(res.data)
+            }
+          }).catch((error) => {
+            this.$message.error(error)
+          })
         }
       });
     },