0


vue2+element-plus 密码校验及动态校验

应用场景

团队想给新系统的新建/修改用户、个人设置的修改密码中的密码输入框加一个密码校验。具体加什么校验,产品参考了几个增加密码复杂度的校验,比如不能输入连续的3个数字,这种校验,但是好像密码的复杂度并不能保证系统的安全性,好像邮箱验证会比较安全?虽然密码只防君子不妨小人,但是设置密码校验也只是避免用户输入过于简单的密码,比如:123,123456,111111这种。

针对我们这个项目,我们的密码校验规则是:

包含英文字母大小写、数字和特殊符号且在8到16位的任意组合


开发流程分析

首先我有三个场景需要设置密码:

1.个人设置——修改密码:旧密码、新密码、重复密码(3个输入框)

2.用户管理——新建用户:密码、重复密码(2个输入框)

3.用户管理——修改用户:重置密码(1个输入框)

针对三个不同环境,划分一下,分别是需要以下校验:

  • 新密码与旧密码,不能重复
  • 新密码/密码 与重复密码,必须一致
  • 重置密码、新密码、密码,必须校验正则
  • 以上输入框也要校验输入的字符必须在8—16个字符之间
  • 并且由于新建和修改用户用的同一个表单,涉及动态展示校验规则

以上是对于需求的确定,关于开发,由于涉及两个页面,分别从个人设置和用户管理,分析具体的代码逻辑。


详细开发场景

