您现在的位置是:首页 > 技术教程 正文

【手机号验证/前端】Vue2+elementUI编写一个手机号验证码登录页面,路由式开发(附完整代码)

admin 阅读: 2024-03-27
后台-插件-广告管理-内容页头部广告(手机)

目录

效果图:

一、template部分

二、style样式

三、script部分

1.先对手机号的格式进行一个判断

2.接下来就是表单验证规则rules

3.最后就是methods了

(1)首先我们给获取验证码绑定一个方法

(2)然后封装一个axios接口,方便后面测试联调(这部分每个人封装的都不一样)

(3)然后是倒计时的方法

(4)最后的登录按钮

四、完整代码


效果图:

一、template部分

这里不是重点,自行对照,并不需要与之完全相同

  1. <div>
  2. <el-form
  3. ref="form"
  4. label-width="70px"
  5. :inline="true"
  6. class="login-container"
  7. :model="form"
  8. :rules="rules"
  9. >
  10. <h3 class="login_title"> 手 机 验 证 登 录 h3>
  11. <el-form-item
  12. label="手机号"
  13. prop="CellPhone"
  14. ref="phone"
  15. >
  16. <el-input v-model="form.CellPhone" placeholder="请输入手机号">
  17. <el-select placeholder="+86">el-select>
  18. el-input>
  19. el-form-item>
  20. <el-form-item
  21. label="验证码"
  22. prop="VerificationCode"
  23. >
  24. <el-input v-model="form.VerificationCode" placeholder="请输入验证码">
  25. <el-button slot="suffix" :disabled="disabled" @click="getCode">
  26. <span class="Time">{{btnTxt}}span>
  27. el-button>
  28. el-input>
  29. el-form-item>
  30. <el-form-item>
  31. <el-button @click="submit" class="login_button" type="primary"> 登 录 el-button>
  32. el-form-item>
  33. el-form>
  34. div>

二、style样式

样式我是用less写的,编写之前需要安装lessless-loader

npm i less npm i less-loader

值得注意的是,要注意版本,太新或者太久都可能导致无法运行

剩下的就是样式了:

  1. <style lang="less" scoped>
  2. .login-container {
  3. width: 450px;
  4. border:1px solid #eaeaea;
  5. margin: 180px auto;
  6. padding: 35px 35px 15px 35px;
  7. border-radius: 15px;
  8. box-shadow: 0 0 25px #cac6c6;
  9. background-color: #ffffff;
  10. box-sizing: border-box;
  11. //修改element的样式的方法有多种,/deep/只是其中一种
  12. /deep/ .el-input__inner {
  13. width: 120%;
  14. border: 0px;
  15. border-bottom: 1px solid;
  16. }
  17. .el-button {
  18. border: 0px;
  19. margin: -80px;
  20. .span {
  21. margin-left: 50px;
  22. }
  23. }
  24. .login_title {
  25. text-align: center;
  26. margin-bottom: 40px;
  27. color: #505458;
  28. }
  29. .el-input {
  30. width: 198px;
  31. }
  32. .login_button {
  33. margin-left: 105px;
  34. margin-top: 10px;
  35. }
  36. .time {
  37. width: 50px;
  38. }
  39. }
  40. style>

