架构设计(基础的组件)
涉及到的数据表
涉及到的模型(抽象,根据各层的需要)
根据各层不同的需求需要进行POJO的各种封装
用户注册
生成验证码
- 前端填写手机号,传送给后端
- 后端生成验证码,发送成功标志给前端
- 前端获取到Json数据对其分析跳转到注册页面,进行表单填写
@RequestMapping(value = "/getotp",method = {RequestMethod.POST},consumes = {CONTENT_TYPE_FORMED})//consumers传输的数据为form表单
@ResponseBody
//@RequestParam传送的参数
public CommonReturnType getOtp(@RequestParam(name="telphone") String telphone){
//需要按照一定的规则生成OTP验证码
Random random = new Random();
int randomInt = random.nextInt(99999);
randomInt =randomInt+1000;
String otpCode = String.valueOf(randomInt);
//将OTP验证码同对应用户的手机号关联
//可以使用Redis缓存的方式存储
//在这里使用HttpSession的方式绑定手机号与OTPcODE
httpServletRequest.getSession().setAttribute(telphone,otpCode);
//将OTP验证码通过短信发送给用户,省略
System.out.println("telphone="+telphone+"&optCode="+otpCode);
//返回给前端数据
/**
* {data:null ,status:suyceess}
*/
return CommonReturnType.create(null);
}
提交注册的信息进行注册
前端提交注册数据表单---->验证码校验----->封装UserModel----->调用服务层的用户注册服务(保存用户,保存密码)
- 前端提交的数据封装成后端的Model,然后Model当保存到数据库中的时候,需要转换成数据库表的格式(尤其是数据库Model对应数据库多个表的操作的时候),可以使用
Beautils.Copy(src,dest)
,但需要注意在拷贝的时候,字段一定要对应(数据类型),否则可能存在赋值为空的情况- 对密码进行加密,再保存到数据库中
- 对各个字段校验是否为空,可以使用validation工具,一般情况下前端提交的时候已经进行了一次校验,但是我们最后进行一次校验,越靠近用户的校验越好,可以提高用户的体验度。
//用户注册接口
@RequestMapping(value = "/register",method = {RequestMethod.POST},consumes = {CONTENT_TYPE_FORMED})
@ResponseBody
public CommonReturnType register(
//前端传过来的数据
@RequestParam(name="telphone") String telphone,
@RequestParam(name="otpCode") String optCode,
@RequestParam(name="name") String name,
@RequestParam(name="gender") Byte gender,
@RequestParam(name="age") Integer age,
@RequestParam(name="password") String password
) throws BusinessException, UnsupportedEncodingException, NoSuchAlgorithmException {
//验证手机号和对应的optCode相符合
//获取会话中的验证码 进行比对
String inSessionOptCode = (String)this.httpServletRequest.getSession().getAttribute(telphone);
//使用对optCode进行笔记哦奥
if(!StringUtils.equals(inSessionOptCode,optCode)){
throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,"短信验证码不符合");
}
//用户注册的流程
UserModel userModel = new UserModel();
userModel.setName(name);
userModel.setGender(gender);
userModel.setAge(age);
userModel.setTelphone(telphone);
userModel.setRegisterMode("byphone");
userModel.setEncrptPassword(this.EncodeByMd5(password));
//注册用户
userService.register(userModel);
//返回给前端数据
return CommonReturnType.create(null);
}
下面是保存用户信息与用户密码的服务
注意加了@Transactional注解
@Override
@Transactional //声明式事务
public void register(UserModel userModel) throws BusinessException {
if(userModel==null){
throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);
}
//用户的注册流程:判空
// if(StringUtils.isEmpty(userModel.getName())||
// (userModel.getGender()==null)||
// (userModel.getAge()==null)||
// StringUtils.isEmpty(userModel.getTelphone())
// ){
// throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);
// }
//进行校验
ValidationResult result = validatorImpl.validate(userModel);
if(result.isHasErroes()){
throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR,result.getErrMsg());
}
//实现model--->dataObject方法//实现model--->dataObject方法
UserDO userDO = convertFromModel(userModel);
userDOMapper.insertSelective(userDO);
userModel.setId(userDO.getId());
//保存密码
UserPasswordDO userPasswordDO = convertPasswordFromModel(userModel);
userPasswordDOMapper.insertSelective(userPasswordDO);
}
用户登录
校验用户提交的密码是否与数据库中的密码相等,若相等则跳转到商品页面
- 从用户信息表中查找用户的信息,从密码表中查找用户密码,然后进行校验
- 若校验成功则跳转到
//用户登录接口
/*
用户的登入
*/
@RequestMapping(value = "/login", method = RequestMethod.POST)
@ResponseBody
public CommonReturnType userLogin(@RequestParam("telphone") String telphone, @RequestParam("password") String password) throws BusinessException {
UserModel userModel = null;
if (StringUtils.isEmpty(telphone) || StringUtils.isEmpty(password)) {
throw new BusinessException(EmBusinessError.PARAMETER_VALIDATION_ERROR);
}
try {
userModel = userService.validateLogin(telphone, EncodeByMd5(password));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//将登录凭证加入到合法用户的session中(只有登录了才能购买商品)
HttpSession session = this.httpServletRequest.getSession();
session.setAttribute("IS_LOGIN", true);
session.setAttribute("USER_LOG", userModel);
//返回给前端成功的标志
return CommonReturnType.create(null);
}