微信小程序之用户登录

用户登录是小程序的一个常用功能,当用户在浏览文章想要收藏时,在线上购买商品时,只有用户登录自己账号以后,才可以进一步使用这些功能。此文论述了小程序用户登录功能的设计流程

一、设计思路

1、界面

小程序界面效果如下所示:

点击默认头像可以选择用微信头像作为小程序头像;点击“请输入昵称”输入框可以手动填写昵称或使用微信昵称;点击“获取用户积分”按钮时,如果已登录,则显示积分,否则显示“未登录或用户不存在”。

2、知识

(1)登录流程时序

角色:

小程序:用户使用的客户端,即微信小程序。

开发者服务器:小程序的后台服务器,为小程序提供服务。

微信接口服务: 微信为开发者服务器提供的接口。

时序
        1.微信小程序获取临时登录凭证code

使用wx.login()方法获取临时登录凭证code,自动生成,有效期5分钟,被微信接口服务验证一次就会失效。

        2.微信小程序发送code至开发者服务器

使用wx.request()方法将code发送给开发者服务器

        3.开发者服务器通过微信接口服务校验登录凭证

开发者服务器将AppID(微信小程序的唯一标识)、appsercret(微信小程序密钥)和code发送给微信接口服务进行登录凭证校验,校验成功,微信接口服务会返回session_key、openid、unionid等信息。session_key是用户的会话密钥,用于对用户数据进行加密签名。opend是用户唯一标识,同一用户在不同的小程序中的openid是不同的。unionid是用户在微信开发者平台账号下的唯一标识。

        4.开发者服务器自定义登录状态

自定义登录状态是指由开发者自由决定如何维持用户的登录状态,常用的做法是,在开发者服务器中为登录成功用户生成一个token,然后通过验证token的有效性来识别用户的登录状态。此文的用户登录功能设计,登录成功时需要保存openid和session_key,然后生成一个 token响应给微信小程序,微信小程序下次请求时,需要携带token,当开发者服务器收到请求后,使用请求的token查询对应用户的openid和session_key,查询成功则已登录,否则未登录。

(2)登录API

微信小程序提供登录API:

wx.login():获取用户登录凭证code,并发送至开发者服务器。

常用选项:

        timeout:  超时时间,单位为毫秒。

        success: 调用成功的回调函数。

        fail: 调用失败的回调函数

        complete: 调用结束时的回调函数。

(3)数据缓存API
常见数据缓存

微信小程序利用数据缓存API可从实现数据缓存,从而加快数据的速度,常见的数据缓存方法如下所示:

常见数据缓存方法
方式方法说明
异步wx.setStorage()将数据存储在本地指定的key中
wx.getStorage()从本地缓存中获取指定key的内容
wx.getStorageInfo()获取当前Storage相关信息
wx.removeStoreage()从本地缓存中移除指定key
同步wx.setStorageSync()同名的同步版本
wx.getStorageSync()同名的同步版本
wx.getStorageInfo()同名的同步版本
wx.removeStorageSync()风名的同步版本

        注意: 单key允许存储的最大数据长度为1MB,数据存储上限为10MB

(4) 头像昵称填写

头像选择: 将button组件open-type属性值设置为chooseAvatar,绑定bindchooseAvatar事件处理函数获取头像信息。

昵称填写:将input的type的属性值设置为nickname,用户可以选择微信昵称或填写昵称。

(5)App()函数

微信小程序中,若要在小程序启动、显示、隐藏时执行操作,或在各个页面共享数据时,可通过App()函数实现。

App()函数用于注册微信小程序,此函数必须在app.js文件中调用,且只能调用一次。其参数为一对象,通过此对象可以指定应用生命周期回调函数和保存共享数据。应用生命周期函数是指小程序"启动-运行-销毁"期间依次调用的函数。应用周期回调函数如下所示:

应用生命周期回调函数
函数名说明
onLaunch()监听小程序初始化,小程序初始化时触发,全局只触发一次
onShow()监听小程序启动或切前台,小程序启动或从后台切前台时触发
onError()错误监听函数,微信小程序脚本错误或者API调用报错时触发
onHide()监听小程序切后台,小程序从前台进入后台时触发
onPageNotFound()页面不存在监听函数,小程序要打开的页面不存在时触发

3、思路

此程序分为小程序和服务器设计,服务器采用nodejs+express框架,其中开发者服务器主要完成向微信服务接口提出验证申请并接收返回的session_key和openid,并生成自定义登录状态token。小程序主要完成界面设计、并完成头像选择或填写,昵称填写等功能。

