• 学成在线第一天-课程内容管理服务搭建以及查询课程接口设计


    目录

    一、搭建课程内容管理服务

    二、设计接口

    三、面试题

    四、总结


    一、搭建课程内容管理服务

    没什么好说的,直接就是创建内容模块 然后这个继承父模块,然后再课程内容模块下面创建三个子模块,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接收

    1. @ApiOperation(value = "课程列表", notes = "课程列表")
    2. @PostMapping("/list")
    3. public PageResult courses(PageParams pageParams, @RequestBody CourseBaseInfoDto courseBaseInfoDto) {
    4. PageResult pageResult = courseBaseService.courses(pageParams, courseBaseInfoDto);
    5. return pageResult;
    6. }

    这里的话如果是分页请求,那么也就是分页结果,可以使用一个分页响应类返回。分页响应类里面封装着 结果 总记录数 响应状态码 响应信息:

    1. public class PageResult {
    2. private static final long serialVersionUID = 1L;
    3. /** 总记录数 */
    4. @ApiModelProperty(value = "总记录数")
    5. private long counts;
    6. /** 列表数据 */
    7. @ApiModelProperty(value = "列表数据")
    8. private List items;
    9. /** 消息状态码 */
    10. @ApiModelProperty(value = "消息状态码")
    11. private int code;
    12. /** 消息内容 */
    13. @ApiModelProperty(value = "消息内容")
    14. private String msg;
    15. private long page;
    16. //每页记录数
    17. private long pageSize;
    18. /**
    19. * 表格数据对象
    20. */
    21. public PageResult()
    22. {
    23. }
    24. /**
    25. * 分页
    26. *
    27. * @param list 列表数据
    28. * @param counts 总记录数
    29. */
    30. public PageResult(List list, long counts)
    31. {
    32. this.items = list;
    33. this.counts = counts;
    34. }
    35. public PageResult(List list, long counts,Integer code,String msg)
    36. {
    37. this.items = list;
    38. this.counts = counts;
    39. this.code = code;
    40. this.msg = msg;
    41. }
    42. public static PageResult ok(List list, long counts){
    43. PageResult pageResult = new PageResult<>(list, counts,200,"success");
    44. return pageResult;
    45. }
    46. public static PageResult error(){
    47. PageResult pageResult = new PageResult<>(null,0,500,"error");
    48. return pageResult;
    49. }
    50. public long getcounts()
    51. {
    52. return counts;
    53. }
    54. public void setcounts(long counts)
    55. {
    56. this.counts = counts;
    57. }
    58. public List getitems()
    59. {
    60. return items;
    61. }
    62. public void setitems(List items)
    63. {
    64. this.items = items;
    65. }
    66. public int getCode()
    67. {
    68. return code;
    69. }
    70. public void setCode(int code)
    71. {
    72. this.code = code;
    73. }
    74. public String getMsg()
    75. {
    76. return msg;
    77. }
    78. public void setMsg(String msg)
    79. {
    80. this.msg = msg;
    81. }
    82. }

    大致这样,具体属性名参考前端写的 匹配好 

    而一般的请求就使用一般结果响应类 推荐使用下面这个:

    1. public class R extends HashMap {
    2. private static final long serialVersionUID = 1L;
    3. public R setData(Object data) {
    4. put("data",data);
    5. return this;
    6. }
    7. //利用fastjson进行反序列化
    8. public T getData(TypeReference typeReference) {
    9. Object data = get("data"); //默认是map
    10. String jsonString = JSON.toJSONString(data);
    11. T t = JSON.parseObject(jsonString, typeReference);
    12. return t;
    13. }
    14. //利用fastjson进行反序列化
    15. public T getData(String key,TypeReference typeReference) {
    16. Object data = get(key); //默认是map
    17. String jsonString = JSON.toJSONString(data);
    18. T t = JSON.parseObject(jsonString, typeReference);
    19. return t;
    20. }
    21. public R() {
    22. put("code", 0);
    23. put("msg", "success");
    24. }
    25. public static R error() {
    26. return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, "未知异常,请联系管理员");
    27. }
    28. public static R error(String msg) {
    29. return error(HttpStatus.SC_INTERNAL_SERVER_ERROR, msg);
    30. }
    31. public static R error(int code, String msg) {
    32. R r = new R();
    33. r.put("code", code);
    34. r.put("msg", msg);
    35. return r;
    36. }
    37. public static R ok(String msg) {
    38. R r = new R();
    39. r.put("msg", msg);
    40. return r;
    41. }
    42. public static R ok(Map map) {
    43. R r = new R();
    44. r.putAll(map);
    45. return r;
    46. }
    47. public static R ok() {
    48. return new R();
    49. }
    50. public R put(String key, Object value) {
    51. super.put(key, value);
    52. return this;
    53. }
    54. public Integer getCode() {
    55. return (Integer) this.get("code");
    56. }
    57. }

    三、面试题

    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可以同时声明多个参数信息

    1. @ApiImplicitParams({
    2. @ApiImplicitParam(name = "pageNum", value = "页码数", required = true),
    3. @ApiImplicitParam(name = "pageSize", value = "一页显示的文章条数", required = true),
    4. @ApiImplicitParam(name = "categoryId", value = "文章类别Id", required = true)
    5. }

    四、总结

    1. 掌握接口设计方法

    2. 掌握微服务模块搭建方法

    3. 知道SpingBoot中接口相关的注解有哪些

  • 相关阅读:
    选择图像区域矩形框控件【原创】
    美容院共享系统开发|共享模式具体应该怎么去做?
    Python第二语言(十三、PySpark实战)
    方法:Ubuntu配置网络源-apt源、pip源、conda源
    YOLO系列算法精讲整理(持续更新)
    简单实用的模糊照片修复方法,小白也能轻松上手
    live555 UsageEnvironment目录解读
    达梦数据库的锁排查方法
    【魔店】拼多多店铺一般在哪里找货源?
    VC++学习(5)——文本编程,插入符的初始化,图形插入符;文字始终在窗口;字符输入功能,回车换行,删除,左键定位;字体修改,字体平滑变色
  • 原文地址:https://blog.csdn.net/m0_63445035/article/details/133968669