Ver Fonte

fix:待发布版本

Signed-off-by: mingsoft <killfen@126.com>
msgroup há 2 anos atrás
pai
commit
644f0bdc95

+ 24 - 24
src/main/java/net/mingsoft/cms/action/BaseAction.java

@@ -18,27 +18,27 @@
  * 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.action;
-
-import java.util.MissingResourceException;
-
-/**
- * @Author: 铭飞开源团队--huise
- * @Date: 2019/8/9 20:47
- */
-public class BaseAction extends net.mingsoft.basic.action.BaseAction{
-    @Override
-    protected String getResString(String key) {
-        // TODO Auto-generated method stub
-        String str = "";
-        try {
-            str = super.getResString(key);
-        } catch (MissingResourceException e) {
-            str = getLocaleString(key,net.mingsoft.cms.constant.Const.RESOURCES);
-        }
-
-        return str;
-    }
-}
+
+
+package net.mingsoft.cms.action;
+
+import java.util.MissingResourceException;
+
+/**
+ * @Author: 铭飞开源团队--huise
+ * @Date: 2019/8/9 20:47
+ */
+public class BaseAction extends net.mingsoft.basic.action.BaseAction{
+    @Override
+    protected String getResString(String key) {
+        // TODO Auto-generated method stub
+        String str = "";
+        try {
+            str = super.getResString(key);
+        } catch (MissingResourceException e) {
+            str = getLocaleString(key,net.mingsoft.cms.constant.Const.RESOURCES);
+        }
+
+        return str;
+    }
+}

+ 298 - 292
src/main/java/net/mingsoft/cms/action/CategoryAction.java

@@ -7,10 +7,10 @@
  * 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:
-
+ * <p>
  * The above copyright notice and this permission notice shall be included in all
  * copies or substantial portions of the Software.
-
+ * <p>
  * 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
@@ -23,6 +23,7 @@
 package net.mingsoft.cms.action;
 
 import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -53,318 +54,323 @@ import java.util.List;
  * 创建日期:2019-11-28 15:12:32<br/>
  * 历史修订:<br/>
  */
-@Api(tags={"后端-内容模块接口"})
+@Api(tags = {"后端-内容模块接口"})
 @Controller("cmsCategoryAction")
 @RequestMapping("/${ms.manager.path}/cms/category")
 public class CategoryAction extends BaseAction {
 
 
-	/**
-	 * 注入分类业务层
-	 */
-	@Autowired
-	private ICategoryBiz categoryBiz;
+    /**
+     * 注入分类业务层
+     */
+    @Autowired
+    private ICategoryBiz categoryBiz;
 
-	/**
-	 * 返回主界面index
-	 * @return
-	 */
-	@GetMapping("/index")
-	@RequiresPermissions("cms:category:view")
-	public String index(){
-		return "/cms/category/index";
-	}
+    /**
+     * 返回主界面index
+     * @return
+     */
+    @GetMapping("/index")
+    @RequiresPermissions("cms:category:view")
+    public String index() {
+        return "/cms/category/index";
+    }
 
-	/**
-	 * 查询分类列表接口
-	 * @param category 栏目实体
-	 * @return
-	 */
-	@ApiOperation(value = "查询分类列表接口")
-	@ApiImplicitParams({
-    	@ApiImplicitParam(name = "categoryTitle", value = "栏目管理名称", required =false,paramType="query"),
-    	@ApiImplicitParam(name = "categoryParentId", value = "父类型编号", required =false,paramType="query"),
+    /**
+     * 查询分类列表接口
+     * @param category 栏目实体
+     * @return
+     */
+    @ApiOperation(value = "查询分类列表接口")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "categoryTitle", value = "栏目管理名称", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryParentId", value = "父类型编号", required = false, paramType = "query"),
     })
-	@RequestMapping(value="/list",method = {RequestMethod.GET, RequestMethod.POST})
-	@ResponseBody
-	public ResultData list(@ModelAttribute @ApiIgnore CategoryEntity category) {
-		BasicUtil.startPage();
-		List categoryList = categoryBiz.query(category);
-		return ResultData.build().success(new EUListBean(categoryList,(int) BasicUtil.endPage(categoryList).getTotal()));
-	}
-
-	/**
-	 * 返回编辑界面category_form
-	 * @param category 栏目
-	 * @return
-	 */
-	@GetMapping("/form")
-	public String form(@ModelAttribute CategoryEntity category, ModelMap model){
-		model.addAttribute("appId", BasicUtil.getApp().getAppId());
-		return "/cms/category/form";
-	}
+    @RequestMapping(value = "/list", method = {RequestMethod.GET, RequestMethod.POST})
+    @ResponseBody
+    public ResultData list(@ModelAttribute @ApiIgnore CategoryEntity category) {
+        BasicUtil.startPage();
+        List categoryList = categoryBiz.list(new LambdaQueryWrapper<CategoryEntity>(category));
+        return ResultData.build().success(new EUListBean(categoryList, (int) BasicUtil.endPage(categoryList).getTotal()));
+    }
 
-	/**
-	 * 获取分类
-	 * @param category 分类实体
-	 */
-	@ApiOperation(value = "获取分类列表接口")
-    @ApiImplicitParam(name = "id", value = "编号", required =true,paramType="query")
-	@GetMapping("/get")
-	@RequiresPermissions("cms:category:view")
-	@ResponseBody
-	public ResultData get(@ModelAttribute @ApiIgnore CategoryEntity category){
-		if(category.getId()==null) {
-			return ResultData.build().error();
-		}
-		CategoryEntity _category = (CategoryEntity)categoryBiz.getById(category.getId());
-		return ResultData.build().success(_category);
-	}
+    /**
+     * 返回编辑界面category_form
+     * @param category 栏目
+     * @return
+     */
+    @GetMapping("/form")
+    public String form(@ModelAttribute CategoryEntity category, ModelMap model) {
+        model.addAttribute("appId", BasicUtil.getApp().getAppId());
+        return "/cms/category/form";
+    }
 
+    /**
+     * 获取分类
+     * @param category 分类实体
+     */
+    @ApiOperation(value = "获取分类列表接口")
+    @ApiImplicitParam(name = "id", value = "编号", required = true, paramType = "query")
+    @GetMapping("/get")
+    @RequiresPermissions("cms:category:view")
+    @ResponseBody
+    public ResultData get(@ModelAttribute @ApiIgnore CategoryEntity category) {
+        if (category.getId() == null) {
+            return ResultData.build().error();
+        }
+        CategoryEntity _category = (CategoryEntity) categoryBiz.getById(category.getId());
+        return ResultData.build().success(_category);
+    }
 
 
-	/**
-	* 保存分类
-	* @param category 分类实体
-	*/
-	@ApiOperation(value = "保存分类列表接口")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "categoryTitle", value = "栏目管理名称", required =true,paramType="query"),
-			@ApiImplicitParam(name = "categoryId", value = "所属栏目", required =false,paramType="query"),
-			@ApiImplicitParam(name = "categoryType", value = "栏目管理属性", required =false,paramType="query"),
-			@ApiImplicitParam(name = "categorySort", value = "自定义顺序", required =false,paramType="query"),
-			@ApiImplicitParam(name = "categoryListUrl", value = "列表模板", required =false,paramType="query"),
-			@ApiImplicitParam(name = "categoryUrl", value = "内容模板", required =false,paramType="query"),
-			@ApiImplicitParam(name = "categoryKeyword", value = "栏目管理关键字", required =false,paramType="query"),
-			@ApiImplicitParam(name = "categoryDescrip", value = "栏目管理描述", required =false,paramType="query"),
-			@ApiImplicitParam(name = "categoryImg", value = "缩略图", required =false,paramType="query"),
-			@ApiImplicitParam(name = "categoryDiyUrl", value = "自定义链接", required =false,paramType="query"),
-			@ApiImplicitParam(name = "mdiyModelId", value = "栏目管理的内容模型id", required =false,paramType="query"),
-			@ApiImplicitParam(name = "categoryDatetime", value = "类别发布时间", required =false,paramType="query"),
-			@ApiImplicitParam(name = "dictId", value = "字典对应编号", required =false,paramType="query"),
-			@ApiImplicitParam(name = "categoryFlag", value = "栏目属性", required =false,paramType="query"),
-			@ApiImplicitParam(name = "categoryPath", value = "栏目路径", required =false,paramType="query"),
-			@ApiImplicitParam(name = "categoryParentId", value = "父类型编号", required =false,paramType="query"),
-	})
-	@PostMapping("/save")
-	@ResponseBody
-	@LogAnn(title = "保存分类", businessType = BusinessTypeEnum.INSERT)
-	@RequiresPermissions("cms:category:save")
-	public ResultData save(@ModelAttribute @ApiIgnore CategoryEntity category) {
-		//验证缩略图参数值是否合法
-		if (!category.getCategoryImg().matches("^\\[.{1,}]$") || category.getCategoryImg()==null){
-			category.setCategoryImg("");
-		}
-		//验证栏目管理名称的值是否合法
-		if(StringUtil.isBlank(category.getCategoryTitle())){
-			return ResultData.build().error(getResString("err.empty", this.getResString("category.title")));
-		}
-		if(!StringUtil.checkLength(category.getCategoryTitle()+"", 1, 100)){
-			return ResultData.build().error(getResString("err.length", this.getResString("category.title"), "1", "100"));
-		}
+    /**
+     * 保存分类
+     * @param category 分类实体
+     */
+    @ApiOperation(value = "保存分类列表接口")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "categoryTitle", value = "栏目管理名称", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "categoryId", value = "所属栏目", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryType", value = "栏目管理属性", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categorySort", value = "自定义顺序", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryListUrl", value = "列表模板", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryUrl", value = "内容模板", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryKeyword", value = "栏目管理关键字", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryDescrip", value = "栏目管理描述", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryImg", value = "缩略图", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryDiyUrl", value = "自定义链接", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "mdiyModelId", value = "栏目管理的内容模型id", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryDatetime", value = "类别发布时间", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "dictId", value = "字典对应编号", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryFlag", value = "栏目属性", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryPath", value = "栏目路径", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryParentId", value = "父类型编号", required = false, paramType = "query"),
+    })
+    @PostMapping("/save")
+    @ResponseBody
+    @LogAnn(title = "保存分类", businessType = BusinessTypeEnum.INSERT)
+    @RequiresPermissions("cms:category:save")
+    public ResultData save(@ModelAttribute @ApiIgnore CategoryEntity category) {
+        //验证缩略图参数值是否合法
+        if (!category.getCategoryImg().matches("^\\[.{1,}]$") || category.getCategoryImg() == null) {
+            category.setCategoryImg("");
+        }
+        //验证栏目管理名称的值是否合法
+        if (StringUtil.isBlank(category.getCategoryTitle())) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("category.title")));
+        }
+        if (!StringUtil.checkLength(category.getCategoryTitle() + "", 1, 100)) {
+            return ResultData.build().error(getResString("err.length", this.getResString("category.title"), "1", "100"));
+        }
 
