zoukankan      html  css  js  c++  java
  • 「小程序JAVA实战」小程序我的个人信息-注销功能(42)

    转自:https://idig8.com/2018/09/06/xiaochengxujavashizhanxiaochengxuwodegerenxinxi-zhuxiaogongneng40/

    注销的功能,直接写在springboot的controller里面就可以了,通过删除redis的方式来完成用户的注销功能。源码:https://github.com/limingios/wxProgram.git 中No.15

    后端代码

    后端代码通过用户user的Id,删除redis的方式来完成。编写对应的controller

    • springboot -api 项目中。
    package com.idig8.controller;
    
    import java.util.UUID;
    
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.BeanUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.idig8.pojo.Users;
    import com.idig8.pojo.vo.UsersVO;
    import com.idig8.service.UserService;
    import com.idig8.utils.JSONResult;
    import com.idig8.utils.MD5Utils;
    
    import io.swagger.annotations.Api;
    import io.swagger.annotations.ApiImplicitParam;
    import io.swagger.annotations.ApiOperation;
    
    @RestController
    @Api(value="用户注册登录的接口",tags={"注册和登录的controller"})
    public class RegistLoginController extends BasicController{
    
        @Autowired
        private UserService userService;
    
    
        @ApiOperation(value="用户注册",notes="用户注册的接口")
        @PostMapping("/regist")
        public JSONResult regist(@RequestBody Users user) {
            //1.判断用户名和密码不能为空
            if(StringUtils.isBlank(user.getUsername())||StringUtils.isBlank(user.getPassword())) {
                return JSONResult.errorMsg("用户名或密码不能为空");
            }
    
            //2.判断用户名是否存在
            boolean usernameIsExist = userService.queryUsernameIsExist(user.getUsername());
            if(!usernameIsExist) {
                user.setNickname(user.getUsername());
                try {
                    user.setPassword(MD5Utils.getMD5Str(user.getPassword()));
                } catch (Exception e) {
    
                    return JSONResult.errorMsg(e.getMessage());
                }
                user.setFollowCounts(0);
                user.setReceiveLikeCounts(0);
                user.setFansCounts(0);
                userService.saveUser(user);
            }else {
                return JSONResult.errorMsg("用户名或已经存在,请更换在试试!");
            }
    
            UsersVO userVO = setUserRedisSessionToken(user);
    
            return JSONResult.ok(userVO);
        }
    
        @ApiOperation(value="用户登录",notes="用户登录的接口")
        @PostMapping("/login")
        public JSONResult login(@RequestBody Users user) {
            //1.判断用户名和密码不能为空
            if(StringUtils.isBlank(user.getUsername())||StringUtils.isBlank(user.getPassword())) {
                return JSONResult.errorMsg("用户名或密码不能为空");
            }
    
            //2.判断用户名是否存在
            Users userObject = userService.queryUserIsExist(user);
    
            if(userObject==null){
                return JSONResult.errorMsg("用户名或密码不存在!");
            }
    
            UsersVO userVO = setUserRedisSessionToken(userObject);
            return JSONResult.ok(userVO);
        }
    
        @ApiOperation(value="用户注销",notes="用户注销的接口")
        @ApiImplicitParam(name="userId",value="用户id",required=true,dataType="String",paramType="query")
        @PostMapping("/logout")
        public JSONResult logout(String userId) {
    
            try {
                redis.del(USERS_REDIS_SESSION + ":" + userId);
            } catch (Exception e) {
                return JSONResult.errorMsg("注销失败"+e.getMessage());
            }
            return JSONResult.ok();
        }
    
        public UsersVO setUserRedisSessionToken(Users userModel) {
            String uniqueToken = UUID.randomUUID().toString();
            redis.set(USERS_REDIS_SESSION + ":" + userModel.getId(), uniqueToken, USERS_REDIS_SESSION_TL);
    
            UsersVO userVO = new UsersVO();
            BeanUtils.copyProperties(userModel, userVO);
            userVO.setUserToken(uniqueToken);
            return userVO;
        }
    }
    
    

    前端代码

    • 用户登录跳转到个人信息页面
      > 修改对应的js跳转,用户登录后保存对应的token到redis中
    const app = getApp()
    
    Page({
      data: {
    
      },
    
      doLogin: function (e) {
        var formObject = e.detail.value;
        var username = formObject.username;
        var password = formObject.password;
    
        // 简单验证
        if (username.length == 0 || password.length == 0) {
          wx.showToast({
            title: '用户名或密码不能为空',
            icon: 'none',
            duration: 3000
          })
        } else {
          wx.showLoading({
            title: '正在加载中。。。'
          });
          wx.request({
            url: app.serverUrl + "/login",
            method: "POST",
            data: {
              username: username,
              password: password
            },
            header: {
              'content-type': 'application/json' // 默认值
            },
            success: function (res) {
              console.log(res.data);
              var status = res.data.status;
              wx.hideLoading();
              if (status == 200) {
                wx.showToast({
                  title: "用户登陆成功~!",
                  icon: 'none',
                  duration: 3000
                })
                app.userInfo = res.data.data;
                wx.redirectTo({
                  url: '../mine/mine',
                })
    
              } else if (status == 500) {
                wx.showToast({
                  title: res.data.msg,
                  icon: 'none',
                  duration: 3000
                })
              }
            }
          })
        }
      },
      goRegisterPage: function (e) {
        wx.redirectTo({
          url: '../userRegister/userRegister',
        })
      }
    })
    

    • 个人信息页面注销
      > 在注销按钮中绑定事件方法,然后从app的全局变量app.userInfo中获得用户的id,发送请求,完成redis中用户的id的删除,完成注销并跳转到注册页面。
    <view>
    
      <view class='container'>
          <image src="{{faceUrl}}" class="face"></image>
        <label class='nickname'>{{nickname}}</label>
          <button size='mini' class='primary' bindtap='uploadVideo'> 上传作品</button>
          <button size='mini' type='' class='logout' bindtap='logout'>注销</button>
    
            <button size='mini' type='' class='follow' data-followType='0' bindtap='followMe'>已关注</button>
    
            <button size='mini' type='primary' class='follow' data-followType='1' bindtap='followMe'>关注我</button>
    
    
        <view class='container-row'>
          <label class='info-items'>{{fansCounts}} 粉丝</label>
          <label class='info-items'>{{followCounts}} 关注</label>
          <label class='info-items'>{{receiveLikeCounts}} 获赞</label>
        </view>
      </view>
    
    </view>
    
    <view class="line"></view>
    

    // pages/mine/mine.js
    const app = getApp()
    Page({
    
      /**
       * 页面的初始数据
       */
      data: {
        faceUrl: "../../resource/images/noneface.png",
        nickname: "昵称",
        fansCounts: 0,
        followCounts: 0,
        receiveLikeCounts: 0,
      },
      logout:function(e){
        var user = app.userInfo;
        wx.showLoading({
          title: '正在注销中。。。'
        });
        wx.request({
          url: app.serverUrl + "/logout?userId="+user.id,
          method: "POST",
          header: {
            'content-type': 'application/json' // 默认值
          },
          success: function (res) {
            console.log(res.data);
            var status = res.data.status;
            wx.hideLoading();
            if (status == 200) {
              wx.showToast({
                title: "用户注销成功~!",
                icon: 'none',
                duration: 3000
              })
              app.userInfo = null;
              wx.redirectTo({
                url: '../userRegister/userRegister',
              })
    
            } else if (status == 500) {
              wx.showToast({
                title: res.data.msg,
                icon: 'none',
                duration: 3000
              })
            }
          }
        })
      },
    
      /**
       * 生命周期函数--监听页面加载
       */
      onLoad: function (options) {
    
      },
    
      /**
       * 生命周期函数--监听页面初次渲染完成
       */
      onReady: function () {
    
      },
    
      /**
       * 生命周期函数--监听页面显示
       */
      onShow: function () {
    
      },
    
      /**
       * 生命周期函数--监听页面隐藏
       */
      onHide: function () {
    
      },
    
      /**
       * 生命周期函数--监听页面卸载
       */
      onUnload: function () {
    
      },
    
      /**
       * 页面相关事件处理函数--监听用户下拉动作
       */
      onPullDownRefresh: function () {
    
      },
    
      /**
       * 页面上拉触底事件的处理函数
       */
      onReachBottom: function () {
    
      },
    
      /**
       * 用户点击右上角分享
       */
      onShareAppMessage: function () {
    
      }
    })
    

    流程演示

    • 用户登录,redis内增加
      >用户登录保存user的id到redis中

    • 点击注销,查看redis内容
      >redis清空了对应user的id信息,跳转到注册页面。

    swagger2的讲解

    之前写的内容有老铁反应,swagger能详细讲讲参数不,我说这个坑我一定填。

    ####注释关键字详解

    • @ApiOperation

      @ApiOperation(value = “接口说明”, httpMethod = “接口请求方式”, response = “接口返回参数类型”, notes = “接口发布说明”

    • @ApiImplicitParam
    • @ApiModel

      @ApiModelProperty()用于方法,字段; 表示对model属性的说明或者数据操作更改
      value–字段说明
      name–重写属性名字
      dataType–重写属性类型
      required–是否必填
      example–举例说明
      hidden–隐藏

    @ApiModel(value="user对象",description="用户对象user")
    public class Users implements Serializable{
        private static final long serialVersionUID = 1L;
         @ApiModelProperty(value="用户名",name="username",example="idig8")
         private String username;
         @ApiModelProperty(value="状态",name="state",required=true)
          private Integer state;
          private String password;
    
          @ApiModelProperty(value="id数组",hidden=true)
          private String[] ids;
    }
    

    PS:OK,这就是咱们个人信息中的注销功能,也可以好好熟悉下swagger api的使用其实真的很有用!

  • 相关阅读:
    tomcat与eclipse配置
    关于hyperic5.0安装/使用笔记
    java小程序,模拟电视机和遥控
    seldom潜水
    兼容性调试平台
    潜水pw
    scrcpy 👍
    潜水远程调试设备
    尝试方法 在众多平台快速通过脚本自动化验证页面兼容性,可以验证pc,web ,android ,ios,驱动支持java,ruby,c#,python ,js
    try catch嵌套try catch
  • 原文地址:https://www.cnblogs.com/sharpest/p/10296899.html
Copyright © 2011-2022 走看看