字段名称 | 数据类型 | 是否为空 | 备注 |
---|---|---|---|
id | int | N | 用户编号,PK主键 |
username | varchar(80) | Y | 用户名 |
password | varchar(80) | Y | 登录密码 加密之后的密文 加密API |
phone | varchar(20) | Y | 手机号 |
varchar(40) | Y | 邮箱 | |
status | tinyint | Y | 0-1 布尔类型值 0-false 1-true 启用还是禁用 |
created | datetime | Y | 创建时间 每张表里需要单独定义 可以进行封装优化 |
updated | datetime | Y | 修改时间 每张表里需要单独定义 可以进行封装优化 |
步骤1: 用户输入完用户名和密码之后,点击登录按钮
步骤2: 准备username/password数据,向后台服务器发送请求,请求类型: post类型
步骤3: 后台服务器接收用户的请求参数 username/password
步骤4: 根据用户名和密码查询数据库
结果: 有数据 用户名和密码正确 | 没有结果 用户名和密码错误
步骤5: 后端服务器应该返回一个业务回执 标识业务逻辑是否正确执行
假设: status 200 正确, 201 表示失败
步骤6: 前端服务器根据用户的200/201 提示用户操作成功/操作失败.
说明:一般做前后端交互时,必须有业务接口文档。 文档中详细阐述了 业务需求 / url地址 /参数 / 返回值信息 等要素。
前后端严格按照业务接口文档进行编码。
参数名称 | 参数说明 | 备注 |
---|---|---|
username | 用户名 | 不能为空 |
password | 密码 | 不能为空 |
参数名称 | 参数说明 | 备注 |
---|---|---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 返回密钥token信息 |
返回值格式如下:
{"status":200,"msg":"服务器调用成功!","data":"1e893a97634847b3a8b499b173bea620"}
创建包: com.jt.pojo
创建类: BasePojo .java
//pojo基类,完成2个任务,2个日期,实现序列化 @Data @Accessors(chain=true) public class BasePojo implements Serializable{ @TableField(fill = FieldFill.INSERT) private Date created; //表示入库时需要赋值 @TableField(fill = FieldFill.INSERT_UPDATE) private Date updated; //表示入库/更新时赋值. }
创建包: com.jt.pojo
创建类: User.java
@Data //动态生成get/set方法 @TableName("user") //对象与表一一对应 @Accessors(chain = true) //链式加载结构 public class User extends BasePojo{ @TableId(type = IdType.AUTO)//ID主键自增 private Integer id; private String username; private String password; private String phone; private String email; private Boolean status; @TableField(exist = false) //该属性在表中不存在 private Role role; //定义role角色数据 }
关于SysResult对象的说明: 该对象用来实现后端与前端业务的交互。
业务执行正确 status=200 业务执行错误 status=201
概念: 前后端交互的层级 定义为 VO层
创建包: com.jt.vo
创建类: User.java
//作用: 实现前后端交互 @Data @Accessors(chain = true) @NoArgsConstructor //无参构造 @AllArgsConstructor //全参构造 public class SysResult implements Serializable { //规范的写法 private Integer status; //状态码 200 201 private String msg; //服务器返回的提示信息 private Object data; //服务器返回的业务数据 //重载: 方法名称相同,参数不同 //为了用户使用VO对象 更加的方便 重载一些方法 简化程序的调用 public static SysResult fail(){ return new SysResult(201, "业务执行失败",null); } //1.不带参数的正确返回 public static SysResult success(){ return new SysResult(200, "服务器处理成功", null); } //2.带返回值的正确返回 用户传递什么/返回值就是什么 public static SysResult success(Object data){ return new SysResult(200, "服务器处理成功", data); } //3.带返回值,携带提示信息 public static SysResult success(String msg,Object data){ return new SysResult(200, msg,data); } }
业务要求: 完成用户信息校验,并且返回特定的token数据
/** * 业务需求:用户登陆校验 * 类型:POST * URL: /user/login * 参数: username/password json串 {username: "xxx", password: "xxx"} * 返回值: SysResult对象 data的String类型的信息 token * 用户名/密码 admin123/admin123456 */ @PostMapping("/login") public SysResult login(@RequestBody User user){ //1.根据用户名和密码校验 返回token Service层中完成 String token = userService.login(user); //2. token 有值业务正确 | null 业务操作失败 if(token == null){ return SysResult.fail(); } return SysResult.success(token); }
/** * 需求: * 1.根据用户名和密码查询数据库 * 2.将密码进行加密处理 md5加密方式 * 3.如果用户名和密码正确 返回token * 4 UUID: 每次生成的UUID几乎不重复. 重复概率 2^128/1 * b809cd3e-f4fa-11eb-b396-52152e05da50 * @param user 作用: 在未来生成API文档时 有效果 一般都是默认的 * @return */ @Override public String login(User user) { //1.将密码进行加密的处理 String password = user.getPassword(); //明文 //2. 将字符串 转化为字节数组 byte[] passByte = password.getBytes(); //将明文加密 String md5Pass = DigestUtils.md5DigestAsHex(passByte); //3. 根据用户名和密文查询数据库 //Sql: select * from user where uname="xxx" and ps="xx" //根据对象中不为null的属性充当where条件!!!! user.setPassword(md5Pass); QueryWrapper<User> queryWrapper = new QueryWrapper<>(user); //从数据库中获取结果 User userDB = userMapper.selectOne(queryWrapper); if(userDB == null){ //用户名和密码错误 返回null return null; //业务流程结束 } //如果程序执行到这一行,则数据用户的输入正确的. 返回token String token = UUID.randomUUID().toString().replace("-",""); return token; }