-		if(!StringUtil.checkLength(category.getCategoryPath()+"", 1, 100)){
-			return ResultData.build().error(getResString("err.length", this.getResString("category.path"), "1", "100"));
-		}
-		if(!StringUtil.checkLength(category.getCategoryParentIds()+"", 1, 100)){
-			return ResultData.build().error(getResString("err.length", this.getResString("category.parent.id"), "1", "100"));
-		}
-		//判断拼音是否重复
-		if(StrUtil.isNotBlank(category.getCategoryPinyin())) {
-			CategoryEntity _category = new CategoryEntity();
-			_category.setCategoryPinyin(category.getCategoryPinyin());
-			List<CategoryEntity> query = categoryBiz.query(_category);
-			if (query.size() > 0) {
-				return ResultData.build().error(getResString("err.exist", this.getResString("category.pinyin")));
-			}
-		}
+        if (!StringUtil.checkLength(category.getCategoryPath() + "", 1, 100)) {
+            return ResultData.build().error(getResString("err.length", this.getResString("category.path"), "1", "100"));
+        }
+        if (!StringUtil.checkLength(category.getCategoryParentIds() + "", 1, 100)) {
+            return ResultData.build().error(getResString("err.length", this.getResString("category.parent.id"), "1", "100"));
+        }
+        //判断拼音是否重复
+        if (StrUtil.isNotBlank(category.getCategoryPinyin())) {
+            if (!category.getCategoryPinyin().matches("^[a-zA-Z0-9]*$")){
+                return ResultData.build().error(this.getResString("err.format"));
+            }
+            CategoryEntity _category = new CategoryEntity();
+            _category.setCategoryPinyin(category.getCategoryPinyin());
+            List<CategoryEntity> query = categoryBiz.query(_category);
+            if (query.size() > 0) {
+                return ResultData.build().error(getResString("err.exist", this.getResString("category.pinyin")));
+            }
+        }
 
-		categoryBiz.saveEntity(category);
-		return ResultData.build().success(category);
-	}
+        categoryBiz.saveEntity(category);
+        return ResultData.build().success(category);
+    }
 
-	/**
-	 * 批量删除分类列表接口
-	 * @param categorys
-	 * @return
-	 */
-	@ApiOperation(value = "批量删除分类列表接口")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "categorys", value = "删除的栏目集合", allowMultiple = true, dataType = "CategoryEntity", required = true)
+    /**
+     * 批量删除分类列表接口
+     * @param categorys
+     * @return
+     */
+    @ApiOperation(value = "批量删除分类列表接口")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "categorys", value = "删除的栏目集合", allowMultiple = true, dataType = "CategoryEntity", required = true)
 
-	})
-	@PostMapping("/delete")
-	@ResponseBody
-	@LogAnn(title = "删除分类", businessType = BusinessTypeEnum.DELETE)
-	@RequiresPermissions("cms:category:del")
-	public ResultData delete(@RequestBody List<CategoryEntity> categorys) {
-		for(int i = 0;i<categorys.size();i++){
-			categoryBiz.delete(categorys.get(i).getId());
-		}
-		return ResultData.build().success();
-	}
+    })
+    @PostMapping("/delete")
+    @ResponseBody
+    @LogAnn(title = "删除分类", businessType = BusinessTypeEnum.DELETE)
+    @RequiresPermissions("cms:category:del")
+    public ResultData delete(@RequestBody List<CategoryEntity> categorys) {
+        for (int i = 0; i < categorys.size(); i++) {
+            categoryBiz.delete(categorys.get(i).getId());
+        }
+        return ResultData.build().success();
+    }
 
-	/**
-	*	更新分类列表
-	* @param category 分类实体
-	*/
-	 @ApiOperation(value = "更新分类列表接口")
-	 @ApiImplicitParams({
-	    @ApiImplicitParam(name = "id", value = "编号", required =true,paramType="query"),
-    	@ApiImplicitParam(name = "categoryTitle", value = "栏目管理名称", required =true,paramType="query"),
-		@ApiImplicitParam(name = "categoryId", value = "所属栏目", required =false,paramType="query"),
-		@ApiImplicitParam(name = "categoryType", value = "栏目管理属性", required =false,paramType="query"),
-		@ApiImplicitParam(name = "categorySort", value = "自定义顺序", required =false,paramType="query"),
-		@ApiImplicitParam(name = "categoryListUrl", value = "列表模板", required =false,paramType="query"),
-		@ApiImplicitParam(name = "categoryUrl", value = "内容模板", required =false,paramType="query"),
-		@ApiImplicitParam(name = "categoryKeyword", value = "栏目管理关键字", required =false,paramType="query"),
-		@ApiImplicitParam(name = "categoryDescrip", value = "栏目管理描述", required =false,paramType="query"),
-		@ApiImplicitParam(name = "categoryImg", value = "缩略图", required =false,paramType="query"),
-		@ApiImplicitParam(name = "categoryDiyUrl", value = "自定义链接", required =false,paramType="query"),
-		@ApiImplicitParam(name = "mdiyModelId", value = "栏目管理的内容模型id", required =false,paramType="query"),
-		@ApiImplicitParam(name = "categoryDatetime", value = "类别发布时间", required =false,paramType="query"),
-		@ApiImplicitParam(name = "dictId", value = "字典对应编号", required =false,paramType="query"),
-		@ApiImplicitParam(name = "categoryFlag", value = "栏目属性", required =false,paramType="query"),
-		@ApiImplicitParam(name = "categoryPath", value = "栏目路径", required =false,paramType="query"),
-		@ApiImplicitParam(name = "categoryParentId", value = "父类型编号", required =false,paramType="query"),
-	})
-	@PostMapping("/update")
-	@ResponseBody
-	@LogAnn(title = "更新分类", businessType = BusinessTypeEnum.UPDATE)
-	@RequiresPermissions("cms:category:update")
-	public ResultData update(@ModelAttribute @ApiIgnore CategoryEntity category) {
-		 //验证缩略图参数值是否合法
-		 if (!category.getCategoryImg().matches("^\\[.{1,}]$") || category.getCategoryImg()==null){
-			 category.setCategoryImg("");
-		 }
-		//验证栏目管理名称的值是否合法
-		if(StringUtil.isBlank(category.getCategoryTitle())){
-			return ResultData.build().error(getResString("err.empty", this.getResString("category.title")));
-		}
-		if(!StringUtil.checkLength(category.getCategoryTitle()+"", 1, 100)){
-			return ResultData.build().error(getResString("err.length", this.getResString("category.title"), "1", "100"));
-		}
+    /**
+     *	更新分类列表
+     * @param category 分类实体
+     */
+    @ApiOperation(value = "更新分类列表接口")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "编号", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "categoryTitle", value = "栏目管理名称", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "categoryId", value = "所属栏目", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryType", value = "栏目管理属性", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categorySort", value = "自定义顺序", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryListUrl", value = "列表模板", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryUrl", value = "内容模板", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryKeyword", value = "栏目管理关键字", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryDescrip", value = "栏目管理描述", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryImg", value = "缩略图", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryDiyUrl", value = "自定义链接", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "mdiyModelId", value = "栏目管理的内容模型id", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryDatetime", value = "类别发布时间", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "dictId", value = "字典对应编号", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryFlag", value = "栏目属性", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryPath", value = "栏目路径", required = false, paramType = "query"),
+            @ApiImplicitParam(name = "categoryParentId", value = "父类型编号", required = false, paramType = "query"),
+    })
+    @PostMapping("/update")
+    @ResponseBody
+    @LogAnn(title = "更新分类", businessType = BusinessTypeEnum.UPDATE)
+    @RequiresPermissions("cms:category:update")
+    public ResultData update(@ModelAttribute @ApiIgnore CategoryEntity category) {
+        //验证缩略图参数值是否合法
+        if (!category.getCategoryImg().matches("^\\[.{1,}]$") || category.getCategoryImg() == null) {
+            category.setCategoryImg("");
+        }
+        //验证栏目管理名称的值是否合法
+        if (StringUtil.isBlank(category.getCategoryTitle())) {
+            return ResultData.build().error(getResString("err.empty", this.getResString("category.title")));
+        }
+        if (!StringUtil.checkLength(category.getCategoryTitle() + "", 1, 100)) {
+            return ResultData.build().error(getResString("err.length", this.getResString("category.title"), "1", "100"));
+        }
 
-		if(!StringUtil.checkLength(category.getCategoryPath()+"", 0, 100)){
-			return ResultData.build().error(getResString("err.length", this.getResString("category.path"), "1", "100"));
-		}
-		if(!StringUtil.checkLength(category.getCategoryParentIds()+"", 0, 100)){
-			return ResultData.build().error(getResString("err.length", this.getResString("category.parent.id"), "1", "100"));
-		}
-		 //判断拼音是否重复并且是否和原拼音相同
-		 if(StrUtil.isNotBlank(category.getCategoryPinyin()) && !categoryBiz.getById(category.getId()).getCategoryPinyin().equals(category.getCategoryPinyin())) {
-			 CategoryEntity _category = new CategoryEntity();
-			 _category.setCategoryPinyin(category.getCategoryPinyin());
-			 List<CategoryEntity> query = categoryBiz.query(_category);
-			 if (query.size() > 0) {
-				 return ResultData.build().error(getResString("err.exist", this.getResString("category.pinyin")));
-			 }
-		 }
-		 String pingYin = PinYinUtil.getPingYin(category.getCategoryTitle());
-		 //如果用户填写了拼音则使用用户填写的
-		 if (StrUtil.isNotBlank(category.getCategoryPinyin())) {
-		 	pingYin = category.getCategoryPinyin();
-		 }
-		 CategoryEntity categoryEntity=new CategoryEntity();
-		 categoryEntity.setCategoryPinyin(pingYin);
-		 CategoryEntity categoryBizEntity = categoryBiz.getEntity(categoryEntity);
-		 category.setCategoryPinyin(pingYin);
-		 //如果存在此拼音栏目则拼接上id
-		 if(categoryBizEntity!=null&&!categoryBizEntity.getId().equals(category.getId())){
-			 category.setCategoryPinyin(pingYin+category.getId());
-		 }
-		//判断是否选择子级为所属栏目
-		 CategoryEntity _category = new CategoryEntity();
-		 _category.setId(category.getId());
-		 List<CategoryEntity> categoryList = categoryBiz.queryChildren(_category);
-		 if(categoryList.size()>1) {
-			 for(CategoryEntity item:categoryList){
-				 if(item.getId().equals(category.getCategoryId())){
-					 return ResultData.build().error(getResString("cannot.select.child"));
-				 }
-			 }
-			 category.setLeaf(false);
-		 } else {
-			 category.setLeaf(true);
-		 }
+        if (!StringUtil.checkLength(category.getCategoryPath() + "", 0, 100)) {
+            return ResultData.build().error(getResString("err.length", this.getResString("category.path"), "1", "100"));
+        }
+        if (!StringUtil.checkLength(category.getCategoryParentIds() + "", 0, 100)) {
+            return ResultData.build().error(getResString("err.length", this.getResString("category.parent.id"), "1", "100"));
+        }
+        //判断拼音是否重复并且是否和原拼音相同
+        if (StrUtil.isNotBlank(category.getCategoryPinyin()) && !categoryBiz.getById(category.getId()).getCategoryPinyin().equals(category.getCategoryPinyin())) {
+            if (!category.getCategoryPinyin().matches("^[a-zA-Z0-9]*$")){
+                return ResultData.build().error(this.getResString("err.format"));
+            }
+            CategoryEntity _category = new CategoryEntity();
+            _category.setCategoryPinyin(category.getCategoryPinyin());
+            List<CategoryEntity> query = categoryBiz.query(_category);
+            if (query.size() > 0) {
+                return ResultData.build().error(getResString("err.exist", this.getResString("category.pinyin")));
+            }
+        }
+        String pingYin = PinYinUtil.getPingYin(category.getCategoryTitle());
+        //如果用户填写了拼音则使用用户填写的
+        if (StrUtil.isNotBlank(category.getCategoryPinyin())) {
+            pingYin = category.getCategoryPinyin();
+        }
+        CategoryEntity categoryEntity = new CategoryEntity();
+        categoryEntity.setCategoryPinyin(pingYin);
+        CategoryEntity categoryBizEntity = categoryBiz.getEntity(categoryEntity);
+        category.setCategoryPinyin(pingYin);
+        //如果存在此拼音栏目则拼接上id
+        if (categoryBizEntity != null && !categoryBizEntity.getId().equals(category.getId())) {
+            category.setCategoryPinyin(pingYin + category.getId());
+        }
+        //判断是否选择子级为所属栏目
+        CategoryEntity _category = new CategoryEntity();
+        _category.setId(category.getId());
+        List<CategoryEntity> categoryList = categoryBiz.queryChildren(_category);
+        if (categoryList.size() > 1) {
+            for (CategoryEntity item : categoryList) {
+                if (item.getId().equals(category.getCategoryId())) {
+                    return ResultData.build().error(getResString("cannot.select.child"));
+                }
+            }
+            category.setLeaf(false);
+        } else {
+            category.setLeaf(true);
+        }
 
-		 // 这里不能使用mybitsplus 存在业务
-		 categoryBiz.updateEntity(category);
-		return ResultData.build().success(category);
-	}
+        // 这里不能使用mybitsplus 存在业务
+        categoryBiz.updateEntity(category);
+        return ResultData.build().success(category);
+    }
 
