【UniApp开发小程序】请求包创建+登录功能实现

文章目录

  • 请求包创建
    • 创建文件夹
    • 请求工具`request.js`
  • 登录功能实现
    • 请求方法
    • 页面
    • 涉及知识点
      • 错误提示
      • 前端校验
      • 设置`token`到客户端缓存中
      • 路由跳转

请求包创建

小程序的数据需要向后端发请求进行获取,为了简化后续的开发,需要创建一个包专门存放所有发请求的js方法。

创建文件夹

创建api的存放包
在这里插入图片描述
再创建工具js的存放包
在这里插入图片描述

请求工具request.js

注意使用该文件,请修改baseUrl对应的值,配置好你的后端的请求Ip和端口。

export default {common: {baseUrl: 'http://localhost:8085',// 如果需要真机调试,打开cmd使用ipconfig命令,这样手机才可以在同一局域网访问到后端// baseUrl: 'http://10.23.12.180:6001',data: {},header: {},method: "GET",dataTyoe: 'json'},request(options = {}) {let token = uni.getStorageSync('token')if (token) {this.common.header = {'token': token}}options.url = this.common.baseUrl + options.url;options.data = options.data || this.common.data;options.header = options.header || this.common.header;options.method = options.method || this.common.method;options.dataTyoe = options.dataTyoe || this.common.dataTyoe;return new Promise((res, rej) => {uni.request({...options,success: (result) => {if (result.statusCode != 200) {return rej();}let data = result.data;res(data);}})})}
}

登录功能实现

请求方法

创建login.js文件
在这里插入图片描述

import httpRequest from '@/utils/request'// 登录方法
export function login(username, password, code, uuid) {const data = {username,password,code,uuid}return httpRequest.request({url: '/login',headers: {isToken: false},method: 'post',data: data})
}// 获取验证码
export function getCodeImg() {return httpRequest.request({url: '/captchaImage',headers: {isToken: false},method: 'get',timeout: 20000})
}

页面

创建login.vue文件
在这里插入图片描述

<template><view class="login"><u-toast ref="uToast"></u-toast><view class="form"><view class="title"><text>易售二手平台</text></view><u--form labelPosition="left" :model="model" :rules="rules" ref="loginForm"><u-form-item prop="loginForm.username" leftIcon="account-fill" borderBottom ref="item1"><view class="item"><u--input v-model="model.loginForm.username" border="none"></u--input></view></u-form-item><u-form-item prop="loginForm.password" leftIcon="lock-fill" borderBottom ref="item1"><view class="item"><u--input v-model="model.loginForm.password" password border="none"></u--input></view></u-form-item><u-form-item prop="loginForm.code" leftIcon="integral-fill" borderBottom ref="item1"><view class="item"><u-input v-model="model.loginForm.code" clearable border placeholder="验证码"></u-input><img :src="codeUrl" @click="getCode" class="login-code-img" /></view></u-form-item></u--form><view style="margin-top: 20rpx;"></view><u-button type="primary" class="login-button" @click="login()">登录</u-button></view></view>
</template><script>import {getCodeImg,login} from "@/api/login";export default {data() {return {model: {loginForm: {username: 'admin',password: 'admin123',uuid: '',code: '',},},// 登录表单字段校验过程rules: {'loginForm.username': {type: 'string',required: true,message: '请填写用户名',trigger: ['blur', 'change']},'loginForm.password': {type: 'string',required: true,message: '请填写密码',trigger: ['blur', 'change']},'loginForm.code': {type: 'number',required: true,message: '请输入数字类型的验证码',trigger: ['blur', 'change']},},codeUrl: "",}},onReady() {//onReady 为uni-app支持的生命周期之一this.$refs.loginForm.setRules(this.rules)},created() {this.getCode();},methods: {/*** 获取验证码*/getCode() {// console.log("获取验证码")getCodeImg().then(res => {// console.log("获取验证码:" + JSON.stringify(res))let captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;if (captchaEnabled) {this.codeUrl = "data:image/gif;base64," + res.img;this.model.loginForm.uuid = res.uuid;}});},login() {this.$refs.loginForm.validate().then(res => {// console.log("登录:");login(this.model.loginForm.username, this.model.loginForm.password, this.model.loginForm.code,this.model.loginForm.uuid).then(res => {// console.log("登录:" + JSON.stringify(res))if (res.code != 200) {this.$refs.uToast.show({type: 'error',message: res.msg})} else {// 存储tokenuni.setStorage({key: "token",data: res.token,success: (res) => {// 跳转到首页uni.reLaunch({url: "/pages/index/index"})}})}})}).catch(errors => {this.$refs.uToast.show({type: 'error',message: "表单数据校验失败,请检查后再登录"})})}}}
</script><style lang="scss">.login {display: flex;flex-direction: column;align-items: center;justify-content: center;height: 100vh;// background: #2b92ff;background-color: #0093E9;background-image: linear-gradient(135deg, #0093E9 0%, #80D0C7 100%);.title {width: 100%;font-weight: bold;font-size: 45rpx;display: flex;align-items: center;justify-content: center;margin-bottom: 30rpx;}.form {width: 600rpx;background: #ffffff;padding: 30rpx;border-radius: 20rpx;.item {display: flex;height: 80rpx;}.login-code-img {float: right;height: 80rpx;width: 160rpx;padding-left: 12rpx;}.login-button {margin-top: 50rpx;width: 80%;}}}
</style>

在这里插入图片描述

涉及知识点

错误提示

当用户登录时密码或者验证码出错时,需要提示用户登录出错的原因

this.$refs.uToast.show({type: 'error',message: res.msg
})

在这里插入图片描述

前端校验

现在出错是后端校验的,其实前端也可以做很多校验,在前端不让不合法的输入提交,这样可以减轻后端服务器的压力。如已经验证码为算术题,答案肯定是数字,那就限制用户不能输入字符串。

首先需要定义规则,如下面的代码

rules: {'loginForm.username': {type: 'string',required: true,message: '请填写用户名',trigger: ['blur', 'change']},'loginForm.password': {type: 'string',required: true,message: '请填写密码',trigger: ['blur', 'change']},'loginForm.code': {type: 'number',required: true,message: '请输入数字类型的验证码',trigger: ['blur', 'change']},
},

在页面初始化的时候,给表单设置规则,如下面的代码

onReady() {//onReady 为uni-app支持的生命周期之一this.$refs.loginForm.setRules(this.rules)
},

最后使用:rules="rules"给表单绑定规则,如下面的代码

<u--form labelPosition="left" :model="model" :rules="rules" ref="loginForm">

在点击登录按钮之后,一定要通过校验之后,才真正向后端发请求

this.$refs.loginForm.validate().then(res => {// 校验通过之后,向后端发登录请求
}).catch(errors => {this.$refs.uToast.show({type: 'error',message: "表单数据校验失败,请检查后再登录"})
})

当校验不通过时,不会发请求
在这里插入图片描述

设置token到客户端缓存中

当用户登录成功之后,后端给前端返回一个凭证,即token,可以理解为一把钥匙,用户后面访问其他接口的时候,就带上这把钥匙,后端判断用户有钥匙之后,就让用户访问接口。当然,钥匙是有过期时间的,当过期之后,用户就需要重新登录。下面是设置缓存的代码:

uni.setStorage({key: "token",data: res.token,success: (res) => {// 跳转到首页}
})

在这里插入图片描述
在前面的request.js文件中,有这么一段代码,作用就是在发请求之前,从缓存中取出token对应的值,然后放到请求头中,这样后端就可以去请求头中获取token的值

let token = uni.getStorageSync('token')
if (token) {this.common.header = {'token': token}
}

路由跳转

当登录成功之后,需要跳转到小程序首页

// 跳转到首页
uni.reLaunch({url: "/pages/index/index"
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/22485.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL环境配置

MySQL在centos7环境安装 一.卸载不要的环境二.获取mysql官方yum源三.安装mysql服务四.mysql登陆五.设置配置文件my.cnf六.设置开机启动【可以不设】七.常见问题 安装与卸载中&#xff0c;⽤⼾全部切换成为root&#xff0c;⼀旦安装&#xff0c;普通⽤⼾也能使⽤。 一.卸载不要…

LVGL开发:配置模拟器学习LVGL V8.3

文章目录 模拟器配置常用控件学习基本知识WidgetEvents 输入设备ImagesScreen 参考 模拟器配置 LVGL支持多种IDE下配置模拟器&#xff1a; 在WINDOWS下面&#xff0c;大家最常使用的是VS2019&#xff0c;为了和大家保持一致&#xff0c;这里也使用VS2019进行配置。 首先&…

[Android 13]Binder系列--获取服务

获取服务 hongxi.zhu 2023-7-8 一、客户端发起获取服务 以SurfaceFlinger进程中获取InputFlinger服务为例 frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp sp<IBinder> input(defaultServiceManager()->getService(String16("inputflinger"…

使用Pycharm

本人没有单独安装python&#xff0c;而是直接安装了anaconda 使用Pycharm创建项目 项目取名为HelloWorld&#xff0c;环境使用前面安装的anaconda pycharm安装模块的方法&#xff1a; 打开Pycharm>File > Settings>Project: Python>Project Interpreter

【大数据之Hive】二十三、HQL语法优化之数据倾斜

1 数据倾斜概述 数据倾斜指参与计算的数据分布不均&#xff0c;即某个key或者某些key的数据量远超其他key&#xff0c;导致在shuffle阶段&#xff0c;大量相同key的数据被发往同一个Reduce&#xff0c;导致该Reduce所需的时间远超其他Reduce&#xff0c;成为整个任务的瓶颈。  …

安装部署rancher2.7.0,然后导入K8S集群,管理集群

1. 安装rancher2.7.0 docker run -d --name rancher --restartunless-stopped --privileged -p 80:80 -p 443:443 -v /var/lib/rancher:/var/lib/rancher/ -v /var/log/rancher/auditlog:/var/log/auditlog rancher/rancher:v2.7.02.浏览器登录 2.1 利用默认账号登…

SOPC之NiosⅡ系统(三)

常用NIOS Ⅱ组件概括 目录 1.定时器Timer 1.1 预定义硬件配置 1.2 超时周期Timeout poriod 1.3 计数器大小Timer counter Size 1.4 寄存器Registers 2.串口UART 2.1 基础设置Basic settings 2.1.1 奇偶校验Parity 2.1.2 数据为Data bits 2.1.3 停止位Stop bits 2.1…

CANOE 操作详情

canoe 手把手教你如何操作canoe工具&#xff1a; 1&#xff1a;创建test文件夹&#xff0c; 并在文件夹下创建3 文件夹 2&#xff1a;创建canoe工程&#xff0c;选择500波特率 3: 双击后进入 4&#xff1a;创建DBC文件 5 创建网络节点&#xff1a; 两个节点创建好之后&#x…

【力扣刷题 | 第十九天】

目录 前言&#xff1a; 135. 分发糖果 - 力扣&#xff08;LeetCode&#xff09; 860. 柠檬水找零 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a; 前言&#xff1a; 今天着重刷贪心算法的题目 135. 分发糖果 - 力扣&#xff08;LeetCode&#xff09; n 个孩子…

SQL语法与数据库快速入门(1)

目录 数据库简介数据库分类常用数据库简介使用场景MySql 的安装与配置数据库客户端工具MySql 介绍SQL 简介DDL 数据库操作-创建DDL 数据库操作-查看DDL 数据库操作-修改DDL 数据库操作-删除DDL 数据库表操作简介DDL 数据库表操作-创建DDL 数据库表操作-查看DDL 数据库表操作-修…

explain 是干嘛的

explain 是干嘛的 1.explain的作用 在MySQL中&#xff0c;EXPLAIN是一个用于查询优化的关键字。它可以用于分析查询语句的执行计划&#xff0c;帮助开发人员和数据库管理员理解查询的执行方式、查询涉及的表和索引、连接类型、查询优化器的决策等信息。 通过使用EXPLAIN关键…

【基于FPGA的芯片设计】RISC-V的20条指令CPU设计

实验板卡&#xff1a;xc7a100tlc sg324-2L&#xff0c;共20个开关 实验要求&#xff1a;