CmsParserUtil.java 9.5 KB

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