-	/**
-	 * 验证拼音
-	 * @param category 栏目
-	 * @return
-	 */
-	@ApiOperation(value = "验证拼音")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "id", value = "编号", required =true,paramType="query"),
-			@ApiImplicitParam(name = "categoryPinyin", value = "栏目管拼音", required =true,paramType="query"),
-	})
-	@GetMapping("/verifyPingYin")
-	@ResponseBody
-	public ResultData verifyPingYin(@ModelAttribute @ApiIgnore CategoryEntity category){
-	 	long count = categoryBiz.count(Wrappers.<CategoryEntity>lambdaQuery()
-				.ne(StrUtil.isNotBlank(category.getId()), CategoryEntity::getId, category.getId())
-				.eq(CategoryEntity::getCategoryPinyin, category.getCategoryPinyin()));
+    /**
+     * 验证拼音
+     * @param category 栏目
+     * @return
+     */
+    @ApiOperation(value = "验证拼音")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "编号", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "categoryPinyin", value = "栏目管拼音", required = true, paramType = "query"),
+    })
+    @GetMapping("/verifyPingYin")
+    @ResponseBody
+    public ResultData verifyPingYin(@ModelAttribute @ApiIgnore CategoryEntity category) {
+        long count = categoryBiz.count(Wrappers.<CategoryEntity>lambdaQuery()
+                .ne(StrUtil.isNotBlank(category.getId()), CategoryEntity::getId, category.getId())
+                .eq(CategoryEntity::getCategoryPinyin, category.getCategoryPinyin()));
 
-		if(count>0){
-			return ResultData.build().error("存在相同拼音的栏目");
-		}
-		return ResultData.build().success();
-	}
+        if (count > 0) {
+            return ResultData.build().error("存在相同拼音的栏目");
+        }
+        return ResultData.build().success();
+    }
 
-	/**
-	 * 批量更新模版
-	 * @param category 栏目实体
-	 * @return
-	 */
-	@ApiOperation(value = "批量更新模版")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "id", value = "编号", required =true,paramType="query"),
-			@ApiImplicitParam(name = "dictId", value = "字典", required =true,paramType="query")
-	})
-	@GetMapping("/updateTemplate")
-	@ResponseBody
-	@RequiresPermissions("cms:category:update")
-	public ResultData updateTemplate(@ModelAttribute @ApiIgnore CategoryEntity category){
-		if (category ==null || StringUtils.isEmpty(category.getId())) {
-			return ResultData.build().error(getResString("err.error", this.getResString("id")));
-		}
-		category = categoryBiz.getById(category.getId());
-		category.setCategoryParentIds(null);
-		List<CategoryEntity> childs = categoryBiz.queryChildren(category);
-		//更新与父节点相同类型的子栏目的模板内容
-		for (int i =0; i < childs.size(); i++) {
-			if (childs.get(i).getCategoryType().equals(category.getCategoryType())) {
-				childs.get(i).setCategoryUrl(category.getCategoryUrl());
-				childs.get(i).setCategoryListUrl(category.getCategoryListUrl());
-				categoryBiz.updateEntity(childs.get(i));
-			}
-		}
-		return ResultData.build().success();
-	}
+    /**
+     * 批量更新模版
+     * @param category 栏目实体
+     * @return
+     */
+    @ApiOperation(value = "批量更新模版")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "编号", required = true, paramType = "query"),
+            @ApiImplicitParam(name = "dictId", value = "字典", required = true, paramType = "query")
+    })
+    @GetMapping("/updateTemplate")
+    @ResponseBody
+    @RequiresPermissions("cms:category:update")
+    public ResultData updateTemplate(@ModelAttribute @ApiIgnore CategoryEntity category) {
+        if (category == null || StringUtils.isEmpty(category.getId())) {
+            return ResultData.build().error(getResString("err.error", this.getResString("id")));
+        }
+        category = categoryBiz.getById(category.getId());
+        category.setCategoryParentIds(null);
+        List<CategoryEntity> childs = categoryBiz.queryChildren(category);
+        //更新与父节点相同类型的子栏目的模板内容
+        for (int i = 0; i < childs.size(); i++) {
+            if (childs.get(i).getCategoryType().equals(category.getCategoryType())) {
+                childs.get(i).setCategoryUrl(category.getCategoryUrl());
+                childs.get(i).setCategoryListUrl(category.getCategoryListUrl());
+                categoryBiz.updateEntity(childs.get(i));
+            }
+        }
+        return ResultData.build().success();
+    }
 
-	/**
-	 * 复制栏目
-	 * @param category 栏目实体
-	 * @return
-	 */
-	@ApiOperation(value = "复制栏目")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "id", value = "编号", required =true,paramType="query")
-	})
-	@GetMapping("/copyCategory")
-	@ResponseBody
-	@RequiresPermissions("cms:category:save")
-	public ResultData copyCategory(@ModelAttribute @ApiIgnore CategoryEntity category){
-		if (category == null || StringUtils.isEmpty(category.getId())) {
-			return ResultData.build().error(getResString("err.error", this.getResString("id")));
-		}
-		categoryBiz.copyCategory(category);
-		return ResultData.build().success();
-	}
+    /**
+     * 复制栏目
+     * @param category 栏目实体
+     * @return
+     */
+    @ApiOperation(value = "复制栏目")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "编号", required = true, paramType = "query")
+    })
+    @GetMapping("/copyCategory")
+    @ResponseBody
+    @RequiresPermissions("cms:category:save")
+    public ResultData copyCategory(@ModelAttribute @ApiIgnore CategoryEntity category) {
+        if (category == null || StringUtils.isEmpty(category.getId())) {
+            return ResultData.build().error(getResString("err.error", this.getResString("id")));
+        }
+        categoryBiz.copyCategory(category);
+        return ResultData.build().success();
+    }
 
 }

+ 30 - 30
src/main/java/net/mingsoft/cms/bean/CategoryBean.java

@@ -18,33 +18,33 @@
  * 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.bean;
-
-import net.mingsoft.cms.entity.CategoryEntity;
-
-/**
-* 文章实体
-* @author 铭飞开发团队
-* 创建日期:2019-11-28 15:12:32<br/>
-* 历史修订:<br/>
-*/
-public class CategoryBean extends CategoryEntity {
-
-	/**
-	 * 文章编号
-	 */
-	private String articleId;
-
-
-
-
-	public String getArticleId() {
-		return articleId;
-	}
-
-	public void setArticleId(String articleId) {
-		this.articleId = articleId;
-	}
-}
+
+
+package net.mingsoft.cms.bean;
+
+import net.mingsoft.cms.entity.CategoryEntity;
+
+/**
+* 文章实体
+* @author 铭飞开发团队
+* 创建日期:2019-11-28 15:12:32<br/>
+* 历史修订:<br/>
+*/
+public class CategoryBean extends CategoryEntity {
+
+	/**
+	 * 文章编号
+	 */
+	private String articleId;
+
+
+
+
+	public String getArticleId() {
+		return articleId;
+	}
+
+	public void setArticleId(String articleId) {
+		this.articleId = articleId;
+	}
+}

+ 41 - 41
src/main/java/net/mingsoft/cms/biz/ICategoryBiz.java

@@ -18,44 +18,44 @@
  * 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 net.mingsoft.base.biz.IBaseBiz;
