【项目功能实现(1):登录】

登录功能比较简单,主要是使用vant做界面。😉😉😉

一、了解Vant

vant官方文档: https://vant-contrib.gitee.io/vant/#/zh-CN

Vant是轻量、可定制的移动端 Vue 组件库。

二、登录界面的编写

2.1 登录界面

准备在顶部放一张图片,下面放两个输入框,两个按钮。
在src目录下,创建login文件夹,在该文件夹下,添加login.vue。
在这里插入图片描述
login.vue的内容如下:

<template>
    <div>
        <img src="https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg"/>
    </div>
    <div>
        <van-field
            v-model="user.name"
            name="账号"
            label="账号"
            placeholder="账号"
            :rules="[{ required: true, message: '请填写账号' }]"
        />
        <van-field
            v-model="user.password"
            type="password"
            name="密码"
            label="密码"
            placeholder="密码"
            :rules="[{ required: true, message: '请填写密码' }]"
        />
    </div>
    <div>
        <van-button plain type="primary" @click="clickButton(1)">登录</van-button>
        <van-button plain type="primary" @click="clickButton(2)">清空</van-button>

    </div>
</template>
<script lang="ts">
import {defineComponent, reactive} from 'vue';
export default defineComponent({
    name: 'Login',
    setup(){
        const images=reactive([
        ]);
        //保存登录的信息
        const user = reactive({
            name:"",
            password:""
        });

        function clickButton(value: number){
            console.log(value);
        }

        return {
            images,
            user,
            clickButton,
        };
    },
})
</script>
<style scoped>
img{
    width: 100%;
}
</style>

这里实现了点击登录,控制台打印1;点击清空,控制台打印2。

2.2 修改路由

在router的index.ts文件中,修改部分代码,使得当访问根路径’/‘时,自动重定向到’/login’路径。另外,定义登录页面路由对应的组件是login.vue,并使用动态导入的方式import组件,修改部分代码如下:

const routes: Array<RouteRecordRaw> = [
  {
    path: '/',
    name: 'home',
    redirect: 'login'
  },
  {
    path: '/login',
    name: 'Login',
    component: ()=>import('../components/login/login.vue')
  },
  {
    path: '/about',
    name: 'about',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
  }
]

可以运行一下,运行截图如下:
在这里插入图片描述

三、使用mock实现用户登录

想使用mock对’/api/login’发送包含用户名以及密码的请求,尝试获取响应。添加下面的代码,当点击登录按钮时,发送请求。

		//获取当前实例对象
        const {proxy}:any = getCurrentInstance();
        //发送登录请求的方法
        function toLogin(){
            proxy.$http.post('/api/login',{
                name:user.name,
                password:user.password
            })
            .then((res: any)=>{
                console.log(res);
            })
            .catch((error: any)=>{
                console.log(error);
            })
        }

        function clickButton(value: number){
            if(value == 1){
                toLogin();
            }
            console.log(value);
        }

在mock中,添加下面的代码:

Mock.mock(/\/api\/login/,(req:any)=>{
    console.log(req.body);
//return中的数据
    return{
        code:0,
        data:{
            msg:'测试登录成功~~~~'
        }
    }
})

这样就可以拦截ajax请求,返回一些模拟数据。
在这里插入图片描述
实现登录逻辑之后的代码:

<template>
    <div>
        <img src="https://fastly.jsdelivr.net/npm/@vant/assets/cat.jpeg"/>
    </div>
    <div>
        <van-field
            v-model="user.name"
            name="账号"
            label="账号"
            placeholder="账号"
            :rules="[{ required: true, message: '请填写账号' }]"
        />
        <van-field
            v-model="user.password"
            type="password"
            name="密码"
            label="密码"
            placeholder="密码"
            :rules="[{ required: true, message: '请填写密码' }]"
        />
    </div>
    <div>
        <van-button plain type="primary" @click="clickButton(1)">登录</van-button>
        <van-button plain type="primary" @click="clickButton(2)">清空</van-button>

    </div>
</template>
<script lang="ts">
import {defineComponent, getCurrentInstance, reactive} from 'vue';
export default defineComponent({
    name: 'Login',
    setup(){
        //获取当前实例对象
        const {proxy}:any = getCurrentInstance();
        const images=reactive([
        ]);
        //保存登录的信息
        const user = reactive({
            name:"",
            password:""
        });

        //发送登录请求的方法
        function toLogin(){
            proxy.$http.post('/api/login',{
                name:user.name,
                password:user.password
            })
            .then((res: any)=>{
                console.log(res);
                if(res.data.code==0){
                    proxy.$toast.success("登录成功");
                }
                else{
                    proxy.$toast.success("登录失败");
                }
            })
            .catch((error: any)=>{
                console.log(error);
            })
        }

        function clickButton(value: number){
            if(value == 1){
                if(user.name == '' && user.password == ''){
                    proxy.$toast.fail("账号密码不能为空");
                }else{
                    toLogin();               
                }
            }
            else if(value == 2){
                user.name="";
                user.password="";
            }
            console.log(value);
        }

        return {
            images,
            user,
            clickButton,
        };
    },
})
</script>
<style scoped>
img{
    width: 100%;
}
</style>

mock

import Mock from 'mockjs'

//设置请求延时
Mock.setup({
    timeout:'200-2000',//单位为毫秒
})

//设置拦截路径
//mock中有三个参数:拦截路径的正则表达式,请求的方法,响应数据的函数
// Mock.mock(/\/api\/register/,'get',homeApi.getHomeData);

//登陆接口
 Mock.mock(/\/api\/testApi/,(req:any)=>{
    console.log(req);
//return中的数据
    return{
        code:0,
        data:{
            msg:'mock测试成功~~~~'
        }
    }
})

Mock.mock(/\/api\/login/,(req:any)=>{
    //账号池
    const userPools=[
        {name:'aa',password:'123456'},
        {name:'bb',password:'123456'},
        {name:'cc',password:'123456'},
        {name:'dd',password:'123456'},
        {name:'ee',password:'123456'},
    ];
    const {name,password} = JSON.parse(req.body);
    console.log(req.body);

    const userLength=userPools.filter((res)=>{
        return res.name = name;
    });

    if(userLength.length>0){
        if(userLength[0].password == password){
            return {
                code: 0,
                data:{
                    msg: '账号不存在'
                }
            }
        }else{
            return {
                code: -1,
                data:{
                    msg: '密码错误'
                }
            }
        }
    }else{
        return {
            code: -1,
            data:{
                msg: '账号不存在'
            }
        }
    }
})

export default Mock;

如果输入的用户名、密码在用户池内,会跳出提示登录成功。
在这里插入图片描述

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值