微服务项目开发学成在线_day01_CMS服务端开发

05-CMS需求分析-什么是CMS

什么是CMS?
CMS (Content Management System)即内容管理系统,不同的项目对CMS的定位不同。
CMS有哪些类型?
每个公司对每个项目的CMS定位不同,CMS基本上分为:针对后台数据内容的管理、针对前端页面的管理、针对样式风格的管理等 。 
本项目CMS的定位是什么?
本项目作为一个大型的在线教育平台,对CMS系统的定位是对各各网站(子站点)页面的管理,主要管理由于运营需要而经常变动的页面,从而实现根据运营需要快速进行页面开发、上线的需求。

06-CMS需求分析-静态门户工程搭建

门户,是一个网站的入口,一般网站都有一个对外的门户。我们首先搭建学成网的静态门户工程,根据门户的页面结构来分析页面的管理方案。

1、安装WebStorm
2、安装Nginx
3、导入门户工程

创建nginx的配置文件 xcEdu2019.conf

#user  nobody;
worker_processes ; #error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info; #pid logs/nginx.pid; events {
worker_connections ;
} http {
include mime.types;
default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on;
#tcp_nopush on; #keepalive_timeout ;
keepalive_timeout ; #gzip on; server{
listen ;
server_name www.xuecheng.com;
ssi on;
ssi_silent_errors on;
location / {
alias F:/xcEdu/xcEduUI01/xc-ui-pc-static-portal/;
index index.html;
} } # another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen ;
# listen somename:;
# server_name somename alias another.alias; # location / {
# root html;
# index index.html index.htm;
# }
#} # HTTPS server
#
#server {
# listen ssl;
# server_name localhost; # ssl_certificate cert.pem;
# ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on; # location / {
# root html;
# index index.html index.htm;
# }
#} }

server_name www.xuecheng.com

在WIN10系统下启动nginx的 命令行

#Shift+鼠标右键 启动Powershell蓝色窗口

F:\javaweb\nginx-1.16.>
ls #powershell启动和关闭nginx.exe服务 .\nginx -c conf\xcEdu2019.conf .\nginx -s stop #重新加载配置文件不用再次指定文件名
.\nginx -s reload

访问 :http://localhost

修改系统hosts文件的属性,去掉只读选项。
C:\Windows\System32\drivers\etc

启用SwitchHosts!开发工具并录入

127.0.0.1 www.xuecheng.com

访问:http://www.xuecheng.com/


07-CMS需求分析-SSI服务端包含技术

1、页面内容多如何管理?
将页面拆分成一个一个的小页面,通过cms去管理这些小页面,当要更改部分页面内容时只需要更改具体某个小页面即可 。

2、页面拆出来怎么样通过web服务浏览呢?
使用web服务(例如nginx)的SSI技术,将多个子页面合并渲染输出。

3、SSI具体是指什么?
微服务项目开发学成在线_day01_CMS服务端开发

nginx配置文件,开启SSI支持功能

    server{
listen ;
server_name www.xuecheng.com;
ssi on;
ssi_silent_errors on;
ssi_types text/html;
location / {
alias F:/xcEdu/xcEduUI01/xc-ui-pc-static-portal/;
index index.html;
} }

SSI包含类似于jsp页面中的incluce指令,ssi是在web服务端将include指定 的页面包含在网页中,渲染html网页响应给客户端 。nginx、apache等多数web容器都支持SSI指令。

ssi指令如下:
<!‐‐#include virtual="/../....html"‐‐>

08-CMS需求分析-CMS页面管理需求

3.3 CMS页面管理需求
2、本项目要实现什么样的功能?

1)创建站点:
一个网站有很多子站点,比如:学成在线有主门户、学习中心、问答系统等子站点。

2)创建模板:
页面如何创建呢?比如电商网站的商品详情页面,每个页面的内容布局、板式是相同的,不同的只是内容,这个页
面的布局、板式就是页面模板,模板+数据就组成一个完整的页面,最终要创建一个页面文件需要先定义此页面的
模板,最终拿到页面的数据再结合模板就拼装成一个完整的页面。