-import net.mingsoft.cms.entity.CategoryEntity;
-
-import java.util.List;
-
-
-/**
- * 分类业务
- * @author 铭飞开发团队
- * 创建日期:2019-11-28 15:12:32<br/>
- * 历史修订:<br/>
- */
-public interface ICategoryBiz extends IBaseBiz<CategoryEntity> {
-
-    /**
-     * 查询当前分类下的所有子分类,包含自身
-     * @param category 通过setId指定栏目id
-     * @return
-     */
-    List<CategoryEntity> queryChildren(CategoryEntity category);
-
-    void saveEntity(CategoryEntity entity);
-
-    /**更新父级及子集
-     * @param entity
-     */
-    void updateEntity(CategoryEntity entity);
-
-    /**只更新自身
-     * @param entity
-     */
-    void update(CategoryEntity entity);
-
-    void delete(String categoryId);
-
-    void copyCategory(CategoryEntity entity);
-}
+
+
+package net.mingsoft.cms.biz;
+
+import net.mingsoft.base.biz.IBaseBiz;
+import net.mingsoft.cms.entity.CategoryEntity;
+
+import java.util.List;
+
+
+/**
+ * 分类业务
+ * @author 铭飞开发团队
+ * 创建日期:2019-11-28 15:12:32<br/>
+ * 历史修订:<br/>
+ */
+public interface ICategoryBiz extends IBaseBiz<CategoryEntity> {
+
+    /**
+     * 查询当前分类下的所有子分类,包含自身
+     * @param category 通过setId指定栏目id
+     * @return
+     */
+    List<CategoryEntity> queryChildren(CategoryEntity category);
+
+    void saveEntity(CategoryEntity entity);
+
+    /**更新父级及子集
+     * @param entity
+     */
+    void updateEntity(CategoryEntity entity);
+
+    /**只更新自身
+     * @param entity
+     */
+    void update(CategoryEntity entity);
+
+    void delete(String categoryId);
+
+    void copyCategory(CategoryEntity entity);
+}

+ 16 - 16
src/main/java/net/mingsoft/cms/biz/IHistoryLogBiz.java

@@ -18,19 +18,19 @@
  * 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 net.mingsoft.base.biz.IBaseBiz;
-
-
-/**
- * 文章浏览记录业务
- * @author 铭飞开发团队
- * 创建日期:2019-12-23 9:24:03<br/>
- * 历史修订:<br/>
- */
-public interface IHistoryLogBiz extends IBaseBiz {
-
-}
+
+
+package net.mingsoft.cms.biz;
+
+import net.mingsoft.base.biz.IBaseBiz;
+
+
+/**
+ * 文章浏览记录业务
+ * @author 铭飞开发团队
+ * 创建日期:2019-12-23 9:24:03<br/>
+ * 历史修订:<br/>
+ */
+public interface IHistoryLogBiz extends IBaseBiz {
+
+}

+ 298 - 298
src/main/java/net/mingsoft/cms/biz/impl/CategoryBizImpl.java

@@ -18,301 +18,301 @@
  * 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.impl;
