Part1 CMS服务端开发

Part1 CMS服务端开发

一.CMS需求分析

1、CMS是什么 ?

1、CMS是什么 ?
CMS (Content Management System)即内容管理系统,不同的项目对CMS的定位不同,比如:一个在线教育网站,有些公司认为CMS系统是对所有的课程资源进行管理,而在早期网站刚开始盛行时很多公司的业务是网站制作,当时对CMS的定位是创建网站,即对网站的页面、图片等静态资源进行管理。
2、CMS有哪些类型?
上边也谈到每个公司对每个项目的CMS定位不同,CMS基本上分为:针对后台数据内容的管理、针对前端页面的
管理、针对样式风格的管理等 。比如:一个给企业做网站的公司,其CMS系统主要是网站页面管理及样式风格的
管理。
3、本项目CMS的定位是什么?
本项目作为一个大型的在线教育平台,对CMS系统的定位是对各各网站(子站点)页面的管理,主要管理由于运营需要而经常变动的页面,从而实现根据运营需要快速进行页面开发、上线的需求。

2.静态门户工程搭建

门户效果图如下:

Part1 CMS服务端开发_第1张图片

下载安装Nginx 配置虚拟主机

server{
listen 80;
server_name www.xuecheng.com;
ssi on;
ssi_silent_errors on;
location / {
alias F:/teach/xcEdu/xcEduUI/xc‐ui‐pc‐static‐portal/;
index index.html;
}
}

#F:/teach/xcEdu/xcEduUI/xc‐ui‐pc‐static‐portal/ 本目录为门户的主目录

配置hosts文件 修改C:\Windows\System32\drivers\etc\hosts文件

Part1 CMS服务端开发_第2张图片

打开浏览器输入http://www.xuecheng.com 成功访问到主页

3.SSI服务端包含技术

本节分析首页的管理方案。
1、页面内容多如何管理?
将页面拆分成一个一个的小页面,通过cms去管理这些小页面,当要更改部分页面内容时只需要更改具体某个小页
面即可。
2、页面拆出来怎么样通过web服务浏览呢?
使用web服务(例如nginx)的SSI技术,将多个子页面合并渲染输出。
3、SSI是什么?

Part1 CMS服务端开发_第3张图片

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

ssi指令如下:


将首页拆分成

index.html:首页主体内容
include/header.html:头部区域
include/index_banner.html:轮播图
include/index_category.html:左侧列表导航
include/footer.html:页尾

Part1 CMS服务端开发_第4张图片

在nginx虚拟主机中开通SSI

Part1 CMS服务端开发_第5张图片

ssi的配置参数如下:

ssi on: 开启ssi支持 ssi_silent_errors on:默认为off,设置为on则在处理SSI文件出错时不输出错误信息 ssi_types:默认为 ssi_types text/html,如果需要支持shtml(服务器执行脚本,类似于jsp)则需要设置为ssi_types text/sht

PS: 通过模板静态化的页面,在SpringBoot内置的Tomcat中是不支持SSI的

二.CMS服务端搭建

1.导入基础工程

工程结构

CMS及其它服务端工程基于maven进行构建,首先需要创建如下基础工程:
parent工程:父工程,提供依赖管理。
common工程:通用工程,提供各层封装
model工程:模型工程,提供统一的模型类管理
utils工程:工具类工程,提供本项目所使用的工具类
Api工程:接口工程,统一管理本项目的服务接口

工程结果如下:

Part1 CMS服务端开发_第6张图片

Part1 CMS服务端开发_第7张图片

2.MongoDB安装并导入数据

安装过程自行百度

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

Part1 CMS服务端开发_第8张图片

3.页面查询接口定义

1 定义模型

1.1 需求分析

​ 在梳理完用户需求后就要去定义前后端的接口,接口定义后前端和后端就可以依据接口去开发功能了。
本次定义页面查询接口,本接口供前端请求查询页面列表,支持分页及自定义条件查询方式。
具体需求如下:
1、分页查询CmsPage 集合下的数据
2、根据站点Id、模板Id、页面别名查询页面信息
3、接口基于Http Get请求,响应Json数据

1.2模型类介绍

Part1 CMS服务端开发_第9张图片

1.MongoDB中的文档就好比Mysql中的表: @Document是把一个java类声明为mongodb的文档,可以通过collection参数指定这个类对应的文档

