01_搭建環(huán)境 CMS服務端開發(fā)

1:=====?開發(fā)步驟

項目是基于前后端分離的架構進行開發(fā)锈锤,前后端分離架構總體上包括前端和服務端,通常是多人協(xié)作并行開發(fā),開

發(fā)步驟如下:

1久免、需求分析

梳理用戶的需求浅辙,分析業(yè)務流程

2、接口定義

根據(jù)需求分析定義接口

3阎姥、服務端和前端并行開發(fā)

依據(jù)接口進行服務端接口開發(fā)记舆。

前端開發(fā)用戶操作界面,并請求服務端接口完成業(yè)務處理呼巴。

4氨淌、前后端集成測試

最終前端調用服務端接口完成業(yè)務。

2:=======CMS需求分析

1伊磺、CMS是什么 ?

CMS (Content Management System)即內容管理系統(tǒng)删咱,不同的項目對CMS的定位不同屑埋,比如:一個在線教育網(wǎng)

站,有些公司認為CMS系統(tǒng)是對所有的課程資源進行管理痰滋,而在早期網(wǎng)站剛開始盛行時很多公司的業(yè)務是網(wǎng)站制

作摘能,當時對CMS的定位是創(chuàng)建網(wǎng)站,即對網(wǎng)站的頁面敲街、圖片等靜態(tài)資源進行管理团搞。

2、CMS有哪些類型多艇?

上邊也談到每個公司對每個項目的CMS定位不同逻恐,CMS基本上分為:針對后臺數(shù)據(jù)內容的管理、針對前端頁面的

管理峻黍、針對樣式風格的管理等 复隆。比如:一個給企業(yè)做網(wǎng)站的公司,其CMS系統(tǒng)主要是網(wǎng)站頁面管理及樣式風格的

管理姆涩。

3:======靜態(tài)門戶工程搭建

3.1:導入門戶工程

1挽拂、安裝WebStorm

2、安裝Nginx

下載nginx:http://nginx.org/en/download.html

本教程下載nginx-1.14.0.zip(http://nginx.org/download/nginx-1.14.0.zip)

解壓nginx-1.14.0.zip到自己的計算機骨饿,雙擊nginx.exe即可運行亏栈。

訪問 :http://localhost

3:導入門戶工程

鏈接:https://pan.baidu.com/s/1i_7NWzVZz4DHpIvTI35c4g

提取碼:aesa

3.1 使用webstrom 打開?xc-ui-pc-static-portal

3.2: 配置虛擬主機

修改nginx安裝目錄下的conf文件夾下的nginx.conf

將圖1修改為圖2


圖1



圖2

3.2.3;在nginx安裝目錄? ?進入cmd 窗口

輸入?nginx.exe -s reload

3.2.4:、配置hosts文件?

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

127.0.0.1 www.xuecheng.com

?3.3 SSI服務端包含技術


本節(jié)分析首頁的管理方案宏赘。

1绒北、頁面內容多如何管理?

將頁面拆分成一個一個的小頁面察署,通過cms去管理這些小頁面镇饮,當要更改部分頁面內容時只需要更改具體某個小頁

面即可。

2、頁面拆出來怎么樣通過web服務瀏覽呢储藐?

使用web服務(例如nginx)的SSI技術俱济,將多個子頁面合并渲染輸出。

3钙勃、SSI是什么蛛碌?


ssi包含類似于jsp頁面中的incluce指令,ssi是在web服務端將include指定 的頁面包含在網(wǎng)頁中辖源,渲染html網(wǎng)頁響

應給客戶端 蔚携。nginx、apache等多數(shù)web容器都支持SSI指令克饶。

?ssi指令如下:

<!‐‐#include virtual="/../....html"‐‐>


4酝蜒、將首頁拆分成


index.html:首頁主體內容

include/header.html:頭部區(qū)域

include/index_banner.html:輪播圖

include/index_category.html:左側列表導航

include/footer.html:頁尾

5、在nginx虛擬主機中開通SSI

server{

listen 80;

server_name www.xuecheng.com;

ssi on;

ssi_silent_errors on;

......

ssi的配置參數(shù)如下: ssi on: 開啟ssi支持 ssi_silent_errors on:默認為offff矾湃,設置為on則在處理SSI文件出錯時不

輸出錯誤信息 ssi_types:默認為 ssi_types text/html亡脑,如果需要支持shtml(服務器執(zhí)行腳本,類似于jsp)則需

要設置為ssi_types text/shtml

?6邀跃、測試

去掉某個#include查看頁面效果霉咨。

?3.4:CMS頁面管理需求


1、這些頁面的管理流程是什么拍屑?

1)創(chuàng)建站點:

一個網(wǎng)站有很多子站點途戒,比如:學成在線有主門戶、學習中心僵驰、問答系統(tǒng)等子站點喷斋。具體的哪個頁面是歸屬于具體

的站點,所以要管理頁面蒜茴,先要管理頁面所屬的站點继准。

2)創(chuàng)建模板:

頁面如何創(chuàng)建呢?比如電商網(wǎng)站的商品詳情頁面矮男,每個頁面的內容布局移必、板式是相同的,不同的只是內容毡鉴,這個頁

面的布局崔泵、板式就是頁面模板,模板+數(shù)據(jù)就組成一個完整的頁面猪瞬,最終要創(chuàng)建一個頁面文件需要先定義此頁面的

模板憎瘸,最終拿到頁面的數(shù)據(jù)再結合模板就拼裝成一個完整的頁面。

3)創(chuàng)建頁面:

創(chuàng)建頁面是指填寫頁面的基本信息陈瘦,如:頁面的名稱幌甘、頁面的url地址等。

4)頁面預覽:

頁面預覽是頁面發(fā)布前的一項工作,頁面預覽使用靜態(tài)化技術根據(jù)頁面模板和數(shù)據(jù)生成頁面內容锅风,并通過瀏覽器預

覽頁面酥诽。頁面發(fā)布前進行頁面預覽的目是為了保證頁面發(fā)布后的正確性。

5)頁面發(fā)布:

使用計算機技術將頁面發(fā)送到頁面所在站點的服務器皱埠,頁面發(fā)布成功就可以通過瀏覽器來訪問了肮帐。

2、本項目要實現(xiàn)什么樣的功能边器?

1)頁面管理

管理員在后臺添加训枢、修改、刪除頁面信息

2)頁面預覽

管理員通過頁面預覽功能預覽頁面發(fā)布后的效果忘巧。

3)頁面發(fā)布

管理員通過頁面發(fā)布功能將頁面發(fā)布到遠程門戶服務器恒界。

頁面發(fā)布成功,用戶即可在瀏覽器瀏覽到最新發(fā)布的頁面砚嘴,整個頁面添加十酣、發(fā)布的過程由于軟件自動執(zhí)行,無需人

工登錄服務器操作枣宫。

4 =============CMS服務端工程搭建

4.1:開發(fā)工具配置

1、創(chuàng)建工程代碼目錄 XcEduCode(本教程創(chuàng)建XcEduCode01目錄)吃环,并且IDEA打開也颤。

2、配置maven環(huán)境

?setting.xml文件中配置maven倉庫郁轻,maven倉庫的目錄位置不要去使用中文翅娶。


3、配置編碼


4:配置JDK1.8


5: 好唯、自動導入包 快捷方式:

idea可以自動優(yōu)化導入包竭沫,但是有多個同名的類調用不同的包,必須自己手動Alt+Enter設置

設置idea導入包


6:代碼模板


7:提示忽略大小寫

默認IDEA的提示是區(qū)分大


8:配置虛擬機內存

修改idea64.exe.vmoptions(64位電腦選擇此文件)

?-Xms1024m -Xmx4096m -XX:MaxPermSize=1024m -XX:ReservedCodeCacheSize=1024m

?4.2 導入基礎工程


4.2.1 工程結構

CMS及其它服務端工程基于maven進行構建骑篙,首先需要創(chuàng)建如下基礎工程:

parent工程:父工程蜕提,提供依賴管理。

common工程:通用工程靶端,提供各層封裝

model工程:模型工程谎势,提供統(tǒng)一的模型類管理

utils工程:工具類工程,提供本項目所使用的工具類

Api工程:接口工程杨名,統(tǒng)一管理本項目的服務接口脏榆。

