全栈仿抖音小程序--登陆、注册、注销模块

后端部分:

注册、登录接口开发

注册 ,就是向数据库里加数据,当然是要之前不存在。否则注册失败

两个主要接口:
两个主要接口

@Transactional(propagation = Propagation.REQUIRED)@Overridepublic boolean queryUserNameIsExist(String username) {Users user = new Users();user.setUsername(username);Users one = usersMapper.selectOne(user);return one!=null;}@Transactional(propagation = Propagation.SUPPORTS)@Overridepublic void saveUser(Users user) {String userId = sid.nextShort();user.setId(userId);usersMapper.insert(user);}

对应的controller:

    /*** 注册** @param user* @return*/@ApiOperation(value = "用户注册",notes = "注册接口")@PostMapping("/regist")public JSONResult regist(@RequestBody Users user) throws Exception {System.out.println(user.getUsername());System.out.println(user.getPassword());//1.用户名密码不为空if (StringUtils.isBlank(user.getUsername()) || StringUtils.isBlank(user.getPassword())) {return JSONResult.errorMsg("用户名/密码为空!");}//2、是否存在boolean flag = userService.queryUserNameIsExist(user.getUsername());//3、保存if (!flag) {user.setNickname(user.getUsername());user.setPassword(MD5Utils.getMD5Str(user.getPassword()));user.setFansCounts(0);user.setReceiveLikeCounts(0);user.setFollowCounts(0);userService.saveUser(user);user.setPassword(null);UsersVO usersVO = setUserRedisSessionToken(user);return JSONResult.ok(usersVO);} else {return JSONResult.errorMsg("用户名已存在!!");}}

登录 ,先查询是否存在,然后再比较账号、密码,检测通过就放行 redis加入缓存

因为前端需要登录用户的信息,所以要把相关信息传递回前端,但是有密码这个敏感信息,所以需要新建一个UserVO ,不需要密码这个属性

public class UsersVO {private boolean isFollow;public boolean isFollow() {return isFollow;}public void setFollow(boolean follow) {isFollow = follow;}@ApiModelProperty(hidden = true)@Idprivate String id;@ApiModelProperty(hidden = true)private String UserToken;/*** 用户名*/@ApiModelProperty(value = "用户名", name = "username", example = "cc", required = true)private String username;/*** 密码*/@ApiModelProperty(value = "密码", name = "password", example = "123123", required = true)@JsonIgnoreprivate String password;/*** 我的头像,如果没有默认给一张*/@ApiModelProperty(hidden = true)private String faceImage;/*** 昵称*/private String nickname;/*** 我的粉丝数量*/@ApiModelProperty(hidden = true)private Integer fansCounts;/*** 我关注的人总数*/@ApiModelProperty(hidden = true)private Integer followCounts;/*** 我接受到的赞美/收藏 的数量*/@ApiModelProperty(hidden = true)private Integer receiveLikeCounts;

值得注意的是,我们新加了一个UserToken属性,是redis中确定User的唯一身份。

登录对应的controller:

@ApiOperation(value = "用户登录",notes = "登录接口")@PostMapping("/login")public JSONResult login(@RequestBody Users users) throws Exception {
//        Thread.sleep(2000);//1.用户名密码不为空if (StringUtils.isBlank(users.getUsername()) || StringUtils.isBlank(users.getPassword())) {return JSONResult.errorMsg("用户名/密码为空!");}//2、是否存在Users checkUser = userService.checkUser(users.getUsername(), MD5Utils.getMD5Str(users.getPassword()));if (checkUser != null) {checkUser.setPassword("");UsersVO usersVO = setUserRedisSessionToken(checkUser);return JSONResult.ok(usersVO);} else {return JSONResult.errorMsg("用户名/密码不正确,请重试...");}}

前面有提到,登录的同时需要加入redis缓存之中。我们使用redisTemplate的操作实现类来实现

private UsersVO setUserRedisSessionToken(Users userModel) {String uniqueToken = UUID.randomUUID().toString();redis.set(USER_REDIS_SESSION + ":" + userModel.getId(), uniqueToken, 1000 * 60 * 30);UsersVO usersVO = new UsersVO();BeanUtils.copyProperties(userModel, usersVO);usersVO.setUserToken(uniqueToken);return usersVO;}

用户注销?把redis里面的纪录通过前面的userId删除即可

@PostMapping("/logout")public JSONResult logout(String userId) throws Exception {redis.del(USER_REDIS_SESSION+":"+userId);return JSONResult.ok();}

小程序部分

在这里插入图片描述
注册按钮绑定事件:

  doRegist: function(e) {var formObject = e.detail.value;var username = formObject.username;var password = formObject.password;//verifyif (username.length == 0 || password.length == 0) {wx.showToast({title: '用户/密码不能为空',icon: 'none',duration: 3000})} else {var serverUrl = app.serverUrl;wx.showLoading({title: '请等待...',})wx.request({url: serverUrl + '/regist',method: "post",data: {username: username,password: password},header: {'content-type': 'application/json' // 默认值},success: function(res) {wx.hideLoading();console.log(res.data);var status = res.data.status;if (status == 200) {wx.showToast({title: '用户注册成功!',icon: 'none',duration: 3000}),//app.userInfo=res.data.data;app.setGlobalUserInfo(res.data.data);} else if (status == 500) {wx.showToast({title: res.data.msg,icon: 'none',duration: 3000})}}})}},

用到了微信小程序内置api
wx.request 就不再赘述其基本用法,主要说明一下

data: {username: username,password: password},

代表传输的数据;这里的数据后端会接收到并完成逻辑处理
如果后台传输的状态码为200 则注册成功。
主要就是这一个doRegist函数。很easy
在这里插入图片描述
再来看登录的方法:

doLogin: function(e) {var me = this;var formObject = e.detail.value;var username = formObject.username;var password = formObject.password;//verifyif (username.length == 0 || password.length == 0) {wx.showToast({title: '用户/密码不能为空',icon: 'none',duration: 3000})} else {var serverUrl = app.serverUrl;wx.showLoading({title: '请等待...',})//调用后端wx.request({url: serverUrl + '/login',method: "post",data: {username: username,password: password},header: {'content-type': 'application/json' // 默认值},success: function(res) {console.log(res.data);wx.hideLoading();var status = res.data.status;console.log(status);if (status == 200) {wx.showToast({title: '登录成功!',icon: 'success',duration: 2000}),//app.userInfo=res.data.data;app.setGlobalUserInfo(res.data.data);var redirectUrl = me.redirectUrl;var user = app.getGlobalUserInfo();//debuggerif (redirectUrl != null && redirectUrl != undefined && redirectUrl != "") {//跳转wx.redirectTo({url: redirectUrl,})} else {//跳转wx.redirectTo({url: '../mine/mine?publisherId=' + user.id,})}} else if (status == 500) {wx.showToast({title: res.data.msg,icon: 'none',duration: 3000,success: function() {wx.redirectTo({url: '../userLogin/login',})}})}}})}},

和注册的逻辑大同小异,通过wx。requset对后端发起请求,根据处理结果做响应动作。如果登录成功

  • 设置全局UserInfo
  • 带上这个信息转向个人主页

这里有一个redirectUrl 是在后面如果未登录状态下有(比如:点赞行为)的话是不允许的,所以再登录之后再转到之前的页面进行操作。

url: '../mine/mine?publisherId=' + user.id,

这里的publisherId是为了区别是自己还是看别人的主页,如果是别人的则是关注、自己 本人则是上传、注销功能

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

抖音一机两号有影响吗?抖音一个设备可以运营多个抖音号吗

一部手机一个设备能不能登录多个抖音号? 一个抖音号可不可以在多个手机上登录?  一部手机登录多个抖音号会有什么后果? 这是做抖音的新手经常会问的问题! 那么今天我们就简单说一下! 首先需要说的是,在某些方面抖音的规则是要比今日头条的规则严格的多!如果你以前…

Spring相关面试题(Spring核心)

Spring相关面试题 谁定义了bean的生命周期IOC初始化 IOC启动阶段 (Spring容器的启动流程)Spring-IOC是什么IOC是什么DI是什么 依赖注入 DI的三种方式Spring-AOP是什么OOPAOPAOP实现方式动JDK动态代理和CGLIB动态代理 JDK动态代理和CGLIB动态代理IOC 和 AOP 的联系和区别 BeanFa…

【拒绝爆零】C++编程考试常见栽区

前言 在OI赛制中,我们可能会因为一些细节原因导致题目爆零。下面,是我列举的一些常见的坑: 1.极值未赋值 这个错误在运行时就能检查出来,但还是会浪费一定的时间,所以我们还是避开这些小插曲为好。 2.定义变量遇到…

JS 正则表达式验证邮箱和手机号

验证邮箱的正则表达式: const regEmail /^([a-zA-Z0-9_-])([a-zA-Z0-9_-])(\.[a-zA-Z0-9_-])/ 或 const regEmail /^([a-zA-Z]|[0-9])(\w|\-)[a-zA-Z0-9]\.([a-zA-Z]{2,4})$/ 验证手机号的正则表达式: const regMobile /^(0|86|17951)?(1(3\d|4[5-9…

JS正则表达式验证表单

我们通常写的表单中,往往要判断用户填的是否符合要求,那么可以通过js的正则式来验证。js的正则式语法可参考菜鸟教程:JS正则表达式 下面是我的表单页面: 在点击下一步的时候,可以通过JS来控制下,如果不符…

最全JS正则表达式验证

Js代码 <script type"text/javascript"> function SubmitCk() { var reg /^([a-zA-Z0-9][_|\_|\.]?)*[a-zA-Z0-9]([a-zA-Z0-9][_|\_|\.]?)*[a-zA-Z0-9]\.[a-zA-Z]{2,3}$/; if (!reg.test($("#txtEmail").val())) { alert("请输入正确邮箱地…

JS正则表达式 验证邮箱

精简而全面&#xff0c;用js的时候很实用&#xff0c;面试可能会考哦&#xff08;前几天赶集网面试求url正则表达式&#xff0c;表示写出来的东西不和规范&#xff09;~ 转自&#xff1a; http://www.cnblogs.com/morningwang/archive/2007/07/27/833810.html 对于我们做WEB开发…

JS之正则表达式之邮箱的验证

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>Document</title> </head> <body><input type"text" placeholder"请输入邮箱" id"email">…

Mysql 唯一索引的字段值 允许多个NULL值存在吗

MYSQL 引擎innodb &#xff0c;设置了唯一索引的列值 允许 多个NULL值存在。 示例&#xff1a; 字段 userCardNum 添加了唯一索引 证实是允许存在的多个NULL值数据的&#xff1a; 原由&#xff1a; 因为这里 NULL 的定义 &#xff0c;是指 未知值。 所以多个 NULL &#xff…

Mysql唯一索引不区分大小写问题

一、问题描述&#xff1a; 表里某字段设置了唯一索引&#xff0c;在插入的时候报唯一索引重复异常 二、原因分析&#xff1a; 经排查发现&#xff0c;插入的一批数据里面&#xff0c;存在英文字母相同&#xff0c;大小写不同的数据。 如下&#xff0c;sm 和 SM 只是大小写不同&…

MySQL - 唯一索引

唯一索引 所谓唯一索引&#xff0c;就是在创建索引时&#xff0c;限制索引的字段值必须是唯一的。通过该类型的索引可以比普通索引更快速地查询某条记录。 1. 创建表时定义索引 CREATE TABLE tablename(propname1 type1,……propnamen type..n,UNIQUE INDEX | KEY [indexname] …

mysql唯一索引与null

1、建表 CREATE TABLE test_user (id bigint(20) unsigned NOT NULL AUTO_INCREMENT,name varchar(255) NOT NULL,age int(11) DEFAULT NULL,PRIMARY KEY (id),UNIQUE KEY name (name,age) ) ENGINEInnoDB AUTO_INCREMENT6 DEFAULT CHARSETutf8mb4; 添加数据 INSERT INTO te…

mysql添加多字段唯一索引吗_mysql多字段唯一索引

项目中需要用到联合唯一索引: 例如:有以下需求:每个人每一天只有可能产生一条记录:处了程序约定之外,数据库本身也可以设定: 例如:user表中有userID,userName两个字段,如果不希望有2条一模一样的记录,需要给user表添加多个字段的联合唯一索引: alter table user add nuique ind…

MySQL 普通索引和唯一索引的区别详解

1 概念区分 普通索引和唯一索引 普通索引可重复&#xff0c;唯一索引和主键一样不能重复。 唯一索引可作为数据的一个合法验证手段&#xff0c;例如学生表的身份证号码字段&#xff0c;我们人为规定该字段不得重复&#xff0c;那么就使用唯一索引。&#xff08;一般设置学号字…

别踩坑!使用MySQL唯一索引请注意

背景 在程序设计中&#xff0c;我们往往需要确保数据的唯一性&#xff0c;比如在常见的注册模块&#xff0c;我们需要确保一个手机号只能注册为一个账号。这种情况下&#xff0c;我们的程序往往是第一道关卡&#xff0c;用户来注册之前&#xff0c;首先判断这个手机号是否已经…

mysql 唯一索引 死锁_MySQL死锁案例_唯一索引

近期在MySQL数据库中产生了死锁的情况&#xff0c;与通常的死锁不同&#xff0c;由于表中有唯一索引&#xff0c;所以加锁方式也比较有趣&#xff0c;本文将对于该例进行阐述(本文将对数据进行脱敏操作)&#xff1a; 问题描述:隔离级别&#xff1a;READ-COMMITTED 表结构&#…

聊聊mysql唯一索引的哪些坑,为什么还是产生重复数据?

前言 前段时间我踩过一个坑&#xff1a;在mysql8的一张innodb引擎的表中&#xff0c;加了唯一索引&#xff0c;但最后发现数据竟然还是重复了。 到底怎么回事呢&#xff1f; 本文通过一次踩坑经历&#xff0c;聊聊唯一索引&#xff0c;一些有意思的知识点。 1.还原问题现场 …

MySQL普通索引与唯一索引

MySQL普通索引与唯一索引 1. MySQL普通索引与唯一索引区别2. MySQL普通索引与唯一索引选择 1. MySQL普通索引与唯一索引区别 MySQL索引详解 MySQL索引分为很多种&#xff0c;常见的有主键索引与非主键索引&#xff0c;主键索引也就是我们常说的聚簇索引&#xff0c;主键索引叶…

MySQL | 普通索引和唯一索引,应该怎么选择?

在前面的基础篇文章中&#xff0c;我给你介绍过索引的基本概念&#xff0c;相信你已经了解了唯一索引和普通索引的区别。今天我们就继续来谈谈&#xff0c;在不同的业务场景下&#xff0c;应该选择普通索引&#xff0c;还是唯一索引&#xff1f; 假设你在维护一个市民系统&…

【MySQL】轻松学习 唯一索引

目录 &#x1f340;&#x1f340;&#x1f340;&#x1f340;&#x1f340; 引言&#xff1a;什么是索引 一、唯一索引概述 二、创建唯一索引 1.创建表时创建唯一索引 唯一索引与unique约束共存时 2、已存在的表上创建索引 2.1、使用create语句 2.2、使用alter table语句 引…