参考:https://blog.csdn.net/minihuabei/article/details/113725122(18-页面静态化-模板管理-GridFS研究-取文件)
https://blog.csdn.net/minihuabei/article/details/113615605(10-freemarker静态化测试-基于模板文件静态化)
https://blog.csdn.net/minihuabei/article/details/113634638(11-freemarker静态化测试-基于模板字符串静态化)
实现功能
新闻网站,新闻1和新闻2用的同一个模板,但是最终生成2个静态文件,保存在template文件夹下。
1pageSerivce添加程序
上边章节完成了数据模型和模板管理的测试,下边测试整个页面静态化的流程,流程如下:
1、填写页面DataUrl 在编辑cms页面信息界面填写DataUrl,将此字段保存到cms_page集合中。
2、静态化程序获取页面的DataUrl
3、静态化程序远程请求DataUrl获取数据模型。
4、静态化程序获取页面的模板信息
5、执行页面静态化
程序分析
//获取数据模型
//1.通过pageId从cms_page表中拿到dataUrl的地址如:http://localhost:31001/cms/config/getmodel/5a791725dd573c3574ee333f
//2.然后再通过rest接口异步请求这个地址,获取到接口里的数据,如下:
//获取页面的模板信息
//1.通过pageId从cms_page表中拿到templateId模板id
//2.通过模板id从cms_template表中拿到templateFileId模板文件id(在存文件时,生成的模板文件id:601e2fa6ad3b6088a8cc7c18)
//3.根据模板文件id通过gridFs获取模板内容:就是之前上传的文件的文件内容
//执行静态化
//1将获取到的模板内容生成静态文件到template文件夹下
这样就可以把之前上传的文件,生成静态文件放在template文件夹下。
@Autowired
RestTemplate restTemplate;
@Autowired
CmsTemplateRepository cmsTemplateRepository;
@Autowired
GridFsTemplate gridFsTemplate;
@Autowired
GridFSBucket gridFSBucket;
//页面静态化方法
/**
* 静态化程序获取页面的DataUrl
*
* 静态化程序远程请求DataUrl获取数据模型。
*
* 静态化程序获取页面的模板信息
*
* 执行页面静态化
*/
public String getPageHtml(String pageId){
//获取数据模型
Map model = getModelByPageId(pageId);
if(model == null){
//数据模型获取不到
ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAISNULL);
}
//获取页面的模板信息
String template = getTemplateByPageId(pageId);
if(StringUtils.isEmpty(template)){
ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_TEMPLATEISNULL);
}
//执行静态化
String html = generateHtml(template, model);
return html;
}
//执行静态化
//将获取到的模板内容生成静态文件到template文件夹下
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;
}
//获取页面的模板信息
//1.通过pageId从cms_page表中拿到templateId模板id
//2.通过模板id从cms_template表中拿到templateFileId模板文件id(在存文件时,生成的模板文件id)
//3.根据模板文件id通过gridFs获取模板内容
private String getTemplateByPageId(String pageId){
//取出页面的信息
CmsPage cmsPage = this.getById(pageId);
if(cmsPage == null){
//页面不存在
ExceptionCast.cast(CmsCode.CMS_PAGE_NOTEXISTS);
}
//获取页面的模板id
String templateId = cmsPage.getTemplateId();
if(StringUtils.isEmpty(templateId)){
ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_TEMPLATEISNULL);
}
//查询模板信息
Optional<CmsTemplate> optional = cmsTemplateRepository.findById(templateId);
if(optional.isPresent()){
CmsTemplate cmsTemplate = optional.get();
//获取模板文件id
String templateFileId = cmsTemplate.getTemplateFileId();
//从GridFS中取模板文件内容
//根据文件id查询文件
GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(templateFileId)));
//打开一个下载流对象
GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
//创建GridFsResource对象,获取流
GridFsResource gridFsResource = new GridFsResource(gridFSFile,gridFSDownloadStream);
//从流中取数据
try {
String content = IOUtils.toString(gridFsResource.getInputStream(), "utf-8");
return content;
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
//获取数据模型
//1.通过pageId从cms_page表中拿到dataUrl的地址如:http://localhost:40200/portalview/course/get/297e7c7c62b888f00162b8a965510001。
//2.然后再通过rest接口异步请求这个地址,获取到接口里的数据
private Map getModelByPageId(String pageId){
//取出页面的信息
CmsPage cmsPage = this.getById(pageId);
if(cmsPage == null){
//页面不存在
ExceptionCast.cast(CmsCode.CMS_PAGE_NOTEXISTS);
}
//取出页面的dataUrl
String dataUrl = cmsPage.getDataUrl();
if(StringUtils.isEmpty(dataUrl)){
//页面dataUrl为空
ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAURLISNULL);
}
//通过restTemplate请求dataUrl获取数据
ResponseEntity<Map> forEntity = restTemplate.getForEntity(dataUrl, Map.class);
Map body = forEntity.getBody();
return body;
}
cmsCode文件添加报错状态码
添加dao文件,这样才能对cms_template进行增删改查操作
service全部代码如下:
package com.xuecheng.manage_cms.service;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSDownloadStream;
import com.mongodb.client.gridfs.model.GridFSFile;
import com.xuecheng.framework.domain.cms.CmsConfig;
import com.xuecheng.framework.domain.cms.CmsPage;
import com.xuecheng.framework.domain.cms.CmsTemplate;
import com.xuecheng.framework.domain.cms.request.QueryPageRequest;
import com.xuecheng.framework.domain.cms.response.CmsCode;
import com.xuecheng.framework.domain.cms.response.CmsPageResult;
import com.xuecheng.framework.exception.ExceptionCast;
import com.xuecheng.framework.model.response.CommonCode;
import com.xuecheng.framework.model.response.QueryResponseResult;
import com.xuecheng.framework.model.response.QueryResult;
import com.xuecheng.framework.model.response.ResponseResult;
import com.xuecheng.manage_cms.dao.CmsConfigRepository;
import com.xuecheng.manage_cms.dao.CmsPageRepository;
import com.xuecheng.manage_cms.dao.CmsTemplateRepository;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.gridfs.GridFsResource;
import org.springframework.data.mongodb.gridfs.GridFsTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.util.Map;
import java.util.Optional;
/**
* @author Administrator
* @version 1.0
* @create 2018-09-12 18:32
**/
@Service
public class PageService {
@Autowired
CmsPageRepository cmsPageRepository;
@Autowired
CmsConfigRepository cmsConfigRepository;
@Autowired
RestTemplate restTemplate;
@Autowired
CmsTemplateRepository cmsTemplateRepository;
@Autowired
GridFsTemplate gridFsTemplate;
@Autowired
GridFSBucket gridFSBucket;
//页面静态化方法
/**
* 静态化程序获取页面的DataUrl
*
* 静态化程序远程请求DataUrl获取数据模型。
*
* 静态化程序获取页面的模板信息
*
* 执行页面静态化
*/
public String getPageHtml(String pageId){
//获取数据模型
Map model = getModelByPageId(pageId);
if(model == null){
//数据模型获取不到
ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAISNULL);
}
//获取页面的模板信息
String template = getTemplateByPageId(pageId);
if(StringUtils.isEmpty(template)){
ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_TEMPLATEISNULL);
}
//执行静态化
String html = generateHtml(template, model);
return html;
}
//执行静态化
//将获取到的模板内容生成静态文件到template文件夹下
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;
}
//获取页面的模板信息
//1.通过pageId从cms_page表中拿到templateId模板id
//2.通过模板id从cms_template表中拿到templateFileId模板文件id(在存文件时,生成的模板文件id)
//3.根据模板文件id通过gridFs获取模板内容
private String getTemplateByPageId(String pageId){
//取出页面的信息
CmsPage cmsPage = this.getById(pageId);
if(cmsPage == null){
//页面不存在
ExceptionCast.cast(CmsCode.CMS_PAGE_NOTEXISTS);
}
//获取页面的模板id
String templateId = cmsPage.getTemplateId();
if(StringUtils.isEmpty(templateId)){
ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_TEMPLATEISNULL);
}
//查询模板信息
Optional<CmsTemplate> optional = cmsTemplateRepository.findById(templateId);
if(optional.isPresent()){
CmsTemplate cmsTemplate = optional.get();
//获取模板文件id
String templateFileId = cmsTemplate.getTemplateFileId();
//从GridFS中取模板文件内容
//根据文件id查询文件
GridFSFile gridFSFile = gridFsTemplate.findOne(Query.query(Criteria.where("_id").is(templateFileId)));
//打开一个下载流对象
GridFSDownloadStream gridFSDownloadStream = gridFSBucket.openDownloadStream(gridFSFile.getObjectId());
//创建GridFsResource对象,获取流
GridFsResource gridFsResource = new GridFsResource(gridFSFile,gridFSDownloadStream);
//从流中取数据
try {
String content = IOUtils.toString(gridFsResource.getInputStream(), "utf-8");
return content;
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
//获取数据模型
//1.通过pageId从cms_page表中拿到dataUrl的地址如:http://localhost:40200/portalview/course/get/297e7c7c62b888f00162b8a965510001。
//2.然后再通过rest接口异步请求这个地址,获取到接口里的数据
private Map getModelByPageId(String pageId){
//取出页面的信息
CmsPage cmsPage = this.getById(pageId);
if(cmsPage == null){
//页面不存在
ExceptionCast.cast(CmsCode.CMS_PAGE_NOTEXISTS);
}
//取出页面的dataUrl
String dataUrl = cmsPage.getDataUrl();
if(StringUtils.isEmpty(dataUrl)){
//页面dataUrl为空
ExceptionCast.cast(CmsCode.CMS_GENERATEHTML_DATAURLISNULL);
}
//通过restTemplate请求dataUrl获取数据
ResponseEntity<Map> forEntity = restTemplate.getForEntity(dataUrl, Map.class);
Map body = forEntity.getBody();
return body;
}
//根据id查询cmsConfig
public CmsConfig getConfigById(String id){
Optional<CmsConfig> optional = cmsConfigRepository.findById(id);
if(optional.isPresent()){
CmsConfig cmsConfig = optional.get();
return cmsConfig;
}
return null;
}
/**
* 页面查询方法
* @param page 页码,从1开始记数
* @param size 每页记录数
* @param queryPageRequest 查询条件
* @return
*/
public QueryResponseResult findList(int page, int size, QueryPageRequest queryPageRequest){
if(queryPageRequest == null){//当queryPageRequest这个搜索为空时,queryPageRequest.getSiteId()会报错,所以加上如果为空,queryPageRequest = new QueryPageRequest();设置一个空对象
queryPageRequest = new QueryPageRequest();
}
//条件值对象
CmsPage cmsPage= new CmsPage();
//设置页面别名
//设置条件值(站点id)
if(StringUtils.isNotEmpty(queryPageRequest.getSiteId())){//如果搜索的站点id不为空
cmsPage.setSiteId(queryPageRequest.getSiteId());
}
//设置模板id作为查询条件
if(StringUtils.isNotEmpty(queryPageRequest.getTemplateId())){//如果搜索的模板id不为空
cmsPage.setTemplateId(queryPageRequest.getTemplateId());
}
//设置页面别名作为查询条件
if(StringUtils.isNotEmpty(queryPageRequest.getPageAliase())){//如果搜索的页面别名不为空
cmsPage.setPageAliase(queryPageRequest.getPageAliase());
}
//条件匹配器
ExampleMatcher exampleMatcher = ExampleMatcher.matching()
.withMatcher("pageAliase", ExampleMatcher.GenericPropertyMatchers.contains());//因为要对pageAliase进行模糊查询,所以加这句话
//定义Example
Example<CmsPage> example = Example.of(cmsPage,exampleMatcher);
//分页参数
if(page <=0){
page = 1;
}
page = page -1;
if(size<=0){
size = 10;
}
Pageable pageable = PageRequest.of(page,size);
Page<CmsPage> all = cmsPageRepository.findAll(example, pageable);
QueryResult queryResult = new QueryResult();
queryResult.setList(all.getContent());//数据列表
queryResult.setTotal(all.getTotalElements());//数据总记录数
QueryResponseResult queryResponseResult = new QueryResponseResult(CommonCode.SUCCESS,queryResult);
return queryResponseResult;
}
//新增页面
public CmsPageResult add(CmsPage cmsPage) {
if(cmsPage == null){
//抛出异常,非法参数异常..指定异常信息的内容
}
//校验页面名称、站点Id、页面webpath的唯一性
//根据页面名称、站点Id、页面webpath去cms_page集合,如果查到说明此页面已经存在,如果查询不到再继续添加
CmsPage cmsPage1 = cmsPageRepository.findByPageNameAndSiteIdAndPageWebPath(cmsPage.getPageName(), cmsPage.getSiteId(), cmsPage.getPageWebPath());
if(cmsPage1!=null){
ExceptionCast.cast(CmsCode.CMS_ADDPAGE_EXISTSNAME);
//页面已经存在
//抛出异常,异常内容就是页面已经存在
}
//调用dao新增页面
cmsPage.setPageId(null);//防止别人给传主键PageId,所以设置下主键,让他自动生成主键,虽然设置空,但是会自动生成一个随机字符串
// CmsPage save= cmsPageRepository.save(cmsPage);//save对象和参数中的cmsPage是一个对象,只不过save对象多了一个pageId属性。
cmsPageRepository.save(cmsPage);
return new CmsPageResult(CommonCode.SUCCESS,cmsPage);//所以这里返回用save对象也行,用参数中的cmsPage对象也行
}
//修改页面
public CmsPageResult update(String id,CmsPage cmsPage){
//根据id从数据库查询页面信息
CmsPage one = this.getById(id);
if(one!=null){
//准备更新数据
//设置要修改的数据
//更新模板id
one.setTemplateId(cmsPage.getTemplateId());
//更新所属站点
one.setSiteId(cmsPage.getSiteId());
//更新页面别名
one.setPageAliase(cmsPage.getPageAliase());
//更新页面名称
one.setPageName(cmsPage.getPageName());
//更新访问路径
one.setPageWebPath(cmsPage.getPageWebPath());
//更新物理路径
one.setPagePhysicalPath(cmsPage.getPagePhysicalPath());
//更新数据Url
one.setDataUrl(cmsPage.getDataUrl());
//提交修改
cmsPageRepository.save(one);
return new CmsPageResult(CommonCode.SUCCESS,one);
}
//修改失败
return new CmsPageResult(CommonCode.FAIL,null);
}
//根据id删除页面
public ResponseResult delete(String id){
//先查询一下
Optional<CmsPage> optional = cmsPageRepository.findById(id);
if(optional.isPresent()){
cmsPageRepository.deleteById(id);
return new ResponseResult(CommonCode.SUCCESS);
}
return new ResponseResult(CommonCode.FAIL);
}
//根据页面id查询页面
public CmsPage getById(String id){
Optional<CmsPage> optional = cmsPageRepository.findById(id);
if(optional.isPresent()){
CmsPage cmsPage = optional.get();
return cmsPage;
}
return null;
}
}