工程結果如下:


4.2.2導入父工程

鏈接:https://pan.baidu.com/s/1EoIxNM9y671dSBgKJnX9lQ

提取碼:r2i0

?1: 將資料中的parent工程拷貝到代碼目錄

2、點擊Import Model台谍,選擇parent工程目錄



問題:添加module 到工程中 發(fā)現(xiàn)pop.xml 報錯? 或者有的依賴庫 加載失敗

1: 在本地maven安裝目錄下 conf中的setting? 中加入

=========================

<mirror>

? ? <!--This sends everything else to /public -->

? ? <id>nexus-aliyun</id>

? ? <mirrorOf>*</mirrorOf>

? ? <name>Nexus aliyun</name>

? ? <url>http://maven.aliyun.com/nexus/content/groups/public</url>

========================

2:在項目的pop.xml中添加

==============

<repositories>

??<repository>

? ?<id>nexus-aliyun</id>

? ?<name>nexus-aliyun</name>

<url>http://maven.aliyun.com/nexus/content/groups/public/</url>

<releases>

<enabled>true</enabled>

</releases>

<snapshots>

<enabled>false</enabled>

</snapshots>

</repository>

</repositories>


==============

4.3.1 安裝MongoDB

菜鳥教程:https://www.runoob.com/mongodb/mongodb-connections.html

CMS采用MongoDB數(shù)據(jù)庫存儲CMS頁面信息须喂,CMS選用Mongodb的原因如下:

1、Mongodb是非關系型數(shù)據(jù)庫,存儲Json格式數(shù)據(jù) ,數(shù)據(jù)格式靈活坞生。

2仔役、相比課程管理等核心數(shù)據(jù)CMS數(shù)據(jù)不重要,且沒有事務管理要求恨胚。

MongoDB 中文網(wǎng):https://www.mongodb.org.cn/

下載:https://www.mongodb.com/download-center/community

3:安裝成成功之后??

在瀏覽器中輸入:http://127.0.0.1:27017/


4:安裝MongoDB連接客戶端

鏈接:https://pan.baidu.com/s/1PtrMANH7Gl6F4WkodkkJ6A

提取碼:zi5k

官網(wǎng):https://studio3t.com/

下載完成:測試連接



連接成功

4.1:創(chuàng)建數(shù)據(jù)庫

4.1.1點擊 Database? 添加數(shù)據(jù)

4.2:導入數(shù)據(jù)庫文件 json文件

4


5:頁面查詢接口定義

5.1 定義模型

5.1.1 需求分析

1骂因、分頁查詢CmsPage 集合下的數(shù)據(jù)

2、根據(jù)站點Id赃泡、模板Id寒波、頁面別名查詢頁面信息

3、接口基于Http Get請求升熊,響應Json數(shù)據(jù)

5.1.2 模型類介紹

接口的定義離不開數(shù)據(jù)模型俄烁,根據(jù)前邊對需求的分析,整個頁面管理模塊的數(shù)據(jù)模型如下:


CmsSite:站點模型?

CmsTemplate:頁面模板?

CmsPage:頁面信息

頁面信息如下:

======================================

@Data

@ToString

@Document(collection = "cms_page")

public class CmsPage {

/**

* 頁面名稱级野、別名页屠、訪問地址、類型(靜態(tài)/動態(tài))蓖柔、頁面模版辰企、狀態(tài)

*/

//站點ID

?private String siteId;

//頁面ID

@Id

private 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)化內容

private String pageHtml;

//狀態(tài)

private String pageStatus;

//創(chuàng)建時間

private Date pageCreateTime;

//模版id

private String templateId;

//參數(shù)列表,暫不用

private List<CmsPageParam> pageParams;

//模版文件Id

// private String templateFileId;

//靜態(tài)文件Id

private String htmlFileId;

//數(shù)據(jù)Url

private String dataUrl;

}

======================================

屬性說明:

1况鸣、定義一個頁面需要指定頁面所屬站點

一個站點包括多個頁面牢贸,比如:學成在線的門戶站點(網(wǎng)站)包括了多個頁面。

2镐捧、定義一個頁面需要指定頁面使用的模板

