5.2.9 预发布版本

master
zhouyk 3 years ago
parent 38816bf61b
commit eebc37811e
  1. 1
      README.md
  2. 18
      pom.xml
  3. 1
      src/main/java/net/mingsoft/MSApplication.java
  4. 10
      src/main/java/net/mingsoft/cms/action/CategoryAction.java
  5. 17
      src/main/java/net/mingsoft/cms/action/ContentAction.java
  6. 4
      src/main/java/net/mingsoft/cms/action/GeneraterAction.java
  7. 25
      src/main/java/net/mingsoft/cms/action/web/MCmsAction.java
  8. 77
      src/main/java/net/mingsoft/cms/aop/CategoryAop.java
  9. 20
      src/main/java/net/mingsoft/cms/biz/IContentBiz.java
  10. 43
      src/main/java/net/mingsoft/cms/biz/impl/ContentBizImpl.java
  11. 9
      src/main/java/net/mingsoft/cms/constant/e/CategoryTypeEnum.java
  12. 10
      src/main/java/net/mingsoft/cms/dao/ICategoryDao.xml
  13. 16
      src/main/java/net/mingsoft/cms/dao/IContentDao.java
  14. 100
      src/main/java/net/mingsoft/cms/dao/IContentDao.xml
  15. 42
      src/main/java/net/mingsoft/cms/entity/CategoryEntity.java
  16. 13
      src/main/java/net/mingsoft/cms/util/CmsParserUtil.java
  17. 27
      src/main/java/net/mingsoft/config/WebConfig.java
  18. 41
      src/main/resources/application.yml

@ -143,6 +143,7 @@ git clone https://gitee.com/mingSoft/MCMS.git<br/>
# 文档 # 文档
* 使用手册 http://doc.mingsoft.net/mcms/ * 使用手册 http://doc.mingsoft.net/mcms/
* 插件手册 http://doc.mingsoft.net/plugs-cms/
# 关于版本说明 [更多版本查看](https://www.mingsoft.net/html/default/cms/banben/index.html) # 关于版本说明 [更多版本查看](https://www.mingsoft.net/html/default/cms/banben/index.html)
1. 开源版本永久免费发布源代码,开发者、企业可以终身免费使用,每个月团队会收集开源系统的问题并在每月的28号进行更新; 1. 开源版本永久免费发布源代码,开发者、企业可以终身免费使用,每个月团队会收集开源系统的问题并在每月的28号进行更新;