二、服务器设计

此开发者采用nodejs+express框架,监听端口为3000,主要提供三个服务,分别是 /login ,/checklogin, /credit等服务,login为用户登录服务,checklogin为校验用户登录,credit为查询用户信用分。服务器代码如下所示:

const express = require('express')
const bodyParser = require('body-parser')
const request = require('request')
const app = express()
app.use(bodyParser.json())// 注意:小程序端的appid必须使用真实账号,如果使用测试账号,会出现login code错误
const wx = {appid: '',secret: ''
}var db = {session: {},user: {}
}app.post('/login', (req, res) => {console.log('login code: ' + req.body.code)var url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' + wx.appid + '&secret=' + wx.secret + '&js_code=' + req.body.code + '&grant_type=authorization_code'request(url, (err, response, body) => {console.log('session: ' + body)var session = JSON.parse(body)if (session.openid) {var token = 'token_' + new Date().getTime()db.session[token] = sessionif (!db.user[session.openid]) {db.user[session.openid] = {credit: 100}}}res.json({token: token})})
})app.get('/checklogin', (req, res) => {var session = db.session[req.query.token]console.log('checklogin: ', session)// 将用户是否已经登录的布尔值返回给客户端res.json({is_login: session !== undefined})
})app.get('/credit', (req, res) => {var session = db.session[req.query.token]if (session && db.user[session.openid]) {res.json({credit: db.user[session.openid].credit})} else {res.json({err: '用户不存在,或未登录。'})}
})app.listen(3000, () => {console.log('server running at http://127.0.0.1:3000')
})

部署方法如下:

        1. 准备工作
                安装Node.js
                启动命令行,切换工作目录到当前目录。

        2. 打开index.js,找到如下代码,填写你的 appid 和 secret。
                const wx = {
                          appid: '',
                          secret: ''
                        }

        3. 执行如下命令,启动服务器
                node index.js

三、小程序设计

        1、界面设计

此程序界面设计比较简单,从上至下分别是头像选择按钮,昵称填写框、获取用户积分按钮等,具体代码如下所示:

<!--index.wxml-->
<button class="avatar-wrapper" open-type="chooseAvatar" bindchooseavatar="onChooseAvatar"><image class="avatar" src="{{ avatarUrl }}"></image>
</button>
<input type="nickname" class="nickname" placeholder="请输入昵称" /><button bindtap="credit">获取用户的积分</button>

wxss代码如下所示:

/**index.wxss**/
.avatar-wrapper {width: 160rpx;height: 160rpx;padding: 0;background: none;
}.avatar {width: 160rpx;height: 160rpx;border-radius: 20rpx;
}.nickname {width: 80%;height: 100rpx;margin: 20px auto;border: 1px solid #000000;text-align: center;
}

2、处理逻辑
(1)用户登录

在app.js文件的App({})中编写代码,实现小程序启动时自动执行登录操作,具体步骤为:

(1)定义页面所需的数据。

(2)启动时调用login()方法。

详细代码如下:

