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

目录

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

二、设计接口

三、面试题

四、总结


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

没什么好说的,直接就是创建内容模块 然后这个继承父模块,然后再课程内容模块下面创建三个子模块,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<CourseBase> courses(PageParams pageParams, @RequestBody CourseBaseInfoDto courseBaseInfoDto) {PageResult<CourseBase> pageResult = courseBaseService.courses(pageParams, courseBaseInfoDto);return pageResult;}

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

public class PageResult<T> {private static final long serialVersionUID = 1L;/** 总记录数 */@ApiModelProperty(value = "总记录数")private long counts;/** 列表数据 */@ApiModelProperty(value = "列表数据")private List<T> 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<T> list, long counts){this.items = list;this.counts = counts;}public PageResult(List<T> list, long counts,Integer code,String msg){this.items = list;this.counts = counts;this.code = code;this.msg = msg;}public static <T> PageResult<T> ok(List<T> list, long counts){PageResult<T> pageResult = new PageResult<>(list, counts,200,"success");return pageResult;}public static <T> PageResult<T> error(){PageResult<T> pageResult = new PageResult<>(null,0,500,"error");return pageResult;}public long getcounts(){return counts;}public void setcounts(long counts){this.counts = counts;}public List<T> getitems(){return items;}public void setitems(List<T> 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<String, Object> {private static final long serialVersionUID = 1L;public R setData(Object data) {put("data",data);return this;}//利用fastjson进行反序列化public <T> T getData(TypeReference<T> typeReference) {Object data = get("data");	//默认是mapString jsonString = JSON.toJSONString(data);T t = JSON.parseObject(jsonString, typeReference);return t;}//利用fastjson进行反序列化public <T> T getData(String key,TypeReference<T> typeReference) {Object data = get(key);	//默认是mapString 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<String, Object> 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中接口相关的注解有哪些

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/116439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享一下微信小程序的文章中怎么添加营销活动

在数字化时代&#xff0c;小程序已经成为企业营销的重要工具。通过小程序&#xff0c;企业可以提供更加便捷、高效的服务&#xff0c;吸引更多的用户和客户。本文将以小程序营销活动为主题&#xff0c;介绍如何在小程序文章中加入营销活动&#xff0c;提高品牌知名度和销售额。…

告别SQL优化和数据迁移备份烦恼,NineData--小白也能成为DBA的秘密武器!

1、概述 说起sql优化&#xff0c;大家可能首先想到的是创建索引、避免全表扫描、减少子查询及优化查询语句、避免隐式类型转换、慢查询日志记录慢SQL、explain分析SQL的执行计划及调优等等。当然&#xff0c;这也是我们常使用的一些调优手段&#xff0c;而且对开发人员也有一定…

【C语言】用函数实现模块化程序设计

前言&#xff1a;如果把所有的程序代码都写在一个主函数(main函数)中&#xff0c;就会使主函数变得庞杂、头绪不清&#xff0c;使阅读和维护程序变得困难。此外&#xff0c;有时程序中要多次实现某一功能&#xff0c;如果重新编写实现此功能就会使得程序冗长、不精炼。 &#x…

pubsub-js在react中的使用

pubsub-js 是一个用于实现发布-订阅模式的 JavaScript 库&#xff0c;可以用于不同组件之间的通信。在 React 中&#xff0c;可以使用 pubsub-js 来实现组件之间的通信。 以下是在 React 中使用 pubsub-js 的示例代码&#xff1a; 安装 pubsub-js 库 使用 npm 或 yarn 安装 …

【数字IC设计/FPGA】FIFO与流控机制

流控&#xff0c;简单来说就是控制数据流停止发送。常见的流控机制分为带内流控和带外流控。 FIFO的流水反压机制 一般来说&#xff0c;每一个fifo都有一个将满阈值afull_value&#xff08;almost full&#xff09;。当fifo内的数据量达到或超过afull_value时&#xff0c;将满…

天气、气象相关API汇总分享

空气质量查询&#xff1a;支持国内3400个城市的整点观测&#xff0c;并附带空气质量监测点&#xff08;全国共2335个&#xff09;的整点观测数据。天气预报查询&#xff1a;支持全国以及全球多个城市的天气查询&#xff0c;包含国内3400个城市以及国际4万个城市的实况数据&…

KNN 和 SVM 图片分类 任务 代码及细节分享

使用KNN (K-最近邻) 方法进行图像分类也是一个常见的选择。以下是 使用sklearn的KNeighborsClassifier进行图像分类的Python脚本&#xff1a; import os import cv2 import numpy as np import logging from sklearn.neighbors import KNeighborsClassifier from sklearn.met…

MQ常见的问题(kafka保证消息不丢失)

MQ常见的问题 1&#xff0c;mq如何避免消息堆积问题。 消息堆积&#xff1a;生产者的生产速率远远大于消费者的消费速率&#xff0c;使消息大批量的堆积在消息队列。 解决方案&#xff1a;1&#xff0c;提升消费者的消费速率&#xff08;增加消费者集群&#xff09; 2&…

强化学习代码实战(2) --- 多臂赌博机

目录 前言 1.Python基础 2.Numpy基础 3.多臂赌博机 参考文献 前言 本文内容来自于南京大学郭宪老师在博文视点学院录制的视频&#xff0c;课程仅9元地址&#xff0c;配套书籍为深入浅出强化学习 编程实战 郭宪地址。 1.Python基础 1. print() 可以用该语句查看当前数据的情…

2023版 STM32实战11 SPI总线读写W25Q

SPI全称 英文全称&#xff1a;Serial peripheral Interface 串行外设接口 SPI特点 -1- 串行(逐bit传输) -2- 同步(共用时钟线) -3- 全双工(收发可同时进行) -4- 通信只能由主机发起(一主,多从机) 开发使用习惯和理解 -1- CS片选一般配置为软件控制 -2- 片选低电平有效,从…

2023.10.22 关于 定时器(Timer) 详解

目录 引言 标准库定时器使用 自己实现定时器的代码 模拟实现的两大方面 核心思路 重点理解 自己实现的定时器代码最终代码版本 引言 定时器用于在 预定的时间间隔之后 执行特定的任务或操作 实例理解&#xff1a; 在服务器开发中&#xff0c;客户端向服务器发送请求&#…

Spring Cloud 之 GateWay简介及简单DEMO的搭建

&#xff08;1&#xff09;Filter&#xff08;过滤器&#xff09;&#xff1a; 和Zuul的过滤器在概念上类似&#xff0c;可以使用它拦截和修改请求&#xff0c;并且对上游的响应&#xff0c;进行二次处理。过滤器为org.springframework.cloud.gateway.filter.GatewayFilter类的…

微信小程序WeUI项目weui-miniprogram如何运行起来?

微信小程序WeUI项目weui-miniprogram如何运行起来&#xff1f; 解决方法: 1、下载 https://github.com/wechat-miniprogram/weui-miniprogram 2、在项目根目录weui-miniprogram-master执行以下命令安装依赖&#xff1a; npm install 3、继续执行编译命令&#xff1a; npm r…

Unity3D 基础——鼠标悬停更改物体颜色,移走恢复

方法介绍 【unity学习笔记】OnMouseEnter、OnMouseOver、OnMouseExit_unity onmouseover_一白梦人的博客-CSDN博客https://blog.csdn.net/a1208498468/article/details/117856445 GetComponent()详解_getcomponet<> 动态名称-CSDN博客https://blog.csdn.net/kaixindrag…

C# 写入文件比较

数据长度&#xff1a;128188个long BinaryWriter每次写一个long 耗时14.7828ms StreamWriter每次写一个long 耗时44.0934 ms FileStream每次写一个long 耗时20.5142 ms FileStream固定chunk写入&#xff0c;循环操作数组&#xff0c;耗时13.4126 ms byte[] chunk new byte[d…

国际物流报关流程

国际物流报关流程如下&#xff1a; 准备资料&#xff1a;根据国家和地区的要求&#xff0c;准备相关的报关资料&#xff0c;包括进出口货物清单、运输合同、发票、装箱单等文件。 海关申报&#xff1a;将准备好的报关资料递交给海关申报&#xff0c;海关会根据报关单上的信息对…

1. 前缀码判定

题目 前缀码&#xff1a;任何一个字符的编码都不是同一字符集中另一个字符的编码的前缀。 请编写一个程序&#xff0c;判断输入的n个由1和0组成的编码是否为前缀码。如果这n个编码是前缀码&#xff0c;则输出"YES”&#xff1b;否则输出第一个与前面编码发生矛盾的编码。…

牛客网刷题-(2)

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

jvm垃圾回收算法有哪些及原理

目录 垃圾回收器1 Serial收集器2 Parallel收集器3 ParNew收集器4 CMS收集器5 G1回收器三色标记算法标记算法的过程三色标记算法缺陷多标漏标 垃圾回收器 垃圾回收机制&#xff0c;我们已经知道什么样的对象会成为垃圾。对象回收经历了什么——垃圾回收算法。那么谁来负责回收垃…

华为云 CodeArts Snap 智能编程助手 PyCharm 插件安装与使用指南

1 插件安装下载 1.1 搜索插件 打开 PyCharm&#xff0c;选择 File&#xff0c;点击 Settings。 选择 Plugins&#xff0c;点击 Marketplace&#xff0c;并在搜索框中输入 Huawei Cloud CodeArts Snap。 1.2 安装插件 如上图所示&#xff0c;点击 Install 按钮安装 Huawei Cl…