-
-import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import net.mingsoft.base.biz.impl.BaseBizImpl;
-import net.mingsoft.base.dao.IBaseDao;
-import net.mingsoft.basic.util.PinYinUtil;
-import net.mingsoft.cms.biz.ICategoryBiz;
-import net.mingsoft.cms.dao.ICategoryDao;
-import net.mingsoft.cms.dao.IContentDao;
-import net.mingsoft.cms.entity.CategoryEntity;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * 分类管理持久化层
- * @author 铭飞开发团队
- * 创建日期:2019-11-28 15:12:32<br/>
- * 历史修订:<br/>
- */
-@Service("cmscategoryBizImpl")
-@Transactional(rollbackFor = RuntimeException.class)
-public class CategoryBizImpl extends BaseBizImpl<ICategoryDao, CategoryEntity> implements ICategoryBiz {
-
-
-    @Autowired
-    private ICategoryDao categoryDao;
-
-    @Autowired
-    private IContentDao contentDao;
-
-
-    @Override
-    protected IBaseDao getDao() {
-        // TODO Auto-generated method stub
-        return categoryDao;
-    }
-
-    @Override
-    public List<CategoryEntity> queryChildren(CategoryEntity category) {
-        // TODO Auto-generated method stub
-        return categoryDao.queryChildren(category);
-    }
-
-    @Override
-    public void saveEntity(CategoryEntity categoryEntity) {
-        // TODO Auto-generated method stub
-        String pingYin = PinYinUtil.getPingYin(categoryEntity.getCategoryTitle());
-        //如果用户自己填入了拼音则使用用户的
-        if (StrUtil.isNotBlank(categoryEntity.getCategoryPinyin())) {
-            pingYin = categoryEntity.getCategoryPinyin();
-        }
-        CategoryEntity category = new CategoryEntity();
-        category.setCategoryPinyin(pingYin);
-        Object categoryBizEntity = getEntity(category);
-        setParentId(categoryEntity);
-        categoryEntity.setCategoryPinyin(pingYin);
-        //更新新的父级
-        if (StrUtil.isNotBlank(categoryEntity.getCategoryId()) && !"0".equals(categoryEntity.getCategoryId())) {
-            CategoryEntity parent = getById(categoryEntity.getCategoryId());
-            //如果之前是叶子节点就更新
-            if (parent.getLeaf()) {
-                parent.setLeaf(false);
-                updateById(parent);
-            }
-        }
-        categoryEntity.setLeaf(false);
-        //如果是新增栏目一定是叶子节点
-        if (StrUtil.isEmpty(categoryEntity.getId())) {
-            categoryEntity.setLeaf(true);
-        }
-        super.save(categoryEntity);
-        //拼音存在则拼接id
-        if (categoryBizEntity != null) {
-            categoryEntity.setCategoryPinyin(pingYin + categoryEntity.getId());
-        }
-        CategoryEntity parentCategory = null;
-        if (StringUtils.isNotBlank(categoryEntity.getCategoryId())) {
-            parentCategory = (CategoryEntity) getById(categoryEntity.getCategoryId());
-        }
-        //保存链接地址
-        String path = ObjectUtil.isNotNull(parentCategory) ? parentCategory.getCategoryPath() : "";
-        categoryEntity.setCategoryPath(path + "/" + categoryEntity.getCategoryPinyin());
-        setTopId(categoryEntity);
-        super.updateById(categoryEntity);
-    }
-
-    private void setParentId(CategoryEntity categoryEntity) {
-        String path = "";
-        if (StringUtils.isNotEmpty(categoryEntity.getCategoryId()) && Long.parseLong(categoryEntity.getCategoryId()) > 0) {
-            CategoryEntity category = (CategoryEntity) getById(categoryEntity.getCategoryId());
-            path = category.getCategoryPath();
-            if (StringUtils.isEmpty(category.getCategoryParentIds())) {
-                categoryEntity.setCategoryParentIds(category.getId());
-            } else {
-                categoryEntity.setCategoryParentIds(category.getCategoryParentIds() + "," + category.getId());
-            }
-        } else {
-            categoryEntity.setCategoryParentIds(null);
-        }
-        //保存时先保存再修改链接地址,修改时直接修改
-        if (StringUtils.isNotBlank(categoryEntity.getId())) {
-            categoryEntity.setCategoryPath(path + "/" + categoryEntity.getCategoryPinyin());
-        }
-
-    }
-
-    private void setChildParentId(CategoryEntity categoryEntity, String topId) {
-        CategoryEntity category = new CategoryEntity();
-        category.setCategoryId(categoryEntity.getId());
-        List<CategoryEntity> list = categoryDao.query(category);
-        list.forEach(x -> {
-            if (StringUtils.isEmpty(categoryEntity.getCategoryParentIds())) {
-                x.setCategoryParentIds(categoryEntity.getId());
-            } else {
-                x.setCategoryParentIds(categoryEntity.getCategoryParentIds() + "," + categoryEntity.getId());
-            }
-            //更新topid
-            x.setTopId(topId);
-            String path = categoryEntity.getCategoryPath();
-            //判断是否有parentIds
-            x.setCategoryPath(path + "/" + x.getCategoryPinyin());
-            //去除多余的/符号
-            super.updateEntity(x);
-            setChildParentId(x, topId);
-        });
-    }
-
-    @Override
-    public void updateEntity(CategoryEntity entity) {
-        setParentId(entity);
-        String pingYin = entity.getCategoryPinyin();
-        if (StrUtil.isNotBlank(pingYin)) {
-            CategoryEntity category = new CategoryEntity();
-            category.setCategoryPinyin(pingYin);
-            CategoryEntity categoryBizEntity = (CategoryEntity) getEntity(category);
-            //拼音存在则拼接id
-            if (categoryBizEntity != null && !categoryBizEntity.getId().equals(entity.getId())) {
-                entity.setCategoryPinyin(pingYin + entity.getId());
-            }
-        }
-        setParentLeaf(entity);
-        setTopId(entity);
-        //如果父级栏目和父级id为空字符串则转化成null
-        if (StringUtils.isEmpty(entity.getCategoryId())) {
-            entity.setCategoryId(null);
-        }
-        if (StringUtils.isEmpty(entity.getCategoryParentIds())) {
-            entity.setCategoryParentIds(null);
-        }
-        categoryDao.updateEntity(entity);
-        //更新子节点所有父节点id和topid
-        //如果本节点的topid为0(顶级栏目),则把自身的id作为子栏目的topid,非0所有的子栏目和本栏目使用同一个topid
-        String topId = entity.getTopId();
-        if (topId.equals("0")) {
-            topId = entity.getId();
-        }
-        setChildParentId(entity, topId);
-    }
-
-
-    @Override
-    public void update(CategoryEntity entity) {
-        super.updateEntity(entity);
-    }
-
-    @Override
-    public void delete(String categoryId) {
-        // TODO Auto-generated method stub
-        CategoryEntity category = (CategoryEntity) categoryDao.selectById(categoryId);
-        //删除父类
-        if (category != null) {
-            List<CategoryEntity> childrenList = categoryDao.queryChildren(category);
-            List<String> ids = new ArrayList<>();
-            for (int i = 0; i < childrenList.size(); i++) {
-                //删除子类
-                ids.add(childrenList.get(i).getId());
-            }
-            categoryDao.deleteBatchIds(ids);
-            // 删除文章
-            contentDao.deleteEntityByCategoryIds(ids.toArray(new String[ids.size()]));
-
-            //获取被删节点的父节点
-            CategoryEntity parentNode = categoryDao.selectById(category.getCategoryId());
-            //获取被删节点的所属栏目的其他节点
-            List<CategoryEntity> childNode = categoryDao.queryChildren(parentNode);
-            //判断删除的是否为主节点
-            if (parentNode != null) {
-                UpdateWrapper<CategoryEntity> updateWrapper = new UpdateWrapper<>();
-                //如果没有子节点进行更新代码
-                if (childNode.size() == 1) {
-                    updateWrapper.eq("id", parentNode.getId()).set("leaf", 1);
-                    categoryDao.update(null, updateWrapper);
-                }
-
-            }
-
-        }
-    }
-
-    /**
-     * 设置父级叶子节点
-     * @param entity
-     */
-    private void setParentLeaf(CategoryEntity entity) {
-        CategoryEntity categoryEntity = getById(entity.getId());
-        //如果父级不为空并且修改了父级则需要更新父级
-        if (entity.getCategoryId() != null && !entity.getCategoryId().equals(categoryEntity.getCategoryId())) {
-            //更新旧的父级
-            if (StrUtil.isNotBlank(categoryEntity.getCategoryId()) && !"0".equals(categoryEntity.getCategoryId())) {
-                CategoryEntity parent = getById(categoryEntity.getCategoryId());
-                //如果修改了父级则需要判断父级是否还有子节点
-                boolean leaf = parent.getLeaf();
-                //查找不等于当前更新的分类子集,有则不是叶子节点
-                QueryWrapper<CategoryEntity> queryWrapper = new QueryWrapper<>();
-                parent.setLeaf(count(queryWrapper.eq("category_id", parent.getId()).ne("id", entity.getId())) == 0);
-                if (leaf != parent.getLeaf()) {
-                    updateById(parent);
-                }
-
-            }
-            //更新新的父级
-            if (StrUtil.isNotBlank(entity.getCategoryId()) && !"0".equals(entity.getCategoryId())) {
-                CategoryEntity parent = getById(entity.getCategoryId());
-                //如果之前是叶子节点就更新
-                if (parent.getLeaf()) {
-                    parent.setLeaf(false);
-                    updateById(parent);
-                }
-            }
-        }
-    }
-
-    /**
-     * 设置顶级id
-     * @param entity
-     */
-    private void setTopId(CategoryEntity entity) {
-        String categoryParentId = entity.getCategoryParentIds();
-        if (StrUtil.isNotBlank(categoryParentId)) {
-            String[] ids = categoryParentId.split(",");
-            //如果有ParentId就取第一个
-            if (ids.length > 0) {
-                entity.setTopId(ids[0]);
-                return;
-            }
-        }
-        entity.setTopId("0");
-    }
-
-    @Override
-    public void copyCategory(CategoryEntity category) {
-        String oldId = category.getId();
-        //先保存被复制第一层栏目,因为第一层栏目不需要变更父级栏目
-        category = getById(oldId);
-        //id、拼音和路径按照原来的业务逻辑生成
-        category.setId(null);
-        category.setCategoryPinyin(null);
-        category.setCategoryPath(null);
-        saveEntity(category);
-        //传入简要被复制子栏目的id和复制后的生成的id,复制的子栏目全部使用
-        recursionCopyChilds(oldId, category.getId());
-    }
-
-    /*
-     * 递归复制子栏目
-     * @param oldParentId:被复制的父级栏目id(需要数据库原来存在该数据)
-     * @param newParentId:复制栏目后新父级的id(新插入数据的id)
-     * */
-    private void recursionCopyChilds(String oldParentId, String newParentId) {
-        CategoryEntity _category = new CategoryEntity();
-        _category.setCategoryId(oldParentId);
-        List<CategoryEntity> childs = query(_category);
-        for (CategoryEntity child : childs) {
-            String childId = child.getId();
-            //id、拼音和路径按照原来的业务逻辑生成
-            child.setId(null);
-            child.setCategoryPinyin(null);
-            child.setCategoryPath(null);
-            child.setCategoryId(newParentId);
-            saveEntity(child);
-            //如果该栏目下还有子栏目则继续复制该栏目里的子栏目
-            recursionCopyChilds(childId, child.getId());
-        }
-    }
-
-}
+
+
+
+
+package net.mingsoft.cms.biz.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import net.mingsoft.base.biz.impl.BaseBizImpl;
+import net.mingsoft.base.dao.IBaseDao;
+import net.mingsoft.basic.util.PinYinUtil;
+import net.mingsoft.cms.biz.ICategoryBiz;
+import net.mingsoft.cms.dao.ICategoryDao;
+import net.mingsoft.cms.dao.IContentDao;
+import net.mingsoft.cms.entity.CategoryEntity;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 分类管理持久化层
+ * @author 铭飞开发团队
+ * 创建日期:2019-11-28 15:12:32<br/>
+ * 历史修订:<br/>
+ */
+@Service("cmscategoryBizImpl")
+@Transactional(rollbackFor = RuntimeException.class)
+public class CategoryBizImpl extends BaseBizImpl<ICategoryDao, CategoryEntity> implements ICategoryBiz {
+
+
+    @Autowired
+    private ICategoryDao categoryDao;
+
+    @Autowired
+    private IContentDao contentDao;
+
+
+    @Override
+    protected IBaseDao getDao() {
+        // TODO Auto-generated method stub
+        return categoryDao;
+    }
+
+    @Override
+    public List<CategoryEntity> queryChildren(CategoryEntity category) {
+        // TODO Auto-generated method stub
+        return categoryDao.queryChildren(category);
+    }
+
+    @Override
+    public void saveEntity(CategoryEntity categoryEntity) {
+        // TODO Auto-generated method stub
+        String pingYin = PinYinUtil.getPingYin(categoryEntity.getCategoryTitle());
+        //如果用户自己填入了拼音则使用用户的
+        if (StrUtil.isNotBlank(categoryEntity.getCategoryPinyin())) {
+            pingYin = categoryEntity.getCategoryPinyin();
+        }
+        CategoryEntity category = new CategoryEntity();
+        category.setCategoryPinyin(pingYin);
+        Object categoryBizEntity = getEntity(category);
+        setParentId(categoryEntity);
+        categoryEntity.setCategoryPinyin(pingYin);
+        //更新新的父级
+        if (StrUtil.isNotBlank(categoryEntity.getCategoryId()) && !"0".equals(categoryEntity.getCategoryId())) {
+            CategoryEntity parent = getById(categoryEntity.getCategoryId());
+            //如果之前是叶子节点就更新
+            if (parent.getLeaf()) {
+                parent.setLeaf(false);
+                updateById(parent);
+            }
+        }
+        categoryEntity.setLeaf(false);
+        //如果是新增栏目一定是叶子节点
+        if (StrUtil.isEmpty(categoryEntity.getId())) {
+            categoryEntity.setLeaf(true);
+        }
+        super.save(categoryEntity);
+        //拼音存在则拼接id
+        if (categoryBizEntity != null) {
+            categoryEntity.setCategoryPinyin(pingYin + categoryEntity.getId());
+        }
+        CategoryEntity parentCategory = null;
+        if (StringUtils.isNotBlank(categoryEntity.getCategoryId())) {
+            parentCategory = (CategoryEntity) getById(categoryEntity.getCategoryId());
+        }
+        //保存链接地址
+        String path = ObjectUtil.isNotNull(parentCategory) ? parentCategory.getCategoryPath() : "";
+        categoryEntity.setCategoryPath(path + "/" + categoryEntity.getCategoryPinyin());
+        setTopId(categoryEntity);
+        super.updateById(categoryEntity);
+    }
+
+    private void setParentId(CategoryEntity categoryEntity) {
+        String path = "";
+        if (StringUtils.isNotEmpty(categoryEntity.getCategoryId()) && Long.parseLong(categoryEntity.getCategoryId()) > 0) {
+            CategoryEntity category = (CategoryEntity) getById(categoryEntity.getCategoryId());
+            path = category.getCategoryPath();
+            if (StringUtils.isEmpty(category.getCategoryParentIds())) {
+                categoryEntity.setCategoryParentIds(category.getId());
+            } else {
+                categoryEntity.setCategoryParentIds(category.getCategoryParentIds() + "," + category.getId());
+            }
+        } else {
+            categoryEntity.setCategoryParentIds(null);
+        }
+        //保存时先保存再修改链接地址,修改时直接修改
+        if (StringUtils.isNotBlank(categoryEntity.getId())) {
+            categoryEntity.setCategoryPath(path + "/" + categoryEntity.getCategoryPinyin());
+        }
+
+    }
+
+    private void setChildParentId(CategoryEntity categoryEntity, String topId) {
+        CategoryEntity category = new CategoryEntity();
+        category.setCategoryId(categoryEntity.getId());
+        List<CategoryEntity> list = categoryDao.query(category);
+        list.forEach(x -> {
+            if (StringUtils.isEmpty(categoryEntity.getCategoryParentIds())) {
+                x.setCategoryParentIds(categoryEntity.getId());
+            } else {
+                x.setCategoryParentIds(categoryEntity.getCategoryParentIds() + "," + categoryEntity.getId());
+            }
+            //更新topid
+            x.setTopId(topId);
+            String path = categoryEntity.getCategoryPath();
+            //判断是否有parentIds
+            x.setCategoryPath(path + "/" + x.getCategoryPinyin());
+            //去除多余的/符号
+            super.updateEntity(x);
+            setChildParentId(x, topId);
+        });
+    }
+
+    @Override
+    public void updateEntity(CategoryEntity entity) {
+        setParentId(entity);
+        String pingYin = entity.getCategoryPinyin();
+        if (StrUtil.isNotBlank(pingYin)) {
+            CategoryEntity category = new CategoryEntity();
+            category.setCategoryPinyin(pingYin);
+            CategoryEntity categoryBizEntity = (CategoryEntity) getEntity(category);
+            //拼音存在则拼接id
+            if (categoryBizEntity != null && !categoryBizEntity.getId().equals(entity.getId())) {
+                entity.setCategoryPinyin(pingYin + entity.getId());
+            }
+        }
+        setParentLeaf(entity);
+        setTopId(entity);
+        //如果父级栏目和父级id为空字符串则转化成null
+        if (StringUtils.isEmpty(entity.getCategoryId())) {
+            entity.setCategoryId(null);
+        }
+        if (StringUtils.isEmpty(entity.getCategoryParentIds())) {
+            entity.setCategoryParentIds(null);
+        }
+        categoryDao.updateEntity(entity);
+        //更新子节点所有父节点id和topid
+        //如果本节点的topid为0(顶级栏目),则把自身的id作为子栏目的topid,非0所有的子栏目和本栏目使用同一个topid
+        String topId = entity.getTopId();
+        if (topId.equals("0")) {
+            topId = entity.getId();
+        }
+        setChildParentId(entity, topId);
+    }
+
+
+    @Override
+    public void update(CategoryEntity entity) {
+        super.updateEntity(entity);
+    }
+
+    @Override
+    public void delete(String categoryId) {
+        // TODO Auto-generated method stub
+        CategoryEntity category = (CategoryEntity) categoryDao.selectById(categoryId);
+        //删除父类
+        if (category != null) {
+            List<CategoryEntity> childrenList = categoryDao.queryChildren(category);
+            List<String> ids = new ArrayList<>();
+            for (int i = 0; i < childrenList.size(); i++) {
+                //删除子类
+                ids.add(childrenList.get(i).getId());
+            }
+            categoryDao.deleteBatchIds(ids);
+            // 删除文章
+            contentDao.deleteEntityByCategoryIds(ids.toArray(new String[ids.size()]));
+
+            //获取被删节点的父节点
+            CategoryEntity parentNode = categoryDao.selectById(category.getCategoryId());
+            //获取被删节点的所属栏目的其他节点
+            List<CategoryEntity> childNode = categoryDao.queryChildren(parentNode);
+            //判断删除的是否为主节点
+            if (parentNode != null) {
+                UpdateWrapper<CategoryEntity> updateWrapper = new UpdateWrapper<>();
+                //如果没有子节点进行更新代码
+                if (childNode.size() == 1) {
+                    updateWrapper.eq("id", parentNode.getId()).set("leaf", 1);
+                    categoryDao.update(null, updateWrapper);
+                }
+
+            }
+
+        }
+    }
+
+    /**
+     * 设置父级叶子节点
+     * @param entity
+     */
+    private void setParentLeaf(CategoryEntity entity) {
+        CategoryEntity categoryEntity = getById(entity.getId());
+        //如果父级不为空并且修改了父级则需要更新父级
+        if (entity.getCategoryId() != null && !entity.getCategoryId().equals(categoryEntity.getCategoryId())) {
+            //更新旧的父级
+            if (StrUtil.isNotBlank(categoryEntity.getCategoryId()) && !"0".equals(categoryEntity.getCategoryId())) {
+                CategoryEntity parent = getById(categoryEntity.getCategoryId());
+                //如果修改了父级则需要判断父级是否还有子节点
+                boolean leaf = parent.getLeaf();
+                //查找不等于当前更新的分类子集,有则不是叶子节点
+                QueryWrapper<CategoryEntity> queryWrapper = new QueryWrapper<>();
+                parent.setLeaf(count(queryWrapper.eq("category_id", parent.getId()).ne("id", entity.getId())) == 0);
+                if (leaf != parent.getLeaf()) {
+                    updateById(parent);
+                }
+
+            }
+            //更新新的父级
+            if (StrUtil.isNotBlank(entity.getCategoryId()) && !"0".equals(entity.getCategoryId())) {
+                CategoryEntity parent = getById(entity.getCategoryId());
+                //如果之前是叶子节点就更新
+                if (parent.getLeaf()) {
+                    parent.setLeaf(false);
+                    updateById(parent);
+                }
+            }
+        }
+    }
+
+    /**
+     * 设置顶级id
+     * @param entity
+     */
+    private void setTopId(CategoryEntity entity) {
+        String categoryParentId = entity.getCategoryParentIds();
+        if (StrUtil.isNotBlank(categoryParentId)) {
+            String[] ids = categoryParentId.split(",");
+            //如果有ParentId就取第一个
+            if (ids.length > 0) {
+                entity.setTopId(ids[0]);
+                return;
+            }
+        }
+        entity.setTopId("0");
+    }
+
+    @Override
+    public void copyCategory(CategoryEntity category) {
+        String oldId = category.getId();
+        //先保存被复制第一层栏目,因为第一层栏目不需要变更父级栏目
+        category = getById(oldId);
+        //id、拼音和路径按照原来的业务逻辑生成
+        category.setId(null);
+        category.setCategoryPinyin(null);
+        category.setCategoryPath(null);
+        saveEntity(category);
+        //传入简要被复制子栏目的id和复制后的生成的id,复制的子栏目全部使用
+        recursionCopyChilds(oldId, category.getId());
+    }
+
+    /*
+     * 递归复制子栏目
+     * @param oldParentId:被复制的父级栏目id(需要数据库原来存在该数据)
+     * @param newParentId:复制栏目后新父级的id(新插入数据的id)
+     * */
+    private void recursionCopyChilds(String oldParentId, String newParentId) {
+        CategoryEntity _category = new CategoryEntity();
+        _category.setCategoryId(oldParentId);
+        List<CategoryEntity> childs = query(_category);
+        for (CategoryEntity child : childs) {
+            String childId = child.getId();
+            //id、拼音和路径按照原来的业务逻辑生成
+            child.setId(null);
+            child.setCategoryPinyin(null);
+            child.setCategoryPath(null);
+            child.setCategoryId(newParentId);
+            saveEntity(child);
+            //如果该栏目下还有子栏目则继续复制该栏目里的子栏目
+            recursionCopyChilds(childId, child.getId());
+        }
+    }
+
+}

