頁面靜態化
要生成一個靜態化頁面,我們需要頁面模板+資料模型。模板就是一個html頁面,但其中的資料使用佔位符進行填充;資料模型有很多種,如List,Map……
首先我們需要製作模板。
模板管理
模板製作 - Freemarker:
我們可以透過新建一個工程來實現模板製作。
- 獲取原始頁面模板,新增到templates資料夾中
- 確定需要用模型資料替換的板塊,使用Freemarker標籤進行替換
注:如果之後要在模板中填入資料,就要使用RestTemplate遠端請求模型資料
- 首先獲取dataUrl,再透過dataUrl獲取模型,將模型存入map中
- 測試程式碼:
@Autowired
RestTemplate restTemplate;
@RequestMapping("/banner")
public String index_banner(Map<String, Object> map){
String dataUrl = "http://localhost:31001/cms/config/getmodel/5a791725dd573c3574ee333f";
ResponseEntity<Map> forEntity = restTemplate.getForEntity(dataUrl, Map.class);
Map body = forEntity.getBody();
map.putAll(body);
return "index_banner";
}
- 此時訪問`http://localhost:8088/freemarker/banner`可以獲得一個靜態化頁面。
模板存取 - GridFS
MongoDB提供的分散式,用於持久化儲存檔案的模組。
在這個專案中是為了儲存製作完成的模板檔案。
工作原理
在GridFS儲存檔案是將檔案分塊儲存,檔案會按照256KB的大小分割成多個塊進行儲存,GridFS使用兩個集合(collection)儲存檔案,一個集合是chunks, 用於儲存檔案的二進位制資料;一個集合是files,用於儲存檔案的後設資料資訊(檔名稱、塊大小、上傳時間等資訊)。從GridFS中讀取檔案要對檔案的各各塊進行組裝、合併。
手動新增模板
透過GridFS將模板資訊分塊儲存到資料庫後,我們需要手動在cms_template
中新增模板資訊。其中的關鍵是將剛才GridFS儲存時生成的file_id
填入templateFIleId
這一列,透過這個id,我們可以定位到file_chunks中模板資料。
如何獲取頁面的資料模型?
從資料庫cms_config集合中獲知這個專案首頁中頁面的資料模型有三類:輪播圖,精品推薦和分類資訊。我們可以透過查詢config_id
來得到對應配置的資料模型。而這個config_id
就是dataUrl的最後一個部分。
由於資料模型有很多種,而 CMS 只負責執行靜態化程式,所以無法獲知頁面的資料模型。所以我們需要在編輯頁面時為每個頁面指定DataUrl,在執行靜態化程式時,可以透過DataUrl獲取頁面的資料模型資訊。
頁面靜態化流程
下面就詳述每一個步驟。
填寫頁面DataUrl
一個頁面需要新增dataUrl資訊,這個操作是由管理員在後臺操作頁面新增的。這指定了該頁面的資料模型
- 在編輯cms頁面資訊介面填寫DataUrl,將此欄位儲存到cms_page集合中。
- 這個DataUrl是cms_config中模板的id
獲取頁面DataUrl
定義介面
在api包下定義一個CmsConfigController介面,其中定義一個根據id查詢配置模型的方法。
定義Dao
在dao層定義CmsConfigRepository,繼承MongoRepository<Config, String>
,以使用findById()等方法來查詢資料庫內容。
Service層實現查詢
呼叫CmsConfigRepository的findById()
方法,查詢CmsConfig。
Controller呼叫
重寫Api中的getModel()方法,實現對Service層實現方法的呼叫,來獲取cms_config中的模型id–這就是之後為頁面新增的DataUrl資訊,CMS用來獲取該頁面的資料模型。
這裡,我們獲取到的DataUrl是:http://localhost:31001/cms/config/getmodel/5a791725dd573c3574ee333f
遠端請求DataUrl獲取資料模型
新增OkHttpClient依賴後,在SpringBoot啟動類中配置 RestTemplate 即可。然後在業務層方法中使用RestTemplate獲取資料模型。
獲取頁面的模板資訊
- 整個獲取的邏輯:
頁面ID -> 模板ID -> templateFIleId -> 下載模板
生成靜態化頁面
//執行靜態化
private String generateHtml(String templateContent,Map model ){
//建立配置物件
Configuration configuration = new Configuration(Configuration.getVersion());
//建立模板載入器
StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
stringTemplateLoader.putTemplate("template",templateContent);
//向configuration配置模板載入器
configuration.setTemplateLoader(stringTemplateLoader);
//獲取模板
try {
Template template = configuration.getTemplate("template");
//呼叫api進行靜態化
String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
return content;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
預覽頁面
為了能使管理員在後臺管理中檢視到新建的頁面預覽,我們還要透過在nginx中配置一個預覽頁面的路由來實現頁面預覽。
和直接CRUD的實現類似,我們都需要定義介面、編寫業務層實現方法、在Controller中重寫的介面中呼叫、前端定義路由來實現這一功能。
本作品採用《CC 協議》,轉載必須註明作者和本文連結