学成在线--1.CMS接口开发
文章目錄
- 0.定義CMS
- 1.CMS頁面管理
- 2.需求分析
- 3.模型類介紹
- 4.定義請求及響應(yīng)類型
- 5.定義接口
- 6.創(chuàng)建CMS工程結(jié)構(gòu)
- 7.Dao
- 1)創(chuàng)建Dao,繼承MongoRepository
- 2)編寫測試類
- 分頁查詢測試
- 添加
- 刪除
- 修改
- 8.Service
- 9.Controller
- 10.接口開發(fā)規(guī)范
0.定義CMS
1)CMS是什么 ?
CMS (Content Management System)即內(nèi)容管理系統(tǒng),不同的項(xiàng)目對CMS的定位不同,比如:一個(gè)在線教育網(wǎng)站,有些公司認(rèn)為CMS系統(tǒng)是對所有的課程資源進(jìn)行管理,而在早期網(wǎng)站剛開始盛行時(shí)很多公司的業(yè)務(wù)是網(wǎng)站制作,當(dāng)時(shí)對CMS的定位是創(chuàng)建網(wǎng)站,即對網(wǎng)站的頁面、圖片等靜態(tài)資源進(jìn)行管理。
2)CMS有哪些類型?
上邊也談到每個(gè)公司對每個(gè)項(xiàng)目的CMS定位不同,CMS基本上分為:針對后臺數(shù)據(jù)內(nèi)容的管理、針對前端頁面的管理、針對樣式風(fēng)格的管理等 。比如:一個(gè)給企業(yè)做網(wǎng)站的公司,其CMS系統(tǒng)主要是網(wǎng)站頁面管理及樣式風(fēng)格的管理。
3)本項(xiàng)目CMS的定位是什么?
本項(xiàng)目作為一個(gè)大型的在線教育平臺,對CMS系統(tǒng)的定位是對各各網(wǎng)站(子站點(diǎn))頁面的管理,主要管理由于運(yùn)營需要而經(jīng)常變動的頁面,從而實(shí)現(xiàn)根據(jù)運(yùn)營需要快速進(jìn)行頁面開發(fā)、上線的需求。
1.CMS頁面管理
本項(xiàng)目要實(shí)現(xiàn)什么樣的功能?
1)頁面管理
管理員在后臺添加、修改、刪除頁面信息。
2)頁面預(yù)覽
管理員通過頁面預(yù)覽功能預(yù)覽頁面發(fā)布后的效果。
3)頁面發(fā)布
管理員通過頁面發(fā)布功能將頁面發(fā)布到遠(yuǎn)程門戶服務(wù)器。頁面發(fā)布成功,用戶即可在瀏覽器瀏覽到最新發(fā)布的頁面,整個(gè)頁面添加、發(fā)布的過程由于軟件自動執(zhí)行,無需人工登錄服務(wù)器操作。
這些頁面的管理流程是什么?
1)創(chuàng)建站點(diǎn):
一個(gè)網(wǎng)站有很多子站點(diǎn),比如:學(xué)成在線有主門戶、學(xué)習(xí)中心、問答系統(tǒng)等子站點(diǎn)。具體的哪個(gè)頁面是歸屬于具體的站點(diǎn),所以要管理頁面,先要管理頁面所屬的站點(diǎn)。
2)創(chuàng)建模板:
頁面如何創(chuàng)建呢?比如電商網(wǎng)站的商品詳情頁面,每個(gè)頁面的內(nèi)容布局、板式是相同的,不同的只是內(nèi)容,這個(gè)頁面的布局、板式就是頁面模板,模板+數(shù)據(jù)就組成一個(gè)完整的頁面,最終要?jiǎng)?chuàng)建一個(gè)頁面文件需要先定義此頁面的模板,最終拿到頁面的數(shù)據(jù)再結(jié)合模板就拼裝成一個(gè)完整的頁面。
3)創(chuàng)建頁面:
創(chuàng)建頁面是指填寫頁面的基本信息,如:頁面的名稱、頁面的url地址等。
4)頁面預(yù)覽:
頁面預(yù)覽是頁面發(fā)布前的一項(xiàng)工作,頁面預(yù)覽使用靜態(tài)化技術(shù)根據(jù)頁面模板和數(shù)據(jù)生成頁面內(nèi)容,并通過瀏覽器預(yù)覽頁面。頁面發(fā)布前進(jìn)行頁面預(yù)覽的目是為了保證頁面發(fā)布后的正確性。
5)頁面發(fā)布:
使用計(jì)算機(jī)技術(shù)將頁面發(fā)送到頁面所在站點(diǎn)的服務(wù)器,頁面發(fā)布成功就可以通過瀏覽器來訪問了。
2.需求分析
在梳理完用戶需求后就要去定義前后端的接口,接口定義后前端和后端就可以依據(jù)接口去開發(fā)功能。
具體需求如下:
1、分頁查詢CmsPage 集合下的數(shù)據(jù)
2、根據(jù)站點(diǎn)Id、模板Id、頁面別名查詢頁面信息
3、接口基于Http Get請求,響應(yīng)Json數(shù)據(jù)
本次定義頁面查詢接口,本接口供前端請求查詢頁面列表,支持分頁及自定義條件查詢方式。
3.模型類介紹
接口的定義離不開數(shù)據(jù)模型,根據(jù)前邊對需求的分析,整個(gè)頁面管理模塊的數(shù)據(jù)模型如下:
CmsSite:站點(diǎn)模型
CmsTemplate:頁面模板
CmsPage:頁面信息
其中頁面信息CmsPage如下:
屬性說明:
1、定義一個(gè)頁面需要指定頁面所屬站點(diǎn)
一個(gè)站點(diǎn)包括多個(gè)頁面,比如:學(xué)成在線的門戶站點(diǎn)(網(wǎng)站)包括了多個(gè)頁面。
2、定義一個(gè)頁面需要指定頁面使用的模板
多個(gè)頁面可以使用相同的模板,比如:商品信息模板,每個(gè)商品就是一個(gè)頁面,所有商品使用同一個(gè)商品信息模板
注解說明:
@Data、@ToString:是Lombok提供的注解。
@Document:是Spring Data mongodb提供的注解,最終CMS的開發(fā)會使用Mongodb數(shù)據(jù)庫。
4.定義請求及響應(yīng)類型
定義請求模型QueryPageRequest,此模型作為查詢條件類型
package com.xuecheng.framework.domain.cms.request;import io.swagger.annotations.ApiModelProperty; import lombok.Data;@Data public class QueryPageRequest {//接收頁面查詢的查詢條件//站點(diǎn)id//站點(diǎn)id@ApiModelProperty("站點(diǎn)id")private String siteId;//頁面IDprivate String pageId;//頁面名稱private String pageName;//別名private String pageAliase;//模版idprivate String templateId;//.... }響應(yīng)結(jié)果類型,分頁查詢統(tǒng)一使用QueryResponseResult
package com.xuecheng.framework.model.response;import lombok.Data; import lombok.ToString;@Data @ToString public class QueryResponseResult extends ResponseResult {QueryResult queryResult;public QueryResponseResult(ResultCode resultCode,QueryResult queryResult){super(resultCode);this.queryResult = queryResult;}}5.定義接口
在Api接口工程專門定義接口,在Api工程單獨(dú)定義接口的原因如下:
1、接口集中管理
2、Api工程的接口將作為各微服務(wù)遠(yuǎn)程調(diào)用使用。
頁面查詢接口定義如下:
此接口編寫后會在CMS服務(wù)工程編寫Controller類實(shí)現(xiàn)此接口。
6.創(chuàng)建CMS工程結(jié)構(gòu)
1)創(chuàng)建maven工程, CMS工程的名稱為 xc-service-manage-cms,父工程為xc-framework-parent。
pom.xml如下:
由于cms工程要連接mongodb,使用spring data mongodb操作mongodb數(shù)據(jù)庫,所以需要在在cms服務(wù)端工程添加依賴spring-boot-starter-data-mongodb。
2)創(chuàng)建基本的包結(jié)構(gòu):
com.xuecheng.manage_cms.config:配置類目錄,數(shù)據(jù)庫配置、MQ配置等
com.xuecheng.manage_cms.dao:dao接口目錄
com.xuecheng.manage_cms.service:service類目錄
com.xuecheng.manage_cms.web.controller:controller類目錄
3)配置文件
在classpath下配置application.yml
logback-spring.xml:
<?xml version="1.0" encoding="UTF-8"?><configuration><!--定義日志文件的存儲地址,使用絕對路徑--><property name="LOG_HOME" value="d:/logs"/><!-- Console 輸出設(shè)置 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個(gè)字符寬度%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"><!-- 不丟失日志.默認(rèn)的,如果隊(duì)列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日志 --><discardingThreshold>0</discardingThreshold><!-- 更改默認(rèn)的隊(duì)列的深度,該值會影響性能.默認(rèn)值為256 --><queueSize>512</queueSize><!-- 添加附加的appender,最多只能添加一個(gè) --><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>4)SpringBoot 啟動類
Spring Boot應(yīng)用需要?jiǎng)?chuàng)建一個(gè)應(yīng)用啟動類,啟動過程中會掃描Bean并注入spring 容器
注意:此類創(chuàng)建在本工程com.xuecheng.manage_cms包下
7.Dao
1)創(chuàng)建Dao,繼承MongoRepository
本項(xiàng)目使用Spring Data Mongodb完成Mongodb數(shù)據(jù)庫的查詢,Spring Data Mongodb提供一套快捷操作mongodb的方法。
創(chuàng)建Dao,繼承MongoRepository,并指定實(shí)體類型和主鍵類型。
其中繼承的接口MongoRepository有以下方法:
2)編寫測試類
test下的包路徑與main下的包路徑保持一致。
測試程序使用@SpringBootTest和@RunWith(SpringRunner.class)注解,啟動測試類會從main下找springBoot啟
動類,加載spring容器。
測試代碼如下:
分頁查詢測試
//分頁測試 @Test public void testFindPage() { int page = 0;//從0開始 int size = 10;//每頁記錄數(shù) Pageable pageable = PageRequest.of(page,size); Page<CmsPage> all = cmsPageRepository.findAll(pageable); System.out.println(all); }添加
//添加 @Test public void testInsert(){ //定義實(shí)體類 CmsPage cmsPage = new CmsPage(); cmsPage.setSiteId("s01"); cmsPage.setTemplateId("t01"); cmsPage.setPageName("測試頁面"); cmsPage.setPageCreateTime(new Date()); List<CmsPageParam> cmsPageParams = new ArrayList<>(); CmsPageParam cmsPageParam = new CmsPageParam(); cmsPageParam.setPageParamName("param1"); cmsPageParam.setPageParamValue("value1"); cmsPageParams.add(cmsPageParam); cmsPage.setPageParams(cmsPageParams); cmsPageRepository.save(cmsPage); System.out.println(cmsPage); }刪除
//刪除 @Test public void testDelete() { cmsPageRepository.deleteById("5b17a2c511fe5e0c409e5eb3"); }修改
/ /修改 @Test public void testUpdate() { Optional<CmsPage> optional = cmsPageRepository.findOne("5b17a34211fe5e2ee8c116c9"); if(optional.isPresent()){ CmsPage cmsPage = optional.get(); cmsPage.setPageName("測試頁面01"); cmsPageRepository.save(cmsPage); } }關(guān)于Optional:
Optional是jdk1.8引入的類型,Optional是一個(gè)容器對象,它包括了我們需要的對象,使用isPresent方法判斷所包
含對象是否為空,isPresent方法返回false則表示Optional包含對象為空,否則可以使用get()取出對象進(jìn)行操作。
Optional的優(yōu)點(diǎn)是:
1、提醒你非空判斷。
2、將對象非空檢測標(biāo)準(zhǔn)化。
3)自定義Dao方法
同Spring Data JPA一樣Spring Data mongodb也提供自定義方法的規(guī)則,如下:
按照findByXXX,findByXXXAndYYY、countByXXXAndYYY等規(guī)則定義方法,實(shí)現(xiàn)查詢操作。
8.Service
定義頁面查詢方法,根據(jù)條件查詢暫時(shí)不實(shí)現(xiàn):
package com.xuecheng.manage_cms.service; import com.xuecheng.framework.domain.cms.CmsPage; import com.xuecheng.framework.domain.cms.request.QueryPageRequest; import com.xuecheng.framework.model.response.CommonCode; import com.xuecheng.framework.model.response.QueryResponseResult; import com.xuecheng.framework.model.response.QueryResult; import com.xuecheng.manage_cms.dao.CmsPageRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; @Service public class PageService { @Autowired CmsPageRepository cmsPageRepository; /** * 頁面列表分頁查詢 * @param page 當(dāng)前頁碼 * @param size 頁面顯示個(gè)數(shù) * @param queryPageRequest 查詢條件 * @return 頁面列表 */ public QueryResponseResult findList(int page,int size,QueryPageRequest queryPageRequest){if (queryPageRequest == null) {queryPageRequest = new QueryPageRequest();} if (page <= 0) {page = 1;} page = page ‐ 1;//為了適應(yīng)mongodb的接口將頁碼減1if (size <= 0) {size = 20;} //分頁對象Pageable pageable = new PageRequest(page, size);//分頁查詢Page<CmsPage> all = cmsPageRepository.findAll(pageable);QueryResult<CmsPage> cmsPageQueryResult = new QueryResult<CmsPage>();cmsPageQueryResult.setList(all.getContent());cmsPageQueryResult.setTotal(all.getTotalElements());//返回結(jié)果return new QueryResponseResult(CommonCode.SUCCESS,cmsPageQueryResult);} }9.Controller
使用springMVC完成接口實(shí)現(xiàn)開發(fā)。
package com.xuecheng.manage_cms.web.controller; import com.xuecheng.api.cms.CmsPageControllerApi; import com.xuecheng.framework.domain.cms.request.QueryPageRequest; import com.xuecheng.framework.model.response.QueryResponseResult; import com.xuecheng.manage_cms.service.PageService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController 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) { return pageService.findList(page,size,queryPageRequest); } }使用瀏覽器測試
輸入:http://localhost:31001/cms/page/list/1/10 查詢第1頁,每頁顯示10條記錄。
10.接口開發(fā)規(guī)范
Api請求及響應(yīng)規(guī)范
為了嚴(yán)格按照接口進(jìn)行開發(fā),提高效率,對請求及響應(yīng)格式進(jìn)行規(guī)范化。
1)get 請求時(shí),采用key/value格式請求,SpringMVC可采用基本類型的變量接收,也可以采用對象接收。
2)Post請求時(shí),可以提交form表單數(shù)據(jù)(application/x-www-form-urlencoded)和Json數(shù)據(jù)(ContentType=application/json),文件等多部件類型(multipart/form-data)三種數(shù)據(jù)格式,SpringMVC接收J(rèn)son數(shù)據(jù)
使用@RequestBody注解解析請求的json數(shù)據(jù)。
3)響應(yīng)結(jié)果統(tǒng)一信息為:是否成功、操作代碼、提示信息及自定義數(shù)據(jù)。
4)響應(yīng)結(jié)果統(tǒng)一格式為json。
Api定義約束
Api定義使用SpringMVC來完成,由于此接口后期將作為微服務(wù)遠(yuǎn)程調(diào)用使用,在定義接口時(shí)有如下限制:
1)@PathVariable 統(tǒng)一指定參數(shù)名稱,如:@PathVariable(“id”)
2)@RequestParam統(tǒng)一指定參數(shù)名稱,如:@RequestParam(“id”)
總結(jié)
以上是生活随笔為你收集整理的学成在线--1.CMS接口开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 主成分分析与因子分析及SPSS实现
- 下一篇: VS2012番茄助手安装破解教程