uni-app:实现账号密码登录,并且实现当页面登录过该账号在下次登录时无需再输入账号密码(本地缓存实现)

效果

前端代码

一、完整代码

<template><view><view class="all"><view class="title"><image :src="title_login" alt="图片损坏" /></view><form class="login-form" @submit="formSubmit"><view class="input-group "><text class="input-label">帐号</text><input binf cursor-spacing="30" id="userid" maxlength="18" placeholder="请输入用户名" data-type="Idnumber"name='zhanghao' /></view><view class="input-group password"><text class="input-label">密码</text><input :password='isShowPassword' class="mima" name='mima' cursor-spacing="30" id="passwd"placeholder="请输入6位及其以上字符" data-type="password" maxlength="20" /><view class="eye_position" @tap='toggleShowPassword'><image :src='eye' v-if='isShowPassword' /><image :src='eye_close' v-if='!isShowPassword' /></view></view><view><button form-type="submit"style="background-color:#3B759B;width:90%;color:white;margin-top:10%;font-size:20px;">登录</button></view></form></view></view>
</template>
<script>export default {data() {return {isShowPassword: true,zhanghao: '',mima: '',title_login: getApp().globalData.icon + 'login/title_login.png',eye: getApp().globalData.icon + 'index/mine/eye.png',eye_close: getApp().globalData.icon + 'index/mine/eye_close.png',}},methods: {//密码是否显示toggleShowPassword: function(e) {var isShowPassword = !this.isShowPassword;this.isShowPassword = isShowPassword},//用户密码登录formSubmit(e) {//获取用户输入信息this.zhanghao = e.detail.value.zhanghao; //用户输入账号信息this.mima = e.detail.value.mima //用户输入密码信息let zhanghao = this.zhanghaolet mima = this.mima//效验账号密码位数if (zhanghao.length < 2 || zhanghao.length > 10) {uni.showToast({title: '账号应在2~10位之间',icon: 'none'})return} else if (mima.length < 6 || mima.length > 12) {uni.showToast({title: '密码应在6~12位之间',icon: 'none'})return} else {//传入数据到后端,进行登录uni.request({url: getApp().globalData.position + 'Xcxuser/userlogin',header: {"Content-Type": "application/x-www-form-urlencoded"},method: 'POST',dataType: 'json',data: {zhanghao: zhanghao,mima: mima},success: res => { //如果获取到服务器// console.log(res.data)if (res.data == 1) {uni.showToast({title: '账号不存在',icon: "none",})return} else if (res.data == 2) {uni.showToast({title: '密码错误',icon: "none",})return} else if (res.data == 3) {uni.showToast({title: '账号已失效',icon: "none",})return} else {//将账号信息作为全局变量getApp().globalData.username = res.data[0].usernameuni.setStorageSync('username', res.data[0].username)uni.reLaunch({ //跳转到主页,并携带账号参数url: '../../start_production/start_index/start_index?username=' +res.data[0].username})//存入登录变量}},fail: res => {}})}},}}
</script><style>page {background-color: rgb(242, 242, 242);height: 100%;width: 100%;}image {height: 80px;width: 200px;/* border:1px solid black; */z-index: 999px;position: relative;left: 50%;margin-left: -100px;margin-top: 30%;margin-bottom: 10%;}.eye_position {margin: 0px;padding: 0px;width: 45rpx;height: 45rpx;padding-right: 2%;}.eye_position image {margin: 0px;padding: 0px;width: 45rpx;height: 45rpx;}.input-group {display: flex;align-items: center;padding: 25rpx 10rpx;margin: 40rpx 3%;background: #fff;border-radius: 5px;border: 2px solid #f4f4f4;transition: all .25s ease-in-out;width: 88%;height: 60rpx;}.input-group.active {border: 2px solid #7acfa6;}.input-label {color: #888;font-size: 13pt;height: 25rpx;line-height: 25rpx;padding: 0 25rpx;border-right: 1px solid #d8d8d8;}.input-group input,.input-group picker {flex: 1;font-size: 13pt;min-height: 52rpx;height: 52rpx;line-height: 52rpx;padding: 0 25rpx;}.input-placeholder,.input-group picker.placeholder {color: #ccc;}.login-help {display: flex;margin-left: 71%;align-items: center;justify-content: flex-end;padding: 0 30rpx;font-size: 10pt;color: #bbb;}.login-help-img {width: 11pt;height: 11pt;margin: 0 5rpx;}.confirm-btn {font-size: 13pt;line-height: 85rpx;height: 85rpx;background: #1296db;color: #fff;text-align: center;border-radius: 5px;margin: 50rpx 3%;}.confirm-btn:active {opacity: .8;}
</style>

二、标签部分解析

<template><view><view class="all"><view class="title"><image :src="title_login" alt="图片损坏" /></view><form class="login-form" @submit="formSubmit"><view class="input-group "><text class="input-label">帐号</text><input binf cursor-spacing="30" id="userid" maxlength="18" placeholder="请输入用户名" data-type="Idnumber"name='zhanghao' /></view><view class="input-group password"><text class="input-label">密码</text><input :password='isShowPassword' class="mima" name='mima' cursor-spacing="30" id="passwd"placeholder="请输入6位及其以上字符" data-type="password" maxlength="20" /><view class="eye_position" @tap='toggleShowPassword'><image :src='eye' v-if='isShowPassword' /><image :src='eye_close' v-if='!isShowPassword' /></view></view><view><button form-type="submit"style="background-color:#3B759B;width:90%;color:white;margin-top:10%;font-size:20px;">登录</button></view></form></view></view>
</template>
  • 使用了<template>标签定义模板。
  • 页面主要由一个<view>标签组成。
  • 页面包含一个标题图片和一个登录表单。
  • 标题图片使用了<image>标签,通过:src绑定属性来设置图片路径。
  • 登录表单使用了<form>标签,并在提交时调用formSubmit方法。对账号和密码进行name的设置为了在js中获取,button中设置form-type="submit"表名点击此按钮进行表单提交
  • 表单包含了账号和密码的输入框,账号输入框使用了<input>标签,密码输入框使用了<input :password='isShowPassword'>标签,通过v-if控制密码是否显示。
  • 表单最后有一个登录按钮,点击时触发表单的提交事件。

 三、js

<script>export default {data() {return {isShowPassword: true,zhanghao: '',mima: '',title_login: getApp().globalData.icon + 'login/title_login.png',eye: getApp().globalData.icon + 'index/mine/eye.png',eye_close: getApp().globalData.icon + 'index/mine/eye_close.png',}},methods: {//密码是否显示toggleShowPassword: function(e) {var isShowPassword = !this.isShowPassword;this.isShowPassword = isShowPassword},//用户密码登录formSubmit(e) {//获取用户输入信息this.zhanghao = e.detail.value.zhanghao; //用户输入账号信息this.mima = e.detail.value.mima //用户输入密码信息let zhanghao = this.zhanghaolet mima = this.mima//效验账号密码位数if (zhanghao.length < 2 || zhanghao.length > 10) {uni.showToast({title: '账号应在2~10位之间',icon: 'none'})return} else if (mima.length < 6 || mima.length > 12) {uni.showToast({title: '密码应在6~12位之间',icon: 'none'})return} else {//传入数据到后端,进行登录uni.request({url: getApp().globalData.position + 'Xcxuser/userlogin',header: {"Content-Type": "application/x-www-form-urlencoded"},method: 'POST',dataType: 'json',data: {zhanghao: zhanghao,mima: mima},success: res => { //如果获取到服务器// console.log(res.data)if (res.data == 1) {uni.showToast({title: '账号不存在',icon: "none",})return} else if (res.data == 2) {uni.showToast({title: '密码错误',icon: "none",})return} else if (res.data == 3) {uni.showToast({title: '账号已失效',icon: "none",})return} else {//将账号信息作为全局变量getApp().globalData.username = res.data[0].usernameuni.setStorageSync('username', res.data[0].username)uni.reLaunch({ //跳转到主页,并携带账号参数url: '../../start_production/start_index/start_index?username=' +res.data[0].username})//存入登录变量}},fail: res => {}})}},}}
</script>

1、数据部分:

  • isShowPassword:控制密码是否显示的状态,默认为true
  • zhanghao:账号输入框的值,默认为空。
  • mima:密码输入框的值,默认为空。
  • title_login:登录页面标题图片的路径,通过调用getApp().globalData.icon获取全局变量中的图片路径。
  • eye:眼睛打开图标的路径,同样通过调用getApp().globalData.icon获取全局变量中的图片路径。
  • eye_close:眼睛关闭图标的路径,同样通过调用getApp().globalData.icon获取全局变量中的图片路径。

2、方法部分:

  • toggleShowPassword:切换密码显示状态的方法,通过点击眼睛图标触发。方法中将isShowPassword取反,实现密码显示与隐藏的切换。
  • formSubmit:表单提交方法,通过点击登录按钮触发。方法首先获取用户输入的账号和密码信息,然后验证账号和密码的位数是否符合要求。如果不符合要求,将弹出相应的错误提示,并结束方法。如果符合要求,则向后端发送登录请求。请求成功后,根据服务器返回的数据进行判断并做出相应的处理,包括弹出错误提示、保存账号信息到全局变量、跳转到主页等。

后端代码(采用thinkphp)

//账号密码登录public function userlogin(){//获取用户输入的账号密码$zhanghao = input('post.zhanghao');$mima = input('post.mima');//获取输入账号对应的密码信息$user_mima = Db::table('fa_account_info')->where(["username" => $zhanghao])->value('password');//获取账号的状态$blocked = Db::table('fa_account_info')->where(["username" => $zhanghao])->value('blocked');//查找数据库中是否含有此密码(如果账号为空)if (empty(Db::table('fa_account_info')->where(["username" => $zhanghao])->select())) {return 1;}//如果账号存在,但密码错误else if ($mima != $user_mima) {return 2;}else if($blocked==1){return 3;}//成功登录else {$login_info = Db::table('fa_account_info')->where(["username" => $zhanghao, "password" => $mima])->select();echo json_encode($login_info);}}

记住账户密码

账号信息存入本地

在输入正确的账号密码时,有操作设置username的全局变量,以及设置username为本地缓存(见js代码)

getApp().globalData.username = res.data[0].username
uni.setStorageSync('username', res.data[0].username)

进入系统执行方法(App.vue)

完整代码

<script>export default {onLaunch: function() {// 展示本地存储能力const logs = uni.getStorageSync('logs') || []logs.unshift(Date.now())uni.setStorageSync('logs', logs)// 登录const username = uni.getStorageSync('username')console.log('全局'+username)this.globalData.username=usernameif(username){uni.reLaunch({url:'./pages/start_production/start_index/start_index?username='+username,})}},onShow: function() {// console.log('App Show')},onHide: function() {// console.log('App Hide')},globalData:{position:'XXX',icon:'XXX',username:''}}
</script><style></style>

onLaunch 是一个常用的生命周期函数,它在 App 启动时被触发,可以用来执行一些初始化操作和逻辑。

 所以这里只需要在onLaunch 中判断本地缓存是否存在即可,如果存在直接登录,不存在便进行账号密码登录

  •  首先,通过 uni.getStorageSync 方法获取名为 'logs' 的本地存储数据,如果该数据不存在则返回一个空数组。uni.getStorageSync 是 uni-app 提供的接口,用于从本地存储中获取数据。
  • 然后,将当前时间戳(Date.now())添加到获取到的 logs 数组的开头,以记录本次应用启动的时间。unshift 方法用于在数组开头插入元素。

  • 接着,使用 uni.setStorageSync 方法将更新后的 logs 数组重新存储到本地存储中。uni.setStorageSync 用于将数据存储到本地存储中。

  • 继续执行,通过 uni.getStorageSync 获取名为 'username' 的本地存储数据,将其赋值给 const username 变量。这里假设 'username' 是之前保存的用户登录信息。

  • 使用 console.log 打印出全局的 username 变量。

  • 接下来,通过 this.globalData.usernameusername 的值保存到全局变量中,以便在应用的其他页面中使用。其中,this 表示当前小程序实例,globalData 是一个自定义属性,用来存储全局共享的数据。

  • 进行条件判断,如果 username 存在(即用户已登录),则使用 uni.reLaunch 方法跳转到 ./pages/start_production/start_index/start_index 页面,并将 username 作为参数传递给目标页面。

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

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

相关文章

TSDB - VictoriaMetrics 技术原理浅析

一、前言 在监控领域&#xff0c;通常需要指标存储组件TSDB&#xff0c;目前开源的TSDB组件比较多&#xff0c;各个组件性能、高可用性、维护成本等等各有差异。本文不分析选型问题&#xff0c;重点讲解VictoriaMetrics&#xff08;后面简称为vm&#xff09;。 有兴趣的朋友建议…

吉林大学计算机软件考研经验贴

文章目录 简介政治英语数学专业课 简介 本人23考研&#xff0c;一战上岸吉林大学软件工程专硕&#xff0c;政治72分&#xff0c;英一71分&#xff0c;数二144分&#xff0c;专业课967综合146分&#xff0c;总分433分&#xff0c;上图&#xff1a; 如果学弟学妹需要专业课资料…

Mysql执行计划字段解释

文章目录 一、前言二、如何查看执行计划三、执行计划各字段解释四、select_type4.1、SIMPLE&#xff08;简单查询&#xff09;4.1.1、简单的单表查询4.1.2、多表连接查询 4.2、PRIMARY&#xff08;主查询&#xff09;4.2.1、包含复杂子查询的外层查询4.2.2、UNION语句中的第一个…

自动化测试框架unittest与pytest的区别!

引言 前面文章已经介绍了python单元测试框架&#xff0c;大家平时经常使用的是unittest&#xff0c;因为它比较基础&#xff0c;并且可以进行二次开发&#xff0c;如果你的开发水平很高&#xff0c;集成开发自动化测试平台也是可以的。而这篇文章主要讲unittest与pytest的区别&…

可解释的 AI:在transformer中可视化注意力

Visualizing Attention in Transformers | Generative AI (medium.com) 一、说明 在本文中&#xff0c;我们将探讨可视化变压器架构核心区别特征的最流行的工具之一&#xff1a;注意力机制。继续阅读以了解有关BertViz的更多信息&#xff0c;以及如何将此注意力可视化工具整合到…

Debian12中为python3配置虚拟环境及在Pycharm中使用虚拟环境

在Debian 12中&#xff0c;python默认为python 3.11。 基于应用&#xff0c;现需设置虚拟环境。 1.安装venv模块 从python3.3开始&#xff0c;配置python虚拟环境&#xff0c;可用venv模块&#xff0c;更加方便了。 执行命令&#xff1a; #apt install python3.11-venv 2.…

Java虚拟机——前端编译优化

Java的编译期是有上下文语境影响的&#xff0c;不同语境下可以指不同的过程&#xff1a; 可以是前端编译器&#xff0c;把*.java文件转变成*.class文件的过程。 JDK的Javac、Eclipse JDT中的增量式编译器 可以指Java虚拟机的即时编译器&#xff08;JIT编译器&#xff09;在运…

【算法基础:搜索与图论】3.6 二分图(染色法判定二分图匈牙利算法)

文章目录 二分图介绍染色法判定二分图例题&#xff1a;860. 染色法判定二分图 匈牙利匹配二分图最大匹配匈牙利匹配算法思想例题&#xff1a;861. 二分图的最大匹配 二分图介绍 https://oi-wiki.org/graph/bi-graph/ 二分图是图论中的一个概念&#xff0c;它的所有节点可以被…

FPGA驱动SPI屏幕(附完整工程)

一. 简介 相信大家都玩过屏幕&#xff0c;在FPGA上使用最多的就是VGA/HDMI接口的显示器了&#xff0c;这两种显示器的优点就不用说了&#xff0c;缺点就是体积比较大&#xff0c;而且价格比较贵&#xff0c;对于追求便携/价格低的我来说&#xff0c;SPI接口的屏幕才是我的首要…

更新合集 | 七月功能上新记

点击链接了解详情 七月来临&#xff0c;正式开启 2023 下半年的新征途&#xff01;这个盛夏&#xff0c;腾讯云 CODING 上线了微信扫码注册、微信通知、Go 制品管理等重点能力&#xff0c;为企业及团队研发管理带来更多便利&#xff01;以下是 CODING 新功能速递&#xff0c;快…

登录页的具体实现 (小兔鲜儿)【Vue3】

登录页 整体认识和路由配置 整体认识 登录页面的主要功能就是表单校验和登录登出业务 准备模板 <script setup></script><template><div><header class"login-header"><div class"container m-top-20"><h1 cl…

详解go的hex.Encode原理

简言 今天看nsq的messageID生成的时候&#xff0c;发现它使用了hex.Encode函数来产生编码&#xff0c;那就顺道研究一下这个编码方式。 原理 hex是16进制的意思&#xff0c;encode是进行编码的意思&#xff0c;内部实现也很简单&#xff0c;就是 每4位计算出十六进制的值&a…

基于Python机器学习、深度学习在气象、海洋、水文等技能提升教程

详情点击链接&#xff1a;基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用 前言 Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。…

数据可视化(1)

使用python带的matplotlib库进行简单的绘图。使用之前先进行安装&#xff0c;pip install matplotlib。如果安装了Anaconda,则无需安装matplotlib。 1.简单折线图 #绘制简单图表 import matplotlib.pyplot as plt plt.plot([1,2,3,4,5]) plt.show() import matplotlib.pyp…

2023年的深度学习入门指南(19) - LLaMA 2源码解析

2023年的深度学习入门指南(19) - LLaMA 2源码解析 上一节我们学习了LLaMA 2的补全和聊天两种API的使用方法。本节我们来看看LLaMA 2的源码。 补全函数text_completion源码解析 上一节我们讲了LLaMA 2的编程方法。我们来复习一下&#xff1a; generator Llama.build(ckpt_di…

logback-spring.xml日志配置文件详解

目录 前言logback-spring.xml 配置 前言 打印日志是一个系统的基本功能&#xff0c;系统出现异常可以通过查找日志弄清楚是什么原因&#xff0c;从而更加快速地定位问题&#xff0c;修复系统。 logback-spring.xml 配置 文件位置 具体配置 <?xml version"1.0"…

MGRE实验

实验步骤 第⼀步&#xff1a;IP地址规划 PC地址 设备地址 第⼆步&#xff1a;配置IP地址 R1配置 [R1]interface g0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 24 [R1]interface s4/0/0 [R1-Serial4/0/0]ip address 15.1.1.1 24 R2配置 [R2]interface g0/0/…

TCP实现原理和为什么需要三次握手?两次握手不可以?四次握手不可以?

TCP实现原理和为什么需要三次握手?两次握手不可以?四次握手不可以? 1. 什么是TCP协议? TCP&#xff1a;Transmission Control Protocol翻译过来就是传输控制协议,TCP协议是一个面向连接的、可靠的、基于字节流的传输层协议RFC 793对TCP连接的定义 > Connections: >…

Windows 在VMware16.x安装Win11系统详细教程

文章目录 一、准备二、创建虚拟机1. 创建新的虚拟机2. 选择虚拟机硬件兼容性3. 安装客户机操作系统4. 选择客户机操作系统5. 命名虚拟机6. 固件类型7. 处理器配置8. 此虚拟机内存9. 网络类型10. 选择I/O控制器类型11. 选择磁盘类型12. 选择磁盘13. 指定磁盘容量14. 指定磁盘文件…

Centos7.6安装RocketMQ4.9.2并配置开机自启

1、下载RocketMQ 编译后的压缩包 wget https://dlcdn.apache.org/rocketmq/4.9.2/rocketmq-all-4.9.2-bin-release.zip2、解压 unzip rocketmq-all-4.9.2-bin-release.zip3、进入解压文件夹 cd rocketmq-all-4.9.2/4、编辑配置文件/usr/local/rocketmq/rocketmq-all-4.9.4-…