我们按照前面学习的开发流程,开始完成功能开发。首先按照之前分析的需求,完成部门管理
的功能开发。
开发的部门管理功能包含:
-
查询部门
-
删除部门
-
新增部门
-
更新部门(不讲解,自己独立完成)
2.1 查询部门
2.1.1 原型和需求
查询的部门的信息:部门ID、部门名称、修改时间
通过页面原型以及需求描述,我们可以看到,部门查询,是不需要考虑分页操作的。
2.1.2 接口文档
部门列表查询
-
基本信息
请求路径:/depts
请求方式:GET
接口描述:该接口用于部门列表数据查询
-
请求参数
无
-
响应数据
参数格式:application/json
参数说明:
参数名 | 类型 | 是否必须 | 备注 |
---|---|---|---|
code | number | 必须 | 响应码,1 代表成功,0 代表失败 |
msg | string | 非必须 | 提示信息 |
data | object[ ] | 非必须 | 返回的数据 |
|- id | number | 非必须 | id |
|- name | string | 非必须 | 部门名称 |
|- createTime | string | 非必须 | 创建时间 |
|- updateTime | string | 非必须 | 修改时间 |
响应数据样例:
{
"code": 1,
"msg": "success",
"data": [
{
"id": 1,
"name": "学工部",
"createTime": "2022-09-01T23:06:29",
"updateTime": "2022-09-01T23:06:29"
},
{
"id": 2,
"name": "教研部",
"createTime": "2022-09-01T23:06:29",
"updateTime": "2022-09-01T23:06:29"
}
]
}
2.1.3 思路分析
2.1.4 功能开发
通过查看接口文档:部门列表查询
请求路径:/depts
请求方式:GET
请求参数:无
响应数据:json格式
DeptController
@Slf4j
@RestController
public class DeptController {
@Autowired
private DeptService deptService;//@RequestMapping(value = "/depts" , method = RequestMethod.GET)
@GetMapping("/depts")
public Result list(){
log.info("查询所有部门数据");
List<Dept> deptList = deptService.list();
return Result.success(deptList);
}
}
自己写的笔记:
DeptController
@Slf4j //记录日志 @RestController public class DeptController { 调试日志 //private static Logger log = LoggerFactory.getLogger(DeptController.class); @RequestMapping("/depts") public Result list(){ 记录日志 log.info("查询全部部门数据"); return Result.success(); } }
先启动 看看能不能启动得起来
获取到一个JSON格式的数据
这个JSON格式的数据就是Result转JSON之后的结果
因为我们在Controller加了一个注解@RestController
证明接口可以访问到
当前接口通过gpt post等方式访问都是可以的
可是我们的接口文档要求我们用GET请求
那如何去限定请求方式是GET请求
RequestMapping注解当中有一个属性就是来指定请求方式method
@Slf4j //记录日志 @RestController public class DeptController { 调试日志 //private static Logger log = LoggerFactory.getLogger(DeptController.class); //@RequestMapping(value = "/depts",method = RequestMethod.GET) //指定请求方式为GET @GetMapping("/depts") public Result list(){ 记录日志 log.info("查询全部部门数据"); return Result.success(); } }
Controller 要调用Service
所以我们要在Controller里面注入Service对象
面向接口编程 所以注入一个Service接口对象
@Autowired private DeptService deptService;
写实现类
因为要查询数据 得调用数据 调用数据得去数据库里面查找
所以Service要调用Map 所以在ServiceImpl实现类要注入一个Map 接口对象,才能调用map的方法
注入map对象 就可以调用map接口中的方法
在Controller类中注入Service对象 用这个注入的Service对象就可以调用Service接口中的方法
@Autowired
private DeptService deptService;
//调用service查询全部部门数据 所以用list集合安装 List<Dept> deptList = deptService.list();
在ServiceImpl实现类中注入Mapper对象 用这个注入的Mapper对象就可以调用
Mapper接口中的方法@Autowired private DeptMapper deptMapper;//查询数据 要去数据库查询 所以注入map对象 用对象去DeptMapper接口调用方法 return deptMapper.list();
总结:在类中注入对象 调用接口中的方法
然后因为查询全部部门的数据 SQL语句比较简单 所以我们用注解进行开发
流程:
前端发送请求之后 会发送到Controller方法 Controller方法 中调用Service来获取数据
Service中调用Map接口中的方法 来查询全部的部门信息 Map接口就会往数据库中发送
@Select("select * from dept") SQL语句 查询全部的部门 并且把查询部门的信息封装到list集合当中 最终将集合的数据返回给Service Service又返回给了 Controller Controller拿到返回回来的数据之后 需要将这个数据返回给前端
所以我们返回的是
流程图
重启测试
@Slf4j注解源码:
DeptService(业务接口)
public interface DeptService {
/**
* 查询所有的部门数据
* @return 存储Dept对象的集合
*/
List<Dept> list();
}
DeptServiceImpl(业务实现类)
@Slf4j
@Service
public class DeptServiceImpl implements DeptService {
@Autowired
private DeptMapper deptMapper;
@Override
public List<Dept> list() {
List<Dept> deptList = deptMapper.list();
return deptList;
}
}
DeptMapper
@Mapper
public interface DeptMapper {
//查询所有部门数据
@Select("select id, name, create_time, update_time from dept")
List<Dept> list();
}
2.1.5 功能测试
功能开发完成后,我们就可以启动项目,然后打开postman,发起GET请求,访问 :http://localhost:8080/depts
2.2 前后端联调
完成了查询部门的功能,我们也通过postman工具测试通过了,下面我们再基于前后端分离的方式进行接口联调。具体操作如下:
1、将资料中提供的"前端环境"文件夹中的压缩包,拷贝到一个没有中文不带空格的目录下
2、拷贝到一个没有中文不带空格的目录后,进行解压(解压到当前目录)
3、启动nginx
4、打开浏览器,访问:http://localhost:90
5、测试:部门管理 - 查询部门列表
说明:只要按照接口文档开发功能接口,就能保证前后端程序交互
-
后端:严格遵守接口文档进行功能接口开发
-
前端:严格遵守接口文档访问功能接口
请求的是nginx服务器 nginx服务器接收到请求之后 最终nginx服务器会把这个请求 转给后端8080端口的tomcat 所以实际上是由tomcat来处理的这次请求