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;。 有兴趣的朋友建议…

回调函数的使用

使用例子 #include<stdio.h>int Callback_1(int x) // Callback Function 1 {printf("Hello, this is Callback_1: x %d ", x);return 0; }int Callback_2(int x) // Callback Function 2 {printf("Hello, this is Callback_2: x %d ", x);return…

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

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

网络—Linux网络收发包的流程

一、接收网络包的过程 引言 网卡是计算机里的一个硬件&#xff0c;专门负责接收和发送网络包&#xff0c;当网卡接收到一个网络包后&#xff0c;会通过 DMA 技术&#xff0c;将网络包写入到指定的内存地址&#xff0c;也就是写入到 Ring Buffer &#xff0c;这个是一个…

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语句中的第一个…

【N32L40X】学习笔记02-gpio输入实例

GPIO 使用实例 该函数库的目的就是在统一的敌方配置gpio&#xff0c;将配置的不同项放置在一个结构体内部没得io口使用一个枚举来定义一个gpio pin的别名 gpio输入实例 key.c #include <stdio.h> #include "key/bsp_key.h" #include "./key/bsp_lib_i…

自动化测试框架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接口的屏幕才是我的首要…

<Spring Boot>开发基于三层架构设计:Dao层、Service层、Controller层及案例一

三层架构设计&#xff1a;基于Spring Boot开发要使用三层架构&#xff1a; 数据访问层&#xff08;Dao&#xff09;、业务逻辑层&#xff08;Service&#xff09;、控制层&#xff08;Control-ler&#xff09; &#xff08;1&#xff09;数据访问层&#xff08;Dao&#xff0…

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

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

会议室预约系统-检验是否被预约核心SQL

会议室预约时&#xff0c;判断能否被预约&#xff0c;即查询是否已经有预约记录&#xff0c;存在不能被预约。 s,e&#xff1b;表示已经预约的开始结束时间&#xff1b; ns,ne&#xff0c;表示表单提交的预约时间&#xff1b; 只需要(ns,ne)与(s,e)区间没有交集&#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…

mac最好用的解压缩工具,支持tar,rar,zip,ios,exe,msi等多种格式

mac系统最好用的压缩工具&#xff0c;支持多种文件压缩格式&#xff0c;甚至你想不到的压缩格式都支持 The Unarchiver&#xff0c;官网地址 包括gui版和命令行版本 不需要gui版本的&#xff0c;可以直接命令安装brew install unar unar使用方法&#xff1a; unar 压缩文件…

基于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…