用户注册
完成了第一个判断用户名是否存在的接口后{电商独立站搭建},我们着手开始进行用户注册的逻辑编写,首先我们在注册的时候,依然是操作UserMapper,所以数据层是已经准备好的,我们在UserService中,定义第二个创建用户的方法:
/** * 创建用户 * @param userBO * @return */public Users createUser(UserBO userBO);
这个方法会接收一个表单数据,数据包中包含密码,用户名,甚至更多的信息,如果我们在后端一个一个的接收,显然是不合理的,当请求参数过多时,我们便将请求参数封装成一个请求的实体类,在这里我们封装一个UserBO:
public class UserBO { @ApiModelProperty(value = "用户名",name = "username",example ="张三",required =true) private String username; @ApiModelProperty(value = "密码",name = "password",example ="123456",required =true) private String password; @ApiModelProperty(value = "确认密码",name = "confirmPassword",example ="123456",required =false) private String confirmPassword; ...}
get/set方法大家自行生成,方法定义好后,我们去实现类中,实现他:
@Transactional(propagation = Propagation.REQUIRED)@Overridepublic Users createUser(UserBO userBO) { //使用工具类生成唯一id String userId = sid.nextShort(); Users user = new Users(); user.setId(userId); user.setUsername(userBO.getUsername()); try { user.setPassword(MD5Utils.getMD5Str(userBO.getPassword())); } catch (Exception e) { e.printStackTrace(); } //默认用户昵称同用户名 user.setNickname(userBO.getUsername()); //默认头像 user.setFace(USER_FACE); //默认生日 user.setBirthday(DateUtil.stringToDate("1970-01-01")); //设置性别(使用枚举操作)默认为:保密 user.setSex(Sex.secret.type);
user.setCreatedTime(new Date()); user.setUpdatedTime(new Date());
usersMapper.insert(user); return user;}
我们在这里存储密码时,使用了MD5加密机制,防止数据库资源泄露,导致用户数据泄露,保证数据的安全性,MD5的工具类大家可以在源码中获取,我就不贴在这里了;同时使用的工具类还有日期格式化工具类,同样的,大家在源码中获取;我们在新建用户设置性别时,我们可以使用枚举的形式去定义用户的性别,增强代码的可读性:
/** * @Desc:性别枚举 */public enum Sex {
woman(0,"女"), man(1,"男"), secret(2,"保密");
public final Integer type; public final String value;
Sex(Integer type, String value) { this.type = type; this.value = value; }}
我们在生成唯一ID的时候,我们也会使用工具类,注入Sid对象,使用org.n3r.idworker中的方法为了使用其他包中的方法,我们需要SpringBoot在启动时,扫描到idworker,我们需要在Application中配置:
//扫描所有包,以及相关组件包@ComponentScan(basePackages = {"com.imooc","org.n3r.idworker"})
接口实现
写完Service,我们回到PassportController,因为是一个保存数据的方法,我们使用Post的方式:
@ApiOperation(value = "用户注册",notes ="用户注册",httpMethod = "POST")@PostMapping("/regist")public IMOOCJSONResult regist(@RequestBody UserBO userBO, HttpServletRequest request, HttpServletResponse response){
String username = userBO.getUsername(); String password = userBO.getPassword(); String confirmPwd = userBO.getConfirmPassword();
System.out.println(username); System.out.println(password); System.out.println(confirmPwd);
// 判断用户名和密码必须不为空 if (StringUtils.isBlank(username) || StringUtils.isBlank(password) || StringUtils.isBlank(confirmPwd)) { return IMOOCJSONResult.errorMsg("用户名及密码不能为空"); } // 查询用户名是否存在 boolean isExist = userService.queryUsernameIsExist(username); if (isExist) { return IMOOCJSONResult.errorMsg("用户名已经存在"); } // 密码长度不能小于6位 if (password.length() < 6) { return IMOOCJSONResult.errorMsg("密码长度不能小于6位"); } // 判断两次密码是否一致 if (!password.equals(confirmPwd)) { return IMOOCJSONResult.errorMsg("两次密码输入不一致"); } // 实现注册 Users userResult = userService.createUser(userBO);
userResult = setNullProperty(userResult);
CookieUtils.setCookie(request,response,"user", //使用Cookie工具类获取Cookie JsonUtils.objectToJson(userResult),true); //使用Json工具类将对象转换为String // TODO 生成用户token,存入redis会话 // TODO 同步购物车数据
return IMOOCJSONResult.ok();}
Controller的实现的没有什么注重的点,我们接收到前端传来的数据包,解析数据包中的属性,进行校验,校验通过,调用Service层的方法,实现注册;同样的,对于这个方法,我们使用PostMan进行调试。
推荐
No.1
New Arrival
Swagger2
在上面的部分,我们实现了两个接口,实现了注册的业务功能,并使用PostMan进行了接口调试,这些都属于后端开发的部分,那么我们如何在前后端分离的模式下,与前端沟通联调呢,这时候我们需要使用接口文档:接口文档规范了接口路由、参数,入参、出参以及参数的类型。但是对于程序员来说,花费大量的时间去编写文档,是不科学不可取不合理的,那么Swagger2应运而生!首先,我们引入依赖:
<!-- swagger2 配置 --><dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.4.0</version></dependency><dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.4.0</version></dependency><dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>swagger-bootstrap-ui</artifactId> <version>1.6</version></dependency>
引入依赖后,我们需要定义配置类,我们在api工程汇总创建Swagger2的配置类:
@Configuration@EnableSwagger2public class Swagger2 {
// http://localhost:8088/swagger-ui.html 原路径// http://localhost:8088/doc.html
//配置swagger2核心配置 docket @Bean public Docket createRestApi(){ return new Docket(DocumentationType.SWAGGER_2)//指定api类型为swagger2 .apiInfo(apiInfo()) //用于定义api文档汇总信息 .select().apis(RequestHandlerSelectors .basePackage("com.imooc.controller")) //指定controller包 .paths(PathSelectors.any()) //所有Controller .build(); }
private ApiInfo apiInfo() { return new ApiInfoBuilder() .title("天天吃货 电商平台接口api") //文档页标题 .contact(new Contact("eumen", "https://www.imooc.com", "18829526908@163.com")) //联系人信息 .description("api文档") //详细信息 .version("1.0.1") //文档版本号 .termsOfServiceUrl("106.54.54.200")//网站地址 .build(); }}
配置完成后,我们便可以使用API这个注解去添加方法的参数说明,和方法说明了,并且,启动项目,访问BASE_URL/Swagger-ui.html便可以看到生成的项目API文档: