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

这篇具有很好参考价值的文章主要介绍了【UniApp开发小程序】请求包创建+登录功能实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

说明

项目基于若依管理系统进行开发,部分接口来源于若依管理系统后端项目,如本文的登录接口、获取验证码接口。

请求包创建

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

创建文件夹

创建api的存放包
【UniApp开发小程序】请求包创建+登录功能实现,小程序开发,uni-app,小程序,apache,登录
再创建工具js的存放包
【UniApp开发小程序】请求包创建+登录功能实现,小程序开发,uni-app,小程序,apache,登录

请求工具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,
				// 若依管理系统后端识别的是这个
				'Authorization': 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) => {
					// console.log("请求响应:" + JSON.stringify(result));
					let data = result.data;
					if (data.code != 200) {
						// 报错提示
						// uni.showToast({
						// 	title: data.msg,
						// 	icon: 'none',
						// 	duration: 2000
						// })
						if (data.code == 401) {
							console.log("跳转到登录页")
							// 清除掉token,因为token在后端已经过期
							uni.clearStorage();
							uni.reLaunch({
								url: "/pages/login/login"
							})
						} else {
							// catch可以接收data
							return rej(data);
						}
					}
					// then可以接收data
					res(data);
				}
			})
		})
	},

}

关于下面所示的代码,需要根据你的后端来修改,例如你的响应码不一定叫code,你的信息也不一定叫做msg,请求成功的状态码不一定是200,登录的token失效的状态码不一定是401,需要改成自己的

success: (result) => {
// console.log("请求响应:" + JSON.stringify(result));
	let data = result.data;
	if (data.code != 200) {
		// 报错提示
		// uni.showToast({
		// 	title: data.msg,
		// 	icon: 'none',
		// 	duration: 2000
		// })
		if (data.code == 401) {
			console.log("跳转到登录页")
			// 清除掉token,因为token在后端已经过期
			uni.clearStorage();
			uni.reLaunch({
				url: "/pages/login/login"
			})
		} else {
			// catch可以接收data
			return rej(data);
		}
	}
	// then可以接收data
	res(data);
}

登录功能实现

请求方法

创建login.js文件
【UniApp开发小程序】请求包创建+登录功能实现,小程序开发,uni-app,小程序,apache,登录

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文件
【UniApp开发小程序】请求包创建+登录功能实现,小程序开发,uni-app,小程序,apache,登录

<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() {
			let token = uni.getStorageSync('token')
			if (token) {
				this.toIndex();
			}
			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))
							// 存储token
							uni.setStorage({
								key: "token",
								data: res.token,
								success: (res) => {
									this.toIndex();
								}
							})
						}).catch(res => {
						this.$refs.uToast.show({
							type: 'error',
							message: res.msg
						})
					})
				}).catch(errors => {
					this.$refs.uToast.show({
						type: 'error',
						message: "表单数据校验失败,请检查后再登录"
					})
				})

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

		}
	}
</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>

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

涉及知识点

错误提示

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

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

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

前端校验

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

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

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: "表单数据校验失败,请检查后再登录"
	})
})

当校验不通过时,不会发请求
【UniApp开发小程序】请求包创建+登录功能实现,小程序开发,uni-app,小程序,apache,登录

设置token到客户端缓存中

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

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

【UniApp开发小程序】请求包创建+登录功能实现,小程序开发,uni-app,小程序,apache,登录
在前面的request.js文件中,有这么一段代码,作用就是在发请求之前,从缓存中取出token对应的值,然后放到请求头中,这样后端就可以去请求头中获取token的值

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

路由跳转

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

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

如果已经登录过,访问登录页直接跳转到首页

created() {
	let token = uni.getStorageSync('token')
	if (token) {
		this.toIndex();
	}
	this.getCode();
},

同项目其他文章

该项目的其他文章请查看【易售小程序项目】项目介绍、小程序页面展示与系列文章集合文章来源地址https://www.toymoban.com/news/detail-577131.html

