Browse Source

静态化任务调度

xierz 5 years ago
parent
commit
be9263c002

+ 169 - 1
src/main/java/net/mingsoft/cms/biz/impl/ContentBizImpl.java

@@ -21,14 +21,31 @@ The MIT License (MIT) * Copyright (c) 2019 铭飞科技
 
 package net.mingsoft.cms.biz.impl;
 
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.bean.copier.CopyOptions;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import net.mingsoft.base.constant.Const;
+import net.mingsoft.basic.holder.DataHolder;
 import net.mingsoft.basic.util.BasicUtil;
 import net.mingsoft.cms.bean.CategoryBean;
 import net.mingsoft.cms.bean.ContentBean;
+import net.mingsoft.cms.dao.ICategoryDao;
+import net.mingsoft.cms.entity.CategoryEntity;
+import net.mingsoft.cms.util.CmsParserUtil;
+import net.mingsoft.mdiy.bean.AttributeBean;
+import net.mingsoft.mdiy.bean.PageBean;
 import net.mingsoft.mdiy.entity.ModelEntity;
+import net.mingsoft.mdiy.util.ParserUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import net.mingsoft.base.biz.impl.BaseBizImpl;
 import net.mingsoft.base.dao.IBaseDao;
+
+import java.io.IOException;
 import java.util.*;
 
 import net.mingsoft.cms.biz.IContentBiz;
@@ -43,9 +60,18 @@ import net.mingsoft.cms.dao.IContentDao;
  @Service("cmscontentBizImpl")
 public class ContentBizImpl extends BaseBizImpl implements IContentBiz {
 
-	
+	/*
+	 * log4j日志记录
+	 */
+	protected final Logger LOG = LoggerFactory.getLogger(this.getClass());
+
 	@Autowired
 	private IContentDao contentDao;
+	/**
+	 * 栏目管理业务层
+	 */
+	@Autowired
+	private ICategoryDao categoryDao;
 	
 	
 	@Override
@@ -67,4 +93,146 @@ public class ContentBizImpl extends BaseBizImpl implements IContentBiz {
 		}
 		return contentDao.getSearchCount(null,null,whereMap, appId,categoryIds);
 	}