1.个人设置——修改密码

  1. <el-form ref="passwdForm" :model="passwd" label-width="100px" style="margin: 16px" :rules="rules" size="default">
  2. <el-form-item prop="oldVal" label="旧密码">
  3. <el-input v-model.trim="passwd.oldVal" type="password" show-password placeholder="请输入旧密码"></el-input>
  4. </el-form-item>
  5. <el-form-item prop="newVal" label="新密码">
  6. <el-input
  7. v-model.trim="passwd.newVal"
  8. type="password"
  9. show-password
  10. placeholder="请输入包含英文字母大小写、数字和特殊符号的 8-16 位组合"
  11. ></el-input>
  12. </el-form-item>
  13. <el-form-item prop="repeatNewVal" label="重复密码">
  14. <el-input
  15. v-model.trim="passwd.repeatNewVal"
  16. type="password"
  17. show-password
  18. placeholder="请重复密码"
  19. ></el-input>
  20. </el-form-item>
  21. <div style="width: 100%; height: 40px">
  22. <el-button style="float: right; margin: 4px" @click="$refs['passwdForm'].resetFields()">清空</el-button>
  23. <el-button type="primary" style="float: right; margin: 4px" @click="onSubmit">确定</el-button>
  24. </div>
  25. </el-form>
  1. data() {
  2. //新密码与重复密码不一致,一定写在data里但不是return里
  3. let repeatValidate = (rule, value, callback) => {
  4. if (value !== this.passwd.newVal) {
  5. callback(new Error('两次输入密码不一致!'))
  6. } else {
  7. callback()
  8. }
  9. }
  10. //正则校验主要是这部分:/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[._~!@#$^&*])[A-Za-z0-9._~!@#$^&*]{8,16}$
  11. //其中特殊字符包括:._~!@#$^&* (比较常见)
  12. let newValValidate = (rule, value, callback) => {
  13. if (value === this.passwd.oldVal) {
  14. callback(new Error('新密码不能与旧密码一致'))
  15. } else if (/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[._~!@#$^&*])[A-Za-z0-9._~!@#$^&*]{8,16}$/g.test(value)) {
  16. callback()
  17. } else {
  18. callback(new Error('请输入包含英文字母大小写、数字和特殊符号的 8-16 位组合'))
  19. }
  20. }
  21. return {
  22. passwd: {
  23. oldVal: '',
  24. newVal: '',
  25. repeatNewVal: ''
  26. },
  27. showPasswdChange: false,
  28. rules: {
  29. oldVal: [{ required: true, message: '请输入旧密码', trigger: 'blur' }],
  30. newVal: [
  31. { required: true, message: '新密码不能为空', trigger: 'blur' },
  32. {
  33. min: 8,
  34. max: 16,
  35. message: '长度应在 8 到 16 个字符',
  36. trigger: 'blur'
  37. },
  38. { validator: newValValidate, trigger: 'blur' }
  39. ],
  40. repeatNewVal: [
  41. { required: true, message: '请再输入一遍新密码', trigger: 'blur' },
  42. { validator: repeatValidate, trigger: 'blur' }
  43. ]
  44. }
  45. }

实现效果,如下:

2.用户管理——新建/修改用户

这里新建用户的时候,有密码和重复密码两个输入框,这是必填项

但是修改用户的时候,只展示重置密码的输入框,并且 不是必填项,所以这个输入框的rules里面的 required: true,这个就去掉。

  1. //新建用户——新密码、重复密码
  2. <el-form-item label="密码" prop="userPasswd" v-if="!seeEnable && !editEnable">
  3. <el-input
  4. v-model.trim="userInfo.userPasswd"
  5. show-password
  6. placeholder="请输入包含英文字母大小写、数字和特殊符号的 8-16 位组合"
  7. ></el-input>
  8. </el-form-item>
  9. <el-form-item label="重复密码" prop="userPasswdRe">
  10. <el-input v-model.trim="userInfo.userPasswdRe" show-password placeholder="请重复密码"></el-input>
  11. </el-form-item>
  12. //修改用户——重置密码
  13. <el-form-item v-if="editEnable" label="重置密码" prop="userPasswdReset">
  14. <el-input
  15. v-model="userInfo.userPasswdReset"
  16. show-password
  17. placeholder="请输入包含英文字母大小写、数字和特殊符号的 8-16 位组合"
  18. ></el-input>
  19. </el-form-item>
  1. data(){
  2. /*
  3. *@description:重复密码校验
  4. *@date: 2022-07-14 15:25:12
  5. */
  6. let checkPasswdRe = (rule, value, callback) => {
  7. if (value === '') {
  8. callback(new Error('请再次输入密码'))
  9. } else if (value !== this.userInfo.userPasswd) {
  10. callback(new Error('两次输入密码不一致!'))
  11. } else {
  12. callback()
  13. }
  14. }
  15. //密码校验
  16. let newValValidate = (rule, value, callback) => {
  17. if (/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[._~!@#$^&*])[A-Za-z0-9._~!@#$^&*]{8,16}$/g.test(value)) {
  18. callback()
  19. } else {
  20. callback(new Error('请输入包含英文字母大小写、数字和特殊符号的 8-16 位组合'))
  21. }
  22. }
  23. //重置密码校验
  24. let checkPasswdReset = (rule, value, callback) => {
  25. if (!value) {
  26. return callback()
  27. } else {
  28. if (/^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[._~!@#$^&*])[A-Za-z0-9._~!@#$^&*]{8,16}$/g.test(value)) {
  29. callback()
  30. } else {
  31. callback(new Error('请输入包含英文字母大小写、数字和特殊符号的 8-16 位组合'))
  32. }
  33. }
  34. }
  35. return {
  36. seeEnable: true, //查看
  37. editEnable: false, //修改用户信息时展示重置密码
  38. userInfo: {
  39. nickName: '',
  40. userPasswd: '',
  41. userPasswdRe: '',
  42. phone: '',
  43. userPasswdReset: ''
  44. },
  45. rules: {
  46. userPasswd: [
  47. { required: true, message: '密码不能为空', trigger: 'blur' },
  48. {
  49. min: 8,
  50. max: 16,
  51. message: '长度应在 8 到 16 个字符',
  52. trigger: 'blur'
  53. },
  54. { validator: newValValidate, trigger: 'blur' }
  55. ],
  56. userPasswdRe: [
  57. {
  58. required: true,
  59. validator: checkPasswdRe,
  60. trigger: 'blur'
  61. }
  62. ],
  63. userPasswdReset: [
  64. {
  65. min: 8,
  66. max: 16,
  67. message: '长度应在 8 到 16 个字符',
  68. trigger: 'change'
  69. },
  70. { validator: checkPasswdReset, trigger: 'change' }
  71. ]
  72. }
  73. }

实现效果如下:

3.关于提交——校验

  1. async editSubmitForm() {
  2. this.$refs['ruleForm'].validate(async (valid) => {
  3. if (valid) {
  4. //提交操作
  5. }
  6. })
  7. },

总结/分析:

密码校验,只是表单经常校验的一类,之前遇到select的校验,经常会遇到一打开弹窗,表单的校验就出现的bug,这是由于数据的初始化中的结构和select获取的数据结构不一致的原因,这里也记录一下。

以上就是关于密码校验的开发,其实密码校验还有很多常见的正则类型,比如:

密码包含字母、数字组成,区分大小写的8-18位组合:^(?=.[a-zA-Z])(?=.[0-9])[A-Za-z0-9]{8,18}$

记录over。

标签: 前端 javascript java

本文转载自: https://blog.csdn.net/ParkChanyelo/article/details/128544057
版权归原作者 pcyyyyyyyyyyyyyyyyyy 所有, 如有侵权,请联系我们删除。

“vue2+element-plus 密码校验及动态校验”的评论:

还没有评论