@ -10,14 +10,14 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>net.mingsoft</groupId> <groupId>net.mingsoft</groupId>
<artifactId>ms-mcms</artifactId> <artifactId>ms-mcms</artifactId>
<version>5.2.8</version> <version>5.2.9</version>
<name>${project.groupId}:${project.artifactId}</name> <name>${project.groupId}:${project.artifactId}</name>
<!-- 打包war包,注意不启用(resources》resource》excludes的配置并注释掉maven-assembly-plugin 插件配置 --> <!-- 打包war包,注意不启用(resources》resource》excludes的配置并注释掉maven-assembly-plugin 插件配置 -->
<!--<packaging>war</packaging>--> <!--<packaging>war</packaging>-->
<properties> <properties>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<log4j.version>2.17.0</log4j.version> <log4j.version>2.18.0</log4j.version>
</properties> </properties>
<repositories> <repositories>
<repository> <repository>
@ -44,26 +44,30 @@
<dependency> <dependency>
<groupId>net.mingsoft</groupId> <groupId>net.mingsoft</groupId>
<artifactId>ms-base</artifactId> <artifactId>ms-base</artifactId>
<version>2.1.13</version> <version>2.1.14</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.mingsoft</groupId> <groupId>net.mingsoft</groupId>
<artifactId>ms-basic</artifactId> <artifactId>ms-basic</artifactId>
<version>2.1.13.4</version> <version>2.1.14</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>net.mingsoft</groupId> <groupId>net.mingsoft</groupId>
<artifactId>ms-mdiy</artifactId> <artifactId>ms-mdiy</artifactId>
<version>2.1.13.1</version> <version>2.1.14</version>
</dependency> </dependency>
<!--store入口依赖(源码不开发),如果不需要MStore可以直接去掉依赖--> <!--store入口依赖(源码不开发),如果不需要MStore可以直接去掉依赖-->
<dependency> <dependency>
<groupId>net.mingsoft</groupId> <groupId>net.mingsoft</groupId>
<artifactId>store-client</artifactId> <artifactId>store-client</artifactId>
<version>2.1.13</version> <version>2.1.14</version>
</dependency>
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>6.2.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.logging.log4j</groupId> <groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId> <artifactId>log4j-core</artifactId>

@ -32,7 +32,6 @@ import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.Locale; import java.util.Locale;
@SpringBootApplication(scanBasePackages = {"net.mingsoft"}) @SpringBootApplication(scanBasePackages = {"net.mingsoft"})
@MapperScan(basePackages={"**.dao","com.baomidou.**.mapper"}) @MapperScan(basePackages={"**.dao","com.baomidou.**.mapper"})
@ServletComponentScan(basePackages = {"net.mingsoft"}) @ServletComponentScan(basePackages = {"net.mingsoft"})

@ -151,6 +151,10 @@ public class CategoryAction extends BaseAction {
@LogAnn(title = "保存分类", businessType = BusinessTypeEnum.INSERT) @LogAnn(title = "保存分类", businessType = BusinessTypeEnum.INSERT)
@RequiresPermissions("cms:category:save") @RequiresPermissions("cms:category:save")
public ResultData save(@ModelAttribute @ApiIgnore CategoryEntity category) { public ResultData save(@ModelAttribute @ApiIgnore CategoryEntity category) {
//验证缩略图参数值是否合法
if (!category.getCategoryImg().matches("^\\[.{1,}]$") || category.getCategoryImg()==null){
category.setCategoryImg("");
}
//验证栏目管理名称的值是否合法 //验证栏目管理名称的值是否合法
if(StringUtil.isBlank(category.getCategoryTitle())){ if(StringUtil.isBlank(category.getCategoryTitle())){
return ResultData.build().error(getResString("err.empty", this.getResString("category.title"))); return ResultData.build().error(getResString("err.empty", this.getResString("category.title")));
@ -229,6 +233,10 @@ public class CategoryAction extends BaseAction {
@LogAnn(title = "更新分类", businessType = BusinessTypeEnum.UPDATE) @LogAnn(title = "更新分类", businessType = BusinessTypeEnum.UPDATE)
@RequiresPermissions("cms:category:update") @RequiresPermissions("cms:category:update")
public ResultData update(@ModelAttribute @ApiIgnore CategoryEntity category) { public ResultData update(@ModelAttribute @ApiIgnore CategoryEntity category) {
//验证缩略图参数值是否合法
if (!category.getCategoryImg().matches("^\\[.{1,}]$") || category.getCategoryImg()==null){
category.setCategoryImg("");
}
//验证栏目管理名称的值是否合法 //验证栏目管理名称的值是否合法
if(StringUtil.isBlank(category.getCategoryTitle())){ if(StringUtil.isBlank(category.getCategoryTitle())){
return ResultData.build().error(getResString("err.empty", this.getResString("category.title"))); return ResultData.build().error(getResString("err.empty", this.getResString("category.title")));
@ -298,7 +306,7 @@ public class CategoryAction extends BaseAction {
@GetMapping("/verifyPingYin") @GetMapping("/verifyPingYin")
@ResponseBody @ResponseBody
public ResultData verifyPingYin(@ModelAttribute @ApiIgnore CategoryEntity category){ public ResultData verifyPingYin(@ModelAttribute @ApiIgnore CategoryEntity category){
int count = categoryBiz.count(Wrappers.<CategoryEntity>lambdaQuery() long count = categoryBiz.count(Wrappers.<CategoryEntity>lambdaQuery()
.ne(StrUtil.isNotBlank(category.getId()), CategoryEntity::getId, category.getId()) .ne(StrUtil.isNotBlank(category.getId()), CategoryEntity::getId, category.getId())
.eq(CategoryEntity::getCategoryPinyin, category.getCategoryPinyin())); .eq(CategoryEntity::getCategoryPinyin, category.getCategoryPinyin()));

@ -31,7 +31,7 @@ import net.mingsoft.basic.annotation.LogAnn;
import net.mingsoft.basic.bean.EUListBean; import net.mingsoft.basic.bean.EUListBean;
import net.mingsoft.basic.constant.e.BusinessTypeEnum; import net.mingsoft.basic.constant.e.BusinessTypeEnum;
import net.mingsoft.basic.util.BasicUtil; import net.mingsoft.basic.util.BasicUtil;
import net.mingsoft.basic.util.SqlInjectionUtil; import net.mingsoft.base.util.SqlInjectionUtil;
import net.mingsoft.basic.util.StringUtil; import net.mingsoft.basic.util.StringUtil;
import net.mingsoft.cms.bean.ContentBean; import net.mingsoft.cms.bean.ContentBean;
import net.mingsoft.cms.biz.ICategoryBiz; import net.mingsoft.cms.biz.ICategoryBiz;
@ -40,6 +40,7 @@ import net.mingsoft.cms.entity.CategoryEntity;
import net.mingsoft.cms.entity.ContentEntity; import net.mingsoft.cms.entity.ContentEntity;
import net.mingsoft.mdiy.biz.IModelBiz; import net.mingsoft.mdiy.biz.IModelBiz;
import net.mingsoft.mdiy.entity.ModelEntity; import net.mingsoft.mdiy.entity.ModelEntity;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions; import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
@ -85,6 +86,7 @@ public class ContentAction extends BaseAction {
/** /**
* 返回主界面index * 返回主界面index
*/ */
@ApiIgnore
@GetMapping("/index") @GetMapping("/index")
public String index(){ public String index(){
return "/cms/content/index"; return "/cms/content/index";
@ -93,6 +95,7 @@ public class ContentAction extends BaseAction {
/** /**
* 返回主界面main * 返回主界面main
*/ */
@ApiIgnore
@GetMapping("/main") @GetMapping("/main")
public String main(){ public String main(){
return "/cms/content/main"; return "/cms/content/main";
@ -119,7 +122,7 @@ public class ContentAction extends BaseAction {
// 检查SQL注入 // 检查SQL注入
SqlInjectionUtil.filterContent(content.getCategoryId()); SqlInjectionUtil.filterContent(content.getCategoryId());
BasicUtil.startPage(); BasicUtil.startPage();
List contentList = contentBiz.query(content); List contentList = contentBiz.queryContent(content);
return ResultData.build().success(new EUListBean(contentList,(int) BasicUtil.endPage(contentList).getTotal())); return ResultData.build().success(new EUListBean(contentList,(int) BasicUtil.endPage(contentList).getTotal()));
} }
@ -195,6 +198,10 @@ public class ContentAction extends BaseAction {
@LogAnn(title = "保存文章", businessType = BusinessTypeEnum.INSERT) @LogAnn(title = "保存文章", businessType = BusinessTypeEnum.INSERT)
@RequiresPermissions("cms:content:save") @RequiresPermissions("cms:content:save")
public ResultData save(@ModelAttribute @ApiIgnore ContentEntity content) { public ResultData save(@ModelAttribute @ApiIgnore ContentEntity content) {
//验证缩略图参数值是否合法
if (content.getContentImg()==null || !content.getContentImg().matches("^\\[.{1,}]$")){
content.setContentImg("");
}
//验证文章标题的值是否合法 //验证文章标题的值是否合法
if(StringUtil.isBlank(content.getContentTitle())){ if(StringUtil.isBlank(content.getContentTitle())){
return ResultData.build().error(getResString("err.empty", this.getResString("content.title"))); return ResultData.build().error(getResString("err.empty", this.getResString("content.title")));
@ -238,7 +245,7 @@ public class ContentAction extends BaseAction {
//获取栏目实体 //获取栏目实体
CategoryEntity categoryEntity = categoryBiz.getById(contents.get(i).getCategoryId()); CategoryEntity categoryEntity = categoryBiz.getById(contents.get(i).getCategoryId());
//如果栏目绑定的模型ID为空 //如果栏目绑定的模型ID为空
if (categoryEntity.getMdiyModelId() == null){ if (StringUtils.isBlank(categoryEntity.getMdiyModelId())){
continue; continue;
} }
//获取到配置模型实体 //获取到配置模型实体
@ -279,6 +286,10 @@ public class ContentAction extends BaseAction {
@LogAnn(title = "更新文章", businessType = BusinessTypeEnum.UPDATE) @LogAnn(title = "更新文章", businessType = BusinessTypeEnum.UPDATE)
@RequiresPermissions("cms:content:update") @RequiresPermissions("cms:content:update")
public ResultData update(@ModelAttribute @ApiIgnore ContentEntity content) { public ResultData update(@ModelAttribute @ApiIgnore ContentEntity content) {
//验证缩略图参数值是否合法
if (content.getContentImg()==null || !content.getContentImg().matches("^\\[.{1,}]$")){
content.setContentImg("");
}
//验证文章标题的值是否合法 //验证文章标题的值是否合法
if(StringUtil.isBlank(content.getContentTitle())){ if(StringUtil.isBlank(content.getContentTitle())){
return ResultData.build().error(getResString("err.empty", this.getResString("content.title"))); return ResultData.build().error(getResString("err.empty", this.getResString("content.title")));

@ -99,7 +99,7 @@ public class GeneraterAction extends BaseAction {
@Value("${ms.manager.path}") @Value("${ms.manager.path}")
private String managerPath; private String managerPath;
@Value("${ms.html-dir:html}") @Value("${ms.diy.html-dir:html}")
private String htmlDir; private String htmlDir;
/** /**
@ -251,7 +251,7 @@ public class GeneraterAction extends BaseAction {
contentBean.setCategoryId(category.getId()); contentBean.setCategoryId(category.getId());
contentBean.setCategoryType(category.getCategoryType()); contentBean.setCategoryType(category.getCategoryType());
//将文章列表标签中的中的参数 //将文章列表标签中的中的参数
articleIdList = contentBiz.queryIdsByCategoryIdForParser(contentBean); articleIdList = contentBiz.queryIdsByCategoryIdForParserAndNotCover(contentBean);
// 分类是列表 // 分类是列表
if (category.getCategoryType().equals(CategoryTypeEnum.LIST.toString())) { if (category.getCategoryType().equals(CategoryTypeEnum.LIST.toString())) {
// 判断模板文件是否存在 // 判断模板文件是否存在

@ -19,9 +19,6 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/ */
package net.mingsoft.cms.action.web; package net.mingsoft.cms.action.web;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
@ -31,24 +28,19 @@ import freemarker.core.ParseException;
import freemarker.template.MalformedTemplateNameException; import freemarker.template.MalformedTemplateNameException;
import freemarker.template.TemplateNotFoundException; import freemarker.template.TemplateNotFoundException;
import net.mingsoft.base.constant.Const; import net.mingsoft.base.constant.Const;
import net.mingsoft.basic.exception.BusinessException;
import net.mingsoft.basic.util.BasicUtil; import net.mingsoft.basic.util.BasicUtil;
import net.mingsoft.cms.bean.CategoryBean;
import net.mingsoft.cms.bean.ContentBean;
import net.mingsoft.cms.biz.ICategoryBiz; import net.mingsoft.cms.biz.ICategoryBiz;
import net.mingsoft.cms.biz.IContentBiz; import net.mingsoft.cms.biz.IContentBiz;
import net.mingsoft.cms.entity.CategoryEntity; import net.mingsoft.cms.entity.CategoryEntity;
import net.mingsoft.cms.entity.ContentEntity;
import net.mingsoft.mdiy.bean.PageBean; import net.mingsoft.mdiy.bean.PageBean;
import net.mingsoft.mdiy.biz.IModelBiz; import net.mingsoft.mdiy.biz.IModelBiz;
import net.mingsoft.mdiy.biz.IPageBiz;
import net.mingsoft.mdiy.entity.ModelEntity; import net.mingsoft.mdiy.entity.ModelEntity;
import net.mingsoft.mdiy.util.ParserUtil; import net.mingsoft.mdiy.util.ParserUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseBody;
@ -75,12 +67,6 @@ import java.util.Map;
@RequestMapping("/mcms") @RequestMapping("/mcms")
public class MCmsAction extends net.mingsoft.cms.action.BaseAction { public class MCmsAction extends net.mingsoft.cms.action.BaseAction {
/**
* 自定义页面业务层
*/
@Autowired
private IPageBiz pageBiz;
/** /**
* 文章管理业务处理层 * 文章管理业务处理层
*/ */
@ -101,19 +87,16 @@ public class MCmsAction extends net.mingsoft.cms.action.BaseAction {
private IModelBiz modelBiz; private IModelBiz modelBiz;
@Value("${ms.html-dir:html}") @Value("${ms.diy.html-dir:html}")
private String htmlDir; private String htmlDir;
/** /**
* 实现前端页面的文章搜索 * 实现前端页面的文章搜索
* *
* @param request 搜索id * @param request 搜索id
* @param response * @param response
*/ */
@RequestMapping(value = "search",method = {RequestMethod.GET, RequestMethod.POST}) @RequestMapping(value = "search",method = {RequestMethod.GET, RequestMethod.POST},produces= MediaType.TEXT_HTML_VALUE+";charset=utf-8")
@ResponseBody @ResponseBody
public String search(HttpServletRequest request, HttpServletResponse response) { public String search(HttpServletRequest request, HttpServletResponse response) {
String search = BasicUtil.getString("tmpl", "search.htm"); String search = BasicUtil.getString("tmpl", "search.htm");
@ -178,7 +161,7 @@ public class MCmsAction extends net.mingsoft.cms.action.BaseAction {
column = (CategoryEntity) categoryBiz.getById(typeId); column = (CategoryEntity) categoryBiz.getById(typeId);
// 获取表单类型的id // 获取表单类型的id
if (column != null && ObjectUtil.isNotNull(column.getMdiyModelId())) { if (column != null && ObjectUtil.isNotNull(column.getMdiyModelId())) {
contentModel = (ModelEntity) modelBiz.getEntity(column.getMdiyModelId()); contentModel = (ModelEntity) modelBiz.getById(column.getMdiyModelId());
if (contentModel != null) { if (contentModel != null) {
// 保存自定义模型的数据 // 保存自定义模型的数据
Map<String, String> fieldMap = contentModel.getFieldMap(); Map<String, String> fieldMap = contentModel.getFieldMap();

@ -7,14 +7,22 @@
package net.mingsoft.cms.aop; package net.mingsoft.cms.aop;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import net.mingsoft.base.entity.ResultData;
import net.mingsoft.basic.exception.BusinessException;
import net.mingsoft.basic.util.BasicUtil; import net.mingsoft.basic.util.BasicUtil;
import net.mingsoft.cms.constant.e.CategoryTypeEnum;
import net.mingsoft.cms.dao.ICategoryDao;
import net.mingsoft.cms.dao.IContentDao;
import net.mingsoft.cms.entity.CategoryEntity; import net.mingsoft.cms.entity.CategoryEntity;
import net.mingsoft.mdiy.biz.IDictBiz; import net.mingsoft.cms.entity.ContentEntity;
import net.mingsoft.mdiy.entity.DictEntity;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -23,7 +31,6 @@ import org.springframework.stereotype.Component;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
@ -38,11 +45,73 @@ public class CategoryAop extends net.mingsoft.basic.aop.BaseAop {
@Value("${ms.diy.html-dir:html}") @Value("${ms.diy.html-dir:html}")
private String htmlDir; private String htmlDir;
@Autowired
private ICategoryDao categoryDao;
@Autowired
private IContentDao contentDao;
@Pointcut("execution(* net.mingsoft.cms.action.CategoryAction.delete(..)) ") @Pointcut("execution(* net.mingsoft.cms.action.CategoryAction.delete(..)) ")
public void delete() { public void delete() {
} }
/**
* 栏目保存接口切面
*/
@Pointcut("execution(* net.mingsoft.cms.action.CategoryAction.save(..)) ")
public void save() {}
/**
* 栏目更新接口切面
*/
@Pointcut("execution(* net.mingsoft.cms.action.CategoryAction.update(..)) ")
public void update() {}
@Around("save() || update()")
public ResultData move(ProceedingJoinPoint pjp) throws Throwable {
CategoryEntity category = getType(pjp, CategoryEntity.class);
if (category == null) {
throw new BusinessException("栏目不存在!");
}
// 获取返回值
Object obj = pjp.proceed(pjp.getArgs());
ResultData resultData = JSONObject.parseObject(JSONObject.toJSON(obj).toString(), ResultData.class);
CategoryEntity parent = categoryDao.selectById(category.getCategoryId());
if (parent == null) {
return resultData;
}
// 用于判断父级栏目之前是否是子栏目
// 只有父节点之前为子节点 && 父栏目类型为列表 && 子栏目为列表
boolean flag = parent.getLeaf() && StringUtils.equals(parent.getCategoryType(), CategoryTypeEnum.LIST.toString());
if (flag) {
// 将父栏目的内容模板清空
parent.setCategoryUrl("");
categoryDao.updateById(parent);
CategoryEntity returnCategory = JSONObject.parseObject(resultData.get(ResultData.DATA_KEY).toString(), CategoryEntity.class);
// 获取父栏目ID集合
String categoryIds = StringUtils.isEmpty(parent.getCategoryParentIds())
? returnCategory.getId() : parent.getCategoryParentIds() + "," + returnCategory.getId();
if (!StringUtils.equals(returnCategory.getCategoryType(), CategoryTypeEnum.LIST.toString())) {
// 如果子栏目不为列表,将直接删除父栏目下的文章
LambdaUpdateWrapper<ContentEntity> contentDeleteWrapper = new UpdateWrapper<ContentEntity>().lambda();
contentDeleteWrapper.eq(ContentEntity::getCategoryId, parent.getId());
contentDao.delete(contentDeleteWrapper);
}
// 将父栏目下的文章移动到子栏目下
LambdaUpdateWrapper<ContentEntity> contentWrapper = new UpdateWrapper<ContentEntity>().lambda();
contentWrapper.set(ContentEntity::getCategoryId, returnCategory.getId());
contentWrapper.eq(ContentEntity::getCategoryId, parent.getId());
contentDao.update(new ContentEntity(), contentWrapper);
return resultData;
}
return resultData;
}
/** /**
* 删除栏目后并删除文章对应的静态化文件 * 删除栏目后并删除文章对应的静态化文件
* *

@ -40,12 +40,32 @@ import java.util.Map;
*/ */
public interface IContentBiz extends IBaseBiz<ContentEntity> { public interface IContentBiz extends IBaseBiz<ContentEntity> {
/** /**
* 根据文章属性查询 * 根据文章属性查询
* @param contentBean * @param contentBean
* @return * @return
*/ */
List<CategoryBean> queryIdsByCategoryIdForParser(ContentBean contentBean); List<CategoryBean> queryIdsByCategoryIdForParser(ContentBean contentBean);
/**
* 查询文章,不包括单篇
* @param contentBean
* @return
*/
List<CategoryBean> queryContent(ContentBean contentBean);
int getSearchCount(ModelEntity contentModel, List diyList, Map whereMap, int appId, String categoryIds); int getSearchCount(ModelEntity contentModel, List diyList, Map whereMap, int appId, String categoryIds);
/**
* 根据文章属性查询,不包括单篇
* @param contentBean
* @return
*/
List<CategoryBean> queryIdsByCategoryIdForParserAndNotCover(ContentBean contentBean);
/**
* 根据解析标签arclist的sql获取list
* @return
*/
List list(Map map);
} }

@ -24,6 +24,8 @@
package net.mingsoft.cms.biz.impl; package net.mingsoft.cms.biz.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import freemarker.template.TemplateException;
import net.mingsoft.base.biz.impl.BaseBizImpl; import net.mingsoft.base.biz.impl.BaseBizImpl;
import net.mingsoft.base.dao.IBaseDao; import net.mingsoft.base.dao.IBaseDao;
import net.mingsoft.cms.bean.CategoryBean; import net.mingsoft.cms.bean.CategoryBean;
@ -32,13 +34,16 @@ import net.mingsoft.cms.biz.IContentBiz;
import net.mingsoft.cms.dao.ICategoryDao; import net.mingsoft.cms.dao.ICategoryDao;
import net.mingsoft.cms.dao.IContentDao; import net.mingsoft.cms.dao.IContentDao;
import net.mingsoft.cms.entity.ContentEntity; import net.mingsoft.cms.entity.ContentEntity;
import net.mingsoft.mdiy.biz.ITagBiz;
import net.mingsoft.mdiy.entity.ModelEntity; import net.mingsoft.mdiy.entity.ModelEntity;
import net.mingsoft.mdiy.entity.TagEntity;
import net.mingsoft.mdiy.util.ParserUtil;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -64,9 +69,9 @@ public class ContentBizImpl extends BaseBizImpl<IContentDao, ContentEntity> imp
@Autowired @Autowired
private ICategoryDao categoryDao; private ICategoryDao categoryDao;
@Value("${ms.html-dir:html}")
private String htmlDir;
@Autowired
private ITagBiz tagBiz;
@Override @Override
protected IBaseDao getDao() { protected IBaseDao getDao() {
@ -74,11 +79,18 @@ public class ContentBizImpl extends BaseBizImpl<IContentDao, ContentEntity> imp
return contentDao; return contentDao;
} }
@Override @Override
public List<CategoryBean> queryIdsByCategoryIdForParser(ContentBean contentBean) { public List<CategoryBean> queryIdsByCategoryIdForParser(ContentBean contentBean) {
return this.contentDao.queryIdsByCategoryIdForParser(contentBean); return this.contentDao.queryIdsByCategoryIdForParser(contentBean);
} }
@Override
public List<CategoryBean> queryContent(ContentBean contentBean) {
return this.contentDao.queryContent(contentBean);
}
@Override @Override
public int getSearchCount(ModelEntity contentModel, List diyList, Map whereMap, int appId, String categoryIds) { public int getSearchCount(ModelEntity contentModel, List diyList, Map whereMap, int appId, String categoryIds) {
if (contentModel!=null) { if (contentModel!=null) {
@ -87,5 +99,30 @@ public class ContentBizImpl extends BaseBizImpl<IContentDao, ContentEntity> imp
return contentDao.getSearchCount(null,null,whereMap, appId,categoryIds); return contentDao.getSearchCount(null,null,whereMap, appId,categoryIds);
} }
@Override
public List<CategoryBean> queryIdsByCategoryIdForParserAndNotCover(ContentBean contentBean) {
return this.contentDao.queryIdsByCategoryIdForParser(contentBean);
}
@Override
public List list(Map map ) {
//通过tagSqlBiz获取arclist对应的sql
QueryWrapper<TagEntity> tagWrapper = new QueryWrapper<>();
tagWrapper.eq("tag_name", "arclist");
TagEntity tagEntity = tagBiz.getOne(tagWrapper);
String sqlFtl = tagEntity.getTagSql();
List<ContentEntity> contentEntities = null;
//通过ParserUtil
try {
String sql = ParserUtil.rendering(map,sqlFtl);
//执行原生的sql
contentEntities = (List<ContentEntity>) tagBiz.excuteSql(sql);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
return contentEntities;
}
} }

@ -43,7 +43,12 @@ public enum CategoryTypeEnum implements BaseEnum {
/** /**
* 链接 * 链接
*/ */
LINK("3"); LINK("3"),
/**
* 未知类型
*/
UN_KNOW("0");
CategoryTypeEnum(String type) { CategoryTypeEnum(String type) {
@ -58,7 +63,7 @@ public enum CategoryTypeEnum implements BaseEnum {
return e; return e;
} }
} }
return null; return CategoryTypeEnum.UN_KNOW;
} }
@Override @Override

@ -40,6 +40,7 @@
<if test="leaf != null">leaf=#{leaf},</if> <if test="leaf != null">leaf=#{leaf},</if>
category_id=#{categoryId}, category_id=#{categoryId},
category_parent_ids=#{categoryParentIds}, category_parent_ids=#{categoryParentIds},
mdiy_model_id=#{mdiyModelId},
<if test="categoryType != null and categoryType != ''">category_type=#{categoryType},</if> <if test="categoryType != null and categoryType != ''">category_type=#{categoryType},</if>
<if test="categorySort != null">category_sort=#{categorySort},</if> <if test="categorySort != null">category_sort=#{categorySort},</if>
category_list_url=#{categoryListUrl}, category_list_url=#{categoryListUrl},
@ -48,7 +49,6 @@
<if test="categoryDescrip != null ">category_descrip=#{categoryDescrip},</if> <if test="categoryDescrip != null ">category_descrip=#{categoryDescrip},</if>
<if test="categoryImg != null and categoryImg != ''">category_img=#{categoryImg},</if> <if test="categoryImg != null and categoryImg != ''">category_img=#{categoryImg},</if>
<if test="categoryDiyUrl != null">category_diy_url=#{categoryDiyUrl},</if> <if test="categoryDiyUrl != null">category_diy_url=#{categoryDiyUrl},</if>
<if test="mdiyModelId != null and mdiyModelId != ''">mdiy_model_id=#{mdiyModelId},</if>
<if test="dictId != null">dict_id=#{dictId},</if> <if test="dictId != null">dict_id=#{dictId},</if>
<if test="categoryFlag != null ">category_flag=#{categoryFlag},</if> <if test="categoryFlag != null ">category_flag=#{categoryFlag},</if>
<if test="categoryPath != null and categoryPath != ''">category_path=#{categoryPath},</if> <if test="categoryPath != null and categoryPath != ''">category_path=#{categoryPath},</if>
@ -98,18 +98,20 @@
<!-- 模糊查询开始 --> <!-- 模糊查询开始 -->
<select id="queryChildren" resultMap="resultMap"> <select id="queryChildren" resultMap="resultMap">
select * from cms_category select *,
( SELECT count(*) FROM cms_category cc WHERE cc.category_id = cms_category.id AND cc.del = 0 ) AS childsize from cms_category
<where> <where>
del=0
<if test="dictId &gt; 0"> <if test="dictId &gt; 0">
and dict_id=#{dictId} and dict_id=#{dictId}
</if> </if>
<if test="id != null and id != ''">
and and
( (
find_in_set(#{id},CATEGORY_PARENT_IDS)>0 find_in_set(#{id},CATEGORY_PARENT_IDS)>0
or id=#{id} or id=#{id}
) )
and del=0 </if>
</where> </where>
</select> </select>

@ -39,6 +39,8 @@ import java.util.Map;
*/ */
public interface IContentDao extends IBaseDao<ContentEntity> { public interface IContentDao extends IBaseDao<ContentEntity> {
/** /**
* 查询文章编号集合 * 查询文章编号集合
* @contentBean * @contentBean
@ -46,6 +48,20 @@ public interface IContentDao extends IBaseDao<ContentEntity> {
*/ */
public List<CategoryBean> queryIdsByCategoryIdForParser(ContentBean contentBean); public List<CategoryBean> queryIdsByCategoryIdForParser(ContentBean contentBean);
/**
* 查询文章编号集合,不包括单篇
* @contentBean
* @return
*/
public List<CategoryBean> queryIdsByCategoryIdForParserAndNotCover(ContentBean contentBean);
/**
* 查询文章,不包括单篇
* @contentBean
* @return
*/
public List<CategoryBean> queryContent(ContentBean contentBean);
/** /**
* 根据查询文章实体总数 * 根据查询文章实体总数
* *

@ -207,6 +207,45 @@
<select id="queryAll" resultMap="resultMap"> <select id="queryAll" resultMap="resultMap">
select * from cms_content where del=0 order by id desc select * from cms_content where del=0 order by id desc
</select> </select>
<!-- 查询文章,不包括单篇 -->
<select id="queryContent" resultMap="resultContentMap">
<!--,CONCAT('/html/',ct.app_id,category_path,'/',ct.id,'.html') AS static_url-->
select ct.* from (
select ct.*,cc.category_path from cms_content ct
join cms_category cc on ct.category_id=cc.id
<where>
ct.del=0
<if test="contentTitle != null and contentTitle != ''"> and content_title like CONCAT(CONCAT('%',#{contentTitle}),'%')</if>
<if test="categoryId != null and categoryId != ''"> and (ct.category_id=#{categoryId} or ct.category_id in
(select id FROM cms_category where find_in_set(#{categoryId},CATEGORY_PARENT_IDS)>0 and cms_category.category_type != 2))</if>
<if test="contentType != null and contentType != ''">
and
<foreach item="item" index="index" collection="contentType.split(',')" open="(" separator="or"
close=")">
FIND_IN_SET(#{item},ct.content_type)>0
</foreach>
</if>
<if test="contentDisplay != null and contentDisplay != ''"> and content_display=#{contentDisplay}</if>
<if test="contentAuthor != null and contentAuthor != ''"> and content_author=#{contentAuthor}</if>
<if test="contentSource != null and contentSource != ''"> and content_source=#{contentSource}</if>
<if test="contentDatetime != null"> and content_datetime=#{contentDatetime} </if>
<if test="contentSort != null"> and content_sort=#{contentSort} </if>
<if test="contentImg != null and contentImg != ''"> and content_img=#{contentImg}</if>
<if test="contentDescription != null and contentDescription != ''"> and content_description=#{contentDescription}</if>
<if test="contentKeyword != null and contentKeyword != ''"> and content_keyword=#{contentKeyword}</if>
<if test="contentDetails != null and contentDetails != ''"> and content_details=#{contentDetails}</if>
<if test="contentUrl != null and contentUrl != ''"> and content_url=#{contentUrl}</if>
<if test="contentHit != null"> and content_hit=#{contentHit}</if>
<if test="createBy &gt; 0"> and ct.create_by=#{createBy} </if>
<if test="createDate != null"> and ct.create_date=#{createDate} </if>
<if test="updateBy &gt; 0"> and ct.update_by=#{updateBy} </if>
<if test="updateDate != null"> and update_date=#{updateDate} </if>
<include refid="net.mingsoft.base.dao.IBaseDao.sqlWhere"></include>
</where>
)ct ORDER BY ct.content_datetime desc,content_sort desc
</select>
<!--条件查询--> <!--条件查询-->
<select id="query" resultMap="resultContentMap"> <select id="query" resultMap="resultContentMap">
<!--,CONCAT('/html/',ct.app_id,category_path,'/',ct.id,'.html') AS static_url--> <!--,CONCAT('/html/',ct.app_id,category_path,'/',ct.id,'.html') AS static_url-->
@ -288,7 +327,7 @@
<if test="orderBy=='hit'">ORDER BY content_hit</if> <if test="orderBy=='hit'">ORDER BY content_hit</if>
<if test="orderBy=='sort'">ORDER BY content_sort</if> <if test="orderBy=='sort'">ORDER BY content_sort</if>
<if test="orderBy!='date' and orderBy!='hit' and orderBy!='sort'"> <if test="orderBy!='date' and orderBy!='hit' and orderBy!='sort'">
ORDER BY ct.id ORDER BY ct.content_datetime
</if> </if>
<choose> <choose>
<when test="order!=null and order!=''"> <when test="order!=null and order!=''">
@ -301,6 +340,65 @@
</if> </if>
</select> </select>
<!-- 根据站点编号、开始、结束时间和栏目编号查询文章编号集合,不包括单篇 -->
<select id="queryIdsByCategoryIdForParserAndNotCover" resultMap="resultBean" >
select
ct.id article_id,c.*
FROM cms_content ct
LEFT JOIN cms_category c ON ct.category_id = c.id
where ct.del=0
<!-- 查询子栏目数据 -->
<if test="categoryId!=null and categoryId!='' and categoryType==1">
and (ct.category_id=#{categoryId} or ct.category_id in
(select id FROM cms_category where find_in_set(#{categoryId},CATEGORY_PARENT_IDS)>0 and category_type!=2))
</if>
<if test="categoryId!=null and categoryId!='' and categoryType==2">
and ct.category_id=#{categoryId}
</if>
<if test="beginTime!=null and beginTime!=''">
<if test="_databaseId == 'mysql'">
AND ct.UPDATE_DATE &gt;= #{beginTime}
</if>
<if test="_databaseId == 'oracle'">
and ct.UPDATE_DATE &gt;= to_date(#{beginTime}, 'yyyy-mm-dd hh24:mi:ss')
</if>
</if>
<if test="endTime!=null and endTime!=''">
<if test="_databaseId == 'mysql'">
and ct.UPDATE_DATE &gt;= #{endTime}
</if>
<if test="_databaseId == 'oracle'">
and ct.UPDATE_DATE &gt;= to_date(#{endTime}, 'yyyy-mm-dd hh24:mi:ss')
</if>
</if>
<if test="flag!=null and flag!=''">
and ct.content_type in ( #{flag})
</if>
<if test="noflag!=null and noflag!=''">
and (ct.content_type not in ( #{noflag} ) or ct.content_type is null)
</if>
<if test="orderBy!=null and orderBy!='' ">
<if test="orderBy=='date'">ORDER BY content_datetime</if>
<if test="orderBy=='hit'">ORDER BY content_hit</if>
<if test="orderBy=='sort'">ORDER BY content_sort</if>
<if test="orderBy!='date' and orderBy!='hit' and orderBy!='sort'">
ORDER BY ct.content_datetime
</if>
<choose>
<when test="order!=null and order!=''">
${order}
</when>
<otherwise>
desc
</otherwise>
</choose>
</if>
</select>
<select id="getSearchCount" resultType="int"> <select id="getSearchCount" resultType="int">
select count(*) from select count(*) from
cms_content a cms_content a

@ -22,13 +22,12 @@
package net.mingsoft.cms.entity; package net.mingsoft.cms.entity;
import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.annotation.FieldStrategy;
import com.baomidou.mybatisplus.annotation.*; import com.baomidou.mybatisplus.annotation.IdType;
import com.fasterxml.jackson.annotation.JsonFormat; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import net.mingsoft.base.entity.BaseEntity; import net.mingsoft.base.entity.BaseEntity;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/** /**
* 分类实体 * 分类实体
@ -106,7 +105,7 @@ public class CategoryEntity extends BaseEntity {
/** /**
* 栏目管理的内容模型id * 栏目管理的内容模型id
*/ */
private Integer mdiyModelId; private String mdiyModelId;
/** /**
* 字典对应编号 * 字典对应编号
@ -123,6 +122,7 @@ public class CategoryEntity extends BaseEntity {
/** /**
* 父类型编号 * 父类型编号
*/ */
@TableField(updateStrategy = FieldStrategy.IGNORED)
private String categoryParentIds; private String categoryParentIds;
/** /**
@ -299,11 +299,11 @@ public class CategoryEntity extends BaseEntity {
return this.categoryDiyUrl; return this.categoryDiyUrl;
} }
public Integer getMdiyModelId() { public String getMdiyModelId() {
return mdiyModelId; return mdiyModelId;
} }
public void setMdiyModelId(Integer mdiyModelId) { public void setMdiyModelId(String mdiyModelId) {
this.mdiyModelId = mdiyModelId; this.mdiyModelId = mdiyModelId;
} }
@ -442,4 +442,28 @@ public class CategoryEntity extends BaseEntity {
return categoryPath; return categoryPath;
} }
/**
* 获取栏目属性 (标签使用
*/
@TableField(exist = false)
private String type;
public String getType() {
return this.categoryType;
}
/**
* 获取子分类数量 (标签使用
*/
@TableField(exist = false)
private String childsize;
public String getChildsize() {
return this.childsize;
}
public void setChildsize(String childsize) {
this.childsize = childsize;
}
} }

@ -24,6 +24,7 @@ package net.mingsoft.cms.util;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.PageUtil; import cn.hutool.core.util.PageUtil;
import freemarker.core.ParseException; import freemarker.core.ParseException;
import freemarker.template.MalformedTemplateNameException; import freemarker.template.MalformedTemplateNameException;
@ -138,7 +139,7 @@ public class CmsParserUtil {
// 判断当前栏目是否有自定义模型 // 判断当前栏目是否有自定义模型
if (column.getMdiyModelId() != null) { if (column.getMdiyModelId() != null) {
// 通过栏目模型编号获取自定义模型实体 // 通过栏目模型编号获取自定义模型实体
contentModel = (ModelEntity) SpringUtil.getBean(ModelBizImpl.class).getEntity(column.getMdiyModelId()); contentModel = (ModelEntity) SpringUtil.getBean(ModelBizImpl.class).getById(column.getMdiyModelId());
} }
if (contentModel != null) { if (contentModel != null) {
@ -232,8 +233,8 @@ public class CmsParserUtil {
String columnUrl = categoryBean.getCategoryUrl(); String columnUrl = categoryBean.getCategoryUrl();
LOG.debug("columnUrl {}",columnUrl); LOG.debug("columnUrl {}",columnUrl);
// 文章的栏目模型编号 // 文章的栏目模型编号
Integer columnContentModelId = null; String columnContentModelId = null;
if (articleIdList.get(artId).getMdiyModelId() != null && categoryBean.getMdiyModelId() > 0) { if (StringUtils.isNotBlank(articleIdList.get(artId).getMdiyModelId()) && StringUtils.isNotBlank(categoryBean.getMdiyModelId())) {
columnContentModelId = categoryBean.getMdiyModelId(); columnContentModelId = categoryBean.getMdiyModelId();
} }
@ -270,12 +271,14 @@ public class CmsParserUtil {
} else { } else {
// 通过栏目模型编号获取自定义模型实体 // 通过栏目模型编号获取自定义模型实体
contentModel = (ModelEntity) SpringUtil.getBean(IModelBiz.class) contentModel = (ModelEntity) SpringUtil.getBean(IModelBiz.class)
.getEntity(columnContentModelId); .getById(columnContentModelId);
if (null!=contentModel){
// 将自定义模型编号设置为key值 // 将自定义模型编号设置为key值
contentModelMap.put(columnContentModelId, contentModel.getModelTableName()); contentModelMap.put(columnContentModelId, contentModel.getModelTableName());
parserParams.put(ParserUtil.TABLE_NAME, contentModel.getModelTableName()); parserParams.put(ParserUtil.TABLE_NAME, contentModel.getModelTableName());
} }
} }
}
parserParams.put(ParserUtil.ID, articleId); parserParams.put(ParserUtil.ID, articleId);
// 第一篇文章没有上一篇 // 第一篇文章没有上一篇
@ -298,7 +301,7 @@ public class CmsParserUtil {
parserParams.put(ParserUtil.PAGE, page); parserParams.put(ParserUtil.PAGE, page);
String finalWritePath = writePath; String finalWritePath = writePath;
HashMap<Object, Object> cloneMap = CollUtil.newHashMap(); HashMap<Object, Object> cloneMap = MapUtil.newHashMap();
cloneMap.putAll(parserParams); cloneMap.putAll(parserParams);
HttpServletRequest request = SpringUtil.getRequest(); HttpServletRequest request = SpringUtil.getRequest();
String content = null; String content = null;

@ -26,14 +26,11 @@ import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator; import com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import net.mingsoft.basic.filter.XSSEscapeFilter; import net.mingsoft.basic.filter.XSSEscapeFilter;
import net.mingsoft.basic.interceptor.ActionInterceptor; import net.mingsoft.basic.interceptor.ActionInterceptor;
import net.mingsoft.mdiy.biz.IConfigBiz; import net.mingsoft.mdiy.biz.IConfigBiz;
import net.mingsoft.mdiy.entity.ConfigEntity; import net.mingsoft.mdiy.entity.ConfigEntity;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
@ -43,11 +40,9 @@ import org.springframework.core.Ordered;
import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.context.request.RequestContextListener; import org.springframework.web.context.request.RequestContextListener;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.*;
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 javax.annotation.Resource;
import java.io.File; import java.io.File;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
@ -61,10 +56,10 @@ import java.util.concurrent.TimeUnit;
@Configuration @Configuration
public class WebConfig implements WebMvcConfigurer { public class WebConfig implements WebMvcConfigurer {
@Autowired(required = false) @Resource
private IConfigBiz configBiz; private IConfigBiz configBiz;
@Autowired(required = false) @Resource
private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter; private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;
@Bean @Bean
@ -100,7 +95,7 @@ public class WebConfig implements WebMvcConfigurer {
String uploadMapping = MSProperties.upload.mapping; String uploadMapping = MSProperties.upload.mapping;
String uploadFolderPath = MSProperties.upload.path; String uploadFolderPath = MSProperties.upload.path;
String template = MSProperties.upload.template; String template = MSProperties.upload.template;
String htmlDir = MSProperties.htmlDir; String htmlDir = MSProperties.DiyProperties.htmlDir;
// 上传路径映射 这里的映射不能使用File.separator Windows会存在映射问题 // 上传路径映射 这里的映射不能使用File.separator Windows会存在映射问题
registry.addResourceHandler(uploadMapping).addResourceLocations("/" + uploadFolderPath + "/", "file:" + uploadFolderPath + "/"); registry.addResourceHandler(uploadMapping).addResourceLocations("/" + uploadFolderPath + "/", "file:" + uploadFolderPath + "/");
registry.addResourceHandler("/" + template + "/**").addResourceLocations("/" + template + "/", "file:" + template + "/"); registry.addResourceHandler("/" + template + "/**").addResourceLocations("/" + template + "/", "file:" + template + "/");
@ -141,13 +136,15 @@ public class WebConfig implements WebMvcConfigurer {
registration.setName("XSSFilter"); registration.setName("XSSFilter");
registration.addUrlPatterns(new String[]{"/*"}); registration.addUrlPatterns(new String[]{"/*"});
registration.setOrder(-2147483648); registration.setOrder(-2147483648);
if (filterUrl != null && StrUtil.isNotBlank(filterUrl)) {
xssFilter.includes.addAll(Arrays.asList(filterUrl.split(",")));
}else {
xssFilter.includes.add("/**"); xssFilter.includes.add("/**");
xssFilter.excludes.add(MSProperties.manager.path + "/**");
if (filterUrl != null && StrUtil.isNotBlank(filterUrl.toString())) {
xssFilter.includes.addAll(Arrays.asList(filterUrl.toString().split(",")));
} }
if (excludeUrl != null && StrUtil.isNotBlank(excludeUrl.toString())) { if (excludeUrl != null && StrUtil.isNotBlank(excludeUrl)) {
xssFilter.excludes.addAll(Arrays.asList(excludeUrl.toString().split(","))); xssFilter.excludes.addAll(Arrays.asList(excludeUrl.split(",")));
}else {
xssFilter.excludes.add(MSProperties.manager.path + "/**");
} }
initParameters.put("isIncludeRichText", "false"); initParameters.put("isIncludeRichText", "false");
registration.setInitParameters(initParameters); registration.setInitParameters(initParameters);

@ -1,12 +1,15 @@
server: server:
port: 8080 port: 8080
servlet.session.timeout: P0DT60M0S #D天H小时M分钟S秒,字符T是紧跟在时分秒之前的,每个单位都必须由数字开始,且时分秒顺序不能乱 servlet.session.timeout: P0DT60M0S #D天H小时M分钟S秒,字符T是紧跟在时分秒之前的,每个单位都必须由数字开始,且时分秒顺序不能乱
error:
include-exception: true
include-message: always
servlet: servlet:
encoding: encoding:
force: true force: true
charset: utf-8 charset: utf-8
enabled: true enabled: true
# ssl: #https证书配置 配置了之后只能通过https访问应用,此配置只争对springboot方式有效,如果使用了nginx需要在nginx配置证书 # ssl: #https证书配置 配置了之后只能通过https访问应用
# key-store: xxx.pfx 证书文件 # key-store: xxx.pfx 证书文件
# key-store-password: 1234 证书密码 # key-store-password: 1234 证书密码
@ -17,8 +20,13 @@ logging:
config: classpath:log4j-spring.xml config: classpath:log4j-spring.xml
ms: ms:
xss:
shiro-key: d3d3bWluZ3NvZnRuZXRtcw== #生产必须修改此值否则会存在安全风险,可以通过 https://base64.us/随机生产一个Base64值 xssEnable: true #xss过滤器的开关
filterUrl: /** #过滤的url,多个用逗号分开
excludeUrl: /ms/**,/static/**,/template/**,/file/upload.do,/static/plugins/ueditor/1.4.3.3/jsp/editor.do,/activity/saveUser.do #排除的url,多个用逗号分开
# mstore-url: http://store.i.mingsoft.net
# mstore-host: store.i.mingsoft.net
# shiro-key: #16位长度,不填写默认随机生成
cookie-name: SHIRO_SESSION_ID cookie-name: SHIRO_SESSION_ID
html-dir: html html-dir: html
rand-code: rand-code:
@ -30,20 +38,17 @@ ms:
manager: manager:
path: /ms #后台访问的路径,如:http://项目/ms/login.do,生产的时候建议修改 path: /ms #后台访问的路径,如:http://项目/ms/login.do,生产的时候建议修改
check-code: true #默认开启验证码验证,false验证码不验证 check-code: true #默认开启验证码验证,false验证码不验证
xss:
xssEnable: true #xss过滤器的开关
filterUrl: /** #过滤的url,多个用逗号分开
excludeUrl: /ms**,/static**,/template**,/file/upload.do,/static/plugins/ueditor/1.4.3.3/jsp/editor.do #排除的url,多个用逗号分开
upload: upload:
enable-web: true #启用web层的上传 enable-web: true #启用web层的上传
template: template #模板文件夹支持重命名,不支持路径 template: template #模板文件夹支持重命名,不支持路径
path: upload #文件上传路径,可以根据实际写绝对路径 path: upload #文件上传路径,可以根据实际写绝对路径
mapping: /upload/** #修改需要谨慎,系统第一次部署可以随意修改,如果已经有了上传数据,再次修改会导致之前上传的文件404 mapping: /upload/** #修改需要谨慎,系统第一次部署可以随意修改,如果已经有了上传数据,再次修改会导致之前上传的文件404
denied: .exe,.jsp,.jspx,.sh denied: exe,jsp,xml,sh,bat,py
back-up: /upload_back back-up: /upload_back
multipart: multipart:
#最大上传文件大小 单位:KB #最大上传文件大小 单位:KB
max-file-size: 10240 max-file-size: 1024
#文件暂存临时目录 #文件暂存临时目录
upload-temp-dir: temp upload-temp-dir: temp
#临时文件大小 #临时文件大小
@ -52,8 +57,20 @@ ms:
max-request-size: -1 max-request-size: -1
spring: spring:
main:
allow-circular-references: true
datasource: datasource:
druid: druid:
initialSize: 5 #初始连接数,默认0
minIdle: 5 #最小连接数,默认8
maxActive: 20 #最大连接数,默认8
maxWait: 2000 #获取连接的最大等待时间,单位毫秒
validationQuery: SELECT 1
testOnBorrow: true #设置从连接池获取连接时是否检查连接有效性,true检查,false不检查
testOnReturn: true #设置从连接池归还连接时是否检查连接有效性,true检查,false不检查
poolPreparedStatements: true #可以支持PSCache(提升写入、查询效率)
filters: stat,wall #配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
keepAlive: true #保持长连接
stat-view-servlet: stat-view-servlet:
enabled: false #启用druid监控 enabled: false #启用druid监控
profiles: profiles:
@ -63,6 +80,7 @@ spring:
config: classpath:ehcache.xml config: classpath:ehcache.xml
mvc: mvc:
pathmatch: pathmatch:
matching-strategy: ANT_PATH_MATCHER
use-suffix-pattern: true use-suffix-pattern: true
devtools: devtools:
restart: restart:
@ -92,11 +110,6 @@ spring:
time_format: HH:mm:ss time_format: HH:mm:ss
datetime_format: yyyy-MM-dd HH:mm:ss datetime_format: yyyy-MM-dd HH:mm:ss
number_format: 0.## number_format: 0.##
http:
encoding:
force: true
charset: utf-8
enabled: true
mybatis-plus: mybatis-plus:
global-config: global-config:

Loading…
Cancel
Save