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

news2024/11/24 5:42:56

文章目录

  • 请求包创建
    • 创建文件夹
    • 请求工具`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 {
								// 存储token
								uni.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.coloradmin.cn/o/754543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kong 自定义插件安装和调试

文件格式 官方文档 ├── kong-plugin-mepjwt-0.1.0-1.all.rock # luarocks安装依赖 luarocks pack生成的文件 ├── kong-plugin-mepjwt-0.1.0-1.rockspec # luarocks的安装依赖 └── mepjwt├── handler.lua # 主要处理业务逻辑的文件├── jwt_parser.lua # 依…

Android Framework岗位面试真题分享

Handler是Android中的消息处理机制&#xff0c;是一种线程间通信的解决方案&#xff0c;同时你也可以理解为它天然的为我们在主线程创建一个队列&#xff0c;队列中的消息顺序就是我们设置的延迟的时间&#xff0c;如果你想在Android中实现一个队列的功能&#xff0c;不妨第一时…

【量化课程】02_1.宏观经济学基础概念

2.1_宏观经济学基础概念 文章目录 2.1_宏观经济学基础概念1. 宏观经济简单背景1.1 微观经济学时期1.2 宏观经济学开端1.3 宏观经济学研究的问题1.4 宏观经济与理财的联系 2. 宏观经济分析及关键指标2.1 教材中的宏观经济分析框架和指标2.1.1 国内生产总值GDP2.1.2 边际消费倾向…

vcruntime140.dll重新安装方法,vcruntime140.dll修复教程

vcruntime140.dll是Microsoft Visual C Redistributable的一部分&#xff0c;它是Windows操作系统上非常重要的一个动态链接库文件。这个文件包含了一些运行时库函数&#xff0c;用于支持运行在Windows上使用了Microsoft Visual C开发的软件。如果电脑系统中缺失vcruntime140.d…

【Unity面试篇】Unity 面试题总结甄选 |Unity性能优化 | ❤️持续更新❤️

前言 关于Unity面试题相关的所有知识点&#xff1a;&#x1f431;‍&#x1f3cd;2023年Unity面试题大全&#xff0c;共十万字面试题总结【收藏一篇足够面试&#xff0c;持续更新】为了方便大家可以重点复习某个模块&#xff0c;所以将各方面的知识点进行了拆分并更新整理了新…

SOEM_1(笔记,从别的博客文章学的笔记)

目录介绍&#xff1a; doc&#xff1a;帮助文档、 osal&#xff1a;主要是用于符合OSADL和实时进程创建。也就是说&#xff1a;发送EtherCAT数据包不能抖动太大&#xff0c;如果直接使用linux提供的原生线程&#xff0c;可能实时性无法满足。需要对Linux内核打上实时补丁&…

高等数学❤️第一章~第二节~极限❤️极限的概念与性质~数列极限详解

【精讲】高等数学中的数列极限解析 博主&#xff1a;命运之光的主页 专栏&#xff1a;高等数学 目录 导言 一、数列极限的定义 二、数列极限的判定方法 三、数列极限的性质 必需记忆知识点 例题&#xff08;用于熟悉数列极限&#xff09; 例题1 例题2 例题3 结论 导言…

【QQ好友列表展示-设置HeaderView Objective-C语言】

一、好,看一下,刚才我们这个btnGroupTitle的frame为什么是0 现在我们首先知道,当你程序一运行起来以后,你这里的self,就是 当你程序运行起来以后,这个headerView 的frame,默认应该是0的 就是我们看到的效果,它应该都是0 的 一开始都是0 的 那么其实也就是说,是这样…

Pruning 系列 (十)Pruning VGG 实战

环境 python 3.9numpy 1.24.1pytorch 2.0.0+cu117流程 一、 VGG 模型代码 # -*- coding: utf-8 -*- import torch import torch.nn as nndefault_cfg = {11: [64, M, 128, M, 256, 256, M, 512, 512, M, 512, 512],13: [64, 64, M, 128, 128, M, 256, 256, M, 512, 512, M, …

认识企业级定时任务Quartz

文章目录 前言一、实现一个Quartz的小案例1.创建一个maven项目2.添加Quartz依赖3.创建一个配置文件配置Quartz信息4.创建一个Job类继承Job接口5.编写主方法逻辑进行测试6.测试运行结果 二、Job和JobDetail总结 前言 目前仍有大部分企业仍在使用Quartz这种定时任务框架&#xf…

【分布式应用】ceph分布式存储

目录 一、存储基础1.1单机存储设备1.2单机存储的问题1.3分布式存储的类型 二、Ceph简介2.1Ceph 优势2.2Ceph 架构2.3Ceph核心组件OSD&#xff08;Object Storage Daemon&#xff0c;守护进程 ceph-osd&#xff09;PG&#xff08;Placement Group 归置组&#xff09;PoolMonitor…

【运维】第03讲(上):Nginx 负载均衡常见架构及问题解析

实际上 Nginx 除了承担代理网关角色外还会应用于 7 层应用上的负载均衡&#xff0c;本课时重点讲解 Nginx 的负载均衡应用架构&#xff0c;及最常见的问题。 学前提示 Nginx 作为负载均衡是基于代理模式的基础之上&#xff0c;所以在学习本课时前&#xff0c;你需要对 Nginx …

Codeforces Round 884 (Div. 1 + Div. 2)(视频讲解A--D)

[TOC](Codeforces Round 884 (Div. 1 Div. 2)&#xff08;视频讲解A–D&#xff09;) 视频链接&#xff1a;Codeforces Round 884 (Div. 1 Div. 2)&#xff08;视频讲解A–D&#xff09; A Subtraction Game 1、 板书&#xff1a; 2、代码 #include<bits/stdc.h> #…

网络协议与攻击模拟-19-FTP协议

FTP 协议 1、了解 FTP 协议 2、使用在 Windows 操作系统上使用 serv - U 软件搭建 FTP 服务器 3、分析 FTP 流量 一、 FTP 协议 1、概念 FTP &#xff08;文件传输协议&#xff09;&#xff0c;由两部分组成&#xff1a;客户端&#xff0f;服务器 C / S 架构&#xff0c;应…

Uniapp 版本更新

文章目录 前言Uniapp更新确定接口是否能够使用基本代码封装更新软件区别 前言 软件发布之后更新是经常出现的需求。我们希望软件能够自动连网更新软件&#xff0c;而不是重新去手动安装一个apk安装包。不需要更新的软件只有两个&#xff0c;一个是微信小程序&#xff0c;另一个…

C++浅谈const

在学C的时候&#xff0c;必不可少的是const&#xff0c;他或许在C语言中是可有可无的&#xff0c;但是在C中绝对不是&#xff0c;我们在学习C语言的时候&#xff0c;我们知道的是&#xff0c;经常有人说加const是为了保证“安全”&#xff0c;那么&#xff0c;所谓的“安全”是…

MFC第十六天 CFileDialog、CEdit简介、(线程)进程的启动,以及Notepad的开发(托盘技术-->菜单功能)

文章目录 CCommonDialogCFileDialogCEdit托盘技术进程的启动附录1:启动线程方式附录2:MFC对话框的退出过程 CCommonDialog 通用对话框 CCommonDialog 这些对话框类封装 Windows 公共对话框。 它们提供了易于使用的复杂对话框实现。 CFileDialog 提供用于打开或保存文件的标准对…

使用Git上传大文件模型(超过100MB)教程

目录 modelscope官方教程 服务器拒绝的解决方案 检查.gitattributes文件 modelscope官方教程 我们

Amazon 上的数字孪生:使用 L3 预测性数字孪生来预测“行为”

在上一篇博文中&#xff0c;我们讨论了数字孪生的定义和框架&#xff0c;这与我们的客户在其应用中使用数字孪生的方式一致。我们将数字孪生定义为“单个物理系统的动态数字表示&#xff0c;它通过数据进行动态更新以模仿物理系统的真实结构、状态和行为&#xff0c;从而加快获…

Vue3+ts;枚举(enum);Partial全部可选/Pick选一部分/配置 svg 图标/unplugin-vue-components组件自动按需加载

项目的创建 使用 create-vue 脚手架创建项目。 1.执行创建命令 pnpm create vue # or npm init vuelatest # or yarn create vue2.选择项目依赖内容。 ✔ Project name: … //项目名 ✔ Add TypeScript? … No / Yes ✔ Add JSX Support? … No / Yes ✔ Add Vue Router …