3)填写页面:
创建页面是指填写页面的基本信息,如:页面的名称、页面的url地址等。
4)页面预览:
页面预览是页面发布前的一项工作,页面预览使用静态化技术根据页面模板和数据生成页面内容,并通过浏览器预
览页面。页面发布前进行页面预览的目是为了保证页面发布后的正确性。
5)页面发布:
使用计算机技术将页面发送到页面所在站点的服务器,页面发布成功就可以通过浏览器来访问了。

页面发布成功,用户即可在浏览器浏览到最新发布的页面,整个页面添加、发布的过程由于软件自动执行,无需人工登录服务器操作。


09-CMS服务端工程搭建-开发工具配置

前后端分离开发,创建不同的文件目录

微服务项目开发学成在线_day01_CMS服务端开发
微服务项目开发学成在线_day01_CMS服务端开发
配置编码格式

微服务项目开发学成在线_day01_CMS服务端开发
微服务项目开发学成在线_day01_CMS服务端开发

-Xms512m
-Xmx2048m
-XX:ReservedCodeCacheSize=480m

Custom VM Options

10-CMS服务端工程搭建-导入基础工程

4.2.1 工程结构
CMS及其它服务端工程基于maven进行构建
微服务项目开发学成在线_day01_CMS服务端开发

快捷键Ctrl+Shift+Alt+S 打开项目结构界面

微服务项目开发学成在线_day01_CMS服务端开发

