表设计
user表设计
字段名称 | 数据类型 | 是否为空 | 备注 |
---|---|---|---|
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地址 /参数 / 返回值信息 等要素。
前后端严格按照业务接口文档进行编码。
- 请求路径: /user/login
- 请求方式: POST
- 请求参数
参数名称 | 参数说明 | 备注 |
---|---|---|
username | 用户名 | 不能为空 |
password | 密码 | 不能为空 |
- 响应数据 SysResult对象
参数名称 | 参数说明 | 备注 |
---|---|---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 返回密钥token信息 |
返回值格式如下:
{"status":200,"msg":"服务器调用成功!","data":"1e893a97634847b3a8b499b173bea620"}
前端
后端
创建BasePojo 类
创建包: 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; //表示入库/更新时赋值.
}
创建User类
创建包: 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类(系统返回值)
关于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);
}
}
编辑UserController类
业务要求: 完成用户信息校验,并且返回特定的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);
}
编辑UserServiceImpl实现类
/**
* 需求:
* 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;
}