+ 14 - 14
src/main/java/net/mingsoft/cms/constant/Const.java

@@ -18,17 +18,17 @@
  * 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.constant;
-
-/**
- * @Author: 铭飞开源团队--huise
- * @Date: 2019/8/9 20:51
- */
-public class Const {
-    /**
-     * 资源文件
-     */
-    public final static String RESOURCES = "net.mingsoft.cms.resources.resources";
-}
+
+
+package net.mingsoft.cms.constant;
+
+/**
+ * @Author: 铭飞开源团队--huise
+ * @Date: 2019/8/9 20:51
+ */
+public class Const {
+    /**
+     * 资源文件
+     */
+    public final static String RESOURCES = "net.mingsoft.cms.resources.resources";
+}

+ 27 - 27
src/main/java/net/mingsoft/cms/dao/ICategoryDao.java

@@ -18,30 +18,30 @@
  * 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 net.mingsoft.base.dao.IBaseDao;
-import net.mingsoft.cms.entity.CategoryEntity;
-import org.springframework.stereotype.Component;
-
-import java.util.List;
-
-/**
- * 分类持久层
- * @author 铭飞开发团队
- * 创建日期:2019-11-28 15:12:32<br/>
- * 历史修订:<br/>
- */
-@Component("cmsCategoryDao")
-public interface ICategoryDao extends IBaseDao<CategoryEntity> {
-
-    /**
-     * 查询当前分类下面的所有子分类
-     * @param category 必须存在categoryId categoryParentId
-     * @return
-     */
-    public List<CategoryEntity> queryChildren(CategoryEntity category);
-
-}
+
+
+package net.mingsoft.cms.dao;
+
+import net.mingsoft.base.dao.IBaseDao;
+import net.mingsoft.cms.entity.CategoryEntity;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 分类持久层
+ * @author 铭飞开发团队
+ * 创建日期:2019-11-28 15:12:32<br/>
+ * 历史修订:<br/>
+ */
+@Component("cmsCategoryDao")
+public interface ICategoryDao extends IBaseDao<CategoryEntity> {
+
+    /**
+     * 查询当前分类下面的所有子分类
+     * @param category 必须存在categoryId categoryParentId
+     * @return
+     */
+    public List<CategoryEntity> queryChildren(CategoryEntity category);
+
+}

