Procházet zdrojové kódy

!149 自定义模型字段搜索
Merge pull request !149 from 他是超人他会飞/4.7.0

他是超人他会飞 před 6 roky
rodič
revize
6b87402522

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
doc/4.6.5-to-4.7.0-mysql.sql


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
doc/db-mcms-mysql-4.7.0.sql


+ 4 - 4
src/main/java/net/mingsoft/cms/action/ArticleAction.java

@@ -287,7 +287,7 @@ public class ArticleAction extends BaseAction {
 		// 判断栏目是否存在新增字段
 		if (column.getColumnContentModelId() != 0) {
 			// 保存所有的字段信息
-			List<BaseEntity> listField = fieldBiz.queryListByCmid(column.getColumnContentModelId());
+			List<ContentModelFieldEntity> listField = fieldBiz.queryListByCmid(column.getColumnContentModelId());
 			// 获取内容模型实体
 			ContentModelEntity contentModel = (ContentModelEntity) contentBiz
 					.getEntity(column.getColumnContentModelId());
@@ -414,7 +414,7 @@ public class ArticleAction extends BaseAction {
 				// 判断栏目是否存在新增字段
 				if (column.getColumnContentModelId() != 0) {
 					// 保存所有的字段信息
-					List<BaseEntity> listField = fieldBiz.queryListByCmid(column.getColumnContentModelId());
+					List<ContentModelFieldEntity> listField = fieldBiz.queryListByCmid(column.getColumnContentModelId());
 					ContentModelEntity newContentModel = (ContentModelEntity) contentBiz
 							.getEntity(column.getColumnContentModelId());
 					if (newContentModel != null) {
@@ -442,7 +442,7 @@ public class ArticleAction extends BaseAction {
 		// 判断该文章是否存在新增字段
 		if (column.getColumnContentModelId() != 0) {
 			// 保存所有的字段信息
-			List<BaseEntity> listField = fieldBiz.queryListByCmid(column.getColumnContentModelId());
+			List<ContentModelFieldEntity> listField = fieldBiz.queryListByCmid(column.getColumnContentModelId());
 			// // update中的where条件
 			Map<String, Integer> where = new HashMap<String, Integer>();
 			// 压入默认的basicId字段
@@ -576,7 +576,7 @@ public class ArticleAction extends BaseAction {
 	 *            文章id
 	 * @return 字段信息
 	 */
-	private Map checkField(List<BaseEntity> listField, HttpServletRequest request, int articleId) {
+	private Map checkField(List<ContentModelFieldEntity> listField, HttpServletRequest request, int articleId) {
 		Map<String, Object> mapParams = new HashMap();
 		// 压入默认的basicId字段
 		mapParams.put("basicId", articleId);

+ 0 - 1
src/main/java/net/mingsoft/cms/action/web/ArticleAction.java

@@ -227,7 +227,6 @@ public class ArticleAction extends BaseAction {
 				}
 			}
 		}
-		
 		this.outJson(response, JSONArray.toJSONString(new ListBean(list, BasicUtil.endPage(list)),new DateValueFilter("yyyy-MM-dd HH:mm:ss")));
 	}
 

+ 178 - 58
src/main/java/net/mingsoft/cms/action/web/SearchAction.java

@@ -41,14 +41,21 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import net.mingsoft.basic.action.BaseAction;
+import net.mingsoft.basic.biz.ICategoryBiz;
 import net.mingsoft.basic.biz.IColumnBiz;
+import net.mingsoft.basic.biz.IModelBiz;
+import net.mingsoft.basic.entity.BaseEntity;
 import net.mingsoft.basic.entity.ColumnEntity;
 import net.mingsoft.cms.biz.IArticleBiz;
 import net.mingsoft.cms.util.CmsParserUtil;
+import net.mingsoft.mdiy.biz.IContentModelBiz;
+import net.mingsoft.mdiy.biz.IContentModelFieldBiz;
 import net.mingsoft.mdiy.biz.ISearchBiz;
+import net.mingsoft.mdiy.entity.ContentModelEntity;
 import net.mingsoft.mdiy.entity.ContentModelFieldEntity;
 import net.mingsoft.mdiy.entity.SearchEntity;
-
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.text.StrSpliter;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.PageUtil;
 import freemarker.core.ParseException;
@@ -56,6 +63,7 @@ import freemarker.template.MalformedTemplateNameException;
 import freemarker.template.TemplateNotFoundException;
 import net.mingsoft.base.constant.Const;
 import net.mingsoft.basic.util.BasicUtil;
+import net.mingsoft.basic.util.StringUtil;
 import net.mingsoft.mdiy.util.ParserUtil;
 
 /**
@@ -94,6 +102,33 @@ public class SearchAction extends BaseAction {
 	 */
 	@Autowired
 	private IColumnBiz columnBiz;
+	
+	/**
+	 * 内容模型业务层
+	 */
+	@Autowired
+	private IContentModelBiz contentModelBiz;
+	
+	/**
+	 * 内容字段业务层
+	 */
+	@Autowired
+	private IContentModelFieldBiz fieldBiz;
+	
+
+	/**
+	 * 注入分类业务层
+	 */
+	@Autowired
+	private ICategoryBiz categoryBiz;
+
+
+	/**
+	 * 模块管理biz
+	 */
+	@Autowired
+	private IModelBiz modelBiz;
+	
 	/**
 	 * 实现前端页面的文章搜索
 	 * 
@@ -120,6 +155,34 @@ public class SearchAction extends BaseAction {
 		Map<String, String> basicField = getMapByProperties(net.mingsoft.mdiy.constant.Const.BASIC_FIELD);
 		// 文章字段集合
 		Map<String, Object> articleFieldName = new HashMap<String, Object>();
+		// 自定义字段集合
+		Map<String, String> diyFieldName = new HashMap<String, String>();
+		ColumnEntity column = null; // 当前栏目
+		ContentModelEntity contentModel = null; // 栏目对应模型
+		List<ContentModelFieldEntity> fieldList = new ArrayList<ContentModelFieldEntity>(); // 栏目对应字段
+		List<DiyModelMap> fieldValueList = new ArrayList<DiyModelMap>(); // 栏目对应字段的值
+		int typeId = BasicUtil.getInt("categoryId",0);
+		//记录自定义模型字段名
+		List filedStr = new ArrayList<>();
+		//根据栏目确定模版
+		if(typeId>0){
+			column = (ColumnEntity) columnBiz.getEntity(Integer.parseInt(typeId+""));
+			// 获取表单类型的id
+			if (column != null) {
+				contentModel = (ContentModelEntity) contentModelBiz.getEntity(column.getColumnContentModelId());
+				if (contentModel != null) {
+					fieldList = fieldBiz.queryListByCmid(contentModel.getCmId());
+					for (ContentModelFieldEntity cmField : fieldList) {
+						filedStr.add(cmField.getFieldFieldName());
+					}
+					map.put(ParserUtil.TABLE_NAME, contentModel.getCmTableName());
+				}
+			}
+			map.put(ParserUtil.COLUMN, column);
+			//设置栏目编号
+			map.put(ParserUtil.TYPE_ID, typeId);
+		}
+		
 		// 遍历取字段集合
 		if (field != null) {
 			for (Entry<String, String[]> entry : field.entrySet()) {
@@ -138,32 +201,69 @@ public class SearchAction extends BaseAction {
 					// 若为文章字段,则保存至文章字段集合;否则保存至自定义字段集合
 					if (ObjectUtil.isNotNull(basicField.get(entry.getKey())) && ObjectUtil.isNotNull(value)) {
 						articleFieldName.put(entry.getKey(), value);
-					} 
+					} else {
+						if (!StringUtil.isBlank(value)) {
+							diyFieldName.put(entry.getKey(), value);
+							//判断请求中的是否是自定义模型中的字段
+							if(filedStr.contains(entry.getKey())){
+								//设置自定义模型字段和值
+								DiyModelMap diyMap = new DiyModelMap();
+								diyMap.setKey(entry.getKey());
+								diyMap.setValue(value);
+								fieldValueList.add(diyMap);
+							}
+						} 
+					}
 				}
 			}
 		}
-		Map whereMap = this.searchMap(articleFieldName, null, null);
-		// 获取符合条件的文章总数
-		int count = articleBiz.getSearchCount(null, whereMap, BasicUtil.getAppId(), null);
-		int typeId = BasicUtil.getInt("categoryId",0);
-		//根据栏目确定模版
-		if(typeId>0){
-			ColumnEntity column = (ColumnEntity) columnBiz.getEntity(Integer.parseInt(map.get("typeid")+""));
-			map.put(ParserUtil.COLUMN, column);
-			//设置栏目编号
-			map.put(ParserUtil.TYPE_ID, typeId);
+		//添加自定义模型的字段和值
+		if(fieldValueList.size()>0){
+			map.put("diyModel", fieldValueList);
 		}
+		//组织where查询条件
+		Map whereMap = this.searchMap(articleFieldName, diyFieldName, fieldList);
+		// 获取符合条件的文章总数
+		int count = articleBiz.getSearchCount(contentModel, whereMap, BasicUtil.getAppId(), null);
+		
 		int size = BasicUtil.getInt(ParserUtil.SIZE,10);
+		int total = PageUtil.totalPage(count, size);
 		//获取总数
-		map.put(ParserUtil.TOTAL, PageUtil.totalPage(count, size));
+		map.put(ParserUtil.TOTAL, total);
 		//设置页面显示数量
 		map.put(ParserUtil.RCOUNT, size);
 		map.put(ParserUtil.SIZE, size);
 		//设置列表当前页
 		map.put(ParserUtil.PAGE_NO, BasicUtil.getInt(ParserUtil.PAGE_NO,1));
+		int pageNo = (int) map.get(ParserUtil.PAGE_NO);
+		int next ,pre;
+		if(StringUtil.isBlank(pageNo) || pageNo==1){
+			//如果总页数等于1,下一页就是第一页,不等于就有第二页
+			next = 1==total ? total : 2;
+			pre = 1;
+		}else{
+			next = pageNo==total ? total : pageNo +1;
+			pre = pageNo-1==0 ? 1 : pageNo-1;
+		}
+		String str = ParserUtil.PAGE_NO+",";
+		//设置分页的统一链接
+		String url = BasicUtil.getUrl() + request.getServletPath() +"?" + BasicUtil.assemblyRequestUrlParams(str.split(","));
+		String pageNoStr = "&"+ParserUtil.PAGE_NO+"=";
+		//下一页
+		String nextUrl = url + pageNoStr+next;
+		//首页
+		String indexUrl = url + pageNoStr + 1;
+		//尾页
+		String lastUrl = url + pageNoStr + total;
+		//上一页
+		String preUrl = url + pageNoStr + pre;
 		
+		map.put(ParserUtil.INDEX_URL, indexUrl);
+		map.put(ParserUtil.NEXT_URL, nextUrl);
+		map.put(ParserUtil.PRE_URL, preUrl);
+		map.put(ParserUtil.LAST_URL, lastUrl);
 		map.put(ParserUtil.URL, BasicUtil.getUrl());
-		Map searchMap = new HashMap<>();
+		Map<Object, Object> searchMap = new HashMap<>();
 		searchMap.put(BASIC_TITLE, BasicUtil.getString(BASIC_TITLE));
 		searchMap.put(ParserUtil.PAGE_NO, BasicUtil.getInt(ParserUtil.PAGE_NO,1));
 		map.put(SEARCH, searchMap);
@@ -225,48 +325,48 @@ public class SearchAction extends BaseAction {
 		}
 
 		// 遍历字段自定义字段
-//		for (Iterator iter = diyFieldName.keySet().iterator(); iter.hasNext();) {
-//			String key = iter.next().toString();
-//			String fieldValue = diyFieldName.get(key);
-//			// 获取字段实体
-//			ContentModelFieldEntity field = this.get(key, fields);
-//			if (field != null) {
-//				List list = new ArrayList();
-//				// 是否为自定义字段0
-//				list.add(0, true);
-//				List listValue = new ArrayList();
-//				// 字段的值
-//				if (field.getFieldType() == IContentModelFieldBiz.INT || field.getFieldType() == IContentModelFieldBiz.FLOAT) {
-//					// 判断是否为区间查询
-//
-//					if (diyFieldName.get(key).toString().indexOf("-") > 0) {
-//						String[] values = fieldValue.toString().split("-");
-//						// 是否是数字类型,false:是
-//						list.add(false);
-//						// 是否是区间比较 false:是
-//						list.add(false);
-//						// 字段值1
-//						listValue.add(values[0]);
-//						listValue.add(values[1]);
-//					} else {
-//						// 是否是数字类型,false:是2
-//						list.add(false);
-//						// 是否是区间比较 true:不是3
-//						list.add(true);
-//						// 字段值 1
-//						listValue.add(fieldValue);
-//					}
-//				} else {
-//					// 是否是数字类型,true:不是2
-//					list.add(true);
-//					list.add(false);
-//					// 字段值 1
-//					listValue.add(fieldValue);
-//				}
-//				list.add(listValue);
-//				map.put(key, list);
-//			}
-//		}
+		for (Iterator iter = diyFieldName.keySet().iterator(); iter.hasNext();) {
+			String key = iter.next().toString();
+			String fieldValue = diyFieldName.get(key);
+			// 获取字段实体
+			ContentModelFieldEntity field = this.get(key, fields);
+			if (field != null) {
+				List list = new ArrayList();
+				// 是否为自定义字段0
+				list.add(0, true);
+				List listValue = new ArrayList();
+				// 字段的值
+				if (field.getFieldType() == IContentModelFieldBiz.INT || field.getFieldType() == IContentModelFieldBiz.FLOAT) {
+					// 判断是否为区间查询
+
+					if (diyFieldName.get(key).toString().indexOf("-") > 0) {
+						String[] values = fieldValue.toString().split("-");
+						// 是否是数字类型,false:是
+						list.add(false);
+						// 是否是区间比较 false:是
+						list.add(false);
+						// 字段值1
+						listValue.add(values[0]);
+						listValue.add(values[1]);
+					} else {
+						// 是否是数字类型,false:是2
+						list.add(false);
+						// 是否是区间比较 true:不是3
+						list.add(true);
+						// 字段值 1
+						listValue.add(fieldValue);
+					}
+				} else {
+					// 是否是数字类型,true:不是2
+					list.add(true);
+					list.add(false);
+					// 字段值 1
+					listValue.add(fieldValue);
+				}
+				list.add(listValue);
+				map.put(key, list);
+			}
+		}
 		return map;
 	}
 
@@ -288,5 +388,25 @@ public class SearchAction extends BaseAction {
 		}
 		return null;
 	}
-
-}
+	/**
+	 * 存储自定义模型字段和接口参数
+	 * @author 铭飞开源团队
+	 * @date 2019年3月5日
+	 */
+	public class DiyModelMap {
+		String key;
+		Object value;
+		public String getKey() {
+			return key;
+		}
+		public void setKey(String key) {
+			this.key = key;
+		}
+		public Object getValue() {
+			return value;
+		}
+		public void setValue(Object value) {
+			this.value = value;
+		}
+	}
+}

+ 3 - 1
src/main/java/net/mingsoft/cms/dao/IArticleDao.xml

@@ -52,6 +52,8 @@
 		<result column="column_path" property="columnPath"/>			
 		<result column="column_url" property="columnUrl" />
 		<result column="category_title" property="categoryTitle" />
+		<result column="column_category_id" property="categoryId"/><!-- 与Category类别类绑定ID -->
+		<result column="category_parent_id" property="categoryParentId" /><!-- 关联表category的父类型编号 -->
 		<result column="category_id" property="categoryId" />
 		<result column="COLUMN_CM_ID" property="columnContentModelId" />
 		<result column="COLUMN_TYPE" property="columnType" />
@@ -318,7 +320,7 @@
 	<!-- 根据站点编号、开始、结束时间和栏目编号查询文章编号集合 -->
 	<select id="queryIdsByCategoryIdForParser" resultMap="resultMapBean" >
 		select
-		ARTICLE_BASICID,cl.*
+		ARTICLE_BASICID,cl.*,c.*
 		FROM cms_article a LEFT JOIN basic b  ON a.ARTICLE_BASICID = b.BASIC_ID 
 		LEFT JOIN basic_column cl ON b.BASIC_CATEGORYID = cl.COLUMN_CATEGORY_ID 
 		JOIN category c ON c.CATEGORY_ID = cl.COLUMN_CATEGORY_ID

+ 20 - 16
src/main/java/net/mingsoft/cms/util/CmsParserUtil.java

@@ -8,10 +8,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.apache.commons.lang3.StringUtils;
-
 import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.PageUtil;
 import freemarker.cache.FileTemplateLoader;
 import freemarker.core.ParseException;
@@ -23,7 +20,6 @@ import net.mingsoft.base.constant.Const;
 import net.mingsoft.basic.entity.ColumnEntity;
 import net.mingsoft.basic.util.BasicUtil;
 import net.mingsoft.basic.util.SpringUtil;
-import net.mingsoft.basic.util.StringUtil;
 import net.mingsoft.cms.bean.ColumnArticleIdBean;
 import net.mingsoft.cms.constant.e.ColumnTypeEnum;
 import net.mingsoft.mdiy.biz.IContentModelBiz;
@@ -45,16 +41,12 @@ public class CmsParserUtil extends ParserUtil {
 	public static void generate(String templatePath, String targetPath) throws IOException {
 		Map<String, Object> map = new HashMap<String, Object>();
 		map.put(IS_DO, false);
-		boolean mobileStyle = false;
-		String content = CmsParserUtil.generate(templatePath, map, mobileStyle);
+		String content = CmsParserUtil.generate(templatePath, map, false);
 		
 		FileUtil.writeString(content, ParserUtil.buildHtmlPath(targetPath), Const.UTF8);
-		//判断是否有移动端 不能将这个判断放在上面,会出现PC端一直是移动端的内容
-		if (!StringUtil.isBlank(BasicUtil.getApp().getAppMobileStyle())) {
-			mobileStyle = true;
-		}
+		
 		// 生成移动页面
-		if (mobileStyle) {
+		if (ParserUtil.isMobile(templatePath)) {
 			// 手机端m
 			map.put(ParserUtil.MOBILE, BasicUtil.getApp().getAppMobileStyle());
 			content = CmsParserUtil.generate(templatePath, map, true);
@@ -109,6 +101,11 @@ public class CmsParserUtil extends ParserUtil {
 				parserParams.put(RCOUNT, pageSize);
 				parserParams.put(TYPE_ID, column.getCategoryId());
 				parserParams.put(IS_DO, false);
+				parserParams.put(HTML, HTML);
+				//如果单站点,就废弃站点地址
+				if(ParserUtil.IS_SINGLE) {
+					parserParams.put(ParserUtil.URL, BasicUtil.getUrl());
+				}
 				if (i == 0) {
 					// 数据库中第一页是从开始0*size
 					// 首页路径index.html
@@ -131,7 +128,7 @@ public class CmsParserUtil extends ParserUtil {
 				FileUtil.writeString(tag.rendering(), columnListPath, Const.UTF8);
 
 				// 判断是手机端生成还是pc端,防止重复生成
-				if (ObjectUtil.isNotNull(BasicUtil.getApp().getAppMobileStyle())) {
+				if (ParserUtil.isMobile(column.getColumnListUrl())) {
 					writer = new StringWriter();
 					mobileTemplate.process(null, writer);
 					tag = new TagParser(writer.toString(),parserParams);
@@ -215,20 +212,27 @@ public class CmsParserUtil extends ParserUtil {
 			parserParams.put(ID, articleId);
 			// 第一篇文章没有上一篇
 			if (ai > 0) {
-				parserParams.put(PRE_ID, articleIdList.get(ai - 1).getArticleId());
+				ColumnArticleIdBean preCaBean = articleIdList.get(ai - 1);
+				//判断当前文档是否与上一页文章在同一栏目下,并且不能使用父栏目字符串,因为父栏目中没有所属栏目编号
+				if(articleColumnPath.contains(preCaBean.getCategoryId()+"")){
+					parserParams.put(PRE_ID, preCaBean.getArticleId());
+				}
 			}
 			// 最后一篇文章没有下一篇
 			if (ai + 1 < articleIdList.size()) {
-				parserParams.put(NEXT_ID, articleIdList.get(ai + 1).getArticleId());
+				ColumnArticleIdBean nextCaBean = articleIdList.get(ai + 1);
+				//判断当前文档是否与下一页文章在同一栏目下并且不能使用父栏目字符串,因为父栏目中没有所属栏目编号
+				if(articleColumnPath.contains(nextCaBean.getCategoryId()+"")){
+					parserParams.put(NEXT_ID, nextCaBean.getArticleId());
+				}
 			}
 
 			parserParams.put(IS_DO, false);
 			
 			String content = CmsParserUtil.generate(articleIdList.get(ai).getColumnUrl(), parserParams, false);
 			FileUtil.writeString(content, writePath, Const.UTF8);
-
 			// 手机端
-			if (StringUtils.isNotEmpty(BasicUtil.getApp().getAppMobileStyle())) {
+			if (ParserUtil.isMobile(columnUrl)) {
 				writePath = ParserUtil.buildMobileHtmlPath(articleColumnPath + File.separator + articleId);
 				//如果是封面就生成index.html
 				if(articleIdList.get(ai).getColumnType() == ColumnTypeEnum.COLUMN_TYPE_COVER.toInt()) {

+ 2 - 2
src/main/webapp/templets/1/default/news-list.htm

@@ -21,12 +21,12 @@
 
                     <div class="ms-content-main-div">
                         <ul class="ms-content-main-ul">
-                            {ms:arclist size=20 ispaging=true }
+                            {ms:arclist size=10 ispaging=true}
                             <li>
                                 <a href="{ms:global.url/}[field.link/]">
                                     <!-- <span class="ms-content-main-li-span">·</span> -->
                                     <span class="ms-content-main-li-title">[field.title/]</span>
-                                    <span class="ms-content-main-li-time">[field.date?string("yyyy-mm-dd")/]</span>
+                                    <span class="ms-content-main-li-time">[field.date?string("yyyy-MM-dd")/]</span>
                                 </a>
                             </li>
                             {/ms:arclist}

+ 1 - 1
src/main/webapp/templets/1/default/news-show.htm

@@ -30,7 +30,7 @@
                                     <div class="ms-content-right-main-icon-source">来源:{ms:field.source/}
                                         <span class="ms-content-right-vertical">|</span>
                                     </div>
-                                    <div class="ms-content-right-main-icon-time">时间:{ms:field.date?string("yyyy-mm-dd")/}</div>
+                                    <div class="ms-content-right-main-icon-time">时间:{ms:field.date?string("yyyy-MM-dd")/}</div>
                                 </div>
                                 <div class="ms-content-icon-right">
                                     <div class="ms-content-right-main-icon-clicks"></div>

+ 5 - 5
src/main/webapp/templets/1/default/search.htm

@@ -16,7 +16,7 @@
                         <!-- 共7个结果 -->
                     </div>
                     <ul class="ms-content-main-ul">
-                        {ms:arclist size=3 ispaging=true}
+                        {ms:arclist size=10 ispaging=true}
                         <li>
                             <a href="{ms:global.url/}/[field.link/]">
                                 [field.title/]
@@ -27,10 +27,10 @@
                     </ul>
                 </div>
                 <div class="ms-content-main-page">
-	              	<a href="jacascript::void(0)" @click="indexAndLast(1)">首页</a>
-                  	<a href="jacascript::void(0)" @click="search(false)">上一页</a>
-                  	<a href="jacascript::void(0)" @click="search(true)">下一页</a>
-                  	<a href="jacascript::void(0)" @click="indexAndLast({ms:page.total/})">尾页</a>
+	              	 <a class="ms-content-main-page-first" href="{ms:page.index/}">首页</a>
+		             <a class="ms-content-main-page-upper" href="{ms:page.pre/}">上一页</a>
+		             <a class="ms-content-main-page-next" href="{ms:page.next/}">下一页</a>
+		             <a class="ms-content-main-page-last" href="{ms:page.last/}">末页</a>
 	            </div>
             </div>
         </div>

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů