查询部门的功能我们搞定了,下面我们开始完成删除部门
的功能开发。
2.3.1 需求
点击部门列表后面操作栏的 "删除" 按钮,就可以删除该部门信息。 此时,前端只需要给服务端传递一个ID参数就可以了。 我们从接口文档中也可以看得出来。
2.3.2 接口文档
删除部门
-
基本信息
请求路径:/depts/{id}
请求方式:DELETE
接口描述:该接口用于根据ID删除部门数据
请求参数 参数格式:路径参数
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
id | number | 必须 | 部门ID |
请求参数样例:
/depts/1
响应数据 参数格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
code | number | 必须 | 响应码,1 代表成功,0 代表失败 |
msg | string | 非必须 | 提示信息 |
data | object | 非必须 | 返回的数据 |
响应数据样例:
{
"code":1,
"msg":"success",
"data":null
}
2.3.3 思路分析
接口文档规定:
-
前端请求路径:/depts/{id}
-
前端请求方式:DELETE
问题1:怎么在controller中接收请求路径中的路径参数?
@PathVariable
问题2:如何限定请求方式是delete?
@DeleteMapping
2.3.4 功能开发
通过查看接口文档:删除部门
请求路径:/depts/{id}
请求方式:DELETE
请求参数:路径参数 {id}
响应数据:json格式
DeptController
前端请求路径:/depts/{id} {id}代表路径变量
所以要在方法中声明一个参数来接收路径变量 id是一个Integer类型 所以直接声明一个Integer类型的id
/** *删除部门 * @return */ @DeleteMapping("/depts/{id}") public Result delet(Integer id){ return null; }
并且要标识获取这个变量的id 然后绑定给id参数 所以在加上@PathVariable注解
/** *删除部门 * @return */ @DeleteMapping("/depts/{id}") public Result delet(@PathVariable Integer id){ log.info("根据id删除部门:{}",id); //{}参数占位符 id传进来会替换掉参数占位符 //调用service删除部门 deptService.delete(id); return Result.success(); }
DeptService
/** * 删除部门 * @param id */ void delete(Integer id); }
DeptServiceImpl
//根据id删除部门 @Override public void delete(Integer id) { deptMapper.deleteById(id); }
DeptMapper
/** *根据id删除部门 * @param id */ @Delete("delete from dept where id = #{id}") void deleteById(Integer id);
测试
DeptController
@Slf4j
@RestController
public class DeptController {
@Autowired
private DeptService deptService;@DeleteMapping("/depts/{id}")
public Result delete(@PathVariable Integer id) {
//日志记录
log.info("根据id删除部门");
//调用service层功能
deptService.delete(id);
//响应
return Result.success();
}
//省略...
}
DeptService
public interface DeptService {
/**
* 根据id删除部门
* @param id 部门id
*/
void delete(Integer id);//省略...
}
DeptServiceImpl
@Slf4j
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptMapper deptMapper;@Override
public void delete(Integer id) {
//调用持久层删除功能
deptMapper.deleteById(id);
}
//省略...
}
DeptMapper
@Mapper
public interface DeptMapper {
/**
* 根据id删除部门信息
* @param id 部门id
*/
@Delete("delete from dept where id = #{id}")
void deleteById(Integer id);
//省略...
}
2.3.5 功能测试
删除功能开发完成后,重新启动项目,使用postman,发起DELETE请求:
2.3.6 前后端联调
打开浏览器,测试后端功能接口:
2.4 新增部门
我们前面已完成了查询部门
、删除部门
两个功能,也熟悉了开发的流程。下面我们继续完成新增部门
功能。
2.4.1 需求
点击 "新增部门" 按钮,弹出新增部门对话框,输入部门名称,点击 "保存" ,将部门信息保存到数据库。
2.4.2 接口文档
添加部门
-
基本信息
请求路径:/depts
请求方式:POST
接口描述:该接口用于添加部门数据
请求参数
格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
name | string | 必须 | 部门名称 |
请求参数样例:
{
"name": "教研部"
}
响应数据
参数格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
code | number | 必须 | 响应码,1 代表成功,0 代表失败 |
msg | string | 非必须 | 提示信息 |
data | object | 非必须 | 返回的数据 |
响应数据样例:
{
"code":1,
"msg":"success",
"data":null
}
2.4.3 思路分析
接口文档规定:
-
前端请求路径:/depts
-
前端请求方式:POST
-
前端请求参数 (Json格式):{ "name": "教研部" }
问题1:如何限定请求方式是POST?
@PostMapping
问题2:怎么在controller中接收json格式的请求参数?
@RequestBody //把前端传递的json数据填充到实体类中
2.4.4 功能开发
通过查看接口文档:新增部门
请求路径:/depts
请求方式:POST
请求参数:json格式
响应数据:json格式
/** *新增部门 * @return */ @PostMapping("/depts") public Result add(){ return Result.success(); }
接收页面传递过来的请求参数
页面传递过来的请求参数是JSON格式的请求数据
所以要封装到一个实体类dept中 所以我们用dept实体类来封装 里面刚好有一人属性name
所以参数要写dept对象 因为传递过来JSON格式 所以在加@RequestBody
/** *新增部门 * @return */ @PostMapping("/depts") public Result add( @RequestBody Dept dept){ return Result.success(); }
DeptController
/** *新增部门 * @return */ @PostMapping("/depts") public Result add( @RequestBody Dept dept){ log.info("新增部门:{}",dept); //调用service新增部门 deptService.add(dept); return Result.success(); }
DeptService
/** * 新增部门 * @param dept */ void add(Dept dept);
DeptServiceImpl
/** * 新增部门 * @param dept */ @Override public void add(Dept dept) { dept.setCreateTime(LocalDateTime.now()); dept.setUpdateTime(LocalDateTime.now()); deptMapper.insert(dept); }
DeptMapper
/** * 新增部门 * @param dept */ @Insert("insert into dept (name, create_time, update_time) values (#{name},#{createTime},#{updateTime})") void insert(Dept dept);
DeptController
@Slf4j
@RestController
public class DeptController {
@Autowired
private DeptService deptService;@PostMapping("/depts")
public Result add(@RequestBody Dept dept){
//记录日志
log.info("新增部门:{}",dept);
//调用service层添加功能
deptService.add(dept);
//响应
return Result.success();
}//省略...
}
DeptService
public interface DeptService {
/**
* 新增部门
* @param dept 部门对象
*/
void add(Dept dept);//省略...
}
DeptServiceImpl
@Slf4j
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptMapper deptMapper;@Override
public void add(Dept dept) {
//补全部门数据
dept.setCreateTime(LocalDateTime.now());
dept.setUpdateTime(LocalDateTime.now());
//调用持久层增加功能
deptMapper.inser(dept);
}//省略...
}
DeptMapper
@Mapper
public interface DeptMapper {@Insert("insert into dept (name, create_time, update_time) values (#{name},#{createTime},#{updateTime})")
void inser(Dept dept);//省略...
}
2.4.5 功能测试
新增功能开发完成后,重新启动项目,使用postman,发起POST请求:
2.4.6 前后端联调
打开浏览器,测试后端功能接口:
2.4.7 请求路径
我们部门管理的查询
、删除
、新增
功能全部完成了,接下来我们要对controller层的代码进行优化。
首先我们先来看下目前controller层代码:
以上三个方法上的请求路径,存在一个共同点:都是以/depts
作为开头。(重复了)
在Spring当中为了简化请求路径的定义,可以把公共的请求路径,直接抽取到类上,在类上加一个注解@RequestMapping,并指定请求路径"/depts"。代码参照如下:
优化前后的对比:
注意事项:一个完整的请求路径,应该是类上@RequestMapping的value属性 + 方法上的 @RequestMapping的value属性
重启