到了这里,关于【UniApp开发小程序】请求包创建+登录功能实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp开发微信小程序的登录功能实现

    小程序的登录是必不可少的,那我们如何去实现这个功能呢 1.首先我们是需要去 调用uni.getUserProfile()去获取用户信息的 ,得到一些登录接口相关的一些数据 2.再去 调用uni.login()这个api去获取code字段 3.结合以上这两个api获取的一些数据组合成接口所需要的参数,然后通过调

    2024年02月15日
    浏览(49)
  • uniapp小程序开发|基于微信小程序实现小型比赛自动编排系统

    作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库

    2024年02月11日
    浏览(49)
  • UniApp小程序开发项目创建与运行

    1.准备工作:HbuiderX  +  微信开发者工具下载安装+小程序账号申请开通(这里就不例举了,可以看同账号uniapp小程序开发准备) 2.创建项目 新版本的HbuilderX点击新建项目——选择uni-app——选择默认模板——输入项目名称——选择Vue版本(此随笔是前后端分离开发,不使用UniCloud云

    2023年04月12日
    浏览(35)
  • uniapp + vue3微信小程序开发(3)微信授权登录

    接口获取openId = 用户微信信息入库 = 手机号授权入库 我们知道小程序都是需要openId的,那我们可以通过前端获取,也可以通过后端接口获取, 前端就是这个地址,appid和secret 在你微信公众平台下都可以找到, code,在你调用uni.login就可以获取,但是切记, code码只能使用一次

    2024年02月08日
    浏览(121)
  • uniapp开发小程序部分功能实现详解

    1. 创建tabBar页面         在 pages 下面创建,右键新建页面,这里创建的是 tanBar 对应的几个页面;记住这里要勾选\\\"创建同名目录、在pages.json 中注册\\\"两个选项,默认是选中的;(home、cate、cart、my) 2. 配置tabBar 在pages.json文件中,在pages平级新增tabBar的配置: 由于小程序不支

    2024年02月05日
    浏览(35)
  • 【uniapp】小程序开发:2 安装uni-ui组件库、使用pinia状态管理、自定义http请求

    1、安装 2、配置组件自动导入 使用 npm 安装好 uni-ui 之后,需要配置 easycom 规则,让 npm 安装的组件支持 easycom 打开项目根目录下的 pages.json 并添加 easycom 节点: 3、安装插件,实现uni-ui组件的类型提示 安装完成后,在 tsconfig.json 中增加配置项 4、测试使用 随便复制一个组件在

    2024年02月08日
    浏览(61)
  • uniapp和springboot微信小程序开发实战:前端架构搭建之HBuilder X创建项目以及目录介绍

    HBuilder是DCloud(数字天堂)推出的一款支持HTML5的Web开

    2024年02月09日
    浏览(58)
  • springboot使用 WxJava 实现 微信小程序(uniapp开发)的登陆功能

    前端使用uniapp来开发微信小程序 后端springboot中使用WxJava来做服务端( WxJava是微信服务端开发 的Java SDK ) 该图来源于微信小程序官方文档 根据uniapp的官网直接通过它提供的第三方 登陆api直接使用,代码如下 直接根据WxJava的官方demo (1) yml配置 (2)两个配置文件 (3)contro

    2024年02月15日
    浏览(56)
  • 【uniapp 开发小程序】购物车功能,实现全选、反选、单选、计算总价

    uniapp 开发小程序,实现购物车功能,实现全选、反选、单选、计算总价 关键代码: return totalPrice.toFixed(2); // 保留两位小数 否则会出现多位小数现象:

    2024年02月11日
    浏览(36)
  • 微信小程序开发实战10_2 小程序支付请求签名

    为了保证支付接口使用的安全,微信支付平台在支付API中使用了一些用于接口安全调用的技术。在调用时接口需要使用商户私钥进行接口调用的签名,获取到微信支付平台的应答之后也需要对应答进行签名验证。微信的应答签名使用平台证书来进行签名验证,因此在调用支付

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包