parent工程锁定依赖版本的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.9.RELEASE</version>
</parent>
<groupId>com.xuecheng</groupId>
<artifactId>xc-framework-parent</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<tomcat.version>8.5.45</tomcat.version>
<spring-boot.version>2.0.9.RELEASE</spring-boot.version>
<springframework.version>5.0.10.RELEASE</springframework.version>
<mybatis-spring-boot.version>1.3.3</mybatis-spring-boot.version>
<mybatis.version>3.4.6</mybatis.version>
<druid.version>1.1.10</druid.version>
<mysql-connector-java.version>5.1.45</mysql-connector-java.version> <lombok.version>1.18.8</lombok.version>
<commons-io.version>2.6</commons-io.version>
<org.apache.commons.io.version>1.3.2</org.apache.commons.io.version>
<commons-fileupload.version>1.3.3</commons-fileupload.version>
<commons-codec.version>1.10</commons-codec.version>
<commons-lang3.version>3.6</commons-lang3.version>
<okhttp.version>3.9.1</okhttp.version>
<feign-okhttp.version>8.18.0</feign-okhttp.version>
<springfox-swagger.version>2.7.0</springfox-swagger.version>
<fastjson.version>1.2.30</fastjson.version>
<fastdfs-client-java.version>1.27.0.0</fastdfs-client-java.version>
<mysql-connector-java.version>5.1.40</mysql-connector-java.version>
<elasticsearch.version>6.2.1</elasticsearch.version>
<guava.version>24.0-jre</guava.version>
</properties>
<!--test-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql-connector-java.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot.version}</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.10</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency> <dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>${okhttp.version}</version>
</dependency>
<dependency>
<groupId>com.netflix.feign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>${feign-okhttp.version}</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>${org.apache.commons.io.version}</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons-fileupload.version}</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>${commons-codec.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${springfox-swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${springfox-swagger.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>${fastdfs-client-java.version}</version>
</dependency> <dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>${guava.version}</version>
</dependency> </dependencies>
</dependencyManagement>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- &lt;!&ndash; 资源文件拷贝插件 &ndash;&gt;
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>-->
<!-- java编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

11-MongoDb入门-安装Mongodb数据库

CMS采用MongoDB数据库存储CMS页面信息,CMS选用Mongodb的原因如下:
1、Mongodb是非关系型数据库,存储Json格式数据 ,数据格式灵活。
2、相比课程管理等核心数据CMS数据不重要,且没有事务管理要求。

win10开发环境下安装mongodb(nosql数据库)

win10开发环境下安装studio3t(mongodb客户端)


mongodb入门
微服务项目开发学成在线_day01_CMS服务端开发

mongodb命令行的使用

16-CMS服务端工程搭建-导入CMS数据库

微服务项目开发学成在线_day01_CMS服务端开发

xc_cms——>导入cms数据库文件.json

微服务项目开发学成在线_day01_CMS服务端开发

17-页面查询接口定义-定义模型-需求分析和模型类

Java数据库实体类对应——>MongoDB数据库的Collections的名称;

微服务项目开发学成在线_day01_CMS服务端开发

在梳理完用户需求后就要去定义前后端的接口,接口定义后前端和后端就可以依据接口去开发功能了。
本次定义页面查询接口,本接口供前端请求查询页面列表,支持分页及自定义条件查询方式。

具体需求如下:
1、分页查询CmsPage 集合下的数据
2、根据站点Id、模板Id、页面别名查询页面信息
3、接口基于Http Get请求,响应Json数据

18-页面查询接口定义-定义接口

Lombok是一个实用的java工具,使用它可以消除java代码的臃肿,Lombok提供一系列的注解,使用这些注解可以不用定义getter/setter、equals、构造方法等,它会在编译时在字节码文件自动生成这些通用的方法 。
@Data注解可以自动生成getter/setter方法,@ToString生成tostring方法。

1、定义请求模型QueryPageRequest,此模型作为查询条件类型为后期扩展需求,请求类型统一继承RequestData类型。

package com.xuecheng.framework.domain.cms.request;

import com.xuecheng.framework.model.request.RequestData;
import lombok.Data; @Data
public class QueryPageRequest extends RequestData {
//站点id
private String siteId;
//页面ID
private String pageId;
//页面名称
private String pageName;
//别名
private String pageAliase;
//模版id
private String templateId;
}

2、响应结果类型,分页查询统一使用QueryResponseResult


在xc-service-api模块,创建一个Package

com.xuecheng.api.cms

在Api接口工程专门定义接口的原因如下:
1、接口集中管理
2、Api工程的接口将作为各微服务远程调用使用。

页面查询接口定义如下:

package com.xuecheng.api.cms;

import com.xuecheng.framework.domain.cms.request.QueryPageRequest;
import com.xuecheng.framework.model.response.QueryResponseResult; public interface CmsPageControllerApi {
//页面查询
public abstract QueryResponseResult findList(int page, int size, QueryPageRequest queryPageRequest) ;
}

此接口编写后会在CMS服务工程编写Controller类实现此接口。

19-页面查询服务端开发-创建CMS服务工程-CMS工程结构

6 页面查询服务端开发
  6.1 创建CMS服务工程
创建maven工程, CMS工程的名称为 xc-service-manage-cms,父工程为xc-framework-parent。
pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>xc-framework-parent</artifactId>
<groupId>com.xuecheng</groupId>
<version>1.0-SNAPSHOT</version>
<relativePath>../xc-framework-parent/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion> <artifactId>xc-service-manage-cms</artifactId>
<dependencies>
<dependency>
<groupId>com.xuecheng</groupId>
<artifactId>xc-service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.xuecheng</groupId>
<artifactId>xc-framework-model</artifactId>
<version>1.0-SNAPSHOT</version>
<!--排除有版本冲突的依赖-->
<exclusions>
<exclusion>
<groupId>org.jboss</groupId>
<artifactId>jandex</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--来自hibernate-core的传递依赖-->
<dependency>
<groupId>org.jboss</groupId>
<artifactId>jandex</artifactId>
<version>2.0.5.Final</version>
</dependency>
<dependency>
<groupId>com.xuecheng</groupId>
<artifactId>xc-framework-utils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.xuecheng</groupId>
<artifactId>xc-framework-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies> </project>

微服务项目开发学成在线_day01_CMS服务端开发微服务项目开发学成在线_day01_CMS服务端开发

https://mvnrepository.com/artifact/org.jboss/jandex

server:
port: 31001
spring:
application:
name: xc-service-manage-cms
data:
mongodb:
uri: mongodb://localhost:27017/xc_cms

uri: mongodb://localhost:27017/xc_cms

日志输出配置文件
<?xml version="1.0" encoding="UTF-8"?>

<configuration>
<!--定义日志文件的存储地址,使用绝对路径-->
<property name="LOG_HOME" value="d:/logs"/> <!-- Console 输出设置 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf8</charset>
</encoder>
</appender> <!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${LOG_HOME}/xc.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender> <!-- 异步输出 -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>512</queueSize>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="FILE"/>
</appender> <logger name="org.apache.ibatis.cache.decorators.LoggingCache" level="DEBUG" additivity="false">
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.springframework.boot" level="DEBUG"/>
<root level="info">
<!--<appender-ref ref="ASYNC"/>-->
<appender-ref ref="FILE"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>

logback-spring.xml

创建启动类ManageCmsApplication
@SpringBootApplication
@EntityScan("com.xuecheng.framework.domain.cms")//扫描实体类
@ComponentScan(basePackages={"com.xuecheng.api"})//扫描接口
@ComponentScan(basePackages={"com.xuecheng.framework"})//扫描common包下的类
@ComponentScan(basePackages={"com.xuecheng.manage_cms"})//扫描本项目下的所有类
public class ManageCmsApplication {
public static void main(String[] args) {
SpringApplication.run(ManageCmsApplication.class,args);
}
}

@EntityScan//扫描实体类

6.1.2 测试Controller
使用springMVC完成接口实现开发,这里暂时使用测试数据,稍后会让controller调用service来查询数据。

@RestController
@RequestMapping("/cms/page")
public class CmsPageController implements CmsPageControllerApi { // @Autowired
// PageService pageService; @Override
@GetMapping("/list/{page}/{size}")
public QueryResponseResult findList(@PathVariable("page") int page, @PathVariable("size") int size, QueryPageRequest queryPageRequest) { //暂时用静态数据
//定义queryResult
QueryResult<CmsPage> queryResult =new QueryResult<>();
List<CmsPage> list = new ArrayList<>();
CmsPage cmsPage = new CmsPage();
cmsPage.setPageName("测试页面");
list.add(cmsPage);
queryResult.setList(list);
queryResult.setTotal(1); QueryResponseResult queryResponseResult = new QueryResponseResult(CommonCode.SUCCESS,queryResult);
return queryResponseResult;
//调用service
//return pageService.findList(page,size,queryPageRequest);
} }

http://localhost:31001/cms/page/list/1/2

微服务项目开发学成在线_day01_CMS服务端开发

6.2 Dao层

21-页面查询服务端开发-Dao-分页查询测试

https://blog.csdn.net/qq_40993412/article/details/104082571

本项目使用Spring Data Mongodb完成Mongodb数据库的查询,Spring Data Mongodb提供一套快捷操作mongodb的方法。

22-页面查询服务端开发-Dao-基础方法测试
Optional是jdk1.8引入的1个类,Optional是一个容器对象,它将我们需要的对象包括起来,使用isPresent方法判断所包含的对象是否为“null”,
可以使用get()取出对象。

    //修改(update)
@Test
public void testUpdate() {
//查询对象
Optional<CmsPage> optional = cmsPageRepository.findById("5b4b1d8bf73c6623b03f8cec");
if(optional.isPresent()){
CmsPage cmsPage = optional.get();
//设置要修改值
cmsPage.setPageAliase("test01");
//...
//修改
CmsPage save = cmsPageRepository.save(cmsPage);
System.out.println(save);
} }

if(optional.isPresent()){

 6.2.3.4 自定义Dao方法
同Spring Data JPA一样Spring Data mongodb也提供自定义方法的规则,如下:
按照findByXXX,findByXXXAndYYY、countByXXXAndYYY等规则定义方法,实现查询操作。

//根据站点和页面类型分页查询
Page<CmsPage> findBySiteIdAndPageType(String siteId,String pageType, Pageable pageable);

23-页面查询服务端开发-Service及Controller

@Service
public class PageService { @Autowired
CmsPageRepository cmsPageRepository; /**
* 页面查询方法
* @param page 页码,从1开始记数
* @param size 每页记录数
* @param queryPageRequest 查询条件
* @return
*/
public QueryResponseResult findList(int page, int size, QueryPageRequest queryPageRequest){ //分页参数
if(page <=0){
page = 1;
}
page = page -1;
if(size<=0){
size = 10;
}
Pageable pageable = PageRequest.of(page,size);
Page<CmsPage> all = cmsPageRepository.findAll(pageable);
QueryResult queryResult = new QueryResult();
queryResult.setList(all.getContent());//数据列表
queryResult.setTotal(all.getTotalElements());//数据总记录数
QueryResponseResult queryResponseResult = new QueryResponseResult(CommonCode.SUCCESS,queryResult);
return queryResponseResult;
}
}

使用浏览器测试
输入:http://localhost:31001/cms/page/list/1/10  查询第1页,每页显示10条记录。

24-页面查询服务端开发-接口开发规范

6.6.1 Api请求及响应规范

为了严格按照接口进行开发,提高效率,对请求及响应格式进行规范化。

6.6.1 Api请求及响应规范
为了严格按照接口进行开发,提高效率,对请求及响应格式进行规范化。
、get 请求时,采用key/value格式请求,SpringMVC可采用基本类型的变量接收,也可以采用对象接收。
、Post请求时,可以提交form表单数据(application/x-www-form-urlencoded)和Json数据(ContentType=application/json),文件等多部件类型(multipart/form-data)三种数据格式,SpringMVC接收Json数据
使用@RequestBody注解解析请求的json数据。
、响应结果统一信息为:是否成功、操作代码、提示信息及自定义数据。
、响应结果统一格式为json。

6.6.2 Api定义约束
Api定义使用SpringMVC来完成,由于此接口后期将作为微服务远程调用使用,在定义接口时有如下限制:
1、@PathVariable 统一指定参数名称,如:@PathVariable("id")

2、@RequestParam统一指定参数名称,如:@RequestParam("id")


25-页面查询接口测试-Swagger

7 页面查询接口测试
所以当接口定义完成,可以使用工具生成接口文档,前端人员查看接口文档即可进行前端开发 ,这样前端和服务人员并行开发,大大提高了生产效率。 
7.1.1 Swagger介绍
OpenAPI规范(OpenAPI Specification 简称OAS)是Linux基金会的一个项目,试图通过定义一种用来描述API格式或API定义的语言,来规范RESTful服务开发过程。
https://github.com/OAI/OpenAPI-Specification
Swagger是全球最大的OpenAPI规范(OAS)API开发工具框架,支持从设计和文档到测试和部署的整个API生命周期的开发。
  (https://swagger.io/)
Spring Boot 可以集成Swagger,生成Swagger接口文档。

7.1.2 Swagger常用注解

在Java类中添加Swagger的注解即可生成Swagger接口,常用Swagger注解如下:
 @Api:修饰整个类,描述Controller的作用 @ApiOperation:描述一个类的一个方法,或者说一个接口
 @ApiParam:单个参数描述                        @ApiModel:用对象来接收参数                                @ApiModelProperty:用对象接收参数时,描述对象的一个字段
 @ApiResponse:HTTP响应其中个描述    @ApiResponses:HTTP响应整体描述       @ApiIgnore:使用该注解忽略这个API 
 @ApiError :发生错误返回的信息     @ApiImplicitParam:一个请求参数          @ApiImplicitParams:多个请求参数

微服务项目开发学成在线_day01_CMS服务端开发
 
7.1.4 Swagger接口测试
Swagger接口生成工作原理:
、系统启动,扫描到api工程中的Swagger2Configuration类

//配置类
@Configuration
@EnableSwagger2
public class Swagger2Configuration {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.xuecheng"))
.paths(PathSelectors.any())
.build();
} private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("学成网api文档")
.description("学成网api文档")
// .termsOfServiceUrl("/")
.version("1.0")
.build();
} }

Swagger2Configuration

2、在此类中指定了包路径com.xuecheng,找到在此包下及子包下标记有@RestController注解的controller类。

、根据controller类中的Swagger注解生成接口文档。
启动cms服务工程,查看接口文档,请求:http://localhost:31001/swagger-ui.html

 微服务项目开发学成在线_day01_CMS服务端开发


Insomnia

Postman是一款功能强大的http接口测试工具,使用postman可以完成http各种请求的功能测试。
官方地址:https://www.getpostman.com/

上一篇:kafka客户端和服务端开发(三)


下一篇:程序员的浪漫,把这个玫瑰花代码送给你的那个他/她吧