diff --git a/src/main/java/net/mingsoft/cms/biz/impl/ContentBizImpl.java b/src/main/java/net/mingsoft/cms/biz/impl/ContentBizImpl.java index ff043074..b91e3d12 100644 --- a/src/main/java/net/mingsoft/cms/biz/impl/ContentBizImpl.java +++ b/src/main/java/net/mingsoft/cms/biz/impl/ContentBizImpl.java @@ -21,20 +21,36 @@ The MIT License (MIT) * Copyright (c) 2019 铭飞科技 package net.mingsoft.cms.biz.impl; -import net.mingsoft.base.biz.impl.BaseBizImpl; -import net.mingsoft.base.dao.IBaseDao; +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.biz.IContentBiz; -import net.mingsoft.cms.dao.IContentDao; +import net.mingsoft.cms.dao.ICategoryDao; +import net.mingsoft.cms.entity.CategoryEntity; import net.mingsoft.cms.entity.ContentEntity; +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.util.List; -import java.util.Map; +import java.io.IOException; +import java.util.*; + +import net.mingsoft.cms.biz.IContentBiz; +import net.mingsoft.cms.dao.IContentDao; /** * 文章管理持久化层 @@ -43,13 +59,22 @@ import java.util.Map; * 历史修订:
*/ @Service("cmscontentBizImpl") -public class ContentBizImpl extends BaseBizImpl implements IContentBiz { +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 protected IBaseDao getDao() { // TODO Auto-generated method stub @@ -58,6 +83,7 @@ public class ContentBizImpl extends BaseBizImpl impl @Override public List queryIdsByCategoryIdForParser(ContentBean contentBean) { + contentBean.setAppId(BasicUtil.getAppId()); return this.contentDao.queryIdsByCategoryIdForParser(contentBean); } @@ -68,4 +94,152 @@ public class ContentBizImpl extends BaseBizImpl impl } return contentDao.getSearchCount(null,null,whereMap, appId,categoryIds); } + + /* + * 任务调度静态化任务 + */ + public void staticizeTask(Integer appId, String tmpFileName, String generateFileName) { + LOG.info("定时静态化任务", new Date()); + try { + //将任务采集传过来的appId导入到线程变量中 + //当前线程使用appId时优先使用此数据 + DataHolder.set(ParserUtil.APP_ID, appId); + //调用三种静态化 + genernateColumn(); + generaterIndex(tmpFileName, generateFileName); + //生成文章日期默认为执行日期的上一天 + generateArticle(DateUtil.format(DateUtil.yesterday(), "yyyy-MM-dd")); + LOG.info("静态化完成", new Date()); + } catch (IOException e) { + LOG.info("静态化失败", new Date()); + e.printStackTrace(); + } + } + + /* + * 生成文章逻辑 + */ + private void generateArticle(String dateTime) throws IOException { + // 网站风格物理路径 + List articleIdList = null; + List categoryList = null; + AttributeBean attributeBean = new AttributeBean(); + ContentBean contentBean = new ContentBean(); + contentBean.setBeginTime(dateTime); + Map 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 columns = new ArrayList<>(); + // 获取所有的内容管理栏目 + CategoryEntity categoryEntity=new CategoryEntity(); + categoryEntity.setAppId(BasicUtil.getAppId()); + columns = categoryDao.query(categoryEntity); + List 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 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; + } + Map map = new HashMap(); + 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, BasicUtil.getAppId()); + String read = ParserUtil.read(templatePath, map); + FileUtil.writeString(read, ParserUtil.buildHtmlPath(targetPath), Const.UTF8); + } + } \ No newline at end of file diff --git a/src/main/java/net/mingsoft/config/WebConfig.java b/src/main/java/net/mingsoft/config/WebConfig.java index c889d46a..0ed9d646 100644 --- a/src/main/java/net/mingsoft/config/WebConfig.java +++ b/src/main/java/net/mingsoft/config/WebConfig.java @@ -1,25 +1,22 @@ package net.mingsoft.config; -import java.io.File; -import java.sql.SQLException; -import java.util.List; -import java.util.concurrent.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator; import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor; import com.baomidou.mybatisplus.extension.toolkit.JdbcUtils; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import net.mingsoft.basic.filter.XSSEscapeFilter; +import net.mingsoft.basic.interceptor.ActionInterceptor; +import net.mingsoft.handler.AppHandler; import net.mingsoft.interceptor.DMInnerInterceptor; import net.mingsoft.interceptor.MysqlInnerInterceptor; -import org.springframework.aop.Advisor; -import net.mingsoft.basic.filter.XSSEscapeFilter; -import org.springframework.aop.support.DefaultPointcutAdvisor; -import org.springframework.aop.support.JdkRegexpMethodPointcut; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; -import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; @@ -27,23 +24,18 @@ import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.web.context.request.RequestContextListener; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import com.alibaba.druid.pool.DruidDataSource; -import com.alibaba.druid.support.http.StatViewServlet; -import com.alibaba.druid.support.http.WebStatFilter; -import com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator; -import com.alibaba.druid.support.spring.stat.DruidStatInterceptor; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; - -import net.mingsoft.basic.interceptor.ActionInterceptor; -import net.mingsoft.basic.util.BasicUtil; - import javax.sql.DataSource; +import java.io.File; +import java.sql.SQLException; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; @Configuration public class WebConfig implements WebMvcConfigurer { @@ -65,11 +57,15 @@ public class WebConfig implements WebMvcConfigurer { public ActionInterceptor actionInterceptor() { return new ActionInterceptor(); } - + @Bean + public AppHandler appHandler() { + return new AppHandler(); + } @Bean public MybatisPlusInterceptor mybatisPlusInterceptor(DataSource dataSource) { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(appHandler())); try { //mysql 添加转换sql DbType dbType = JdbcUtils.getDbType(dataSource.getConnection().getMetaData().getURL()); @@ -84,6 +80,10 @@ public class WebConfig implements WebMvcConfigurer { return interceptor; } + @Bean + public ConfigurationCustomizer configurationCustomizer() { + return configuration -> configuration.setUseDeprecatedExecutor(false); + } /** * 增加对rest api鉴权的spring mvc拦截器 */