CmsParserUtil.java 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. package net.mingsoft.cms.util;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.io.StringWriter;
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import java.util.Map;
  9. import org.apache.commons.lang3.StringUtils;
  10. import cn.hutool.core.io.FileUtil;
  11. import cn.hutool.core.util.ObjectUtil;
  12. import cn.hutool.core.util.PageUtil;
  13. import freemarker.cache.FileTemplateLoader;
  14. import freemarker.core.ParseException;
  15. import freemarker.template.MalformedTemplateNameException;
  16. import freemarker.template.Template;
  17. import freemarker.template.TemplateException;
  18. import freemarker.template.TemplateNotFoundException;
  19. import net.mingsoft.base.constant.Const;
  20. import net.mingsoft.basic.entity.ColumnEntity;
  21. import net.mingsoft.basic.util.BasicUtil;
  22. import net.mingsoft.basic.util.SpringUtil;
  23. import net.mingsoft.cms.bean.ColumnArticleIdBean;
  24. import net.mingsoft.cms.constant.e.ColumnTypeEnum;
  25. import net.mingsoft.mdiy.biz.IContentModelBiz;
  26. import net.mingsoft.mdiy.entity.ContentModelEntity;
  27. import net.mingsoft.mdiy.parser.TagParser;
  28. import net.mingsoft.mdiy.util.ParserUtil;
  29. public class CmsParserUtil extends ParserUtil {
  30. /**
  31. * 指定模板,指定路径进行生成静态页面,会自定识别pc与移动端
  32. *
  33. * @param templatePath
  34. * 模板路径
  35. * @param targetPath
  36. * 生成后的路径,默认生成的html文件,所以不能带.html后缀,
  37. * @throws IOException
  38. */
  39. public static void generate(String templatePath, String targetPath) throws IOException {
  40. Map map = new HashMap();
  41. map.put(IS_DO, false);
  42. String content = CmsParserUtil.generate(templatePath, map, false);
  43. FileUtil.writeString(content, ParserUtil.buildHtmlPath(targetPath), Const.UTF8);
  44. // 生成移动页面
  45. if (ObjectUtil.isNotNull(BasicUtil.getApp().getAppMobileStyle())) {
  46. // 手机端m
  47. map.put(ParserUtil.MOBILE, BasicUtil.getApp().getAppMobileStyle());
  48. content = CmsParserUtil.generate(templatePath, map, true);
  49. FileUtil.writeString(content, ParserUtil.buildMobileHtmlPath(targetPath), Const.UTF8);
  50. }
  51. }
  52. /**
  53. * 生成静态列表页
  54. * @param column
  55. * @param articleIdTotal
  56. * @throws TemplateNotFoundException
  57. * @throws MalformedTemplateNameException
  58. * @throws ParseException
  59. * @throws IOException
  60. */
  61. public static void generateList(ColumnEntity column, int articleIdTotal)
  62. throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException {
  63. // 只初始化一次cfg
  64. if (ftl == null) {
  65. ftl = new FileTemplateLoader(new File(ParserUtil.buildTempletPath()));
  66. cfg.setTemplateLoader(ftl);
  67. }
  68. // 移动端模板
  69. Template mobileTemplate = cfg.getTemplate(
  70. BasicUtil.getApp().getAppMobileStyle() + File.separator + column.getColumnListUrl(), Const.UTF8);
  71. // pc端模板
  72. Template template = cfg.getTemplate(File.separator + column.getColumnListUrl(), Const.UTF8);
  73. StringWriter writer = new StringWriter();
  74. try {
  75. // 为了分页添加column,判断栏目是否为父栏目
  76. template.process(null, writer);
  77. String content = writer.toString();
  78. //获取列表页显示的文章数量
  79. int pageSize = TagParser.getPageSize(content);
  80. //获取总数
  81. int totalPageSize = PageUtil.totalPage(articleIdTotal, pageSize);
  82. String columnListPath;
  83. String mobilePath;
  84. int pageNo = 1;
  85. // 遍历分页
  86. for (int i = 0; i < totalPageSize; i++) {
  87. Map parserParams = new HashMap();
  88. parserParams.put(COLUMN, column);
  89. parserParams.put(TOTAL, totalPageSize);
  90. parserParams.put(RCOUNT, pageSize);
  91. parserParams.put(TYPE_ID, column.getCategoryId());
  92. parserParams.put(IS_DO, false);
  93. if (i == 0) {
  94. // 数据库中第一页是从开始0*size
  95. // 首页路径index.html
  96. mobilePath = ParserUtil
  97. .buildMobileHtmlPath(column.getColumnPath() + File.separator + ParserUtil.INDEX);
  98. columnListPath = ParserUtil
  99. .buildHtmlPath(column.getColumnPath() + File.separator + ParserUtil.INDEX);
  100. } else {
  101. // 其他路径list-2.html
  102. mobilePath = ParserUtil.buildMobileHtmlPath(
  103. column.getColumnPath() + File.separator + ParserUtil.PAGE_LIST + pageNo);
  104. columnListPath = ParserUtil
  105. .buildHtmlPath(column.getColumnPath() + File.separator + ParserUtil.PAGE_LIST + pageNo);
  106. }
  107. // 设置分页的起始位置
  108. parserParams.put(PAGE_NO, pageNo);
  109. TagParser tag = new TagParser(content,parserParams);
  110. FileUtil.writeString(tag.rendering(), columnListPath, Const.UTF8);
  111. // 判断是手机端生成还是pc端,防止重复生成
  112. if (ObjectUtil.isNotNull(BasicUtil.getApp().getAppMobileStyle())) {
  113. writer = new StringWriter();
  114. mobileTemplate.process(null, writer);
  115. tag = new TagParser(writer.toString(),parserParams);
  116. // 将tag.getContent()写入路径
  117. FileUtil.writeString(tag.rendering(), mobilePath, Const.UTF8);
  118. }
  119. writer = new StringWriter();
  120. pageNo++;
  121. }
  122. } catch (TemplateException e) {
  123. e.printStackTrace();
  124. }
  125. }
  126. /**
  127. * 生成内容
  128. *
  129. * @param articleIdList
  130. * 文章集合
  131. * @return
  132. * @throws IOException
  133. * @throws ParseException
  134. * @throws MalformedTemplateNameException
  135. * @throws TemplateNotFoundException
  136. */
  137. public static void generateBasic(List<ColumnArticleIdBean> articleIdList)
  138. throws TemplateNotFoundException, MalformedTemplateNameException, ParseException, IOException {
  139. Map<Object, Object> contentModelMap = new HashMap<Object, Object>();
  140. ContentModelEntity contentModel = null;
  141. String writePath = null;
  142. // 记录已经生成了文章编号
  143. List<Integer> generateIds = new ArrayList<>();
  144. // 生成文档
  145. for (int ai = 0; ai < articleIdList.size();) {
  146. // 文章编号
  147. int articleId = articleIdList.get(ai).getArticleId();
  148. // 文章的栏目路径
  149. String articleColumnPath = articleIdList.get(ai).getColumnPath();
  150. // 文章的模板路径
  151. String columnUrl = articleIdList.get(ai).getColumnUrl();
  152. // 文章的栏目模型编号
  153. int columnContentModelId = articleIdList.get(ai).getColumnContentModelId();
  154. // 文章是否已经生成了,生成了就跳过
  155. if (generateIds.contains(articleId)) {
  156. ai++;
  157. continue;
  158. }
  159. // 判断文件是否存在,若不存在弹出返回信息
  160. if (!FileUtil.exist(ParserUtil.buildTempletPath(columnUrl))) {
  161. ai++;
  162. continue;
  163. }
  164. // 将
  165. generateIds.add(articleId);
  166. // 组合文章路径如:html/站点id/栏目id/文章id.html
  167. writePath = ParserUtil.buildHtmlPath(articleColumnPath + File.separator + articleId);
  168. //如果是封面就生成index.html
  169. if(articleIdList.get(ai).getColumnType() == ColumnTypeEnum.COLUMN_TYPE_COVER.toInt()) {
  170. writePath = ParserUtil.buildHtmlPath(articleColumnPath + File.separator + ParserUtil.INDEX);
  171. }
  172. Map<String, Object> parserParams = new HashMap<String, Object>();
  173. // 判断当前栏目是否有自定义模型
  174. if (columnContentModelId > 0) {
  175. // 通过当前栏目的模型编号获取,自定义模型表名
  176. if (contentModelMap.containsKey(columnContentModelId)) {
  177. parserParams.put(TABLE_NAME, contentModel.getCmTableName());
  178. } else {
  179. // 通过栏目模型编号获取自定义模型实体
  180. contentModel = (ContentModelEntity) SpringUtil.getBean(IContentModelBiz.class)
  181. .getEntity(columnContentModelId);
  182. // 将自定义模型编号设置为key值
  183. contentModelMap.put(columnContentModelId, contentModel.getCmTableName());
  184. parserParams.put(TABLE_NAME, contentModel.getCmTableName());
  185. }
  186. }
  187. parserParams.put(ID, articleId);
  188. // 第一篇文章没有上一篇
  189. if (ai > 0) {
  190. parserParams.put(PRE_ID, articleIdList.get(ai - 1).getArticleId());
  191. }
  192. // 最后一篇文章没有下一篇
  193. if (ai + 1 < articleIdList.size()) {
  194. parserParams.put(NEXT_ID, articleIdList.get(ai + 1).getArticleId());
  195. }
  196. parserParams.put(IS_DO, false);
  197. String content = CmsParserUtil.generate(articleIdList.get(ai).getColumnUrl(), parserParams, false);
  198. FileUtil.writeString(content, writePath, Const.UTF8);
  199. // 手机端
  200. if (StringUtils.isNotEmpty(BasicUtil.getApp().getAppMobileStyle())) {
  201. writePath = ParserUtil.buildMobileHtmlPath(articleColumnPath + File.separator + articleId);
  202. //如果是封面就生成index.html
  203. if(articleIdList.get(ai).getColumnType() == ColumnTypeEnum.COLUMN_TYPE_COVER.toInt()) {
  204. writePath = ParserUtil.buildMobileHtmlPath(articleColumnPath + File.separator + ParserUtil.INDEX);
  205. }
  206. // 判断文件是否存在,若不存在弹出返回信息
  207. if (!FileUtil.exist(ParserUtil.buildTempletPath(MOBILE + File.separator + columnUrl))) {
  208. ai++;
  209. continue;
  210. }
  211. parserParams.put(MOBILE, BasicUtil.getApp().getAppMobileStyle());
  212. content = CmsParserUtil.generate(articleIdList.get(ai).getColumnUrl(), parserParams, true);
  213. FileUtil.writeString(content, writePath, Const.UTF8);
  214. }
  215. ai++;
  216. }
  217. }
  218. }