样式里有的一行代码能写完的东西用了多行,可自行修改(别问我为什么不改

三、script部分

1.先对手机号的格式进行一个判断

  1. const validatePhone = (rule, value, callback) => {
  2. // console.log(rule)
  3. // console.log(value)
  4. // console.log(callback)
  5. // 判断输入框中是否输入手机号
  6. if (!value) {
  7. callback(new Error('手机号不能为空'))
  8. }
  9. //正则表达式进行验证手机号,从1开始,第二位是35789中的任意一位,以9数字结尾
  10. if (!/^1[35789]\d{9}$/.test(value)) {
  11. callback(new Error('手机号格式不正确'))
  12. }
  13. callback()
  14. }

2.接下来就是表单验证规则rules

  1. rules: {
  2. CellPhone: [
  3. { required: true, trigger: 'blur', message: '请输入11位手机号'},
  4. { required: true, trigger: 'blur', min: 11, max: 11, message: '长度不符合'},
  5. { required: true, trigger: 'blur', validator: validatePhone}
  6. ],
  7. VerificationCode: [
  8. { required: true, trigger: 'blur', message: '请输入4位验证码'},
  9. { required: true, trigger: 'blur', min: 6, max: 6,message: '验证码错误'}
  10. ],
  11. }
required是否必填,如不设置,则会根据校验规则自动生成booleanfalse
trigger触发方式Stringclick/focus/hover/manualclick
blur在 Input 失去焦点时触发(event: Event)
validate对整个表单进行校验的方法,参数为一个回调函数。该回调函数会在校验结束后被调用,并传入两个参数:是否校验成功和未通过校验的字段。若不传入回调函数,则会返回一个 promiseFunction(callback: Function(boolean, object))

3.最后就是methods了

(1)首先我们给获取验证码绑定一个方法

  1. //获取手机验证码方法
  2. getCode() {
  3. // 校验手机号码
  4. if (!this.form.CellPhone) {
  5. //号码校验不通过
  6. this.$message({
  7. message: '请输入手机号',
  8. type:'warning',
  9. });
  10. //正则判断 从1开始,第二位是35789中的任意一位,以9数字结尾
  11. } else if (!/1[35789]\d{9}/.test(this.form.CellPhone)) {
  12. // 失去焦点后自动触发校验手机号规则
  13. } else {
  14. this.time = 60;
  15. this.disabled = true;
  16. //调用倒计时方法
  17. this.timer();
  18. }
  19. }

(2)然后封装一个axios接口,方便后面测试联调(这部分每个人封装的都不一样)

  1. GetPhone({
  2. CellPhone: this.form.CellPhone,
  3. }) .then(({data}) => {
  4. if (data.code === 200) {
  5. this.$message({
  6. message: '验证成功',
  7. type: 'success',
  8. })
  9. } else {
  10. this.$message({
  11. message: '发送失败',
  12. type: 'warning',
  13. })
  14. }
  15. })

(3)然后是倒计时的方法

  1. timer() {
  2. if (this.time > 0) {
  3. this.time--;
  4. // console.log(this.time);
  5. this.btnTxt = this.time + "s后重新获取验证码";
  6. setTimeout(this.timer, 1000);
  7. } else {
  8. this.time = 0;
  9. this.btnTxt = "获取验证码";
  10. this.disabled = false;
  11. }
  12. },

(4)最后的登录按钮

  1. submit() {
  2. this.getCode(({data}) => {
  3. if (data.code === 200) {
  4. this.$router.push('/')
  5. } else {
  6. this.$message.error(data.data.rules.message)
  7. }
  8. })
  9. }

四、完整代码

  1. <template>
  2. <div>
  3. <el-form
  4. ref="form"
  5. label-width="70px"
  6. :inline="true"
  7. class="login-container"
  8. :model="form"
  9. :rules="rules"
  10. >
  11. <h3 class="login_title"> 手 机 验 证 登 录 h3>
  12. <el-form-item
  13. label="手机号"
  14. prop="CellPhone"
  15. ref="phone"
  16. >
  17. <el-input v-model="form.CellPhone" placeholder="请输入手机号">
  18. <el-select placeholder="+86">el-select>
  19. el-input>
  20. el-form-item>
  21. <el-form-item
  22. label="验证码"
  23. prop="VerificationCode"
  24. >
  25. <el-input v-model="form.VerificationCode" placeholder="请输入验证码">
  26. <el-button slot="suffix" :disabled="disabled" @click="getCode">
  27. <span class="Time">{{btnTxt}}span>
  28. el-button>
  29. el-input>
  30. el-form-item>
  31. <el-form-item>
  32. <el-button @click="submit" class="login_button" type="primary"> 登 录 el-button>
  33. el-form-item>
  34. el-form>
  35. div>
  36. template>
  37. <script>
  38. import {GetPhone} from "@/Api/api";
  39. export default {
  40. name: "AppPhone",
  41. data() {
  42. const validatePhone = (rule, value, callback) => {
  43. // console.log(rule)
  44. // console.log(value)
  45. // console.log(callback)
  46. // 判断输入框中是否输入手机号
  47. if (!value) {
  48. callback(new Error('手机号不能为空'))
  49. }
  50. //正则表达式进行验证手机号,从1开始,第二位是35789中的任意一位,以9数字结尾
  51. if (!/^1[35789]\d{9}$/.test(value)) {
  52. callback(new Error('手机号格式不正确'))
  53. }
  54. callback()
  55. }
  56. return {
  57. btnTxt: "获取验证码",
  58. // 是否禁用 即点击之后一段时间内无法再点击
  59. disabled: false,
  60. time: 0,
  61. form: {
  62. CellPhone: '',
  63. VerificationCode: '',
  64. },
  65. rules: {
  66. CellPhone: [
  67. { required: true, trigger: 'blur', message: '请输入11位手机号'},
  68. { required: true, trigger: 'blur', min: 11, max: 11, message: '长度不符合'},
  69. { required: true, trigger: 'blur', validator: validatePhone}
  70. ],
  71. VerificationCode: [
  72. { required: true, trigger: 'blur', message: '请输入4位验证码'},
  73. { required: true, trigger: 'blur', min: 6, max: 6,message: '验证码错误'}
  74. ],
  75. }
  76. }
  77. },
  78. methods: {
  79. //获取手机验证码方法
  80. getCode() {
  81. // 校验手机号码
  82. if (!this.form.CellPhone) {
  83. //号码校验不通过
  84. this.$message({
  85. message: '请输入手机号',
  86. type:'warning',
  87. });
  88. //正则判断 从1开始,第二位是35789中的任意一位,以9数字结尾
  89. } else if (!/1[35789]\d{9}/.test(this.form.CellPhone)) {
  90. // 失去焦点后自动触发校验手机号规则
  91. } else {
  92. this.time = 60;
  93. this.disabled = true;
  94. //调用倒计时方法
  95. this.timer();
  96. // 封装的axios接口
  97. GetPhone({
  98. CellPhone: this.form.CellPhone,
  99. }) .then(({data}) => {
  100. if (data.code === 200) {
  101. this.$message({
  102. message: '验证成功',
  103. type: 'success',
  104. })
  105. } else {
  106. this.$message({
  107. message: '发送失败',
  108. type: 'warning',
  109. })
  110. }
  111. })
  112. }
  113. },
  114. // 倒计时方法
  115. timer() {
  116. if (this.time > 0) {
  117. this.time--;
  118. // console.log(this.time);
  119. this.btnTxt = this.time + "s后重新获取验证码";
  120. setTimeout(this.timer, 1000);
  121. } else {
  122. this.time = 0;
  123. this.btnTxt = "获取验证码";
  124. this.disabled = false;
  125. }
  126. },
  127. // 提交按钮
  128. submit() {
  129. this.getCode(({data}) => {
  130. if (data.code === 200) {
  131. this.$router.push('/')
  132. } else {
  133. this.$message.error(data.data.rules.message)
  134. }
  135. })
  136. }
  137. }
  138. }
  139. script>
  140. <style lang="less" scoped>
  141. .login-container {
  142. width: 450px;
  143. border:1px solid #eaeaea;
  144. margin: 180px auto;
  145. padding: 35px 35px 15px 35px;
  146. border-radius: 15px;
  147. box-shadow: 0 0 25px #cac6c6;
  148. background-color: #ffffff;
  149. box-sizing: border-box;
  150. /deep/ .el-input__inner {
  151. width: 120%;
  152. border: 0px;
  153. border-bottom: 1px solid;
  154. }
  155. .el-button {
  156. border: 0px;
  157. margin: -80px;
  158. .span {
  159. margin-left: 50px;
  160. }
  161. }
  162. .login_title {
  163. text-align: center;
  164. margin-bottom: 40px;
  165. color: #505458;
  166. }
  167. .el-input {
  168. width: 198px;
  169. }
  170. .login_button {
  171. margin-left: 105px;
  172. margin-top: 10px;
  173. }
  174. .time {
  175. width: 50px;
  176. }
  177. }
  178. style>

 若有不足或错误之处,欢迎指点

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索