日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

学成在线--1.CMS接口开发

發(fā)布時(shí)間:2023/12/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学成在线--1.CMS接口开发 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 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如下:

package com.xuecheng.framework.domain.cms;import lombok.Data; import lombok.ToString; import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document;import java.util.Date; import java.util.List;@Data @ToString @Document(collection = "cms_page") public class CmsPage {/*** 頁面名稱、別名、訪問地址、類型(靜態(tài)/動態(tài))、頁面模版、狀態(tài)*///站點(diǎn)IDprivate String siteId;//頁面ID@Idprivate String pageId;//頁面名稱private String pageName;//別名private String pageAliase;//訪問地址private String pageWebPath;//參數(shù)private String pageParameter;//物理路徑private String pagePhysicalPath;//類型(靜態(tài)/動態(tài))private String pageType;//頁面模版private String pageTemplate;//頁面靜態(tài)化內(nèi)容private String pageHtml;//狀態(tài)private String pageStatus;//創(chuàng)建時(shí)間private Date pageCreateTime;//模版idprivate String templateId;//參數(shù)列表private List<CmsPageParam> pageParams;//模版文件Id // private String templateFileId;//靜態(tài)文件Idprivate String htmlFileId;//數(shù)據(jù)Urlprivate String dataUrl; }

屬性說明:
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)用使用。

頁面查詢接口定義如下:

public interface CmsPageControllerApi { public QueryResponseResult findList(int page, int size, QueryPageRequest queryPageRequest) ; }

此接口編寫后會在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如下:

<?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></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>

由于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

server:port: 31001 spring:application:name: xc-service-manage-cmsdata:mongodb:uri: mongodb://root:123@localhost:27017database: xc_cms

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包下

package com.xuecheng.manage_cms;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.context.annotation.ComponentScan;@SpringBootApplication @EntityScan("com.xuecheng.framework.domain.cms")//掃描實(shí)體類 @ComponentScan(basePackages={"com.xuecheng.api"})//掃描接口 @ComponentScan(basePackages={"com.xuecheng.manage_cms"})//掃描本項(xiàng)目下的所有類 public class ManageCmsApplication {public static void main(String[] args) {SpringApplication.run(ManageCmsApplication.class,args);} }

7.Dao

1)創(chuàng)建Dao,繼承MongoRepository

本項(xiàng)目使用Spring Data Mongodb完成Mongodb數(shù)據(jù)庫的查詢,Spring Data Mongodb提供一套快捷操作mongodb的方法。
創(chuàng)建Dao,繼承MongoRepository,并指定實(shí)體類型和主鍵類型。

package com.xuecheng.manage_cms.dao;import com.xuecheng.framework.domain.cms.CmsPage; import org.springframework.data.mongodb.repository.MongoRepository;public interface CmsPageRepository extends MongoRepository<CmsPage,String> {//根據(jù)頁面名稱查詢CmsPage findByPageName(String pageName); }

其中繼承的接口MongoRepository有以下方法:

2)編寫測試類


test下的包路徑與main下的包路徑保持一致。
測試程序使用@SpringBootTest和@RunWith(SpringRunner.class)注解,啟動測試類會從main下找springBoot啟
動類,加載spring容器。
測試代碼如下:

package com.xuecheng.manage_cms; import com.xuecheng.framework.domain.cms.CmsPage; import com.xuecheng.manage_cms.dao.CmsPageRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.domain.*; import org.springframework.test.context.junit4.SpringRunner;@SpringBootTest @RunWith(SpringRunner.class) public class CmsPageRepositoryTest {@Autowired CmsPageRepository cmsPageRepository;}

分頁查詢測試

//分頁測試 @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)查詢操作。

public interface CmsPageRepository extends MongoRepository<CmsPage,String> { //根據(jù)頁面名稱查詢 CmsPage findByPageName(String pageName); //根據(jù)頁面名稱和類型查詢 CmsPage findByPageNameAndPageType(String pageName,String pageType); //根據(jù)站點(diǎn)和頁面類型查詢記錄數(shù) int countBySiteIdAndPageType(String siteId,String pageType); //根據(jù)站點(diǎn)和頁面類型分頁查詢 Page<CmsPage> findBySiteIdAndPageType(String siteId,String pageType, Pageable pageable); }

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。