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
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,可用于上傳文件醉途。