多個頁面可以使用相同的模板潜索,比如:商品信息模板,每個商品就是一個頁面懂酱,所有商品使用同一個商品信息模板

注解說明:

@Data竹习、@ToString、@Document注解表示什么意思列牺?

@Data整陌、@ToString:是Lombok提供的注解,下邊會介紹瞎领。

@Document:是Spring Data mongodb提供的注解蔓榄,最終CMS的開發(fā)會使用Mongodb數(shù)據(jù)庫。

5.2.3 Lombok

上邊的Data注解表示什么意思呢默刚?Data注解甥郑,ToString注解都是Lombok提供的注解。

Lombok是一個實用的java工具荤西,使用它可以消除java代碼的臃腫澜搅,Lombok提供一系列的注解伍俘,使用這些注解可

以不用定義getter/setter、equals勉躺、構造方法等癌瘾,它會在編譯時在字節(jié)碼文件自動生成這些通用的方法,簡化開發(fā)

人員的工作饵溅。

項目官方地址:https://www.projectlombok.org/

比如上節(jié)創(chuàng)建的UserTest模型妨退,@Data注解可以自動生成getter/setter方法,@ToString生成tostring方法蜕企。

使用方法:

1咬荷、在項目中添加Lombok的依賴

作用:項目在編譯時根據(jù)Lombok注解生成通用方法。

========

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

</dependency>

========

5.2定義接口

5.2.1 定義請求及響應類型

1轻掩、定義請求模型QueryPageRequest幸乒,此模型作為查詢條件類型

為后期擴展需求,請求類型統(tǒng)一繼承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罕扎、響應結果類型,分頁查詢統(tǒng)一使用QueryResponseResult

5.2.2 定義接口


在Api接口工程專門定義接口丐重,在Api工程單獨定義接口的原因如下:

1腔召、接口集中管理

2、Api工程的接口將作為各微服務遠程調用使用扮惦。

頁面查詢接口定義如下:

============================

public interface CmsPageControllerApi {

public QueryResponseResult findList(int page, int size, QueryPageRequest queryPageRequest) ;

}

============================

6 頁面查詢服務端開發(fā)

6.1 創(chuàng)建CMS服務工程

6.1.1 創(chuàng)建CMS工程結構

