页面布局和路由

在 router/index.js 中,加入一条路由规则:

  1. const routes = [
  2. // 最大级别的规则,对应的组件,会显示在 App.vue 中
  3. // 登录
  4. { path: '/login', component: () => import('@/views/Login.vue') },
  5. // 注册
  6. { path: '/reg', component: () => import('@/views/Reg.vue') },
  7. // 后台主页
  8. {
  9. path: '/',
  10. component: () => import('@/views/Home.vue'),
  11. children: [
  12. { path: 'home', component: () => import('@/views/Chart.vue') },
  13. { path: 'user-info', component: () => import('@/views/user/UserInfo.vue') },
  14. + { path: 'user-pwd', component: () => import('@/views/user/RePwd.vue') }
  15. ]
  16. }
  17. ]

复制页面并修改

复制 UserInfo.vue 中,全部的代码,到 RePwd.vue 中。
去掉所有和数据相关的代码:

  • 去掉 的 :model 和 :rules 属性
  • 去掉 的 prop 属性
  • 去掉 的 v-model 属性
  • 去掉 第一个 中的 disabled 属性
  • 去掉两个按钮的 @click 事件

JS代码,清空。
文字(重置密码、原密码、新密码、确认密码),自行修改。

表单验证

验证的内容包括:

  • 三个框,都需要 必填验证、长度验证
  • 新密码,不能和原密码一致
  • 两个新密码,必须一致

设置数据项和验证规则对象:

export default {
  data() {
    // 自定义的规则
    return {
      // 数据项
      pass: {
        old_pwd: '',
        new_pwd: '',
        re_pwd: ''
      },
      // 验证规则对象
      rules: {
        old_pwd: [
          { required: true, message: '原密码必填', trigger: 'blur' },
          { min: 6, max: 15, message: '长度必须是6~15位', trigger: 'blur' }
        ],
        new_pwd: [
          { required: true, message: '新密码必填', trigger: 'blur' },
          { min: 6, max: 15, message: '长度必须是6~15位', trigger: 'blur' }
        ],
        re_pwd: [
          { required: true, message: '确认密码必填', trigger: 'blur' },
          { min: 6, max: 15, message: '长度必须是6~15位', trigger: 'blur' }
        ]
      }
    }
  }
}

表单中,对应的数据绑定好:

<template>
  <el-card class="box-card">
    <div slot="header" class="clearfix">
      <span>重置密码</span>
    </div>
    <!-- 内容区放表单 -->
    <el-form ref="form" label-width="90px" :model="pass" :rules="rules">
      <!-- 表单中的每一行,叫做 el-form-item -->
      <el-form-item label="原密码" prop="old_pwd">
        <el-input v-model="pass.old_pwd"></el-input>
      </el-form-item>
      <el-form-item label="新密码" prop="new_pwd">
        <el-input v-model="pass.new_pwd"></el-input>
      </el-form-item>
      <el-form-item label="确认新密码" prop="re_pwd">
        <el-input v-model="pass.re_pwd"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary">确认修改</el-button>
        <el-button>重置</el-button>
      </el-form-item>
    </el-form>
  </el-card>
</template>

自定义验证规则,验证新密码和原密码不能一致、验证两次新密码必须一致:

export default {
  data() {
    // 自定义的规则
    const newPwd = (rule, value, callback) => {
      // 新密码输入框使用了这个规则,所以value 表示输入的新密码
      if (value === this.pass.old_pwd) {
        callback(new Error('新密码不能和原密码相同'))
      } else {
        callback()
      }
    }
    const rePwd = (rule, value, callback) => {
      // 确认密码使用了这个规则,所以 value 表示输入框的确认密码
      if (value === this.pass.new_pwd) {
        callback()
      } else {
        callback(new Error('两次新密码不一致'))
      }
    }


    return {
      .....................................
    }
  }
}

验证新密码和确认密码的时候,使用自定义的规则即可:

rules: {
  old_pwd: [
    { required: true, message: '原密码必填', trigger: 'blur' },
    { min: 6, max: 15, message: '长度必须是6~15位', trigger: 'blur' }
  ],
  new_pwd: [
    { required: true, message: '新密码必填', trigger: 'blur' },
    { min: 6, max: 15, message: '长度必须是6~15位', trigger: 'blur' },
+   { validator: newPwd, trigger: 'blur' }
  ],
  re_pwd: [
    { required: true, message: '确认密码必填', trigger: 'blur' },
    { min: 6, max: 15, message: '长度必须是6~15位', trigger: 'blur' },
+   { validator: rePwd, trigger: 'blur' }
  ]
}

提交数据,完成修改

封装API方法(只要发送ajax请求,都要封装API方法)
api/user.js,增加如下方法:

// 重置密码
export const updatePwdAPI = data => {
  // return request.put('/my/userinfo', 请求体)
  return request.patch('/my/updatepwd', data)
}

组件中,给 确认修改,添加单击事件

<el-button type="primary" @click="updatePwd">确认修改</el-button>

JS中,导入 API方法

import { updatePwdAPI } from '@/api/user'

完成methods方法:

updatePwd() {
  this.$refs.form.validate(async valid => {
    if (!valid) return
    // 验证通过,提交数据
    const { data: res } = await updatePwdAPI(this.pass)
    // 处理响应结果
    if (res.code === 0) {
      this.$message.success(res.message)
      // this.$refs.form.resetFields() // 重置表单
      // -------------------- 业务逻辑场景二:重置了密码,退出,重新登录 ------------------------
      // 重置vuex中的 token、user,然后跳转到登录 (和退出一样)
      this.$store.commit('user/updateToken', '')
      this.$store.commit('user/updateUser', {})
      this.$router.push('/login')
    } else {
      this.$message.error(res.message)
    }
  })
}