【易售小程序项目】请求包创建+登录功能实现【基于若依管理系统开发】

2023-10-26

说明

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

请求包创建

小程序的数据需要向后端发请求进行获取,为了简化后续的开发,需要创建一个包专门存放所有发请求的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,
				// 若依管理系统后端识别的是这个
				'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文件
在这里插入图片描述

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() {
			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>

在这里插入图片描述

涉及知识点

错误提示

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

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"
})

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

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

同项目其他文章

该项目的其他文章请查看【易售小程序项目】项目介绍、小程序页面展示与系列文章集合

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【易售小程序项目】请求包创建+登录功能实现【基于若依管理系统开发】 的相关文章

  • 如何从 Solr 查询中获取 tf 和 idf 分数?

    以下 Solr 文档 https cwiki apache org confluence display solr Function Queries https cwiki apache org confluence display sol
  • 在 apache 配置中创建变量

    我有一个 apache 配置 如下所示 RewriteCond QUERY STRING site eu jp in NC RewriteRule fetchHomePage action https example com 1 R 301
  • Apache 重写规则将所有请求重定向到包含另一个 .htaccess 的子目录和重写规则

    我的网络服务器上有公共和私人项目 我将所有公开内容放入网络服务器根目录中 并且我有一个private我只能从本地网络访问该文件夹 由其中的 htaccess 设置 我想简单地将每个私人项目放在private文件夹并自动处理请求 但希望 UR
  • 下载 webroot 之外的文件

    好的 首先道歉 因为我意识到这是一个之前已经讨论过很多次的主题 相信我 我知道 我已经阅读了之前的所有问题和答案 但仍然无法使其发挥作用 我有一个包含可下载文件的文件夹 出于安全目的 我将此文件放置在 Webroot 之外 然而 尽管我尽了
  • Apache + Node.js + mod_proxy。如何将一个域路由到 :3000,另一个域路由到 :80

    问题 我需要在不同域的同一服务器上托管一个 Node 应用程序和一个 php 应用程序 example com 应正常使用端口 80 但 node example com 应路由到端口 3000 使用 mod proxy 将所有流量从端口
  • Apache 服务器上的 React、js

    我正在一个react js项目中工作 我有一个安装了apache服务器的云服务器 我的问题是我可以在 apache 服务器上设置我的反应项目吗 正如达文 泰伦所说 react是一种浏览器技术 除了客户端浏览器从服务器下载应用程序之外 一切都
  • 如何在本地主机中为 XAMPP 创建有效的 SSL [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我如何使用安全连接 SSL in my XAMPP在窗口中 当我打开 localhost 页面时出现以下错误 连接不安全 在我的 XAMP
  • Apache 中的手动内容压缩

    我需要 Apache 上的手动压缩解决方案 我的目标 在我的服务器上提供 gzip 编码的内容以及未压缩的内容 文件已预先压缩 并非所有文件都经过压缩 我想指定这些文件 并且选择不是基于类型 扩展名 的 提供许多内容类型 自定义内容类型 并
  • 适合约 250,000 张图像的最佳 Web 文件夹结构

    我的网站将包含大约 200 000 张图像 每张图像将被存储 3 次 全尺寸 缩略图 更大缩略图 全尺寸图像约为 50Kb 至 500Kb 普通技术 VPS 上的 Linux Apache MySQL PHP 存储这些内容以便通过浏览器快速
  • 使用 .htaccess 重定向主域但不重定向某些子域

    目前我有 Redirect 302 http www example com 虽然我仍然希望发生此重定向 但如果他们说 我不希望它重定向他们foo mydomain com或该子域上的任何其他页面 我怎样才能做到这一点 要以这种方式更具体
  • 无法在运行 apache 服务器上访问 http://localhost:80

    在 ubuntu 14 04 中运行 apache 服务器时我得到 This webpage is not available 在浏览器中或 curl 7 Failed to connect to localhost port 80 Con
  • .htaccess 中的多个 mod_rewrite 规则

    我很难让多个 mod rewrite 规则在我的 htaccess 文件中协同工作 在整个网站中 我想删除 www 来自所有 URL 我在文档根目录中使用以下内容 Options FollowSymLinks RewriteCond HTT
  • $_POST 参数被修改/截断

    当我将 POST 中的数据发送到 php 脚本时 此帖子数据被截断 修改 我有一个变量 encrypted 使用 Guzzle 或 Curl 发送到一个端点 该端点以 json 形式返回发布数据 例如 echo json encode PO
  • 使用 JWT 缺少授权标头

    我正在尝试设置 JSON Web 令牌以从移动应用程序与我的 php 后端进行通信 我可以请求一个令牌就好了 当我需要验证它 或向另一个端点发出请求 时 我使用以下格式设置授权标头 Bearer
  • Nginx 对 cms 后端的重写规则

    我需要在 nginx 服务器中制定 url 重写规则 服务器块 就像我之前的 apache 服务器一样 这是 htaccess 中的代码 我需要将其实现 转换 到我现有的代码中 RewriteRule A Za z0 9 A Za z0 9
  • 升级到 Ubuntu 13.10 后,Apache 不再使用 DocumentRoot(使用显示“It Works!”的默认页面)

    我有各种虚拟主机用于我的网络开发工作 包括 cnm 这 sites available cnm 我的文件说得很简单
  • 如何从 apache 中删除日期标头?

    我需要最小化 Apache HTTP 响应标头 现在我将它们减少如下 HTTP 1 1 200 OK Date Thu 25 Mar 2010 21 57 41 GMT Server Apache Content Type text htm
  • Apache httpd:根据其他*响应*标头有条件地设置响应标头

    有没有办法有条件地设置新的响应标头 其中条件使用另一个response标题 具体来说 仅当响应具有特定的 Content Type 时才应设置新的响应标头 我调查过模组头 http httpd apache org docs 2 2 mod
  • CentOs Php 和 MySql 配置

    我已经安装了 php 并运行了一段时间 但我开始从事一个连接到数据库 即 mysql 的项目 所以我安装了 mysql 5 1 73 现在当我使用它连接到数据库时线 dbhandle mysql connect hostname usern
  • 在 Maven Shade 插件中包含依赖项

    我正在尝试使用 Apache 的 commons lang3 创建一个可部署的 jar 但是 我的 Hadoop 所在的 AWS 集群不包含此库 因此我收到了 classNotFoundException 我想我需要手动添加该依赖项 但我在

随机推荐

  • uni-app开发总结分享

    目录 一 uni app介绍 二 uni app和vue的具体区别 1 组件 标签的变化 2 js 3 uniapp自带路由和请求方式 三 环境搭建 1 安装HbuilderX 2 创建uni app项目 四 项目目录结构 五 运行uni
  • 安装mysql提示3306端口已经被占用解决方案

    今天遇到的问题是这样的 之前已经安装过mysql了 一直用的好好的 但是今天开启服务时报异常 无法启动 为了省事 于是想到卸载重装 在安装的过程中发现3306已经被占用 这也是一开始服务无法启动的原因 看到有人说用fport查看端口号 于是
  • JSP学生网上选课系统设计(源代码+论文+答辩PPT)

    QQ 19966519194 摘要 随着科学技术的不断提高 计算机科学日渐成熟 其强大的功能已为人们深刻认识 它已进入人类社会的各个领域并发挥着越来越重要的作用 学生选课系统作为一种现代化的教学技术 以越来越受到人民的重视 是一个学校不可缺
  • [Unity][ShaderGraph][FlowCanvas] SetFloat 无效:通过脚本控制 shader 的动态参数时需要使用参数的引用名

    我的 shader 很简单 就是一个 tiling and offset 制作滚动效果 然后我想用一个脚本控制 speed 但是实际运行没有起效果 一开始我看的这个 然后用的 sharedmaterial https forum unity
  • Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装

    Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装 目录 Stable Diffuse AI 绘画 之 ControlNet 插件及其对应模型的下载安装 一 简单介绍 二 ControlNet 插
  • Swift - 将String类型的数字转换成数字类型(支持十进制、十六进制)

    https www cnblogs com Free Thinker p 7243683 html 1 十进制的字符串转成数字 Swift中 如果要把字符串转换成数字类型 比如整型 浮点型等 可以先转成NSString类型 让后再转 1 2
  • JAVA:jdbc:sqlserver 连接SQLserver实例名

    weChatjdbc driverClassName com microsoft sqlserver jdbc SQLServerDriver weChatjdbc url jdbc sqlserver 127 0 0 1 instance
  • Ubuntu服务器下安装FastDFS及nginx配置访问等问题记录

    Ubuntu服务器下安装FastDFS及nginx配置访问 下载对应包 编译环境 包解压环境配置 配置nginx模块和安装nginx来进行访问该图片 下载对应包 下载方式一 直接使用 wget 下载 如果太慢 可以去github下载 然后上
  • 基于Matlab开发的动态机器人轨迹仿真

    基于Matlab开发的动态机器人轨迹仿真 近年来 机器人技术的发展已经进入了高速发展时期 控制与仿真技术作为机器人领域中至关重要的一环 也随之发展壮大 而在动态机器人轨迹仿真方面 Matlab作为一款具备强大数学计算能力的软件 在该领域中得
  • QT实现sqlite数据库连接池

    ifndef CONNECTIONPOOL H define CONNECTIONPOOL H FileName 数据库连接池 Function 获取连接时不需要了解连接的名字 支持多线程 保证获取到的连接一定是没有被其他线程正在使用 按需
  • MySQL 远程登录与其常用命令的介绍

    以下的文章主要介绍的是MySQL 远程登录与其常用命令的介绍 MySQL 远程登录与其常用命令之所以能在很短的时间内被人们广泛的应用 原因也是因为它们的独特功能 以下的文章就有对其相关内容的介绍 MySQL 远程登录及常用命令 第一招 My
  • Unbantu22.04使用DevStack一键部署OpenStack(使用nat静态IP)

    d 学习openstack的小白 第一步就遇到了大麻烦 下载并部署Openstack 传统的基于组件 一个个的安装配置更加麻烦 使用DevStack工具 一键部署可能是个不错的选择 But devstack部署期间总是会出现各种各样的错误
  • JavaScript面向对象

    JavaScript面向对象 面向过程 面向过程就是讲需求一步一步自己完全实现 如 一堆衣服 需要自己一件一件洗 面向对象 面向对象是把有共同特征的方法抽取为类 比如 一堆衣服 都需要洗 创建洗衣机类 女朋友类 让她洗 类的定义和使用 定义
  • 机器学习 day09(如何设置学习率α,特征工程,多项式回归)

    1 常见的错误的学习曲线图 上方两个 当关于迭代次数的学习曲线图 出现波浪型或向上递增型 表示梯度下降算法出错 该情况可由 学习率 过大 或代码有bug导致 2 常用的调试方法 选择一个非常非常小的学习率 来查看学习曲线是否还是有误 即在某
  • uni-app网络请求的封装

    uni app网络请求的封装 这几天没事干 就去小程序开发小团队里看看 顺便看了一下代码 在网络请求上发现了一些问题 差点没忍住破口大骂 最终想了想 他们之前没做过 都是第一次就算了 其实是安慰自己而已 网络请求都写在page里 每个请求都
  • 池化方法总结(Pooling)

    在卷积神经网络中 我们经常会碰到池化操作 而池化层往往在卷积层后面 通过池化来降低卷积层输出的特征向量 同时改善结果 不易出现过拟合 为什么可以通过降低维度呢 因为图像具有一种 静态性 的属性 这也就意味着在一个图像区域有用的特征极有可能在
  • JAVA-while循环语句

    while循环语句用法比for语句用起来简单 格式也对的简单 while 判断条件 循环体 public class WhileTest public static void main String args int i 1 while i
  • 将tensorpack的inference改为pytorch

    最近在跑一个OCR模型 模型是用Tensorpack写的 模型做inference的时候 显存 速度都不是很理想 改成pytorch后 显存占用 速度比之前好了很多 记录下改inference的过程遇到的一些坑 将pb文件转为pth文件 i
  • Python 垃圾回收机制

    众所周知 我们当代的计算机都是图灵机架构 图灵机架构的本质 就是一条无限长的纸带 对应着我们今天的存储器 在工程学的演化中 逐渐出现了寄存器 易失性存储器 内存 和永久性存储器 硬盘 等产品 其实 这本身来自一个矛盾 速度越快的存储器 单位
  • 【易售小程序项目】请求包创建+登录功能实现【基于若依管理系统开发】

    文章目录 说明 请求包创建 创建文件夹 请求工具 request js 登录功能实现 请求方法 页面 涉及知识点 错误提示 前端校验 设置 token 到客户端缓存中 路由跳转 如果已经登录过 访问登录页直接跳转到首页 同项目其他文章 说明