一、功能概述

二 学习目标

三、数据表

四、主要接口设计
地址:https://gitee.com/imooccode/happymmallwiki/wikis/%E5%90%8E%E5%8F%B0_%E5%93%81%E7%B1%BB%E6%8E%A5%E5%8F%A3
(1)增加节点:/manage/category/add_category.do
(2)修改品类名字:/manage/category/set_category_name.do
(3).获取品类子节点(平级):/manage/category/get_category.do
(4)获取当前分类id及递归子节点categoryId:/manage/category/get_deep_category.do
五、DAO层
Category.java
package com.mmall.dao; import com.mmall.pojo.Category; import java.util.List; public interface CategoryMapper { int deleteByPrimaryKey(Integer id); int insert(Category record); int insertSelective(Category record); Category selectByPrimaryKey(Integer id); int updateByPrimaryKeySelective(Category record); int updateByPrimaryKey(Category record); List<Category> selectCategoryChildrenByParentId(Integer parentId); }
CategoryMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.mmall.dao.CategoryMapper" >
<resultMap id="BaseResultMap" type="com.mmall.pojo.Category" >
<constructor >
<idArg column="id" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="parent_id" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="name" jdbcType="VARCHAR" javaType="java.lang.String" />
<arg column="status" jdbcType="BIT" javaType="java.lang.Boolean" />
<arg column="sort_order" jdbcType="INTEGER" javaType="java.lang.Integer" />
<arg column="create_time" jdbcType="TIMESTAMP" javaType="java.util.Date" />
<arg column="update_time" jdbcType="TIMESTAMP" javaType="java.util.Date" />
</constructor>
</resultMap>
<sql id="Base_Column_List" >
id, parent_id, name, status, sort_order, create_time, update_time
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from mmall_category
where id = #{id,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
delete from mmall_category
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.mmall.pojo.Category" >
insert into mmall_category (id, parent_id, name,
status, sort_order, create_time,
update_time)
values (#{id,jdbcType=INTEGER}, #{parentId,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR},
#{status,jdbcType=BIT}, #{sortOrder,jdbcType=INTEGER},now(),
now())
</insert>
<insert id="insertSelective" parameterType="com.mmall.pojo.Category" >
insert into mmall_category
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="id != null" >
id,
</if>
<if test="parentId != null" >
parent_id,
</if>
<if test="name != null" >
name,
</if>
<if test="status != null" >
status,
</if>
<if test="sortOrder != null" >
sort_order,
</if>
<if test="createTime != null" >
create_time,
</if>
<if test="updateTime != null" >
update_time,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
#{id,jdbcType=INTEGER},
</if>
<if test="parentId != null" >
#{parentId,jdbcType=INTEGER},
</if>
<if test="name != null" >
#{name,jdbcType=VARCHAR},
</if>
<if test="status != null" >
#{status,jdbcType=BIT},
</if>
<if test="sortOrder != null" >
#{sortOrder,jdbcType=INTEGER},
</if>
<if test="createTime != null" >
#{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateTime != null" >
#{updateTime,jdbcType=TIMESTAMP},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.mmall.pojo.Category" >
update mmall_category
<set >
<if test="parentId != null" >
parent_id = #{parentId,jdbcType=INTEGER},
</if>
<if test="name != null" >
name = #{name,jdbcType=VARCHAR},
</if>
<if test="status != null" >
status = #{status,jdbcType=BIT},
</if>
<if test="sortOrder != null" >
sort_order = #{sortOrder,jdbcType=INTEGER},
</if>
<if test="createTime != null" >
create_time = #{createTime,jdbcType=TIMESTAMP},
</if>
<if test="updateTime != null" >
update_time = now(),
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="com.mmall.pojo.Category" >
update mmall_category
set parent_id = #{parentId,jdbcType=INTEGER},
name = #{name,jdbcType=VARCHAR},
status = #{status,jdbcType=BIT},
sort_order = #{sortOrder,jdbcType=INTEGER},
create_time = #{createTime,jdbcType=TIMESTAMP},
update_time = now()
where id = #{id,jdbcType=INTEGER}
</update>
<select id="selectCategoryChildrenByParentId" parameterType="int" resultMap="BaseResultMap">
SELECT
<include refid="Base_Column_List"/>
FROM mmall_category
WHERE parent_id = #{parentId}
</select>
</mapper>
六、Service层
ICategoryService.java:
package com.mmall.service; import com.mmall.common.ServerResponse; import java.util.List; /** * @author GenshenWang.nomico * @date 2018/4/8. */ public interface ICategoryService { ServerResponse<String> addCategory(Integer parentId, String categoryName); ServerResponse<String> updateCategoryName(Integer categoryId, String categoryName); ServerResponse getChildrenParallelCategory(Integer categoryId); ServerResponse<List<Integer>> getCategoryAndDeepChildrenCategory(Integer categoryId); }
CategoryServiceImpl.java:
package com.mmall.service.impl; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.mmall.common.ServerResponse; import com.mmall.dao.CategoryMapper; import com.mmall.pojo.Category; import com.mmall.service.ICategoryService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Collections; import java.util.List; import java.util.Set; /** * @author GenshenWang.nomico * @date 2018/4/8. */ @Service("iCategoryService") public class CategoryServiceImpl implements ICategoryService { Logger logger = LoggerFactory.getLogger(CategoryServiceImpl.class); @Autowired CategoryMapper categoryMapper; @Override public ServerResponse<String> addCategory(Integer parentId, String categoryName){ if (parentId == null || StringUtils.isBlank(categoryName)){ return ServerResponse.createByErrorMsg("参数错误"); } Category category = new Category(); category.setParentId(parentId); category.setName(categoryName); category.setStatus(true);//这个分类是可用的 int rowCount = categoryMapper.insert(category); if (rowCount > 0){ return ServerResponse.createBySuccess("添加品类成功"); } return ServerResponse.createByErrorMsg("添加品类失败"); } @Override public ServerResponse<String> updateCategoryName(Integer categoryId, String categoryName){ if (categoryId == null || StringUtils.isBlank(categoryName)){ return ServerResponse.createByErrorMsg("参数错误"); } Category category = new Category(); category.setId(categoryId); category.setName(categoryName); int rowCount = categoryMapper.updateByPrimaryKeySelective(category); if (rowCount > 0){ return ServerResponse.createBySuccess("修改品类成功"); } return ServerResponse.createByErrorMsg("修改品类失败"); } @Override public ServerResponse getChildrenParallelCategory(Integer categoryId){ if (categoryId == null){ return ServerResponse.createByErrorMsg("参数错误"); } List<Category> categoryList = categoryMapper.selectCategoryChildrenByParentId(categoryId); if (CollectionUtils.isEmpty(categoryList)){ logger.info("未找到当前分类的子类"); } return ServerResponse.createBySuccess(categoryList); } @Override public ServerResponse<List<Integer>> getCategoryAndDeepChildrenCategory(Integer categoryId){ if (categoryId == null){ return ServerResponse.createByErrorMsg("参数错误"); } Set<Category> categorySet = Sets.newHashSet(); findChildCategory(categorySet, categoryId); List<Integer> cayegoryList = Lists.newArrayList(); for (Category category : categorySet) { cayegoryList.add(category.getId()); } return ServerResponse.createBySuccess(cayegoryList); } //递归算法,算出子节点 //注意:此处 用Set去重Category,需要对Category重写Hashcode和equals方法 public Set<Category> findChildCategory(Set<Category> categorySet, Integer categoryId){ Category category = categoryMapper.selectByPrimaryKey(categoryId); if (category != null){ categorySet.add(category); } //递归查找子节点 List<Category> categoryList = categoryMapper.selectCategoryChildrenByParentId(categoryId); for (Category categoryItem:categoryList) { findChildCategory(categorySet, categoryItem.getId()); } return categorySet; } }
七、Controller层
package com.mmall.controller.backend; import com.mmall.common.Const; import com.mmall.common.ResponseCode; import com.mmall.common.ServerResponse; import com.mmall.pojo.Category; import com.mmall.pojo.User; import com.mmall.service.ICategoryService; import com.mmall.service.IUserService; import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpSession; /** * @author GenshenWang.nomico * @date 2018/4/8. */ @Controller @RequestMapping(value = "/manage/category") public class CategoryManageController { @Autowired IUserService iUserService; @Autowired ICategoryService iCategoryService; /** * 添加品类 * @param session * @param parentId * @param categoryName * @return */ @RequestMapping(value = "/add_category.do", method = RequestMethod.POST) @ResponseBody public ServerResponse addCategory(HttpSession session, @RequestParam(value = "parentId", defaultValue = "0") Integer parentId, String categoryName){ // 判断用户是否登录 User user = (User) session.getAttribute(Const.CURRENT_USER); if (user == null){ return ServerResponse.createByErrorCodeMsg(ResponseCode.NEED_LOGIN.getCode(), "用户未登录,请登录"); } // 判断用户是否有权限操作 ServerResponse<String> response = iUserService.checkAdminRole(user); if (response.isSuccess()){ // 添加 return iCategoryService.addCategory(parentId, categoryName); }else { return response; } } /** * 更改品类名称 * @param session * @param categoryId * @param categoryName * @return */ @RequestMapping(value = "/set_category_name.do", method = RequestMethod.POST) @ResponseBody public ServerResponse setCategoryName(HttpSession session, Integer categoryId, String categoryName){ User user = (User) session.getAttribute(Const.CURRENT_USER); if (user == null){ return ServerResponse.createByErrorCodeMsg(ResponseCode.NEED_LOGIN.getCode(), "用户未登录,请登录"); } ServerResponse<String> response = iUserService.checkAdminRole(user); if (response.isSuccess()){ return iCategoryService.updateCategoryName(categoryId, categoryName); }else { return response; } } /** * 获取当前品类节点下的所有子节点(平级) * @param session * @param categoryId * @return */ @RequestMapping(value = "/get_category.do", method = RequestMethod.POST) @ResponseBody public ServerResponse getChildrenParallelCategory(HttpSession session, @RequestParam(value = "categoryId", defaultValue = "0") Integer categoryId){ User user = (User) session.getAttribute(Const.CURRENT_USER); if (user == null){ return ServerResponse.createByErrorCodeMsg(ResponseCode.NEED_LOGIN.getCode(), "未登录,请先登录"); } ServerResponse<String> response = iUserService.checkAdminRole(user); if (response.isSuccess()){ return iCategoryService.getChildrenParallelCategory(categoryId); }else { return response; } } /** * 获取当前分类id及递归子节点categoryId * @param session * @param categoryId * @return */ @RequestMapping(value = "/get_deep_category.do", method = RequestMethod.POST) @ResponseBody public ServerResponse getCategoryAndDeepChildrenCategory(HttpSession session, @RequestParam(value = "categoryId", defaultValue = "0") Integer categoryId){ User user = (User) session.getAttribute(Const.CURRENT_USER); if (user == null){ return ServerResponse.createByErrorCodeMsg(ResponseCode.NEED_LOGIN.getCode(), "未登录,请先登录"); } ServerResponse<String> response = iUserService.checkAdminRole(user); if (response.isSuccess()){ return iCategoryService.getCategoryAndDeepChildrenCategory(categoryId); }else { return response; } } }

浙公网安备 33010602011771号