登录注册-表单验证

本文主要实现简单的前端邮箱注册登录以及发送验证码的功能

  登录

 页面:

  <div class="login">
      <a-form
        layout="inline"  //表单布局:水平
        ref="formRef"    //获取整个表单,用以认证登录
        :rules="rules"  //表单验证的规则
        :model="formState"  //表单数据对象
      >
        <a-form-item  class="info">
          还没有账号?
          <router-link to="/register" class="to-reg">立即去注册</router-link>
        </a-form-item>
        <a-form-item class="email" name="username">
          <a-input v-model:value="formState.username" placeholder="请输入邮箱">
          </a-input>
        </a-form-item>
        <a-form-item class="passwd" name="password">
          <a-input v-model:value="formState.password" type="password"  autocomplete="off" placeholder="请输入密码" >  //autocomplete 禁用自动完成功能 
      </a-input>
     </a-form-item>
    <a-form-item class="login-btn">
      <a-button @click="onLogin" :class="{onedit: btnActive}">登录</a-button>
     </a-form-item>
    </a-form>
  </div>

 

 js实现:

export default defineComponent({
  name: "Login",
  setup() {
    let btnActive = ref(false); //登录按钮的动态样式
    const formRef = ref();
    const formState = reactive({
      username: "",
      password: ""
    });
    
    let validateEdit = async (rule, value) => {
      // console.log("validateEdit", value, value === "");
      if (value === "") {
        btnActive.value = false;
      } else {
        btnActive.value = true;
      }
      return Promise.resolve();
    };
    //表单验证规则
    const rules = {
      username: [
        {required: true, message: '输入的邮箱地址不能为空', trigger: ['change','blur']},
        {type: 'email', message: '请输入有效的邮箱地址', trigger: ['change','blur']},
        {validator: validateEdit, trigger: 'change' }
      ],
      password: [
        {required: true, message: '输入的密码不能为空', trigger: ['change','blur']},
        { validator: validateEdit, trigger: "change" },
      ],
    };
  //登录功能 const onLogin
= () => { formRef.value .validate() //触发表单验证 .then(() => { axios.post(config.weburl + '/user/login', qs.stringify({ //qs.stringify 是把一个参数对象格式化为一个字符串。 email:formState.username, password: formState.password })).then(function (response) { // console.log('login:',response); if(response.data.status == 0){ storage.set('tools_user_id',response.data.id); router.push({ path: '/toolshome' }) }else{ message.error('登录失败'); } }).catch(function (error) { console.log(error); }); }) .catch((error) => { console.log('error', error); }); }; return { btnActive, formRef, formState, rules, onLogin } } });

 

  注册

 页面:

<div class="register">
      <a-form
        layout="inline"
        ref="formRef"
        :rules="rules"
        :model="formState"
      >
        <a-form-item  class="info">
          已有账号?
          <router-link to="/login" class="to-reg">去登录</router-link>
        </a-form-item>
        <a-form-item class="email" name="username">
          <a-input v-model:value="formState.username" placeholder="请输入邮箱">
          </a-input>
        </a-form-item>
        <a-form-item class="verification" name="verification">
          <a-input v-model:value="formState.verification" placeholder="请输入邮箱收到的验证码">
          </a-input>
          <a-button @click="sendVerifyCode" :class="{onedit: sendActive}" :disabled="islock">{{sendVerifyBtn}}</a-button>
        </a-form-item>
        <a-form-item class="passwd" name="password">
          <a-input v-model:value="formState.password" type="password"  autocomplete="off" placeholder="请输入密码" >
          </a-input>
        </a-form-item>
        <a-form-item class="passwd" name="password2">
          <a-input v-model:value="formState.password2" type="password"  autocomplete="off" placeholder="请再次输入密码" >
          </a-input>
        </a-form-item>
        <a-form-item class="register-btn">
          <a-button @click="onRegister" :class="{onedit: btnActive}">注册</a-button>
        </a-form-item>
      </a-form>
    </div>

 

 js实现:

export default defineComponent({  name: "Register",  setup() {
   let btnActive
= ref(false); let sendActive = ref(false); const formRef = ref(); let verifyCode = ''; let verfy = ''; const formState = reactive({ username: "", password: "", password2: "", verification: "", }); const islock = ref(false);//发送验证码按钮禁用时期 const sendVerifyBtn = ref('发送验证码');   //按钮的样式规则 let validateEdit = async (rule, value) => { console.log("validateEdit", value, value === ""); if (formState.username == "" && formState.password == "" && formState.password2 == "" && formState.verification == ""){ btnActive.value = false; sendActive.value = false; }else { btnActive.value = true; sendActive.value = true; } return Promise.resolve(); };
  //密码规则
const validatePass = async () => { if (formState.password2 !== '') { formRef.value.validateFields('password2'); } return Promise.resolve(); };
  //确认密码规则
const validatePass2 = async (rule, value) => { if (value !== formState.password) { return Promise.reject("请输入相同密码"); } else { return Promise.resolve(); } };
  //验证码规则
const validateVerfy = async (rule, value) => { if (verfy !== formState.verification) { return Promise.reject('请输入正确的验证码'); } else { return Promise.resolve(); } };   //表单校检规则 const rules = { username: [ {required: true, message: '输入的邮箱地址不能为空', trigger: 'blur'}, {required: true, message: '输入的邮箱地址不能为空', trigger: 'change'}, {type: 'email', message: '请输入有效的邮箱地址', trigger: 'change'}, {type: 'email', message: '请输入有效的邮箱地址', trigger: 'blur'}, {validator: validateEdit, trigger: 'change' } ], verification: [ {required: true, message: '输入的验证码不能为空', trigger: 'blur'}, {required: true, message: '输入的验证码不能为空', trigger: 'change'}, {validator: validateVerfy, trigger: 'blur'}, {validator: validateEdit, trigger: 'change' } ], password: [ {required: true, message: '输入的密码不能为空', trigger: 'blur'}, {required: true, message: '输入的密码不能为空', trigger: 'change'}, {validator: validatePass, trigger: 'blur'}, {validator: validatePass, trigger: 'change' }, { validator: validateEdit, trigger: 'change' } ], password2: [ {required: true, message: '输入的密码不能为空', trigger: 'blur'}, {required: true, message: '输入的密码不能为空', trigger: 'change'}, {validator: validatePass2, trigger: 'blur'}, {validator: validatePass2, trigger: 'change' }, { validator: validateEdit, trigger: 'change' } ] }; const timeWait = function(callback, limit) { let times = limit; const timeout = function(){ if (times > 0) { setTimeout(()=>{ times--; timeout(); callback(times); },1000); } } return timeout; } let _timewait = null; const checkSendLock = (isSend) => { let _waitSencod = 60; let _saveSecond = storage.get('tools_reg_sendwait'); if (_saveSecond) { _waitSencod = _saveSecond; } if (! _timewait && (isSend || !isSend && _waitSencod != 60)) { islock.value = true; _timewait = timeWait(times => { // console.log('sendVerify timeWait',times); sendActive.value = false; sendVerifyBtn.value = '重新发送('+ times + 's)'; storage.set('tools_reg_sendwait', times); if (times == 0) { islock.value = false; if (isSend) { sendActive.value = false; sendVerifyBtn.value = '重新发送'; } else { sendActive.value = true; sendVerifyBtn.value = '发送验证码'; } storage.remove('tools_reg_sendwait'); _timewait = null; } },_waitSencod); _timewait(); } } //生成随机数 const random = (max,min) => { return Math.round(Math.random()*(max-min)+min); }
  //生成随机四位验证码
const randomStr = () => { let strData = ""; //生成随机字符库 (验证码四位,随机数三种,取公倍数12,所以循环4次。也可以是120次,1200次。) for(let i=0;i<4;i++){ let num = random(0,9); let az = String.fromCharCode(random(97,122)); let AZ = String.fromCharCode(random(65,90)); strData = strData + num + az + AZ;//将生成的字符进行字符串拼接 } // 开始真正的随机(从随机字符库中随机取出四个) let str = ""; for(let i=0;i<4;i++){ str += strData[random(0,strData.length-1)] } verfy = str; // console.log('正确验证码:',str) return str; }    //发送验证码 const sendVerifyCode = () => { randomStr(); // console.log('verfy:',verfy); formRef.value.validateFields('username') //触发表单只对某一具体值进行验证 .then(() => { axios.post(config.weburl + '/user/post_email', qs.stringify({ email: formState.username, sale: verfy, })).then(function (response) { console.log('response', response); if (response.data.status == 0) { verifyCode = response.data.sale; checkSendLock(true); message.info('发送验证码成功'); }else if(response.data.status == 1) { message.error(response.data.msg); } else { message.info('发送验证码失败'); } }); }) .catch(err=>{ console.log(err); }); } // window.localStorage.removeItem('tools_reg_sendwait');

const onRegister = () => { formRef.value .validate() .then(() => { axios.post(config.weburl + '/user/register', qs.stringify({ email:formState.username, password: formState.password })).then(function (response) { console.log('onRegister:',response); if(response.data.status == 0){ message.info('注册成功'); storage.remove('tools_reg_sendwait'); router.push({ path: '/login' }); }else{ message.error('注册失败:' + response.data.msg); } }).catch(error => { console.log('里面的error', error); }); }) .catch((error) => { console.log('外面的error', error); }); } } });

 

posted @ 2022-01-13 16:20  打遍天下吴敌手  阅读(208)  评论(0编辑  收藏  举报