欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

实操教程:用Vue3和Vant UI打造一款功能丰富的记账应用(包含登录注册及验证码功能)

最编程 2024-02-22 20:08:51
...
<template> <!-- 根据页面显示相应头部 --> <Header :title="type == 'login' ? '登录' : '注册'" /> <div class="auth"> <img class="logo" src="//s.yezgea02.com/1606836859539/onpeice.png" alt="" /> <!-- 登录界面的表单 --> <van-form class="form-wrap" @submit="onSubmit" v-if="type == 'login'"> <div class="form"> <!-- 账号输入框,clearable:清除图标,rules:表单校验规则 --> <van-field clearable v-model="username" name="username" label="账号" placeholder="请输入账号" :rules="[{ required: true, message: '请填写账户' }]" /> <!-- 密码输入框 --> <van-field clearable v-model="password" type="password" name="password" label="密码" placeholder="请输入密码" :rules="[{ required: true, message: '请填写密码' }]" /> </div> <div style="margin: 16px 0"> <van-button round block type="primary" native-type="submit"> 登录 </van-button> <p @click="chanegType('register')" class="change-btn"> 没有账号,前往注册 </p> </div> </van-form> <!-- 注册页面的表单 --> <van-form class="form-wrap" @submit="onSubmit" v-if="type == 'register'"> <div class="form"> <van-field clearable v-model="username" name="username" label="账号" placeholder="请输入账号" :rules="[{ required: true, message: '请填写账号' }]" /> <van-field clearable v-model="password" type="password" name="password" label="密码" placeholder="请输入密码" :rules="[{ required: true, message: '请填写密码' }]" /> <!-- 验证码输入框 --> <van-field center clearable label="验证码" placeholder="输入验证码" v-model="verify" > <!-- 点击刷新验证码 --> <template #button> <!-- 生成验证码图片组件,ref 方便拿到组件内的实例属性 --> <VueImgVerify ref="verifyRef" /> </template> </van-field> </div> <div style="margin: 16px 0"> <van-button round block type="primary" native-type="submit"> 注册 </van-button> <p @click="chanegType('login')" class="change-btn">登录已有账号</p> </div> </van-form> </div> </template> <script> import { reactive, toRefs, ref, onMounted } from "vue"; // 生成验证码的组件 import VueImgVerify from "../components/VueImageVerify.vue"; import Header from "../components/Header.vue"; import axios from "../utils/axios"; // 轻提示(成功/失败...) import { Toast } from "vant"; import router from "../router"; export default { name: "Login", components: { VueImgVerify, // 验证码组件 Header, //公共头组件 }, setup() { // 便于拿到 verifyRef 组件内的实例属性 const verifyRef = ref(null); // 注册登录的相关内容 const state = reactive({ username: "", password: "", type: "login", // 登录注册模式切换参数 verify: "", // 验证码输入框输入的内容 imgCode: "", // 生成的验证图片内的文字 }); console.log("verifyRef", verifyRef); // 提交登录 or 注册表单 const onSubmit = async (values) => { // 登录功能 if (state.type == "login") { const { data } = await axios.post("/user/login", { username: state.username, password: state.password, }); // 添加 token 到本地存储 localStorage.setItem("token", data.token); window.location.href = "/"; } else { // 生成的图片验证码的文字等于验证码组件生成的验证码 state.imgCode = verifyRef.value.imgCode || ""; // 如果验证码组件生成的验证码的小写 != 用户输入的验证码的小写,则提示错误 if ( verifyRef.value.imgCode.toLowerCase() != state.verify.toLowerCase() ) { console.log("verifyRef.value.imgCode", verifyRef.value.imgCode); Toast.fail("验证码错误"); return; } // 验证码匹配成功,注册=>注册成功 await axios.post("/user/register", { username: state.username, password: state.password, }); Toast.success("注册成功"); } }; // 切换登录和注册两种模式 const chanegType = (type) => { state.type = type; }; return { ...toRefs(state), onSubmit, chanegType, verifyRef, }; }, }; </script> <style lang='less' scoped> @import url("../config/custom.less"); .auth { height: calc(~"(100% - 46px)"); padding: 30px 20px 0 20px; background: @primary-bg; .logo { width: 150px; display: block; margin: 0 auto; margin-bottom: 30px; } .form-wrap { .form { border-radius: 10px; overflow: hidden; .van-cell:first-child { padding-top: 20px; } .van-cell:last-child { padding-bottom: 20px; } } } .change-btn { text-align: center; margin: 10px 0; color: @link-color; font-size: 14px; } } </style>