狼行天下5 - 用户注册

接下来开始根据前端请求开发功能

一.运行前台服务

将前台的前端和后端项目都跑起来

二.实现立即注册功能

进入注册界面:localhost/regist.html

输入电话,然后点击立即注册,发现报错

然后根据其url查找到对应的前端页面(trip-web-site/resources/static/views目录下),即regist.html

然后发现regist.html引用的脚本为/js/system/regist.js

发现它发送了一个ajax请求,请求方式为get,得到响应数据data,如果data为true,则提示已注册,否则显示下个页面

然后就可以根据前端请求在trip-website-api中对应的controller中写方法:

因为请求为/users/checkPhone,父路径时/users,所以在UserinfoController中写方法

 然后实现checkPhone,

写完后重启服务,

然后刷新上次网页,重新点击注册,进入到下个页面

三.编写JSON封装工具类

接着观察regist.js中前端的请求方法

发现它需要状态码(trip-core),此时则需要自己封装JsonResult类,将返回的数据封装成JSON格式

在trip-core下util中新建工具类JsonResult:

package com.example.util;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class JsonResult<T> {
    public static final int CODE_SUCCESS = 200;
    public static final String MSG_SUCCESS = "操作成功";

    public static final int CODE_ERROR = 500;
    public static final String MSG_ERROR = "系统异常,请联系管理员";

    public static final int CODE_NOLOGIN = 401;
    public static final String MSG_NOLOGIN = "请先登录";

    public static final int CODE_BUSINESS_ERROR = 501;
    public static final String MSG_BUSINESS_ERROR = "业务异常";

    private int code;
    private String msg;

    private T data;

    //   成功后不返回数据
    public static JsonResult success(){
        return new JsonResult(CODE_SUCCESS, MSG_SUCCESS, null);
    }

    //    成功后返回数据
    public static <T> JsonResult success(T data) {
        return new JsonResult(CODE_SUCCESS, MSG_SUCCESS, data);
    }

    //系统异常处理
    public static JsonResult defaultError(){
        return new JsonResult(CODE_ERROR, MSG_ERROR, null);
    }

    //没登录异常处理
    public static JsonResult noLogin(){
        return new JsonResult(CODE_NOLOGIN, MSG_NOLOGIN, null);
    }

    //  业务异常处理
    public static JsonResult businessError(String msg){
        return new JsonResult(CODE_BUSINESS_ERROR, msg,null);
    }

    //其他异常处理
    public static JsonResult error(int code, String msg) {
        return new JsonResult(code, msg, null);
    }
}

四.编写自定义异常类并捕获自定义异常

创建exception包,在其中新建自定义异常

 

package com.example.exception;

public class BusinessException extends RuntimeException{
    public BusinessException(String msg){
        super(msg);
    }
}

创建advice包,在其中新建异常拦截类,用来像前端反馈异常提示

package com.example.advice;

import com.example.exception.BusinessException;
import com.example.util.JsonResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

//统一异常处理
@RestControllerAdvice
public class CommonExceptionHandler {
    //捕获自定义逻辑异常
    @ExceptionHandler(BusinessException.class)
    public JsonResult businessExceptionHandler(BusinessException e){
            e.printStackTrace();
        return JsonResult.businessError(e.getMessage());
    }

    //捕获其他异常
    @ExceptionHandler(RuntimeException.class)
    public JsonResult runtimeExceptionHandler(RuntimeException e){
        e.printStackTrace();
        return JsonResult.defaultError();
    }
}

 

六.实现发送验证码功能

创建完JSON封装工具且创建完自定义异常后,开始实现发送验证码功能

请求路径:/users/sendVerifyCode,请求方式get,参数phone,返回值JsonResult 

 

//发送验证码
    @GetMapping("/sendVerifyCode")
    public JsonResult sendVerifyCode(String phone){
        userinfoService.sendVerifyCode(phone);
        return JsonResult.success();
    }

@Override
    //发送验证码
    public void sendVerifyCode(String phone){
        //生成验证码
        Random random = new Random();
        Integer num = random.nextInt(89999)+10000;
        String code = num.toString();
        //发送验证码
        try {
            SmsUtil.sendSmsAliyun(phone,code);
        } catch (Exception e) {
            e.printStackTrace();
            throw new BusinessException("验证码发送失败");
        }
        //TODO:存储验证码
    }

 七.编写断言工具类

为了方便对注册信息进行确认和反馈,设计断言工具类

package com.example.util;

import com.example.exception.BusinessException;
import org.springframework.util.StringUtils;

//断言异常
public class AssertUtil {
    /**
     * 判空
     * 参数 1 :要判断的字符串
     * 参数 2 : 当参数1为 null或者“ ”时的提示信息
     */

    //判断是否有内容
    public static void hasLength(String text,String message){
      //不符合要求抛出异常
        if (!StringUtils.hasLength(text)) {
            throw new BusinessException(message);
        }
    }


    /**
     * 判断输入的两个内容是否一致
     * @param text1
     * @param text2
     */
    public static void isEquals(String text1, String text2,String message) {
        if (!text1.equals(text2)) {
            throw new BusinessException(message);
        }
    }
}

八.实现完成注册功能

//用户注册
    @PostMapping("/regist")
    public JsonResult regist(String phone,String nickname,String password,String rpassword,String verifyCode){
        userinfoService.regist(phone, nickname, password, rpassword, verifyCode);
        return JsonResult.success();

    }

 

@Override
    public void regist(String phone, String nickname, String password, String rpassword, String verifyCode) {
        //参数的有效性判断
        AssertUtil.hasLength(nickname, "昵称不能为空");
        AssertUtil.hasLength(phone, "手机号不能为空");

        AssertUtil.hasLength(password, "密码不能为空");
        AssertUtil.hasLength(rpassword, "确认密码不能为空");
        AssertUtil.isEquals(password, rpassword, "密码输入不一致");
        AssertUtil.hasLength(verifyCode, "验证码不能为空");

        //插入数据
        Userinfo userinfo = new Userinfo();
        userinfo.setPhone(phone);
        userinfo.setNickname(nickname);
        userinfo.setPassword(password);
        userinfo.setGender(0);
        userinfo.setLevel(1);
        userinfo.setState(0);
        userinfo.setHeadImgUrl("/images/default.jpg");
        userinfoMapper.insert(userinfo);
    }

完成之后重启项目,点击完成注册,看是否有提示信息

 

存在提示信息,说明断言工具类和自定义异常及拦截异常成功

然后点击发送验证码

 

点击完成注册,进入登录页面,说明注册功能成功

 

你会发现数据库中的用户数据多了一条,说明注册成功

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值