創(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所以需要在在cms服務端工程添加如下依賴:

項目使用spring data mongodb操作mongodb數(shù)據(jù)庫

================

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring‐boot‐starter‐data‐mongodb</artifactId>

</dependency>

================

2掺栅、創(chuàng)建基本的包結構:

com.xuecheng.manage_cms.confifig:配置類目錄烙肺,數(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‐cms

data:

mongodb:

uri: mongodb://root:123@localhost:27017

database: xc_cms

==================

?logback-spring.xml桃笙,

==================

<?xml version="1.0" encoding="UTF-8"?>


? ? <property name="LOG_HOME" value="d:/logs"/>


? ? <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">


? ? ? ? ? ? <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n

? ? ? ? ? ? <charset>utf8


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

? ? ? ? ? ? <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n


? ? <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">


? ? ? ? <discardingThreshold>0


? ? ? ? <queueSize>512


? ? ? ? <appender-ref ref="FILE"/>

? ? <logger name="org.apache.ibatis.cache.decorators.LoggingCache" level="DEBUG" additivity="false">

? ? ? ? <appender-ref ref="CONSOLE"/>

? ? <logger name="org.springframework.boot" level="DEBUG"/>

? ? <root level="info">


? ? ? ? <appender-ref ref="FILE"/>

? ? ? ? <appender-ref ref="CONSOLE"/>

</configuration>

==================

4氏堤、SpringBoot 啟動類

Spring Boot應用需要創(chuàng)建一個應用啟動類,啟動過程中會掃描Bean并注入spring 容器

注意:此類創(chuàng)建在本工程com.xuecheng.manage_cms包下

==================

@SpringBootApplication

@EntityScan("com.xuecheng.framework.domain.cms")//掃描實體類

@ComponentScan(basePackages={"com.xuecheng.api"})//掃描接口

@ComponentScan(basePackages={"com.xuecheng.manage_cms"})//掃描本項目下的所有類

public class ManageCmsApplication {

public static void main(String[] args) {

SpringApplication.run(ManageCmsApplication.class,args);

}

}

==================

6.1.2 測試Controller

使用springMVC完成接口實現(xiàn)開發(fā)搏明,這里暫時使用測試數(shù)據(jù)鼠锈,稍后會讓controller調用service來查詢數(shù)據(jù)。

=====================

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 {

@Override

@GetMapping("/list/{page}/{size}")

public QueryResponseResult findList(@PathVariable("page") int page,@PathVariable("size") int

size,QueryPageRequest queryPageRequest) {

//暫時采用測試數(shù)據(jù)星著,測試接口是否可以正常運行

QueryResult queryResult = new QueryResult();

queryResult.setTotal(2);

//靜態(tài)數(shù)據(jù)列表

List list = new ArrayList();

CmsPage cmsPage = new CmsPage();

cmsPage.setPageName("測試頁面");

list.add(cmsPage)

queryResult.setList(list);

QueryResponseResult queryResponseResult = new

QueryResponseResult(CommonCode.SUCCESS,queryResult);

return queryResponseResult;

}

}

=====================

運行?ManageCmsApplication??

在瀏覽器輸入:http://localhost:31001/list/1/10

訪問成功:


6.2 Dao

6.2.1 分頁查詢測試

6.2.1.1 定義Dao接口

本項目使用Spring Data Mongodb完成Mongodb數(shù)據(jù)庫的查詢购笆,Spring Data Mongodb提供一套快捷操作

mongodb的方法。

創(chuàng)建Dao虚循,繼承MongoRepository同欠,并指定實體類型和主鍵類型样傍。

public interface CmsPageRepository extends MongoRepository<CmsPage,String> {

}

6.2.1.2編寫測試類

*(注意)test下的包路徑與main下的包路徑保持一致。

測試程序使用@SpringBootTest和@RunWith(SpringRunner.class)注解铺遂,啟動測試類會從main下找springBoot啟

動類衫哥,加載spring容器。

測試代碼如下:

===================== 查詢

@SpringBootTest

@RunWith(SpringRunner.class)

public class CmsPageRepositoryTest {

@Autowired

? ? CmsPageRepositorycmsPageRepository;

? ? @Test

? ? public void testFindPage() {

int page =0;//從0開始

? ? ? ? int size =5;//每頁記錄數(shù)

? ? ? ? Pageable pageable = PageRequest.of(page,size);

? ? ? ? Page all =cmsPageRepository.findAll(pageable);

? ? ? ? for(CmsPage c:all){

System.out.println("pppppppppp"+c );

? ? ? ? }

}

}

====================修改

//修改

? ? @Test

? ? public void testUpdate() {

Optional optional =cmsPageRepository.findById("5a754adf6abb500ad05688d9");

? ? ? ? if(optional.isPresent()){

CmsPage cmsPage = optional.get();

? ? ? ? ? ? cmsPage.setPageAliase("首頁1");

? ? ? ? ? ? CmsPage save =cmsPageRepository.save(cmsPage);

? ? ? ? }

}

===========================

關于Optional:

Optional是jdk1.8引入的類型襟锐,Optional是一個容器對象撤逢,它包括了我們需要的對象,使用isPresent方法判斷所包

含對象是否為空粮坞,isPresent方法返回false則表示Optional包含對象為空蚊荣,否則可以使用get()取出對象進行操作。

Optional的優(yōu)點是:

1捞蚂、提醒你非空判斷妇押。

2、將對象非空檢測標準化姓迅。

6.2.3.4 自定義Dao方法

同Spring Data JPA一樣Spring Data mongodb也提供自定義方法的規(guī)則敲霍,如下:

按照fifindByXXX,fifindByXXXAndYYY丁存、countByXXXAndYYY等規(guī)則定義方法肩杈,實現(xiàn)查詢操作。

public interface CmsPageRepository extends MongoRepository<CmsPage,String> {

//根據(jù)頁面名稱查詢

CmsPage findByPageName(String pageName);

//根據(jù)頁面名稱和類型查詢

CmsPage findByPageNameAndPageType(String pageName,String pageType);

//根據(jù)站點和頁面類型查詢記錄數(shù)

int countBySiteIdAndPageType(String siteId,String pageType);

//根據(jù)站點和頁面類型分頁查詢

Page<CmsPage> findBySiteIdAndPageType(String siteId,String pageType, Pageable pageable);

}

6.3 Service?

================

@Service

public class PageService {

@Autowired

CmsPageRepository cmsPageRepository;

/**

* 頁面列表分頁查詢

* @param page 當前頁碼

* @param size 頁面顯示個數(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;//為了適應mongodb的接口將頁碼減1

if (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());

//返回結果

return new QueryResponseResult(CommonCode.SUCCESS,cmsPageQueryResult);

}

}

================

6.4 Controller

==================

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/list/1/10

訪問成功:


6.6 接口開發(fā)規(guī)范

6.6.1 Api請求及響應規(guī)范

為了嚴格按照接口進行開發(fā)解寝,提高效率扩然,對請求及響應格式進行規(guī)范化。

1聋伦、get 請求時夫偶,采用key/value格式請求,SpringMVC可采用基本類型的變量接收觉增,也可以采用對象接收兵拢。

2、Post請求時逾礁,可以提交form表單數(shù)據(jù)(application/x-www-form-urlencoded)和Json數(shù)據(jù)(Content-

Type=application/json)说铃,文件等多部件類型(multipart/form-data)三種數(shù)據(jù)格式,SpringMVC接收Json數(shù)據(jù)

使用@RequestBody注解解析請求的json數(shù)據(jù)嘹履。

4腻扇、響應結果統(tǒng)一信息為:是否成功、操作代碼砾嫉、提示信息及自定義數(shù)據(jù)幼苛。

5、響應結果統(tǒng)一格式為json焕刮。

6.6.2 Api定義約束

Api定義使用SpringMVC來完成舶沿,由于此接口后期將作為微服務遠程調用使用舌剂,在定義接口時有如下限制:

1、@PathVariable 統(tǒng)一指定參數(shù)名稱暑椰,如:@PathVariable("id")?

2霍转、@RequestParam統(tǒng)一指定參數(shù)名稱,如:@RequestParam("id")

7 頁面查詢接口測試

上邊的代碼是基于服務端編寫接口一汽,如果前端人員等待服務端人員將接口開發(fā)完畢再去開發(fā)前端內容這樣做效率是

非常低下的避消,所以當接口定義完成,可以使用工具生成接口文檔召夹,前端人員查看接口文檔即可進行前端開發(fā)岩喷,這樣

前端和服務人員并行開發(fā)进泼,大大提高了生產(chǎn)效率亲怠。

本章節(jié)介紹兩種接口開發(fā)工具,Swagger和Postman间景。

7.1 Swagger

7.1.1 Swagger介紹

OpenAPI規(guī)范(OpenAPI Specifification 簡稱OAS)是Linux基金會的一個項目鲸阔,試圖通過定義一種用來描述API格

式或API定義的語言偷霉,來規(guī)范RESTful服務開發(fā)過程,目前版本是V3.0褐筛,并且已經(jīng)發(fā)布并開源在github上类少。

(https://github.com/OAI/OpenAPI-Specifification)

Swagger是全球最大的OpenAPI規(guī)范(OAS)API開發(fā)工具框架,支持從設計和文檔到測試和部署的整個API生命周

期的開發(fā)渔扎。 (https://swagger.io/)

Spring Boot 可以集成Swagger硫狞,生成Swagger接口,Spring Boot是Java領域的神器晃痴,它是Spring項目下快速構建

項目的框架残吩。

7.1.2 Swagger常用注解

在Java類中添加Swagger的注解即可生成Swagger接口,常用Swagger注解如下:

@Api:修飾整個類倘核,描述Controller的作用 @ApiOperation:描述一個類的一個方法泣侮,或者說一個接口

@ApiParam:單個參數(shù)描述 @ApiModel:用對象來接收參數(shù) @ApiModelProperty:用對象接收參數(shù)時,描述對

象的一個字段 @ApiResponse:HTTP響應其中1個描述 @ApiResponses:HTTP響應整體描述 @ApiIgnore:使用

該注解忽略這個API @ApiError :發(fā)生錯誤返回的信息 @ApiImplicitParam:一個請求參數(shù)

@ApiImplicitParams:多個請求參數(shù)

@ApiImplicitParam屬性:


7.1.3 Swagger接口定義

修改接口工程中頁面查詢接口笤虫,添加Swagger注解旁瘫。

=========================

@Api(value="cms頁面管理接口",description = "cms頁面管理接口祖凫,提供頁面的增琼蚯、刪、改惠况、查")

public interface CmsPageControllerApi {

@ApiOperation("分頁查詢頁面列表")

@ApiImplicitParams({

@ApiImplicitParam(name="page",value = "頁

碼",required=true,paramType="path",dataType="int"),

@ApiImplicitParam(name="size",value = "每頁記錄

數(shù)",required=true,paramType="path",dataType="int")

})

public 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;

}


=========================

7.1.4 Swagger接口測試

Swagger接口生成工作原理:

1遭庶、系統(tǒng)啟動,掃描到api工程中的Swagger2Confifiguration類

2稠屠、在此類中指定了包路徑com.xuecheng峦睡,找到在此包下及子包下標記有@RestController注解的controller類

3翎苫、根據(jù)controller類中的Swagger注解生成接口文檔。

啟動cms服務工程榨了,查看接口文檔煎谍,請求:http://localhost:31001/swagger-ui.html


7.5 Postman


Postman是一款功能強大的http接口測試工具,使用postman可以完成http各種請求的功能測試龙屉。

官方地址:https://www.getpostman.com/

1呐粘、安裝Postman

本教程使用,雙擊打開 Postman-win64-6.0.10-Setup.exe

新建一個Postman窗口



2转捕、使用postman測試http接口


3作岖、請求參數(shù)設置

1) get請求參數(shù)設置


2)post請求參數(shù)設置


form-data:將表單的數(shù)據(jù)轉為鍵值對,并且可以包括文件

x-www-form-urlencoded: content-type為application/x-www-from-urlencoded五芝,將表單的數(shù)據(jù)轉為鍵值對

raw:請求text痘儡、json、xml枢步、html沉删,比如如果請求json數(shù)據(jù)則使用此格式

binary:content-type為application/octet-stream,可用于上傳文件醉途。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末丑念,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子结蟋,更是在濱河造成了極大的恐慌脯倚,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嵌屎,死亡現(xiàn)場離奇詭異推正,居然都是意外死亡,警方通過查閱死者的電腦和手機宝惰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進店門植榕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尼夺,你說我怎么就攤上這事尊残。” “怎么了淤堵?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵寝衫,是天一觀的道長。 經(jīng)常有香客問我拐邪,道長慰毅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任扎阶,我火速辦了婚禮汹胃,結果婚禮上婶芭,老公的妹妹穿的比我還像新娘。我一直安慰自己着饥,他們只是感情好犀农,可當我...
    茶點故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宰掉,像睡著了一般井赌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贵扰,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天仇穗,我揣著相機與錄音,去河邊找鬼戚绕。 笑死纹坐,一個胖子當著我的面吹牛,可吹牛的內容都是我干的舞丛。 我是一名探鬼主播耘子,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼球切!你這毒婦竟也來了谷誓?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤吨凑,失蹤者是張志新(化名)和其女友劉穎捍歪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸵钝,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡糙臼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了恩商。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片变逃。...
    茶點故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖怠堪,靈堂內的尸體忽然破棺而出揽乱,到底是詐尸還是另有隱情,我是刑警寧澤粟矿,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布凰棉,位于F島的核電站,受9級特大地震影響嚷炉,放射性物質發(fā)生泄漏渊啰。R本人自食惡果不足惜探橱,卻給世界環(huán)境...
    茶點故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一申屹、第九天 我趴在偏房一處隱蔽的房頂上張望绘证。 院中可真熱鬧,春花似錦哗讥、人聲如沸嚷那。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽魏宽。三九已至,卻和暖如春决乎,著一層夾襖步出監(jiān)牢的瞬間队询,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工构诚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蚌斩,地道東北人。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓范嘱,卻偏偏與公主長得像送膳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子丑蛤,可洞房花燭夜當晚...
    茶點故事閱讀 43,728評論 2 351

推薦閱讀更多精彩內容