接下来开始根据前端请求开发功能
一.运行前台服务
将前台的前端和后端项目都跑起来
二.实现立即注册功能
进入注册界面: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);
}
完成之后重启项目,点击完成注册,看是否有提示信息
存在提示信息,说明断言工具类和自定义异常及拦截异常成功
然后点击发送验证码
点击完成注册,进入登录页面,说明注册功能成功
你会发现数据库中的用户数据多了一条,说明注册成功