2.当Java的Sping Data 框架映射Pojo为MongoDB数据时,数据库中会自动给你添加一个_class字段

其作用是 :来映射Pojo的,更具体的说,是为了方便处理Pojo中存在继承的情况,增加系统的扩展性的

@Data
@ToString
@Document(collection = "cms_page")
public class CmsPage {
/**
* 页面名称、别名、访问地址、类型(静态/动态)、页面模版、状态
*/
//站点ID
private String siteId;
//页面ID
@Id
private String pageId;
//页面名称
private String pageName;
//别名
private String pageAliase;
//访问地址
private String pageWebPath;
//参数
private String pageParameter;
//物理路径
private String pagePhysicalPath;
//类型(静态/动态)
private String pageType;
//页面模版
private String pageTemplate;
//页面静态化内容
private String pageHtml;
//状态
private String pageStatus;
//创建时间
private Date pageCreateTime;
//模版id
private String templateId;
//参数列表,暂不用
private List pageParams;
//模版文件Id
// private String templateFileId;
//静态文件Id
private String htmlFileId;
//数据Url
private String dataUrl;
}
属性说明:

1、定义一个页面需要指定页面所属站点
一个站点包括多个页面,比如:学成在线的门户站点(网站)包括了多个页面。
2、定义一个页面需要指定页面使用的模板
多个页面可以使用相同的模板,比如:商品信息模板,每个商品就是一个页面,所有商品使用同一个商品信息模板
注解说明:
@Data、@ToString、@Document注解表示什么意思?
@Data、@ToString:是Lombok提供的注解,下边会介绍。
@Document:是Spring Data mongodb提供的注解,最终CMS的开发会使用Mongodb数据库。

1.3定义请求及响应类型

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

Part1 CMS服务端开发_第10张图片

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

Part1 CMS服务端开发_第11张图片

Part1 CMS服务端开发_第12张图片

1.4接口定义

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

Part1 CMS服务端开发_第13张图片

2.服务端开发

1.创建CMS工程结构

创建maven工程, CMS工程的名称为 xc-service-manage-cms,父工程为xc-framework-parent



com.xuecheng
xc‐service‐api
1.0‐SNAPSHOT


com.xuecheng
xc‐framework‐model
1.0‐SNAPSHOT


com.xuecheng
xc‐framework‐utils
1.0‐SNAPSHOT


com.xuecheng
xc‐framework‐common
1.0‐SNAPSHOT


org.springframework.boot
spring‐boot‐starter‐web


org.springframework.boot
spring‐boot‐starter‐freemarker


org.springframework.boot
spring‐boot‐starter‐data‐mongodb


org.springframework.boot
spring‐boot‐starter‐amqp


com.squareup.okhttp3
okhttp


org.springframework.boot
spring‐boot‐starter‐test




org.springframework.boot
spring‐boot‐starter‐data‐mongodb



2.CmsPageController
@RestController
@RequestMapping("/cms/page")
public class CmsPageController implements CmsPageControllerApi {

    @Autowired
    private CmsPageService cmsPageService;

    @Override
    @GetMapping("/list/{page}/{size}")
    public QueryResponseResult findList(
    	@PathVariable("page") int page, 		 
    	@PathVariable("size") int size, 
    	QueryPageRequest queryPageResult) {
        return cmsPageService.findList(page, size, queryPageResult);
    }
    }
3.CmsPageService
@Service
public class CmsPageService {

    @Autowired
    private CmsPageRepository cmsPageRepository;
    public QueryResponseResult findList(int page,int size,
    QueryPageRequest 	queryPageRequest){
		if (queryPageRequest == null) {
		queryPageRequest = new QueryPageRequest();
		}
            if (page <= 0) {
            page = 1;
            }
            page = page ‐ 1;//为了适应mongodb的接口将页码减1
            if (size <= 0) {
            size = 20;
            }
            //分页对象
            Pageable pageable = new PageRequest(page, size);
            //分页查询
            Page all = cmsPageRepository.findAll(pageable);
            QueryResult cmsPageQueryResult = new QueryResult();
            cmsPageQueryResult.setList(all.getContent());
            cmsPageQueryResult.setTotal(all.getTotalElements());
            //返回结果
            return new QueryResponseResult(CommonCode.SUCCESS,cmsPageQueryResult);
}
    
    }