+ 14 - 14
src/main/java/net/mingsoft/cms/dao/ICmsHistoryLogDao.java

@@ -18,17 +18,17 @@
  * 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 net.mingsoft.base.dao.IBaseDao;
-
-/**
- * 文章浏览记录持久层
- * @author 铭飞开发团队
- * 创建日期:2019-12-23 9:24:03<br/>
- * 历史修订:<br/>
- */
-public interface ICmsHistoryLogDao extends IBaseDao {
-}
+
+
+package net.mingsoft.cms.dao;
+
+import net.mingsoft.base.dao.IBaseDao;
+
+/**
+ * 文章浏览记录持久层
+ * @author 铭飞开发团队
+ * 创建日期:2019-12-23 9:24:03<br/>
+ * 历史修订:<br/>
+ */
+public interface ICmsHistoryLogDao extends IBaseDao {
+}

+ 43 - 3
src/main/java/net/mingsoft/cms/entity/CategoryEntity.java

@@ -7,10 +7,10 @@
  * 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:
-
+ * <p>
  * The above copyright notice and this permission notice shall be included in all
  * copies or substantial portions of the Software.
-
+ * <p>
  * 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
@@ -24,6 +24,11 @@ package net.mingsoft.cms.entity;
 
 import com.baomidou.mybatisplus.annotation.*;
 import net.mingsoft.base.entity.BaseEntity;
+import net.mingsoft.basic.util.BasicUtil;
+import net.mingsoft.config.MSProperties;
+import net.mingsoft.mdiy.util.ConfigUtil;
+
+import java.io.File;
 
 /**
  * 分类实体
@@ -131,6 +136,21 @@ public class CategoryEntity extends BaseEntity {
      */
     private String topId;
 
+    /**
+     * 路径url
+     */
+    @TableField(exist = false)
+    private String url;
+
+    /**
+     * 设置url路径
+     *
+     * @param url 路径的字符串
+     */
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
     public Boolean getLeaf() {
         return leaf;
     }
@@ -419,7 +439,8 @@ public class CategoryEntity extends BaseEntity {
      * 获取栏目Id(标签使用)
      */
     public Boolean getTypeleaf() {
-        return this.leaf; }
+        return this.leaf;
+    }
 
 
     /**
@@ -431,6 +452,7 @@ public class CategoryEntity extends BaseEntity {
 
     @TableField(exist = false)
     private String typepath;
+
     /**
      * 获取栏目图片 (标签使用)
      */
@@ -462,4 +484,22 @@ public class CategoryEntity extends BaseEntity {
         this.childsize = childsize;
     }
 
+    /**
+     * 获取url路径
+     *
+     * @return url路径的字符串
+     */
+    public String getUrl() {
+        String appDir = "";
+        String htmlDir = MSProperties.diy.htmlDir;
+        String categoryPath = this.getCategoryPath();
+        String categoryPinyin = this.getCategoryPinyin();
+        if (!(ConfigUtil.getBoolean("短链配置", "shortLinkSwitch", false))) {
+            //未开启短链
+            appDir = "/" + BasicUtil.getApp().getAppDir();
+            return url = "/" + htmlDir + appDir + categoryPath + "/index.html";
+        }
+        //开启短链后的url拼接
+        return url = "/" + htmlDir + appDir + "/" + categoryPinyin + ".html";
+    }
 }

+ 5 - 1
src/main/java/net/mingsoft/config/WebConfig.java

@@ -132,7 +132,8 @@ public class WebConfig implements WebMvcConfigurer {
     @Bean
     public FilterRegistrationBean xssFilterRegistration(@Value("${ms.xss.enable:true}") boolean xssEnable,
                                                         @Value("${ms.xss.filter-url}") String filterUrl,
-                                                        @Value("${ms.xss.exclude-url}") String excludeUrl) {
+                                                        @Value("${ms.xss.exclude-url}") String excludeUrl,
+                                                        @Value("${ms.xss.exclude-filed}") String excludeFiled) {
         XSSEscapeFilter xssFilter = new XSSEscapeFilter();
         Map<String, String> initParameters = new HashMap();
         FilterRegistrationBean registration = new FilterRegistrationBean();
@@ -149,6 +150,9 @@ public class WebConfig implements WebMvcConfigurer {
         }else {
             xssFilter.excludes.add(MSProperties.manager.path + "/**");
         }
+        if (excludeFiled != null && StrUtil.isNotBlank(excludeFiled)) {
+            xssFilter.excludesFiled.addAll(Arrays.asList(excludeFiled.split(",")));
+        }
         initParameters.put("isIncludeRichText", "false");
         registration.setInitParameters(initParameters);
         registration.setFilter(xssFilter);

+ 0 - 1
src/main/webapp/template/1/default/news-detail.htm

@@ -92,7 +92,6 @@
             },
         },
         created() {
-            this.likeTotal()
         }
     })
 </script>