+
+	/*
+	 * 任务调度静态化任务
+	 */
+	public void staticizeTask(Integer appId, String tmpFileName, String generateFileName) {
+		Date now = new Date();
+		LOG.info("定时静态化任务", now);
+		//生成栏目,更新所有栏目
+		try {
+			DataHolder.set(ParserUtil.APP_ID, appId);
+			genernateColumn();
+			generaterIndex(tmpFileName, generateFileName);
+			generateArticle(DateUtil.format(now, "yyyy-MM-dd"));
+			LOG.info("静态化完成", new Date());
+		} catch (IOException e) {
+			LOG.info("静态化失败", new Date());
+			e.printStackTrace();
+		}
+	}
+
+	//文章
+	private void generateArticle(String dateTime) throws IOException {
+		// 网站风格物理路径
+		List<CategoryBean> articleIdList = null;
+		List<CategoryEntity> categoryList = null;
+		AttributeBean attributeBean = new AttributeBean();
+		ContentBean contentBean = new ContentBean();
+		contentBean.setBeginTime(dateTime);
+		Map<String, Object> map = new HashMap<>();
+		map.put(ParserUtil.APP_ID, BasicUtil.getAppId());
+		PageBean page = new PageBean();
+		map.put(ParserUtil.HTML, ParserUtil.HTML);
+		map.put(ParserUtil.URL, BasicUtil.getUrl());
+		map.put(ParserUtil.PAGE, page);
+
+		CategoryEntity categoryEntity = new CategoryEntity();
+		categoryList = categoryDao.query(categoryEntity);
+		for(CategoryEntity category : categoryList){
+			contentBean.setContentCategoryId(category.getId());
+			// 分类是列表
+			if(category.getCategoryType().equals("1")){
+				// 判断模板文件是否存在
+				if (!FileUtil.exist(ParserUtil.buildTempletPath(category.getCategoryListUrl())) || StringUtils.isEmpty(category.getCategoryListUrl())) {
+					LOG.error("模板不存在:{}",category.getCategoryUrl());
+					continue;
+				}
+				// 获取文章列表表属性
+				ParserUtil.read(category.getCategoryListUrl(),map, page,attributeBean);
+				contentBean.setFlag(attributeBean.getFlag());
+				contentBean.setNoflag(attributeBean.getNoflag());
+				contentBean.setOrder(attributeBean.getOrder());
+				contentBean.setOrderBy(attributeBean.getOrderby());
+			}
+			articleIdList = queryIdsByCategoryIdForParser(contentBean);
+			// 有符合条件的就更新
+			if (articleIdList.size() > 0) {
+				CmsParserUtil.generateBasic(articleIdList);
+			}
+		}
+	}
+
+	//栏目
+	private void genernateColumn() throws IOException {
+		List<CategoryEntity> columns = new ArrayList<>();
+		// 获取所有的内容管理栏目
+		CategoryEntity categoryEntity=new CategoryEntity();
+		Integer appId = (Integer) DataHolder.get(ParserUtil.APP_ID);
+		categoryEntity.setAppId(appId);
+		columns = categoryDao.query(categoryEntity);
+		List<CategoryBean> articleIdList = null;
+		// 1、设置模板文件夹路径
+		// 获取栏目列表模版
+		for (CategoryEntity column : columns) {
+			ContentBean contentBean = new ContentBean();
+			contentBean.setContentCategoryId(column.getId());
+			// 分类是列表
+			if(column.getCategoryType().equals("1")) {
+				// 判断模板文件是否存在
+				if (!FileUtil.exist(ParserUtil.buildTempletPath(column.getCategoryListUrl()))) {
+					LOG.error("模板不存在:{}", column.getCategoryUrl());
+					continue;
+				}
+				//获取模板中列表标签中的条件
+				Map<String, Object> map = new HashMap<>();
+				map.put(ParserUtil.APP_ID, BasicUtil.getAppId());
+				PageBean page = new PageBean();
+				map.put(ParserUtil.HTML, ParserUtil.HTML);
+				map.put(ParserUtil.URL, BasicUtil.getUrl());
+				map.put(ParserUtil.PAGE, page);
+				AttributeBean attributeBean = new AttributeBean();
+				// 获取文章列表模板标签属性
+				ParserUtil.read(column.getCategoryListUrl(), map, page, attributeBean);
+				contentBean.setFlag(attributeBean.getFlag());
+				contentBean.setNoflag(attributeBean.getNoflag());
+				contentBean.setOrder(attributeBean.getOrder());
+				contentBean.setOrderBy(attributeBean.getOrderby());
+			}
+			articleIdList = contentDao.queryIdsByCategoryIdForParser(contentBean);
+			// 判断列表类型
+			switch (column.getCategoryType()) {
+				//TODO 暂时先用字符串代替
+				case "1": // 列表
+					CmsParserUtil.generateList(column, articleIdList.size());
+					break;
+				case "2":// 单页
+					if(articleIdList.size()==0){
+						CategoryBean columnArticleIdBean=new CategoryBean();
+						CopyOptions copyOptions=CopyOptions.create();
+						copyOptions.setIgnoreError(true);
+						BeanUtil.copyProperties(column,columnArticleIdBean,copyOptions);
+						articleIdList.add(columnArticleIdBean);
+					}
+					CmsParserUtil.generateBasic(articleIdList);
+					break;
+			}
+		}
+	}
+
+	//主页
+	private void generaterIndex(String templatePath, String targetPath) throws IOException {
+		if (!FileUtil.exist(ParserUtil.buildTempletPath())) {
+			LOG.info("模板文件不存在");
+			return;
+		}
+		Integer appId = (Integer) DataHolder.get(ParserUtil.APP_ID);
+		Map<String, Object> map = new HashMap<String, Object>();
+		map.put(ParserUtil.IS_DO, false);
+		CategoryEntity column = new CategoryEntity();
+		//内容管理栏目编码
+		map.put(ParserUtil.COLUMN, column);
+		//如果单站点,就废弃站点地址
+		if (ParserUtil.IS_SINGLE) {
+			map.put(ParserUtil.URL, BasicUtil.getUrl());
+		}
+		//设置生成的路径
+		map.put(ParserUtil.HTML, ParserUtil.HTML);
+		//设置站点编号
+		map.put(ParserUtil.APP_ID, appId);
+		String read = ParserUtil.read(templatePath, map);
+		FileUtil.writeString(read, ParserUtil.buildHtmlPath(targetPath), Const.UTF8);
+	}
+
 }

+ 3 - 0
src/main/java/net/mingsoft/cms/util/CmsParserUtil.java

@@ -7,6 +7,7 @@ import freemarker.core.ParseException;
 import freemarker.template.MalformedTemplateNameException;
 import freemarker.template.TemplateNotFoundException;
 import net.mingsoft.base.constant.Const;
+import net.mingsoft.basic.holder.DataHolder;
 import net.mingsoft.basic.util.BasicUtil;
 import net.mingsoft.basic.util.SpringUtil;
 import net.mingsoft.cms.bean.CategoryBean;
@@ -244,10 +245,12 @@ public class CmsParserUtil extends ParserUtil {
 			HashMap<Object, Object> cloneMap = CollUtil.newHashMap();
 			cloneMap.putAll(parserParams);
             HttpServletRequest request = SpringUtil.getRequest();
+            Integer appId = (Integer) DataHolder.get("appId");
             pool.execute(() -> {
 				String content = null;
 				try {
 					SpringUtil.setRequest(request);
+					DataHolder.set("appId", appId);
 					content = CmsParserUtil.generate(columnUrl, cloneMap);
 					FileUtil.writeString(content, finalWritePath, Const.UTF8);
 				} catch (IOException e) {