diff --git a/pom.xml b/pom.xml index 4a319ad0..6258b116 100644 --- a/pom.xml +++ b/pom.xml @@ -3,10 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - net.mingsoft mcms - 4.7.0-SNAPSHOT + 4.7.1 ms-mcms 1.8 @@ -38,24 +37,19 @@ net.mingsoft - ms-mpeople - 1.0.7 + ms-basic + 1.0.11 net.mingsoft - ms-upgrader - 1.0.5-SNAPSHOT - - - javax.servlet - javax.servlet-api - 3.1.0 - test + ms-mpeople + 1.0.8 + - org.apache.tomcat.embed - tomcat-embed-jasper - 9.0.16 + net.mingsoft + ms-upgrader + 1.0.8 diff --git a/src/main/java/net/mingsoft/cms/action/ColumnAction.java b/src/main/java/net/mingsoft/cms/action/ColumnAction.java index 768c3292..ed4ccd08 100644 --- a/src/main/java/net/mingsoft/cms/action/ColumnAction.java +++ b/src/main/java/net/mingsoft/cms/action/ColumnAction.java @@ -9,6 +9,8 @@ import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import net.mingsoft.basic.util.ArrysUtil; +import net.mingsoft.mdiy.util.DictUtil; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; @@ -41,7 +43,7 @@ import net.mingsoft.mdiy.util.ParserUtil; /** * 铭飞MS平台,通用栏目分类,为了区分文章栏目与其他栏目的权限,该类是从basic模块复制过来 * @author 铭飞开发团队 - * @version + * @version * 版本号:100-000-000 * 创建日期:2017年8月9日 * 历史修订: @@ -49,8 +51,8 @@ import net.mingsoft.mdiy.util.ParserUtil; @Controller("articleColumnAction") @RequestMapping("/${ms.manager.path}/cms/column") public class ColumnAction extends BaseAction{ - - + + /** * 栏目业务层 */ @@ -58,7 +60,7 @@ public class ColumnAction extends BaseAction{ private IColumnBiz columnBiz; @Autowired private ICategoryBiz categoryBiz; - + /** * 模块业务层注入 */ @@ -75,7 +77,7 @@ public class ColumnAction extends BaseAction{ } /** * 栏目添加跳转页面 - * + * * @return */ @RequestMapping("/add") @@ -84,6 +86,8 @@ public class ColumnAction extends BaseAction{ int appId =BasicUtil.getAppId(); List list = columnBiz.queryAll(appId, BasicUtil.getModelCodeId(net.mingsoft.cms.constant.ModelCode.CMS_COLUMN.toString())); ColumnEntity columnSuper = new ColumnEntity(); + // 栏目属性 + model.addAttribute("columnFlag", DictUtil.list("栏目属性")); model.addAttribute("appId",appId); model.addAttribute("columnSuper", columnSuper); model.addAttribute("column",new ColumnEntity()); @@ -114,7 +118,7 @@ public class ColumnAction extends BaseAction{ this.outJson( response, ModelCode.COLUMN, false, getResString("err.empty", this.getResString("columnType"))); return false; } - + return true; } @@ -154,9 +158,9 @@ public class ColumnAction extends BaseAction{ columnBiz.updateEntity(column); //生成文件夹 File fileName = new File(file); - fileName.mkdir(); + fileName.mkdir(); } - + /** * @param column 栏目表实体 * column参数包含字段信息参考: @@ -180,7 +184,7 @@ public class ColumnAction extends BaseAction{ }; this.outJson(response, true); } - + /** * 栏目更新页面跳转 * @param columnId 栏目ID @@ -199,6 +203,8 @@ public class ColumnAction extends BaseAction{ list = columnBiz.queryAll(appId, BasicUtil.getModelCodeId(net.mingsoft.cms.constant.ModelCode.CMS_COLUMN.toString())); //查询当前栏目实体 ColumnEntity column = (ColumnEntity) columnBiz.getEntity(columnId); + // 栏目属性 + model.addAttribute("columnFlag", DictUtil.list("栏目属性")); model.addAttribute("appId",appId); model.addAttribute("column", column); model.addAttribute("columnc", column.getCategoryId()); @@ -212,7 +218,7 @@ public class ColumnAction extends BaseAction{ model.addAttribute("model", "cms"); return "/basic/column/form"; } - + /** * 栏目首页面列表显示 */ @@ -227,10 +233,10 @@ public class ColumnAction extends BaseAction{ EUListBean _list = new EUListBean(list, list.size()); this.outJson(response, net.mingsoft.base.util.JSONArray.toJSONString(_list)); } - + /** * 栏目添加 - * + * * @param column * 栏目对象 * @return 返回页面跳转 @@ -245,6 +251,13 @@ public class ColumnAction extends BaseAction{ column.setCategoryManagerId(getManagerBySession(request).getManagerId()); column.setCategoryDateTime(new Timestamp(System.currentTimeMillis())); column.setCategoryModelId(BasicUtil.getModelCodeId(net.mingsoft.cms.constant.ModelCode.CMS_COLUMN.toString())); + String checkboxType = BasicUtil.getString("checkboxType"); + //如果选择一个属性不做排序操作 + if(!StringUtils.isEmpty(checkboxType) && checkboxType.length()>2){ + column.setColumnFlag(ArrysUtil.sort(checkboxType, ",")+","); + }else{ + column.setColumnFlag(checkboxType); + } if(column.getColumnType()==ColumnEntity.ColumnTypeEnum.COLUMN_TYPE_COVER.toInt()){ column.setColumnListUrl(null); } @@ -252,7 +265,7 @@ public class ColumnAction extends BaseAction{ this.columnPath(request,column); this.outJson(response, ModelCode.COLUMN, true,null,JSONArray.toJSONString(column.getCategoryId())); } - + /** * 更新栏目 * @param column 栏目实体 @@ -274,6 +287,13 @@ public class ColumnAction extends BaseAction{ } column.setCategoryManagerId(getManagerBySession(request).getManagerId()); column.setAppId(websiteId); + String checkboxType = BasicUtil.getString("checkboxType"); + //如果选择一个属性不做排序操作 + if(!StringUtils.isEmpty(checkboxType) && checkboxType.length()>2){ + column.setColumnFlag(ArrysUtil.sort(checkboxType, ",")+","); + }else{ + column.setColumnFlag(checkboxType); + } columnBiz.updateCategory(column); this.columnPath(request,column); //查询当前栏目是否有子栏目, @@ -291,4 +311,4 @@ public class ColumnAction extends BaseAction{ } this.outJson(response, ModelCode.COLUMN, true,null,JSONArray.toJSONString(column.getCategoryId())); } -} +} \ No newline at end of file diff --git a/src/main/java/net/mingsoft/cms/action/GeneraterAction.java b/src/main/java/net/mingsoft/cms/action/GeneraterAction.java index 879af10c..492d2a2b 100644 --- a/src/main/java/net/mingsoft/cms/action/GeneraterAction.java +++ b/src/main/java/net/mingsoft/cms/action/GeneraterAction.java @@ -30,6 +30,8 @@ import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.CopyOptions; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -194,8 +196,17 @@ public class GeneraterAction extends BaseAction { CmsParserUtil.generateList(column, articleIdList.size()); break; case ColumnEntity.COLUMN_TYPE_COVER:// 单页 + if(articleIdList.size()==0){ + ColumnArticleIdBean columnArticleIdBean=new ColumnArticleIdBean(); + CopyOptions copyOptions=CopyOptions.create(); + copyOptions.setIgnoreError(true); + BeanUtil.copyProperties(column,columnArticleIdBean,copyOptions); + articleIdList.add(columnArticleIdBean); + } CmsParserUtil.generateBasic(articleIdList); break; + default: + throw new IllegalStateException("Unexpected value: " + column.getColumnType()); } } } catch (IOException e) { diff --git a/src/main/java/net/mingsoft/cms/action/web/MCmsAction.java b/src/main/java/net/mingsoft/cms/action/web/MCmsAction.java index 8090b565..9424bb51 100644 --- a/src/main/java/net/mingsoft/cms/action/web/MCmsAction.java +++ b/src/main/java/net/mingsoft/cms/action/web/MCmsAction.java @@ -1,5 +1,5 @@ /** -The MIT License (MIT) * Copyright (c) 2016 铭飞科技(mingsoft.net) + The MIT License (MIT) * Copyright (c) 2016 铭飞科技(mingsoft.net) * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -21,13 +21,23 @@ The MIT License (MIT) * Copyright (c) 2016 铭飞科技(mingsoft.net) package net.mingsoft.cms.action.web; +import java.io.File; import java.io.IOException; +import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import cn.hutool.core.io.FileUtil; +import com.github.pagehelper.PageHelper; +import net.mingsoft.base.constant.Const; +import net.mingsoft.basic.util.SpringUtil; +import net.mingsoft.cms.constant.e.ColumnTypeEnum; +import net.mingsoft.mdiy.biz.IContentModelBiz; +import net.mingsoft.mdiy.entity.ContentModelEntity; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -54,13 +64,13 @@ import net.mingsoft.mdiy.util.ParserUtil; /** * 动态生成页面,需要后台配置自定义页数据 - * + * * @author 铭飞开源团队 * @date 2018年12月17日 */ @Controller("dynamicPageAction") @RequestMapping("/mcms") -public class MCmsAction extends net.mingsoft.mdiy.action.BaseAction { +public class MCmsAction extends net.mingsoft.cms.action.BaseAction { /** * 自定义页面业务层 @@ -84,7 +94,7 @@ public class MCmsAction extends net.mingsoft.mdiy.action.BaseAction { // 如商城就为:/mall/{key}.do /** * 前段会员中心所有页面都可以使用该方法 请求地址例如: /{diy}.do,例如登陆界面,与注册界面都可以使用 - * + * * @param key */ @RequestMapping("/{diy}.do") @@ -158,7 +168,7 @@ public class MCmsAction extends net.mingsoft.mdiy.action.BaseAction { //获取栏目编号 int typeId = BasicUtil.getInt(ParserUtil.TYPE_ID,0); int size = BasicUtil.getInt(ParserUtil.SIZE,10); - + //获取文章总数 List columnArticles = articleBiz.queryIdsByCategoryIdForParser(typeId, null, null); //判断栏目下是否有文章 @@ -175,7 +185,7 @@ public class MCmsAction extends net.mingsoft.mdiy.action.BaseAction { map.put(ParserUtil.TYPE_ID, typeId); //设置列表当前页 map.put(ParserUtil.PAGE_NO, BasicUtil.getInt(ParserUtil.PAGE_NO,1)); - + map.put(ParserUtil.URL, BasicUtil.getUrl()); map.put(ParserUtil.PAGE, page); //动态解析 @@ -198,19 +208,27 @@ public class MCmsAction extends net.mingsoft.mdiy.action.BaseAction { } this.outString(resp, content); } - + /** * 动态详情页 * @param id 文章编号 */ @GetMapping("/view.do") - public void view(HttpServletRequest req, HttpServletResponse resp) { + public void view(String orderby,String order,HttpServletRequest req, HttpServletResponse resp) { //参数文章编号 ArticleEntity article = (ArticleEntity) articleBiz.getEntity(BasicUtil.getInt(ParserUtil.ID)); if(ObjectUtil.isNull(article)){ this.outJson(resp, null,false,getResString("err.empty", this.getResString("id"))); - return; + return; + } + if(StringUtils.isNotBlank(order)){ + //防注入 + if(!order.toLowerCase().equals("asc")&&!order.toLowerCase().equals("desc")){ + this.outJson(resp, null,false,getResString("err.error", this.getResString("order"))); + return; + } } + PageBean page = new PageBean(); //根据文章编号查询栏目详情模版 ColumnEntity column = (ColumnEntity) columnBiz.getEntity(article.getBasicCategoryId()); //解析后的内容 @@ -221,6 +239,55 @@ public class MCmsAction extends net.mingsoft.mdiy.action.BaseAction { //设置动态请求的模块路径 map.put(ParserUtil.MODEL_NAME, "mcms"); map.put(ParserUtil.URL, BasicUtil.getUrl()); + map.put(ParserUtil.PAGE, page); + map.put(ParserUtil.ID, article.getArticleID()); + List articleIdList = articleBiz.queryIdsByCategoryIdForParser(column.getCategoryCategoryId(), null, null,orderby,order); + Map contentModelMap = new HashMap(); + ContentModelEntity contentModel = null; + for (int artId = 0; artId < articleIdList.size();) { + //如果不是当前文章则跳过 + if(articleIdList.get(artId).getArticleId() != article.getArticleID()){ + artId++; + continue; + } + // 文章的栏目路径 + String articleColumnPath = articleIdList.get(artId).getColumnPath(); + // 文章的栏目模型编号 + int columnContentModelId = articleIdList.get(artId).getColumnContentModelId(); + Map parserParams = new HashMap(); + parserParams.put(ParserUtil.COLUMN, articleIdList.get(artId)); + // 判断当前栏目是否有自定义模型 + if (columnContentModelId > 0) { + // 通过当前栏目的模型编号获取,自定义模型表名 + if (contentModelMap.containsKey(columnContentModelId)) { + parserParams.put(ParserUtil.TABLE_NAME, contentModel.getCmTableName()); + } else { + // 通过栏目模型编号获取自定义模型实体 + contentModel = (ContentModelEntity) SpringUtil.getBean(IContentModelBiz.class) + .getEntity(columnContentModelId); + // 将自定义模型编号设置为key值 + contentModelMap.put(columnContentModelId, contentModel.getCmTableName()); + parserParams.put(ParserUtil.TABLE_NAME, contentModel.getCmTableName()); + } + } + // 第一篇文章没有上一篇 + if (artId > 0) { + ColumnArticleIdBean preCaBean = articleIdList.get(artId - 1); + //判断当前文档是否与上一页文章在同一栏目下,并且不能使用父栏目字符串,因为父栏目中没有所属栏目编号 + if(articleColumnPath.contains(preCaBean.getCategoryId()+"")){ + page.setPreId(preCaBean.getArticleId()); + } + } + // 最后一篇文章没有下一篇 + if (artId + 1 < articleIdList.size()) { + ColumnArticleIdBean nextCaBean = articleIdList.get(artId + 1); + //判断当前文档是否与下一页文章在同一栏目下并且不能使用父栏目字符串,因为父栏目中没有所属栏目编号 + if(articleColumnPath.contains(nextCaBean.getCategoryId()+"")){ + page.setNextId(nextCaBean.getArticleId()); + } + } + break; + } try { //根据模板路径,参数生成 content = CmsParserUtil.generate(column.getColumnUrl(), map, isMobileDevice(req)); diff --git a/src/main/java/net/mingsoft/cms/biz/IArticleBiz.java b/src/main/java/net/mingsoft/cms/biz/IArticleBiz.java index 091a3188..29e94603 100644 --- a/src/main/java/net/mingsoft/cms/biz/IArticleBiz.java +++ b/src/main/java/net/mingsoft/cms/biz/IArticleBiz.java @@ -1,43 +1,43 @@ -/** -The MIT License (MIT) * Copyright (c) 2016 铭飞科技(mingsoft.net) - - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - +/** + The MIT License (MIT) * Copyright (c) 2016 铭飞科技(mingsoft.net) + + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + package net.mingsoft.cms.biz; -import java.util.List; -import java.util.Map; - -import net.mingsoft.basic.biz.IBasicBiz; -import net.mingsoft.cms.bean.ColumnArticleIdBean; -import net.mingsoft.cms.entity.ArticleEntity; -import net.mingsoft.mdiy.entity.ContentModelEntity; - - -/** - * - * @ClassName: IArticleBiz - * @Description:TODO(文章管理业务处理层 || 继承IBasicBiz业务处理层) - * @author: 铭飞开发团队 - * @date: 2018年1月31日 下午2:53:32 - * - * @Copyright: 2018 www.mingsoft.net Inc. All rights reserved. +import java.util.List; +import java.util.Map; + +import net.mingsoft.basic.biz.IBasicBiz; +import net.mingsoft.cms.bean.ColumnArticleIdBean; +import net.mingsoft.cms.entity.ArticleEntity; +import net.mingsoft.mdiy.entity.ContentModelEntity; + + +/** + * + * @ClassName: IArticleBiz + * @Description:TODO(文章管理业务处理层 || 继承IBasicBiz业务处理层) + * @author: 铭飞开发团队 + * @date: 2018年1月31日 下午2:53:32 + * + * @Copyright: 2018 www.mingsoft.net Inc. All rights reserved. */ public interface IArticleBiz extends IBasicBiz { @@ -52,14 +52,14 @@ public interface IArticleBiz extends IBasicBiz { * @param article * 文件实体 * @return - */ + */ @Deprecated int count(int webId, int[] basicCategoryId, String flag, String noFlag, ArticleEntity article); /** * 通过分类id获取文章内容 - * + * * @param categoryId * 分类编号 * @return @@ -69,7 +69,7 @@ public interface IArticleBiz extends IBasicBiz { /** * 通过视图表来查询文章总数 - * + * * @param basicId * 文章编号 */ @@ -78,31 +78,31 @@ public interface IArticleBiz extends IBasicBiz { /** * 查找basicId下一篇文章 - * + * * @param appId * 应用编号 * @param basicId * 文章编号 * @return - */ + */ @Deprecated public ArticleEntity getNext(int appId, int basicId, Integer categoryId); /** * 查找basicId上一篇文章 - * + * * @param appId * 应用编号 * @param basicId * 文章编号 * @return - */ + */ @Deprecated public ArticleEntity getPrevious(int appId, int basicId, Integer categoryId); /** * 高级查询接口,主要提供给有自定义模型的栏目,返回總數 - * + * * @param contentModel * 自定义模型 * @param whereMap @@ -118,7 +118,7 @@ public interface IArticleBiz extends IBasicBiz { /** * 文章查询 - * + * * @para webId 网站编号 * @param basicCategoryIds * 栏目编号集合 @@ -129,28 +129,37 @@ public interface IArticleBiz extends IBasicBiz { * @param orderBy * 排序字段 * @param order - * true 升序 false 降序 排序方式 - * @param beginTime 开始时间 - * @param endTime 结束时间 + * true 升序 false 降序 排序方式 + * @param beginTime 开始时间 + * @param endTime 结束时间 * @param article - * 文章实体,便于扩展查询 + * 文章实体,便于扩展查询 * @return 文章集合 */ List query(int webId, int[] basicCategoryIds, String flag, String noFlag, String orderBy, - boolean order, String beginTime,String endTime, ArticleEntity article); - - /** - * 查询文章编号集合 - * @param categoryId 栏目编号 - * @param beginTime 开始时间 - * @param endTime 结束时间 - * @return + boolean order, String beginTime,String endTime, ArticleEntity article); + + /** + * 查询文章编号集合 + * @param categoryId 栏目编号 + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return */ public List queryIdsByCategoryIdForParser(int categoryId, String beginTime,String endTime); - + /** + * 查询文章编号集合 + * @param categoryId 栏目编号 + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @param orderBy 排序字段 + * @param order 排序方式 + * @return + */ + public List queryIdsByCategoryIdForParser(int categoryId, String beginTime,String endTime,String orderBy,String order); /** * 根据页面栏目的id获取与其绑定的文章实体 - * + * * @param basicCategoryId * @return 文章实体 */ @@ -162,7 +171,7 @@ public interface IArticleBiz extends IBasicBiz { /** * 高级查询接口,主要提供给有自定义模型的栏目, - * + * * @param conntentModel * 自定义模型 * @param whereMap @@ -177,6 +186,6 @@ public interface IArticleBiz extends IBasicBiz { */ @Deprecated public List queryListForSearch(ContentModelEntity conntentModel, Map whereMap, - int appId, List ids, Map orders); + int appId, List ids, Map orders); } \ No newline at end of file diff --git a/src/main/java/net/mingsoft/cms/biz/impl/ArticleBizImpl.java b/src/main/java/net/mingsoft/cms/biz/impl/ArticleBizImpl.java index 5c8fdf1d..7f89bd37 100644 --- a/src/main/java/net/mingsoft/cms/biz/impl/ArticleBizImpl.java +++ b/src/main/java/net/mingsoft/cms/biz/impl/ArticleBizImpl.java @@ -1,5 +1,5 @@ /** -The MIT License (MIT) * Copyright (c) 2016 铭飞科技(mingsoft.net) + The MIT License (MIT) * Copyright (c) 2016 铭飞科技(mingsoft.net) * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import com.github.pagehelper.PageHelper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -42,43 +43,43 @@ import net.mingsoft.mdiy.biz.IContentModelBiz; import net.mingsoft.mdiy.entity.ContentModelEntity; /** - * - * @ClassName: ArticleBizImpl - * @Description:TODO(文章管理业务层实现类 || 继承BasicBizImpl || 实现IArticleBiz) + * + * @ClassName: ArticleBizImpl + * @Description:TODO(文章管理业务层实现类 || 继承BasicBizImpl || 实现IArticleBiz) * @author: 铭飞开发团队 - * @date: 2018年1月31日 下午2:53:53 - * + * @date: 2018年1月31日 下午2:53:53 + * * @Copyright: 2018 www.mingsoft.net Inc. All rights reserved. */ @Service("ArticleBizImpl") public class ArticleBizImpl extends BasicBizImpl implements IArticleBiz { - + /** * 文章持久化处理 */ private IArticleDao articleDao; - - + + /** * 栏目业务处理 */ @Autowired - private ICategoryBiz categoryBiz; + private ICategoryBiz categoryBiz; /** * 自定类型义业务处理 */ @Autowired private IColumnBiz columnBiz; - + /** * 自定义模型 */ @Autowired private IContentModelBiz contentModelBiz; - + /** * 模块管理业务层 */ @@ -94,7 +95,7 @@ public class ArticleBizImpl extends BasicBizImpl implements IArticleBiz { /** * 获取Article的持久化层 - * + * * @return 返回持Article的久化对象 */ public IArticleDao getArticleDao() { @@ -133,7 +134,7 @@ public class ArticleBizImpl extends BasicBizImpl implements IArticleBiz { /** * 获取IBaseDao的持久化层 - * + * * @return 返回持articleDao的久化对象 */ @Override @@ -165,7 +166,7 @@ public class ArticleBizImpl extends BasicBizImpl implements IArticleBiz { @Override public List query(int webId, int[] basicCategoryIds, String flag, String noFlag, String orderBy, - boolean order,String beginTime,String endTime, ArticleEntity article) { + boolean order,String beginTime,String endTime, ArticleEntity article) { // TODO Auto-generated method stub if(article == null) { article = new ArticleEntity(); @@ -175,7 +176,7 @@ public class ArticleBizImpl extends BasicBizImpl implements IArticleBiz { /** * 根据页面栏目的id获取与其绑定的文章实体 - * + * * @param basicCategoryId * @return 文章实体 */ @@ -201,7 +202,7 @@ public class ArticleBizImpl extends BasicBizImpl implements IArticleBiz { /** * 设置Article的持久化层 - * + * * @param articleDao */ @Autowired @@ -212,6 +213,10 @@ public class ArticleBizImpl extends BasicBizImpl implements IArticleBiz { @Override public List queryIdsByCategoryIdForParser(int categoryId, String beginTime,String endTime) { - return this.articleDao.queryIdsByCategoryIdForParser(categoryId,BasicUtil.getAppId(), beginTime, endTime); + return this.articleDao.queryIdsByCategoryIdForParser(categoryId,BasicUtil.getAppId(), beginTime, endTime,null,null); + } + @Override + public List queryIdsByCategoryIdForParser(int categoryId, String beginTime,String endTime,String orderBy,String order) { + return this.articleDao.queryIdsByCategoryIdForParser(categoryId,BasicUtil.getAppId(), beginTime, endTime,orderBy,order); } } \ No newline at end of file diff --git a/src/main/java/net/mingsoft/cms/dao/IArticleDao.java b/src/main/java/net/mingsoft/cms/dao/IArticleDao.java index d981012c..c48b6bdf 100644 --- a/src/main/java/net/mingsoft/cms/dao/IArticleDao.java +++ b/src/main/java/net/mingsoft/cms/dao/IArticleDao.java @@ -1,45 +1,45 @@ -/** -The MIT License (MIT) * Copyright (c) 2016 铭飞科技(mingsoft.net) - - * Permission is hereby granted, free of charge, to any person obtaining a copy of - * this software and associated documentation files (the "Software"), to deal in - * the Software without restriction, including without limitation the rights to - * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of - * the Software, and to permit persons to whom the Software is furnished to do so, - * subject to the following conditions: - - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS - * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR - * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER - * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - +/** + The MIT License (MIT) * Copyright (c) 2016 铭飞科技(mingsoft.net) + + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + package net.mingsoft.cms.dao; -import java.util.List; -import java.util.Map; - -import org.apache.ibatis.annotations.Param; - -import net.mingsoft.cms.bean.ColumnArticleIdBean; -import net.mingsoft.cms.entity.ArticleEntity; - -import net.mingsoft.base.dao.IBaseDao; - - -/** - * - * @ClassName: IArticleDao - * @Description:TODO(文章管理持久化层 || 继承IBaseDao持久化层) - * @author: 铭飞开发团队 - * @date: 2018年1月31日 下午2:55:33 - * - * @Copyright: 2018 www.mingsoft.net Inc. All rights reserved. +import java.util.List; +import java.util.Map; + +import org.apache.ibatis.annotations.Param; + +import net.mingsoft.cms.bean.ColumnArticleIdBean; +import net.mingsoft.cms.entity.ArticleEntity; + +import net.mingsoft.base.dao.IBaseDao; + + +/** + * + * @ClassName: IArticleDao + * @Description:TODO(文章管理持久化层 || 继承IBaseDao持久化层) + * @author: 铭飞开发团队 + * @date: 2018年1月31日 下午2:55:33 + * + * @Copyright: 2018 www.mingsoft.net Inc. All rights reserved. */ public interface IArticleDao extends IBaseDao { @@ -54,24 +54,24 @@ public interface IArticleDao extends IBaseDao { * @param article * 文章实体,便于扩展查询 * @return 文章总数 - */ + */ @Deprecated int count(@Param("webId") int webId, @Param("basicCategoryIds") int[] basicCategoryIds, @Param("flag") String flag, - @Param("noFlag") String noFlag, @Param("article") ArticleEntity article); + @Param("noFlag") String noFlag, @Param("article") ArticleEntity article); /** * 通过分类id获取文章内容 - * + * * @param categoryId * 分类编号 * @return 文章集合 - */ + */ @Deprecated List getByCategoryId(@Param("categoryId") int categoryId); /** * 通过视图表来查询文章总数 - * + * * @param basicId * 文章编号 * @param contentModelTableName @@ -81,7 +81,7 @@ public interface IArticleDao extends IBaseDao { /** * 查找basicId上一篇文章 - * + * * @param appId * 应用编号 * @param basicId @@ -91,11 +91,11 @@ public interface IArticleDao extends IBaseDao { * @return */ ArticleEntity getNextOrPrevious(@Param("appId") int appId, @Param("basicId") int basicId, - @Param("flag") boolean flag, @Param("categoryId") Integer categoryId); + @Param("flag") boolean flag, @Param("categoryId") Integer categoryId); /** * 根据查询文章实体总数 - * + * * @param tableName * :自定义生成的表名 * @param map @@ -104,11 +104,11 @@ public interface IArticleDao extends IBaseDao { * @return 文章实体总数 */ int getSearchCount(@Param("tableName") String tableName, @Param("map") Map map, - @Param("websiteId") int websiteId, @Param("ids") String ids); + @Param("websiteId") int websiteId, @Param("ids") String ids); /** * 文章查询 - * + * * @para webId 网站编号 * @param basicCategoryIds * 栏目编号集合 @@ -121,19 +121,19 @@ public interface IArticleDao extends IBaseDao { * @param order * true 升序 false 降序 排序方式 * @param article - * 文章实体,便于扩展查询 - * @param beginTime 开始时间 + * 文章实体,便于扩展查询 + * @param beginTime 开始时间 * @param endTime 结束时间 * @return 文章集合 */ List query(@Param("webId") int webId, @Param("basicCategoryIds") int[] basicCategoryIds, - @Param("flag") String flag, @Param("noFlag") String noFlag, @Param("orderBy") String orderBy, - @Param("order") boolean order, @Param("beginTime") String beginTime,@Param("endTime") String endTime, - @Param("article") ArticleEntity article); + @Param("flag") String flag, @Param("noFlag") String noFlag, @Param("orderBy") String orderBy, + @Param("order") boolean order, @Param("beginTime") String beginTime,@Param("endTime") String endTime, + @Param("article") ArticleEntity article); /** * 根据页面栏目的id获取与其绑定的文章实体 - * + * * @param basicCategoryId * @return 文章实体 */ @@ -142,7 +142,7 @@ public interface IArticleDao extends IBaseDao { /** * 根据查询文章实体 - * + * * @param tableName * :自定义生成的表名 * @param map @@ -152,16 +152,18 @@ public interface IArticleDao extends IBaseDao { */ @Deprecated List queryListForSearch(@Param("tableName") String tableName, @Param("map") Map map, - @Param("websiteId") int websiteId, @Param("ids") List ids, - @Param("sortMap") Map sortMap); - - /** - * 查询文章编号集合 - * @param categoryId 栏目编号 - * @param appId 站点编号 - * @param beginTime 开始时间 - * @param endTime 结束时间 - * @return - */ - public List queryIdsByCategoryIdForParser(@Param("categoryId")int categoryId,@Param("appId")int appId , @Param("beginTime") String beginTime,@Param("endTime") String endTime); + @Param("websiteId") int websiteId, @Param("ids") List ids, + @Param("sortMap") Map sortMap); + + /** + * 查询文章编号集合 + * @param categoryId 栏目编号 + * @param appId 站点编号 + * @param beginTime 开始时间 + * @param endTime 结束时间 + * @return + */ + public List queryIdsByCategoryIdForParser(@Param("categoryId")int categoryId,@Param("appId")int appId , @Param("beginTime") String beginTime,@Param("endTime") String endTime,@Param("orderBy")String orderBy,@Param("order")String order); + + } \ No newline at end of file diff --git a/src/main/java/net/mingsoft/cms/dao/IArticleDao.xml b/src/main/java/net/mingsoft/cms/dao/IArticleDao.xml index 5e235493..9e17ef2e 100644 --- a/src/main/java/net/mingsoft/cms/dao/IArticleDao.xml +++ b/src/main/java/net/mingsoft/cms/dao/IArticleDao.xml @@ -36,7 +36,7 @@ + javaType="net.mingsoft.basic.entity.ColumnEntity"> @@ -47,9 +47,10 @@ - - + + + @@ -68,13 +69,13 @@ - - @@ -85,7 +86,7 @@ + javaType="net.mingsoft.basic.entity.ColumnEntity"> @@ -101,7 +102,7 @@ BASIC_DISPLAY,BASIC_TITLE,BASIC_DESCRIPTION,BASIC_THUMBNAILS,BASIC_HIT,BASIC_DATETIME,BASIC_UPDATETIME,BASIC_PEOPLEID,BASIC_CATEGORYID,BASIC_SORT - + BASIC_DISPLAY,BASIC_ID,BASIC_CATEGORYID,BASIC_TITLE,BASIC_DESCRIPTION,BASIC_THUMBNAILS,BASIC_HIT,BASIC_DATETIME,BASIC_UPDATETIME,BASIC_PEOPLEID,BASIC_SORT, @@ -186,10 +187,10 @@ where a.ARTICLE_BASICID=#{basicId} - + - CONCAT('%',#{article.basicTitle},'%') + CONCAT('%',#{article.basicTitle},'%') '%'||#{ article.basicTitle}||'%' @@ -199,7 +200,7 @@ - CONCAT('%',#{flag},'%') + CONCAT('%',#{flag},'%') '%'||#{ flag}||'%' @@ -209,7 +210,7 @@ - CONCAT('%',#{noFlag},'%') + CONCAT('%',#{noFlag},'%') '%'||#{ noFlag}||'%' @@ -237,7 +238,7 @@ and b.BASIC_CATEGORYID in + open="(" separator="," close=")"> #{categoryId} @@ -250,15 +251,15 @@ - + select ,c.CATEGORY_TITLE,c.CATEGORY_ID - ,cl.COLUMN_PATH,cl.COLUMN_CM_ID,cl.COLUMN_TYPE,cl.COLUMN_CATEGORY_ID - 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 + ,cl.COLUMN_PATH,cl.COLUMN_CM_ID,cl.COLUMN_TYPE,cl.COLUMN_CATEGORY_ID + 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 where a.ARTICLE_WEBID = #{webId} @@ -270,7 +271,7 @@ and b.BASIC_CATEGORYID in + open="(" separator="," close=")"> #{categoryId} @@ -321,23 +322,26 @@ select 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 + FROM cms_article a LEFT JOIN basic ON a.ARTICLE_BASICID = basic.BASIC_ID + LEFT JOIN basic_column cl ON basic.BASIC_CATEGORYID = cl.COLUMN_CATEGORY_ID JOIN category c ON c.CATEGORY_ID = cl.COLUMN_CATEGORY_ID - where + where a.ARTICLE_WEBID = #{appId} - and (b.basic_categoryid=#{categoryId} or b.basic_categoryid in - (select category_id FROM category where )) + and (basic.basic_categoryid=#{categoryId} or basic.basic_categoryid in + (select category_id FROM category where )) - and b.basic_updatetime >= #{beginTime} + and basic.basic_updatetime >= #{beginTime} - and b.basic_updatetime >= #{endTime} + and basic.basic_updatetime >= #{endTime} + + + ORDER BY `${orderBy}` ${order} @@ -359,24 +363,24 @@ like CONCAT("%", - - #{val} - - ,"%") + + #{val} + + ,"%") like '%'|| - - #{val} - - ||'%' + + #{val} + + ||'%' like '%'+ - - #{val} - - +'%' + + #{val} + + +'%' @@ -398,12 +402,12 @@ and b.BASIC_CATEGORYID in + separator="," close=")"> #{id.categoryId} + separator="" close=""> and ${key} @@ -421,7 +425,7 @@ between + separator="and"> #{val} @@ -460,12 +464,12 @@ cl.COLUMN_CATEGORY_ID left join ${tableName} d on d.basicId=a.ARTICLE_BASICID - where a.ARTICLE_WEBID = #{websiteId} + where a.ARTICLE_WEBID = #{websiteId} and FIND_IN_SET(category_categoryid,'${ids}') + separator="" close=""> and ${key} @@ -483,7 +487,7 @@ between + separator="and"> #{val} @@ -505,12 +509,12 @@ - select - - from + select + + from (((basic JOIN cms_article ON (BASIC_ID = ARTICLE_BASICID)) - JOIN basic_column ON (BASIC_CATEGORYID = COLUMN_CATEGORY_ID)) - JOIN category ON (COLUMN_CATEGORY_ID = CATEGORY_ID)) + JOIN basic_column ON (BASIC_CATEGORYID = COLUMN_CATEGORY_ID)) + JOIN category ON (COLUMN_CATEGORY_ID = CATEGORY_ID)) left join ${contentModelTableName} cmt on cmt.basicid=basic_id @@ -531,12 +535,12 @@ - from + from (((basic JOIN cms_article ON (BASIC_ID = ARTICLE_BASICID)) - JOIN basic_column ON (BASIC_CATEGORYID = COLUMN_CATEGORY_ID)) - JOIN category ON (COLUMN_CATEGORY_ID = CATEGORY_ID)) - - where category_appid=#{appId} + JOIN basic_column ON (BASIC_CATEGORYID = COLUMN_CATEGORY_ID)) + JOIN category ON (COLUMN_CATEGORY_ID = CATEGORY_ID)) + + where category_appid=#{appId} and basic_id < ${basicId} @@ -551,7 +555,7 @@ - select + select @@ -564,7 +568,7 @@ - select + select and rownum=1 @@ -598,13 +602,13 @@ - select + select - from + from (((basic JOIN cms_article ON (BASIC_ID = ARTICLE_BASICID)) - JOIN basic_column ON (BASIC_CATEGORYID = COLUMN_CATEGORY_ID)) - JOIN category ON (COLUMN_CATEGORY_ID = CATEGORY_ID)) - where basic_categoryId=#{categoryId} order by basic_id desc + JOIN basic_column ON (BASIC_CATEGORYID = COLUMN_CATEGORY_ID)) + JOIN category ON (COLUMN_CATEGORY_ID = CATEGORY_ID)) + where basic_categoryId=#{categoryId} order by basic_id desc @@ -613,7 +617,7 @@ ARTICLE_BASICID in #{item} + separator="," close=")">#{item} diff --git a/src/main/java/net/mingsoft/cms/resources/resources_zh_CN.properties b/src/main/java/net/mingsoft/cms/resources/resources_zh_CN.properties index 6706675b..b9bb6c6a 100644 --- a/src/main/java/net/mingsoft/cms/resources/resources_zh_CN.properties +++ b/src/main/java/net/mingsoft/cms/resources/resources_zh_CN.properties @@ -1,5 +1,6 @@ -#mcms\u7248\u672c +#mcms\u7248\u672C version=d3a98fefcb242db78da5fc31608ff247 -templet.file=\u6a21\u677f\u6587\u4ef6\u4e0d\u5b58\u5728 -id=\u6587\u7ae0\u7f16\u53f7 -typeid=\u680f\u76ee\u7f16\u53f7 +templet.file=\u6A21\u677F\u6587\u4EF6\u4E0D\u5B58\u5728 +id=\u6587\u7AE0\u7F16\u53F7 +typeid=\u680F\u76EE\u7F16\u53F7 +order=\u6392\u5E8F diff --git a/src/main/java/net/mingsoft/config/WebConfig.java b/src/main/java/net/mingsoft/config/WebConfig.java index d837dff7..e89a8a3e 100644 --- a/src/main/java/net/mingsoft/config/WebConfig.java +++ b/src/main/java/net/mingsoft/config/WebConfig.java @@ -1,5 +1,9 @@ package net.mingsoft.config; +import java.io.File; +import java.util.Arrays; + +import net.mingsoft.basic.filter.XSSEscapeFilter; import org.springframework.aop.Advisor; import org.springframework.aop.support.DefaultPointcutAdvisor; import org.springframework.aop.support.JdkRegexpMethodPointcut; @@ -23,6 +27,7 @@ import com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator; import com.alibaba.druid.support.spring.stat.DruidStatInterceptor; import net.mingsoft.basic.interceptor.ActionInterceptor; +import net.mingsoft.basic.util.BasicUtil; @Configuration public class WebConfig implements WebMvcConfigurer { @@ -50,15 +55,23 @@ public class WebConfig implements WebMvcConfigurer { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler("/html/**").addResourceLocations("/html/"); - registry.addResourceHandler("/app/**").addResourceLocations("classpath:/app/"); - registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); - registry.addResourceHandler("/api/**").addResourceLocations("classpath:/api/"); + //jar包方式映射处理 + String classPath = BasicUtil.getClassPath(""); + if (classPath.startsWith("file")) { + registry.addResourceHandler("/upload/**").addResourceLocations("file:" + BasicUtil.getRealPath("upload") + File.separator); + registry.addResourceHandler("/html/**").addResourceLocations("file:" + BasicUtil.getRealPath("html") + File.separator); + registry.addResourceHandler("/templets/**").addResourceLocations("file:" + BasicUtil.getRealPath("templets") + File.separator); + } else { + //必须做判断,不然jar运行的html路径会被覆盖掉 + registry.addResourceHandler("/html/**").addResourceLocations("/html/"); + } + registry.addResourceHandler("/app/**").addResourceLocations("/app/", "classpath:/app/"); + registry.addResourceHandler("/static/**").addResourceLocations("/static/", "classpath:/static/"); + registry.addResourceHandler("/api/**").addResourceLocations("/api/", "classpath:/api/"); } - - /** - * druidServlet注册 - */ + /** + * druidServlet注册 + */ @Bean public ServletRegistrationBean druidServletRegistration() { ServletRegistrationBean registration = new ServletRegistrationBean(new StatViewServlet()); @@ -120,18 +133,16 @@ public class WebConfig implements WebMvcConfigurer { return new DefaultPointcutAdvisor(druidStatPointcut(), druidStatInterceptor()); } - // /** - // * xssFilter注册 - // */ - // @Bean - // public FilterRegistrationBean xssFilterRegistration() { - // XssFilter xssFilter = new XssFilter(); - // xssFilter.setUrlExclusion(Arrays.asList("/static/")); - // FilterRegistrationBean registration = new - // FilterRegistrationBean(xssFilter); - // registration.addUrlPatterns("/*"); - // return registration; - // } + /** + * xssFilter注册 + */ + @Bean + public FilterRegistrationBean xssFilterRegistration() { + XSSEscapeFilter xssFilter = new XSSEscapeFilter(); + FilterRegistrationBean registration = new FilterRegistrationBean(xssFilter); + registration.addUrlPatterns("/*"); + return registration; + } /** * RequestContextListener注册 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 60bc8cdf..ff0cc3be 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -13,7 +13,7 @@ ms: upload: path: /upload - denied: exe + denied: .exe,.jsp allowed: jpg max-size: 1 memory-size: 4096 diff --git a/src/main/webapp/WEB-INF/manager/cms/article/article_main.ftl b/src/main/webapp/WEB-INF/manager/cms/article/article_main.ftl index db39cbb8..ab8dd801 100644 --- a/src/main/webapp/WEB-INF/manager/cms/article/article_main.ftl +++ b/src/main/webapp/WEB-INF/manager/cms/article/article_main.ftl @@ -87,7 +87,7 @@ field: 'basicDateTime', title: '发布时间', align: 'center', - width: 90 + width: 150 }] }); //查询文章标题 diff --git a/src/main/webapp/WEB-INF/manager/login.ftl b/src/main/webapp/WEB-INF/manager/login.ftl new file mode 100644 index 00000000..4ed6ba1d --- /dev/null +++ b/src/main/webapp/WEB-INF/manager/login.ftl @@ -0,0 +1,164 @@ + + + + ${app.appName} + <#include "/include/head-file.ftl"/> + + + + + + + + + + + + + + + + + + + 账户登录 / User login + + + + + + + + + + + 看不清? + 换一张 + + + + 记住密码 + + + 登录 + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/manager/main.ftl b/src/main/webapp/WEB-INF/manager/main.ftl index f5e5a622..5e14e7b9 100644 --- a/src/main/webapp/WEB-INF/manager/main.ftl +++ b/src/main/webapp/WEB-INF/manager/main.ftl @@ -3,24 +3,604 @@ 铭飞CMS - + + - + + + <#include "../../include/head-file.ftl"> -欢迎使用铭飞产品技术交流加群:①242805203 ②231212174(满) ③221335098(满) 或到官方论坛进行技术交流 + + + + + + + 实时数据 + + + + 在售 + 断货 + 停售 + + + 1204 + 23 + 2 + + + 99% + 5% + 0.1% + + + + + + 计划目标 + + + + 生产中 + 已完成 + + + 104 + 230 + + + 28% + 62% + + + + + + 财务状况 + + 五月 + + + + + 当前余额 + 待收货款 + + + ¥120400.00 + ¥5111.99 + + + <#--统计图--> + + + + + + + + 广告收支对比 + + <#--统计图--> + + + + + 生命周期 + + <#--统计图--> + + + + + 销售物流 + + + <#--统计图--> + + + + + 团队业绩 + + 本周 + + + + + + <#--统计图--> + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file +
+ 看不清? + 换一张 +
技术交流加群:①242805203 ②231212174(满) ③221335098(满) 或到官方论坛进行技术交流