1. 用户模块管理
1.1 用户列表展现
1.1.1 业务接口文档
- 请求路径: /user/list
- 请求类型: GET
- 请求参数: 后台使用PageResult对象接收
- 请求案例: http://localhost:8091/user/list?query=查询关键字&pageNum=1&pageSize=10
参数名称 | 参数说明 | 备注信息 |
---|---|---|
query | 用户查询的数据 | 可以为null |
pageNum | 分页查询的页数 | 必须赋值不能为null |
pageSize | 分页查询的条数 | 必须赋值不能为null |
- 响应参数: SysResult对象 需要携带分页对象 PageResult
参数名称 | 参数说明 | 备注信息 |
---|---|---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 返回值PageResult对象 |
- PageResult 对象介绍
参数名称 | 参数名称 | 参数名称 | 备注信息 |
---|---|---|---|
query | String | 用户查询的数据 | 可以为null |
pageNum | Integer | 查询页数 | 不能为null |
pageSize | Integer | 查询页数 | 不能为null |
total | Long | 查询总记录数 | 不能为null |
rows | Object | 分页查询的结果 | 不能为null |
- 返回值效果
{"status":200,
"msg":"服务器调用成功!",
"data":
{"query":"",
"pageNum":1,
"pageSize":2,
"total":4,
"rows":[
{"created":"2021-02-18T11:17:23.000+00:00",
"updated":"2021-03-26T06:47:20.000+00:00",
"id":1,
"username":"admin",
"password":"a66abb5684c45962d887564f08346e8d",
"phone":"13111112222",
"email":"1235678@qq.com",
"status":true,
"role":null
},
{"created":"2021-02-18T11:17:23.000+00:00",
"updated":"2021-03-13T08:50:30.000+00:00",
"id":2,
"username":"admin123",
"password":"a66abb5684c45962d887564f08346e8d",
"phone":"13111112223",
"email":"1235678@qq.com",
"status":false,
"role":null
}
]
}
}
1.1.2 编辑PageResult对象
package com.jt.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
public class PageResult implements Serializable {
private String query; //用户查询的数据
private Integer pageNum; //查询页数
private Integer pageSize; //查询条数
private Long total; //查询总记录数
private Object rows; //分页查询的结果
}
1.1.3 编辑UserController
/**
* 需求: 将用户列表进行分页查询
* URL: /user/list
* 参数: query=查询关键字&pageNum=1&pageSize=10
* 请求类型: get
* 返回值: SysResult(pageResult)
*/
@GetMapping("/list")
public SysResult findUserList(PageResult pageResult){//3
pageResult = userService.findUserList(pageResult);//+2
return SysResult.success(pageResult);
}
1.1.4 编辑UserService
- 编辑业务接口
public interface UserService {
PageResult findUserList(PageResult pageResult);
}
2..编辑UserServiceImpl实现类
/**
* 分页查询的Sql:
* SELECT * FROM USER LIMIT 起始位置,查询条数
* 第一页: 每页10条
* SELECT * FROM USER LIMIT 0,10
* 第二页: 每页10条
* SELECT * FROM USER LIMIT 10,10
* 第N页:
* SELECT * FROM USER LIMIT (n-1)*10,10
* @param pageResult
* @return
*/
@Override
public PageResult findUserList(PageResult pageResult) {
//1.总记录数
long total = userMapper.findTotal();
//2.获取分页查询的结果
int start = (pageResult.getPageNum() - 1) * pageResult.getPageSize();
int size = pageResult.getPageSize();
String query = pageResult.getQuery();
List<User> rows = userMapper.findUserList(start,size,query);
return pageResult.setTotal(total).setRows(rows);
}
1.1.5 编辑UserMapper
1.编辑Mapper接口
//只支持单值传参 封装为map集合
List<User> findUserList(@Param("start") int start,@Param("size") int size,@Param("query") String query);
2.编辑UserMapper.xml映射文件
<!--表名必须小写 简化操作全部小写 ctrl+shift+y/u
业务需求: query属性可能有值/可能没有值 形成动态sql
-->
<select id="findUserList" resultType="User">
select * from user
<where>
<if test="query !=null and query !=''">username like "%"#{query}"%"</if>
</where>
limit #{start},#{size}
</select>
1.2 用户状态修改
1.2.1 业务说明
说明: 点击页面开关,修改数据表中的status
知识点讲解:
1. 数据库中没有boolean类型 可以使用数值类型代替 true 代替数值1, false 代替数值0
2. 数据库中可以使用tinyint类型代替boolean. 并且2种类型可以自动转化.
1.2.2 业务接口文档
- 请求路径 /user/status/{id}/{status}
- 请求类型 PUT
- 请求参数: 用户ID/状态值数据
参数名称 | 参数类型 | 参数说明 | 备注信息 |
---|---|---|---|
id | Integer | 用户ID号 | 不能为null |
status | boolean | 参数状态信息 | 不能为null |
- 返回值结果: SysResult对象
{"status":200,"msg":"服务器调用成功!","data":null}
1.2.3 编辑UserController
/**
* 需求: 实现状态修改
* URL: /user/status/{id}/{status}
* 参数: id/status
* 类型: put
* 返回值: SysResult对象
*/
@PutMapping("/status/{id}/{status}")
public SysResult updateStatus(User user){
userService.updateStatus(user);
return SysResult.success();
}
1.2.4 编辑UserService
1.编辑接口
void updateStatus(User user);
2.编辑Service实现类
/**
* 需求: 修改状态信息
* 参数: id/status/updated修改时间
* @param user
*/
@Override
public void updateStatus(User user) {
user.setUpdated(new Date()); //设定当前时间
userMapper.updateStatus(user);
}
1.2.5 编辑UserMapper接口
@Update("update user set status=#{status}," +
"updated=#{updated} where id=#{id}")
void updateStatus(User user);
1.3 用户删除操作
1.3.1 业务接口说明
- 请求路径: /user/{id}
- 请求类型: delete
- 请求参数:
参数名称 | 参数说明 | 备注 |
---|---|---|
ID | 用户ID号 | 不能为null |
- 返回值: SysResult对象
参数名称 | 参数说明 | 参数说明 |
---|---|---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | null |
1.3.2 编辑UserController
/**
* 业务说明: 实现用户数据删除操作
* URL: /user/{id}
* 参数: id
* 返回值: SysResult对象
*/
@DeleteMapping("/{id}")
public SysResult deleteUserById(@PathVariable Integer id){
userService.deleteUserById(id);
return SysResult.success();
}
1.3.3 编辑UserService
1.接口方法
void deleteUserById(Integer id);
2.实现类方法
@Override
public void deleteUserById(Integer id) {
userMapper.deleteUserById(id);
}
1.3.4 编辑UserMapper
@Delete("delete from user where id=#{id}")
void deleteUserById(Integer id);
1.3.5 修改页面JS
1.4 用户新增
1.4.1 业务接口文档
- 请求路径 /user/addUser
- 请求类型 POST
- 请求参数: 整个form表单数据封装为js对象进行参数传递
参数名称 | 参数类型 | 参数说明 | 备注信息 |
---|---|---|---|
username | String | 用户名 | 不能为null |
password | String | 密码 | 不能为null |
phone | String | 密码 | 不能为null |
String | 密码 | 不能为null |
- 返回值结果: SysResult对象
{"status":200,"msg":"服务器调用成功!","data":null}
1.4.2 编辑UserController
/**
* 需求: 完成用户新增操作
* URL地址: /user/addUser
* 参数: 使用对象接收
* 返回值: SysResult
* 类型: post
*/
@PostMapping("/addUser")
public SysResult saveUser(@RequestBody User user){
userService.saveUser(user);
return SysResult.success();
}
1.4.3 编辑UserService
1.编辑UserService接口
void saveUser(User user);
2.编辑UserServiceImpl实现类
/**
* 业务:
* 1.密码进行加密处理
* 2.设定状态码信息
* 3.设定创建时间和修改时间
* @param user
*/
@Override
public void saveUser(User user) {
//将密码加密处理
String password = user.getPassword();
Date date = new Date();
String md5Pass = DigestUtils.md5DigestAsHex(password.getBytes());
user.setPassword(md5Pass)
.setStatus(true)
.setCreated(date)
.setUpdated(date);
userMapper.saveUser(user);
}
1.4.4 编辑Mapper/映射文件
1.编辑Mapper接口
void saveUser(User user);
2.编辑Mapper映射文件
<insert id="saveUser">
insert into user value (null,#{username},#{password},#{phone},
#{email},#{status},#{created},#{updated})
</insert>
1.5 用户修改-数据回显
1.5.1 业务接口文档说明
- 请求路径: /user/{id}
- 请求类型: GET
- 返回值: SysResult对象
参数名称 | 参数说明 | 备注 |
---|---|---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 返回user对象 |
- JSON格式如下:
{
"status":200,
"msg":"服务器调用成功!",
"data":{
"created":"2021-02-18T11:17:23.000+00:00",
"updated":"2021-05-17T11:33:46.000+00:00",
"id":1,
"username":"admin",
"password":"a66abb5684c45962d887564f08346e8d",
"phone":"13111112222",
"email":"1235678@qq.com",
"status":true,
"role":null
}
}
1.5.2 编辑UserController
/**
* 业务说明: 根据ID查询数据
* URL: /user/{id}
* 参数: id值
* 类型: get
* 返回值: SysResult(user对象)
*/
@GetMapping("/{id}")
public SysResult findUserById(@PathVariable Integer id){
User user = userService.findUserById(id);
return SysResult.success(user);
}
1.5.3 编辑UserService
1.编辑业务接口代码
User findUserById(Integer id);
2.编辑实现类代码
@Override
public User findUserById(Integer id) {
return userMapper.findUserById(id);
}
1.5.4 编辑UserMapper
@Select("select * from user where id=#{id}")
User findUserById(Integer id);
1.5.5 页面展示
1.6 用户修改-数据提交
1.6.1 业务接口说明
- 请求路径: /user/updateUser
- 请求类型: PUT
- 请求参数: User对象结构
参数名称 | 参数名称 | 参数名称 |
---|---|---|
ID | 用户ID号 | 不能为null |
phone | 用户ID号 | 不能为null |
邮箱地址 | 不能为null |
- 返回值: SysResult对象
参数名称 | 参数说明 | 备注 |
---|---|---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | null |
- JSON格式如下:
{
"status":200,
"msg":"服务器调用成功!",
"data":{}
}
1.6.2 编辑UserController
/**
* 业务: 实现用户的修改操作
* URL地址: /user/updateUser
* 参数: 使用对象User接收
* 返回值: SysResult
* 类型:
*/
@PutMapping("/updateUser")
public SysResult updateUser(@RequestBody User user){
userService.updateUser(user);
return SysResult.success();
}
1.6.3 编辑UserService
1.编辑接口
void updateUser(User user);
2.编辑实现类
/**
* 说明: 实现用户的修改
* 数据: 添加更新时间操作
* @param user
*/
@Override
public void updateUser(User user) {
user.setUpdated(new Date());
userMapper.updateUser(user);
}
1.6.4 编辑UserMapper
1.编辑UserMapper接口
void updateUser(User user);
2. 编辑Mapper映射文件
<!--完成用户的更新操作-->
<update id="updateUser">
update user set
phone=#{phone},
email=#{email},
updated=#{updated}
where id=#{id}
</update>
2. 业务辅助功能
2.1 事务控制
2.1.1 现象说明
说明: 业务逻辑在执行的过程中,如果中间发生了异常,应该保证事务的一致性.事务应该回滚.但是经过测试,发现执行报异常,但是数据可以正常的入库. 说明方法没有事务的控制.
2.1.2 关于注解说明
名称: @Transactional //事务的注解
特点:
1.Spring中默认对事务进行支持.
2.Spring中默认控制的是运行时异常. 如果是检查异常 Spring不负责处理.核心原理: AOP
@Transactional(rollbackFor = Exception.class) 只要有异常,则全部回滚.
问题: 如果采用上述的代码,则AOP拦截所有的异常,运行效率低. 所以一般只拦截运行时异常.检查异常由程序员手动控制.
总结: 以后操作数据库时 ,新增/删除/修改操作 需要事务控制.
2.2 全局异常处理机制
2.2.1 业务说明
当用户在进行业务操作时,不管后端服务器执行是否正确,都应该给用户一个正向的回馈!!!
解决方案:
@PutMapping("/status/{id}/{status}")
public SysResult updateStatus(User user){
try {
userService.updateStatus(user);
return SysResult.success();
}catch (Exception e){
e.printStackTrace();
return SysResult.fail();
}
}
暴露问题: 由于在每个方法中都需要添加try-catch代码 必然会导致代码的可读性低.并且代码繁琐.不便于扩展.
2.2.2 全局异常处理机制实现
package com.jt.aop;
import com.jt.vo.SysResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice //advice 通知!!!
//全局异常处理机制,只拦截Controller层
public class SystemException {
//指定异常的类型进行拦截.
@ExceptionHandler(RuntimeException.class)
public SysResult exception(Exception e){
e.printStackTrace();//控制台打印异常
return SysResult.fail();//201
}
}