商城网站素材,画册设计及制作,网站seo外链建设,wordpress主题更改首页对于开发一个Web项目来说#xff0c;无论是电商还是其他品类的项目#xff0c;注册与登录模块都是必不可少的#xff1b;注册登录功能也是我们在日常生活中最长接触的#xff0c;对于这个业务场景的需求与逻辑大概是没有什么需要详细介绍的#xff0c;市面上常见的邮箱注册…对于开发一个Web项目来说无论是电商还是其他品类的项目注册与登录模块都是必不可少的注册登录功能也是我们在日常生活中最长接触的对于这个业务场景的需求与逻辑大概是没有什么需要详细介绍的市面上常见的邮箱注册、手机注册、独立站账号密码注册其处理方式基本相同我们这里使用账号密码注册的方式实现整个平台的注册/登录功能 让我们开始 判断用户名是否存在 实现注册部分的代码首先想到的就是我们要对前端所发送过来的请求参数做验证在有些项目中会将请求参数的格式验证和合法性验证只写在前端校验而后端只实现业务逻辑我认为这是极其危险的编码习惯当我们的项目放在线上的时候就会有恶意用户绕过前端验证直接访问我们的服务器对线上业务造成破坏因此前端验证是为了减轻一部分请求直接到达后端但是相应的验证后端也要去做 那么首先我们要实现的就是验证用户注册的用户名是否存在我们首先来看一下用户表的结构及设计 从图上我们可以看到用户表中常用的字段我们用户表以用户的Id为主键但注意ID并不是自增长的这与传统的Id设计不同这里不是自增的原因是当系统达到一定的体量时用户数量激增我们需要去做分布式集群需要分库分表这时自增的ID会给分库分表带来极大的困难因为出于日后系统优化的考虑我们这里的数据库主键不是自增的。 电商接口开发 理清业务逻辑看完数据库结构我们着手开始编写业务代码在整个项目代码的编写和接口的实现我们都遵循自底向上的方式从数据库开始实现数据的映射业务实现结果推送的流程对应pojo映射---Service编写---Controller控制的过程。 那么我们开始啦首先我们创建一个UserService接口在接口中我们编写我们第一个业务方法 /** * 判断用户名是否存在 */public boolean queryUsernameIsExist(String username);
我们传入一个userName返回一个布尔值有了接口之后我们去实现这个方法
我们在service工程中新建一个Impl的包在里面新建一个类UserServiceImpl去实现UserService接口并实现其中的方法我们在这个方法中需要操作User这个实体类那么我们先把UserMapper引入进来 Autowiredpublic UsersMapper usersMapper;
在方法中我们使用Example这种使用条件查询的方式去做查询 Transactional(propagation Propagation.SUPPORTS)Overridepublic boolean queryUsernameIsExist(String username) {Example userExample new Example(Users.class); Example.Criteria userCriteria userExample.createCriteria(); userCriteria.andEqualTo(username,username);Users result usersMapper.selectOneByExample(userExample);return result null ? false : true;} 在这个方法的实现中我们使用了Example这种方式Example映射一个实体类获得一个example对象为这个对象去添加相应的条件Criteria对应的方法有很多可以判断等于大于相似等各类条件使用起来很方便感兴趣的同学可以去阅读他的源码这个方法返回一个Users对象我们去判空若为空则用户名可用若false则用户名存在 实现了Service之后我们来编写Controller我们在api工程中新建一个Controller类。命名为PassportController我们为他加上RestController注解并加上路由地址在这个Controller中我们需要操作UserService来进行查询那么我们先将UserService注入进来 Autowiredprivate UserService userService;
并定义一个方法声明方法的路由地址 GetMapping(/usernameIsExist)public IMOOCJSONResult usernameIsExist(RequestParam String username) { //判断用户名不能为空 if (StringUtils.isBlank(username)) { return IMOOCJSONResult.errorMsg(用户名不能为空); }//查找注册的用户名是否存在boolean isExist userService.queryUsernameIsExist(username); if (isExist) { return IMOOCJSONResult.errorMsg(用户名已经存在); } // 请求成功用户名没有重复 return IMOOCJSONResult.ok();} 在这个方法中我们在判断username为空的时候使用了一个字符串的工具类他是Apache提供的我们需要首先引入他的依赖 !-- apache 工具类 --dependency groupIdcommons-codec/groupId artifactIdcommons-codec/artifactId version1.11/version/dependencydependency groupIdorg.apache.commons/groupId artifactIdcommons-lang3/artifactId version3.4/version/dependencydependency groupIdcommons-io/groupId artifactIdcommons-io/artifactId version1.3.2/version/dependency
引入之后我们便可以操作StringUtils他提供了一个isBlank的方法来判断字符串是否为空 同时我们在方法中可以看到一个IMOOCJSONResult对象这是一个结果集对象因为在代码中我们需要返回的结果值类型很多很不确定并且我们需要返回自定义的响应码来告诉前端请求成功与否前端对约定好的各类返回值做统一处理避免前端出现代码报错影响用户体验同时自定义的结果响应能提高我们定位错误的速度规范接口因此我们先定义一个结果返回类 public class IMOOCJSONResult {// 定义jackson对象 private static final ObjectMapper MAPPER new ObjectMapper();// 响应业务状态 private Integer status;// 响应消息 private String msg;// 响应中的数据 private Object data;...}
完整的类代码请大家去看源码不方便在这里粘贴全部代码只提供类中的属性供大家参考大家可以参考对应的实现思路去封装自己的结果集我们使用这样统一的结果类便可以在返回数据的同时返回请求状态码给前端提高接口可读性和稳定性。
接口测试 当我们第一个接口编写完成后我们使用PostMan进行接口测试postman是一款开源免费的接口调试工具可以模拟客户端发出请求是后端开发必备工具 我们可以看到我们的请求是成功的当然图示中我请求的是我的生产服务器接口大家在本机调试的时候URL应该是localhost开头的我们可以看到请求结果的响应也是我们封装的结果集的响应有响应码和数据体组成大家可以认识更换请求数据测试接口功能的完整性。 用户注册 完成了第一个判断用户名是否存在的接口后我们着手开始进行用户注册的逻辑编写首先我们在注册的时候依然是操作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中配置