// app.js
App({onLaunch: function () {this.checkLogin(res => {console.log('is_login: ', res.is_login)if (!res.is_login) {this.login()}})},login: function () {wx.login({success: res => {console.log('login code: ' + res.code)wx.request({url: 'http://127.0.0.1:3000/login',method: 'post',data: {code: res.code},success: res => {console.log('token: ' + res.data.token)// 将token保存为公共 数据,用于在所有页面中共享tokenthis.globalData.token = res.data.token// 将token保存到数据缓存wx.setStorage({key: 'token',data: res.data.token})}})}})},checkLogin: function (callback) {var token = this.globalData.tokenif (!token) {// 从数据缓存中获取tokentoken = wx.getStorageSync('token')if (token) {this.globalData.token = token} else {callback({ is_login: false })return}}wx.request({url: 'http://127.0.0.1:3000/checklogin',data: { token: token },success: res => {callback({ is_login: res.data.is_login })}})}, // 定义页面所需的数据 globalData: {token: null // 保存token}
})
2、校验用户登录

此程序中,登录成功后,会将服务器返回的token保存在globalData和数据缓存中,再次启动小程序时,先判断token是否存在,如不存在,则执行登录操作,如存在,先验证token是否有效,如无效则执行登录,否则在控制台输出“is_login: true”,详细代码如上所示。

3。获取用户积分

在小程序中,为“获取用户积分”按钮,绑定tap事件(i文件index.wxml中),代码为:

                <button bindtap="credit">获取用户的积分</button>

事件处理函数为credit()在index.js文件中,在函数中,先判断用户是否登录,如未登录则显示"用户不存在,或未登录",如已登录,则调用wx.request()方法向服务器申请查询积分,如请求成功返回积分。详细代码如下所示。

4、获取用户头像和昵称

在界面中定义了button组件和image组件,用于选择头像或展示头像,定义input组件输入昵称。在index.js中定义onChooseAvatar()函数,获取头像信息的临时路径,

index.js 代码如下:

// index.js
const app = getApp()
const defaultAvatar = '/images/avatar.png'
Page({data: {avatarUrl: defaultAvatar,},credit: function () {wx.request({url: 'http://127.0.0.1:3000/credit',data: {token: app.globalData.token},success: res => {console.log(res.data)}})},onChooseAvatar: function (e) {console.log(e)const { avatarUrl } = e.detailthis.setData({ avatarUrl })},  
})

此文论述微信小程序的用户登录功能实现方法和步骤,分别思路、知识、界面、逻辑四个方面进行论述,具体方法是在开发者服务器中完成登录请求、登录用户校验、在小程序的app.js 使用onLaunch()函数完成小程序启动时自动登录,在index.js中编写相应的事件处理函数完成头像选择、昵称填写、查询积分等功能。

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

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

相关文章

web后端--Spring事务管理

事务也要日志配置 !!!!debug前面记得加空格 logging:level:org.springframework.jdbc.support.JdbcTransactionManager: debugrollbackFor 默认情况下&#xff0c;只有出现RunTimeException才会回滚事务&#xff0c;rollbackfor属性用于控制出现何种异常类型&#xff0c;回滚…

Linux shell编程笔记0

一、shell概述 shell是一个命令行解释器&#xff0c;它接收应用程序/用户命令&#xff0c;然后调用操作系统内核。 shell还是一个功能强大的编程语言&#xff0c;易编写、易调试、灵活性强。 二、shell脚本入门 1.进入编辑模式进入到目录下 vi 文件名称如果是system下的文件…

电子水尺的工作原理

TH-SC24电子水尺&#xff0c;也被称为感应式防汛水尺或水位在线监测仪&#xff0c;是一种专门用于监测河流水域水位变化的高科技设备。它在防汛工作中发挥着至关重要的作用&#xff0c;能够实时、准确地提供水位数据&#xff0c;为防汛决策和应急响应提供有力支持。   工作原…

连续两年入选!得帆信息强势上榜2024 Gartner ICT技术成熟度曲线

近日&#xff0c;国际权威咨询机构Gartner发布了《Hype Cycle for ICT in China, 2024》&#xff08;2024年中国ICT技术成熟度曲线&#xff09;报告。得帆信息连续两年入选低代码应用平台&#xff08;LCAP&#xff09;标杆供应商&#xff08;Sample Vendor&#xff09;。 每年&…

ABAP 无意义的FORM 规范

发现一个极为奇怪的现象&#xff0c;大多数ABAP程序员会在FORM名称前加前缀frm_。 请问这是规范吗&#xff0c;整齐好看吗&#xff0c;又好看在哪里呢。这是哪个师傅教的&#xff0c;意义是什么&#xff1f;而且大多数人就来个frm_get_data与frm_del_data&#xff0c;然后这两…

基于springboot+vue+uniapp的居民健康监测小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

(CVPR-2024)通过多阶段框架和定制的多解码器架构提高扩散模型的训练效率

通过多阶段框架和定制的多解码器架构提高扩散模型的训练效率 Paper Title:Improving Training Efficiency of Diffusion Models via Multi-Stage Framework and Tailored Multi-Decoder Architecture Paper是密歇根大学发表在CVPR 2024的工作 Paper地址 Code地址 Abstract 扩散…

通过哨兵1号SAR数据获取桂林619洪水内涝情况

目录 1.SAR数据下载 2.SAR数据处理 1、下载轨道数据并进行轨道校正。 2、数据处理 3、转换SAR单位并创建彩色合成影像 3.查看彩色合成SAR数据 4.水体提取方法探讨 方法1&#xff1a;阈值提取法 方法2&#xff1a;深度学习提取水域 5.SAR与DEM数据获取 2024年6月19日&a…

MobaXterm 软件安装及使用

MobaXterm 软件安装及使用 1. 引言 MobaXterm是一款功能强大的终端软件&#xff0c;支持SSH、Telnet、RDP、VNC、FTP、SFTP、X11转发和串口等远程会话功能。它使得在Windows系统上进行Linux系统的远程管理和文件传输变得简单便捷。 2. MobaXterm 软件下载 下载链接&#xff…

蚓链数字化生态平台:构建城市智能商业,引领协同发展新潮流

​在当今数字化飞速发展的时代&#xff0c;城市商业的运行模式正在经历着数字化变革。蚓链数字化生态平台应运而生&#xff0c;以其强大的功能和创新的理念&#xff0c;成为构建城市智能商业枢纽中心的关键力量&#xff0c;推动着平台互通、业务贯通、管理协同的全新发展格局。…

五个优秀的免费 Ollama WebUI 客户端推荐

认识 Ollama 本地模型框架&#xff0c;并简单了解它的优势和不足&#xff0c;以及推荐了 5 款开源免费的 Ollama WebUI 客户端&#xff0c;以提高使用体验。 什么是 Ollama&#xff1f; Ollama 是一款强大的本地运行大型语言模型&#xff08;LLM&#xff09;的框架&#xff0c…

opencascade AIS_ManipulatorOwner AIS_MediaPlayer源码学习

前言 AIS_ManipulatorOwner是OpenCascade中的一个类&#xff0c;主要用于操纵对象的交互控制。AIS_ManipulatorOwner结合AIS_Manipulator类&#xff0c;允许用户通过可视化工具&#xff08;如旋转、平移、缩放等&#xff09;来操纵几何对象。 以下是AIS_ManipulatorOwner的基…

深度强化学习 ②(DRL)

参考视频&#xff1a;&#x1f4fa;王树森教授深度强化学习 前言&#xff1a; 最近在学习深度强化学习&#xff0c;学的一知半解&#x1f622;&#x1f622;&#x1f622;&#xff0c;这是我的笔记&#xff0c;欢迎和我一起学习交流~ 这篇博客目前还相对比较乱&#xff0c;后面…

angular入门基础教程(一)环境配置与新建项目

ng已经更新到v18了&#xff0c;我对他的印象还停留在v1,v2的版本&#xff0c;最近研究了下&#xff0c;与react和vue是越来越像了&#xff0c;所以准备正式上手了。 新官网地址:https://angular.cn/ 准备条件 nodejs > 18.0vscodeng版本18.x(最新的版本) {"name&qu…

【前端 17】使用Axios发送异步请求

Axios 简介与使用&#xff1a;简化 HTTP 请求 在现代 web 开发中&#xff0c;发送 HTTP 请求是一项常见且核心的任务。Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;适用于 node.js 和浏览器&#xff0c;它提供了一种简单的方法来发送各种 HTTP 请求。本文将介绍 Axio…

【虚拟化】KVM概念和架构

目录 一、什么是KVM&#xff1f; 二、KVM的功能 2.1 主要的功能 2.2 其它功能 三、KVM核心组件及作用 四、KVM与VMware的优势 五、KVM架构 六、qemu介绍 七、创建虚拟机流程 一、什么是KVM&#xff1f; Kernel-based Virtual Machine的简称&#xff0c;KVM 是基于虚拟…

ubuntu部署k8s/microk8s安装部署

资源 节点名称IP配置系统node310.2.20.174核8GUbuntu Server 22.04 LTS 64bitnode210.2.24.44核8GUbuntu Server 22.04 LTS 64bitnode110.2.20.134核8GUbuntu Server 22.04 LTS 64bitmaster10.2.24.104核8GUbuntu Server 22.04 LTS 64bit ps:所有命令尽量使用root账号操作 1…

实体店怎么做会员分析管理,告别“僵尸“会员?

在线上严重蚕食线下的当下&#xff0c;如果实体店不重视会员分析&#xff0c;那它将会错失更多的客户&#xff0c;甚至面临被淘汰的危险。 近年来&#xff0c;越来越多的实体店商家开始重视会员分析管理&#xff0c;但要做好会员分析管理并非易事&#xff0c;需要一整套的工具…

RK平台瑞发科NS6601 MIPI CSI VC虚拟通道支持不同分辨率

需求&#xff1a;两路不同分辨率的摄像头&#xff0c;通过des后输入给一路MIPI CSI。在capture的时候&#xff0c;可以分别支持不同分辨率的capture动作。 设备树 &i2c2 {status "okay";pinctrl-names "default";pinctrl-0 <&i2c2m4_xfer&g…

NLP笔记

文本处理和词嵌入 对于机器来说&#xff0c;不能理解一句话的意思&#xff0c;解决办法就是将一句话分割成多个词&#xff0c;用数字代表一个词&#xff0c;将一句话转化成数字的列表 这个词对应的字典又是怎么训练出来的呢&#xff0c;遍历这个词的列表&#xff0c;如果在字…