后端部分:
注册、登录接口开发
注册 ,就是向数据库里加数据,当然是要之前不存在。否则注册失败
两个主要接口:
@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是为了区别是自己还是看别人的主页,如果是别人的则是关注、自己 本人则是上传、注销功能