目录
没什么好说的,直接就是创建内容模块 然后这个继承父模块,然后再课程内容模块下面创建三个子模块,model、sevice、controller
model依赖base、service依赖model、controller依赖service
接口设计要考虑接口要考虑两个方面:
1. 接口参数
需要很清晰的知道前端传递过来哪些参数
如果说能用实体类接收就直接用实体类接收,如果说接收不了,考虑设计dto
这里注意:
如果是多端的情况,controller通常参数个数是不同的,但实际上调用的service都是同一个方法
比如说 app端的controller接口参数只有两个参数,而网页端的controller有三个参数
当然这里其实可以只写一个controller,都用来处理这些请求,只需要将参数设置为那个最多的参数就行了,但是这里的话,如果生成文档交由前端看,就会存在迷惑性,因为我实际上并不需要传递那么多的参数,但是还显示那么多的参数,前端就以为都要传递,所以可以设计成不同的controller
如果是多个controller那么参数就可以叫vo 如果一个参数就叫dto 而service层的话就用最多个数参数接收就行了
2. 响应结果
这个的话,要看前端到底需要什么
简单点的话直接看接口文档,然后自己封装vo对象就行了
如果没有接口文档,就需要我们自己考虑页面需要哪些数据,我们就返回什么数据...接收参数也是一样的
总结:
其实分析一个接口的设计:就是分析参数和响应对象
我们做项目的时候,需要明确需求,确定好参数和响应结果所需要的哪些属性,然后设计dto类和vo类,然后再到service中根据参数获取到结果 返回即可
接口设计当然除了参数还有响应结果,另外的请求路径,以及请求方式需要注意
一般来说其实还是get和post用的多,当参数很多很复杂的时候,就用post请求就行了,传递json给接口
再实际项目中 po、mapper、service都使用插件直接生成 搭建这个MP环境其实很简单的
分析一下分页查询课程列表接口的设计思路:
首先需要分页参数,分页参数较少,前端可以在路径上面直接传递过来 后端就是用一个分页参数类接收就行了
而那个内容条件的可能参数较多,也直接使用对象接收,前端在url上面传递不现实的,所以前端应该传递一个json字符串,后端使用@RequestBody接收
- @ApiOperation(value = "课程列表", notes = "课程列表")
- @PostMapping("/list")
- public PageResult
courses(PageParams pageParams, @RequestBody CourseBaseInfoDto courseBaseInfoDto) { - PageResult
pageResult = courseBaseService.courses(pageParams, courseBaseInfoDto); - return pageResult;
- }
这里的话如果是分页请求,那么也就是分页结果,可以使用一个分页响应类返回。分页响应类里面封装着 结果 总记录数 响应状态码 响应信息:
- public class PageResult
{ - private static final long serialVersionUID = 1L;
-
- /** 总记录数 */
- @ApiModelProperty(value = "总记录数")
- private long counts;
-
- /** 列表数据 */
- @ApiModelProperty(value = "列表数据")
- private List
items; -
- /** 消息状态码 */
- @ApiModelProperty(value = "消息状态码")
- private int code;
-
- /** 消息内容 */
- @ApiModelProperty(value = "消息内容")
- private String msg;
-
-
- private long page;
-
- //每页记录数
- private long pageSize;
-
- /**
- * 表格数据对象
- */
- public PageResult()
- {
- }
-
- /**
- * 分页
- *
- * @param list 列表数据
- * @param counts 总记录数
- */
- public PageResult(List
list, long counts) - {
- this.items = list;
- this.counts = counts;
- }
-
-
- public PageResult(List
list, long counts,Integer code,String msg) - {
- this.items = list;
- this.counts = counts;
- this.code = code;
- this.msg = msg;
- }
-
-
- public static
PageResult ok(List list, long counts) { - PageResult
pageResult = new PageResult<>(list, counts,200,"success"); - return pageResult;
- }
-
- public static
PageResult error(){ - PageResult
pageResult = new PageResult<>(null,0,500,"error"); - return pageResult;
- }
-
-
- public long getcounts()
- {
- return counts;
- }
-
- public void setcounts(long counts)
- {
- this.counts = counts;
- }
-
- public List
getitems() - {
- return items;
- }
-
- public void setitems(List
items) - {
- this.items = items;
- }
-
- public int getCode()
- {
- return code;
- }
-
- public void setCode(int code)
- {
- this.code = code;
- }
-
- public String getMsg()
- {
- return msg;
- }
-
- public void setMsg(String msg)
- {
- this.msg = msg;
- }
- }
大致这样,具体属性名参考前端写的 匹配好
而一般的请求就使用一般结果响应类 推荐使用下面这个:
- public class R extends HashMap
{ - private static final long serialVersionUID = 1L;
-
- public R setData(Object data) {
- put("data",data);
- return this;
- }
-
- //利用fastjson进行反序列化
- public
T getData(TypeReference typeReference) { - Object data = get("data"); //默认是map
- String jsonString = JSON.toJSONString(data);
- T t = JSON.parseObject(jsonString, typeReference);
- return t;
- }
-
- //利用fastjson进行反序列化
- public
T getData(String key,TypeReference typeReference) { - Object data = get(key); //默认是map
- String jsonString = JSON.toJSONString(data);
- T t = JSON.parseObject(jsonString, typeReference);
- return t;
- }
-
- public R() {
- put("code", 0);
- put("msg", "success");
- }
-
- public static R error() {
- return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
- }
-
- public static R error(String msg) {
- return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
- }
-
- public static R error(int code, String msg) {
- R r = new R();
- r.put("code", code);
- r.put("msg", msg);
- return r;
- }
-
- public static R ok(String msg) {
- R r = new R();
- r.put("msg", msg);
- return r;
- }
-
- public static R ok(Map
map) { - R r = new R();
- r.putAll(map);
- return r;
- }
-
- public static R ok() {
- return new R();
- }
-
- public R put(String key, Object value) {
- super.put(key, value);
- return this;
- }
-
- public Integer getCode() {
-
- return (Integer) this.get("code");
- }
-
- }
SpringBoot中接口参数相关的注解有哪些?
1. 类上面的
@RequestMapping 指定路径 一般来说是用 操作哪个表 对那个表进行crud那么就是什么路径
比如说内容 课程控制器 就是 content/course 第一个是微服务 第二个是表
@ResponseBody 这个可以将控制器中所有的接口都以json返回
@Controller
@RestController 上面两个结合就是这个注解
还可以添加swagger注解:
@Api 解释控制器到底干嘛的
2. 方法上面的
@RequestMapping
如果明确请求方式可以使用
@GetMapping Post Put Delelt
@ResponseBody
另外还可以添加swagger注解
@ApiOperation 解释接口干嘛的
3. 方法参数上面的
@RequestParam 接收表单提交的数据
@RequestBody 接收json数据
@PathVariable 接收路径变量
swagger注解:
@ApiImplicitParam 解释参数信息 @ApiImplicitParams里面可以定义多个@ApiImplicitParam可以同时声明多个参数信息
- @ApiImplicitParams({
- @ApiImplicitParam(name = "pageNum", value = "页码数", required = true),
- @ApiImplicitParam(name = "pageSize", value = "一页显示的文章条数", required = true),
- @ApiImplicitParam(name = "categoryId", value = "文章类别Id", required = true)
- }
1. 掌握接口设计方法
2. 掌握微服务模块搭建方法
3. 知道SpingBoot中接口相关的注解有哪些