4.CmsPageRepository(Dao)
public interface CmsPageRepository extends MongoRepository {
}
//创建Dao,继承MongoRepository,并指定实体类型和主键类型。

Part1 CMS服务端开发_第14张图片

测试类下的包路径与main下的包路径保持一致。
测试程序使用@SpringBootTest和@RunWith(SpringRunner.class)注解,启动测试类会从main下找springBoot启
动类,加载spring容器。

关于Optional:
Optional是jdk1.8引入的类型,Optional是一个容器对象,它包括了我们需要的对象,使用isPresent方法判断所包
含对象是否为空,isPresent方法返回false则表示Optional包含对象为空,否则可以使用get()取出对象进行操作。
Optional的优点是:
1、提醒你非空判断。
2、将对象非空检测标准化。

5.接口开发规范
1.Api请求及响应规范

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

2.Api定义约束

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

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

6.页面查询接口测试
1.swagger

​ swagger介绍

​OpenAPI规范(OpenAPI Specification 简称OAS)是Linux基金会的一个项目,试图通过定义一种用来描述API格
式或API定义的语言,来规范RESTful服务开发过程,目前版本是V3.0,并且已经发布并开源在github上。
(https://github.com/OAI/OpenAPI-Specification)
Swagger是全球最大的OpenAPI规范(OAS)API开发工具框架,支持从设计和文档到测试和部署的整个API生命周
期的开发。 (https://swagger.io/)
Spring Boot 可以集成Swagger,生成Swagger接口,Spring Boot是Java领域的神器,它是Spring项目下快速构建
项目的框架。

​ Swagger常用注解

在Java类中添加Swagger的注解即可生成Swagger接口,常用Swagger注解如下:
@Api:修饰整个类,描述Controller的作用

@ApiOperation:描述一个类的一个方法,或者说一个接口
@ApiParam:单个参数描述 @ApiModel:用对象来接收参数

@ApiModelProperty:用对象接收参数时,描述对象的一个字段

@ApiResponse:HTTP响应其中1个描述

@ApiResponses:HTTP响应整体描述

@ApiIgnore:使用该注解忽略这个API

@ApiError :发生错误返回的信息

@ApiImplicitParam:一个请求参数
@ApiImplicitParams:多个请求参数
@ApiImplicitParam属性:

Part1 CMS服务端开发_第15张图片

​ 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();
    }

}

Swagger接口定义

@Api(value = "Cms页面管理接口", description = "Cms页面管理接口,提供页面的CRUD")
public interface CmsPageControllerApi {
    //页面查询
    @ApiOperation("分页查询页面列表")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "page", value = "页码", required = true, paramType = "int"),
            @ApiImplicitParam(name = "size", value = "每页记录数", required = true, paramType = "int")
    })
    QueryResponseResult findList(int page, int size, QueryPageRequest QueryPageRequest);
}

在QueryPageRequest类中使用注解 ApiModelProperty 对属性注释:

@Data
public class QueryPageRequest extends RequestData {
    //站点id
    @ApiModelProperty("站点ID")
    private String siteId;
    //页面ID
    @ApiModelProperty("页面ID")
    private String pageId;
    //页面名称
    @ApiModelProperty("页面名称")
    private String pageName;
    //别名
    @ApiModelProperty("别名")
    private String pageAliase;
    //模版id
    @ApiModelProperty("模版id")
    private String templateId;
    //页面类型
    @ApiModelProperty("页面类型")
    private String pageType;

}

Swagger接口测试

Swagger接口生成工作原理:
1、系统启动,扫描到api工程中的Swagger2Configuration类
2、在此类中指定了包路径com.xuecheng,找到在此包下及子包下标记有@RestController注解的controller类
3、根据controller类中的Swagger注解生成接口文档。

Part1 CMS服务端开发_第16张图片

2.Postman

Part1 CMS服务端开发_第17张图片

1) get请求参数设置

Part1 CMS服务端开发_第18张图片

2)post请求参数设置

Part1 CMS服务端开发_第19张图片

form-data:将表单的数据转为键值对,并且可以包括文件
x-www-form-urlencoded: content-type为application/x-www-from-urlencoded,将表单的数据转为键值对
raw:请求text、json、xml、html,比如如果请求json数据则使用此格式
binary:content-type为application/octet-stream,可用于上传文件。

你可能感兴趣的:(学成在线)