SpringBoot+Mybatis实现三级分类联动
⼀、后台管理系统表格分页形式的分类显⽰
先来看实现的效果。
这是所有商品的⼀级分类,选中⼀个⼀级分类后(如图中的“家电 数码 ⼿机”)点击“下级分类管理”,即跳转⾄该分类的⼆级分类,如下图。
再选择⼆级分类中的“家电”后,点击“下级分类管理”,即跳转⾄该⼆级分类下的三级分类,如下图。
所有的分类都是记录在同⼀张表内,表内主要字段如下。
属性名说明
category_id⾃增id,⽤于记录每个分类的编号
category_level表⽰该分类属于⼏级分类
parent_id表⽰该分类的上级分类的id,如果是⼀级分类,则为0
属性名说明
category_name分类名称
category_rank分类排序值,值越⾼越靠前显⽰
另外在前后端传值的时候有三个关键的参数:
categoryLevel, ⽤来表格该分类的等级
parentId,⽤来表格该分类的上级分类的id,⼀级分类则为0
backParentId,⽤来表⽰三级分类的parentId所对应的⼆级分类的⼀级分类
现在开始上代码。
初试列表显⽰的是所有⼀级分类,因此这⾥三个参数分别为:categoryLevel=1,parentId=0,backParentId=0;url为:admin/categories?parentId=0&categoryLevel=1&backParentId=0
⼆级列表和三级列表的参数由前端获取到后传给后端。
NewBeeMallGoodsCategoryController.java
@Resource
private NewBeeMallCategoryService newBeeMallCategoryService;
/**
* 列表显⽰
*/
@RequestMapping(value ="/categories/list",method = RequestMethod.GET)
@ResponseBody
public Result list(@RequestParam Map<String,Object> params){
if(StringUtils.("page"))|| StringUtils.("limit"))){
FailResult("参数异常");
}
PageQueryUtil pageQueryUtil =new PageQueryUtil(params);
return  CategoriesPage(pageQueryUtil));
}
(categoryLevel=1,parentId=0封装在params中)
NewBeeMallCategoryService.java
/**
* 管理后台分页显⽰
* @param pageQueryUtil
* @return
*/
PageResult getCategoriesPage(PageQueryUtil pageQueryUtil);
NewBeeMallCategoryServiceImpl.java
@Autowired
private GoodsCategoryMapper goodsCategoryMapper;
@Override
public PageResult getCategoriesPage(PageQueryUtil pageQueryUtil){
List<GoodsCategory> goodsCategories = goodsCategoryMapper.findGoodsCategoryList(pageQueryUtil);
int total = TotalGoodsCategories(pageQueryUtil);
PageResult pageResult =new PageResult(goodsCategories,Limit(),Page());
return pageResult;
}
GoodsCategoryMapper.java
/**
* 后台获取分类列表
* @param pageQueryUtil
* @return
*/
List<GoodsCategory>findGoodsCategoryList(PageQueryUtil pageQueryUtil);
/**
* 后台获取分类总数
* @param pageQueryUtil
* @return
*/
int getTotalGoodsCategories(PageQueryUtil pageQueryUtil); l
<sql id="Base_Column_List">
category_id, category_level, parent_id, category_name, category_rank, is_deleted,
create_time, create_user, update_time, update_user
</sql>
<select id="findGoodsCategoryList"parameterType="map"resultMap="BaseResultMap">        select
<include refid="Base_Column_List"></include>
from tb_newbee_mall_goods_category
<where>
<if test="categoryLevel!=null and categoryLevel!=''">
and category_level = #{categoryLevel}
</if>
<if test="parentId!=null and parentId!=''">
and parent_id = #{parentId}
</if>
and is_deleted = 0
</where>
order by category_rank desc
<if test="start!=null and limit!=null">
limit #{start},#{limit}
</if>
</select>
<select id="getTotalGoodsCategories"parameterType="Map"resultType="int">
select count(*) from tb_newbee_mall_goods_category
<where>
<if test="categoryLevel!=null and categoryLevel!=''">
and category_level = #{categoryLevel}
</if>
<if test="parentId!=null and parentId!=''">
and parent_id = #{parentId}
</if>
and is_deleted = 0
</where>
</select>
⼆、添加商品页⾯的下拉菜单式的三级联动
实际效果如图所⽰。
第⼀个下拉菜单默认显⽰排序值最⾼的⼀级分类。第⼆个下拉菜单显⽰的是该⼀级分类下的第⼀个⼆级分类。第三个下拉菜单显⽰的是该⼆级分类下的第⼀个三级分类。若没有内容则显⽰空⽩。这⾥有三种情况,分别是:
(1)打开页⾯后的默认显⽰
⼀打开这个页⾯默认显⽰的是第⼀个⼀级分类,和其所属的第⼀个⼆级分类以及该⼆级分类下的第⼀个三级分类,即:“家电 数码 ⼿机”-->“家电” --> “⽣活电器”。
NewBeeMallGoodsController.java
@Resource
private NewBeeMallCategoryService newBeeMallCategoryService;
@GetMapping("/goods/edit")
public String edit(HttpServletRequest request){
request.setAttribute("path","edit");
//查询所有的⼀级分类
List<GoodsCategory> firstLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(0L), NewB eeMallCategoryLevelEnum.Level());
if(!CollectionUtils.isEmpty(firstLevelCategories)){
spring boot是啥
//查询⼀级分类列表中第⼀个实体的所有⼆级分类
List<GoodsCategory> secondLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList((0).getCategoryId()), NewBeeMallCategoryLevelEnum.Level());
if(!CollectionUtils.isEmpty(secondLevelCategories)){
//查询⼆级分类列表中第⼀个实体的所有三级分类
List<GoodsCategory> thirdLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList((0).getCategoryId()),NewBeeMallCategoryLevelEnum.Level());
request.setAttribute("firstLevelCategories",firstLevelCategories);
request.setAttribute("secondLevelCategories",secondLevelCategories);
request.setAttribute("thirdLevelCategories",thirdLevelCategories);
request.setAttribute("path","goods-edit");
return"admin/newbee_mall_goods_edit";
}
}
return"error/error_5xx";
}
NewBeeMallCategoryService.java
/**
* 根据parentId和level获取分类列表
* @param parentIds
* @param categoryLevel
* @return
*/
List<GoodsCategory>selectByLevelAndParentIdsAndNumber(List<Long> parentIds,int categoryLevel);
NewBeeMallCategoryServiceImpl.java
@Autowired
private GoodsCategoryMapper goodsCategoryMapper;
@Override
public List<GoodsCategory>selectByLevelAndParentIdsAndNumber(List<Long> parentIds,int categoryLevel){
return goodsCategoryMapper.selectByLevelAndParentIdsAndNumber(parentIds,categoryLevel,0);//0代表查询所有
}
GoodsCategoryMapper.java
List<GoodsCategory>selectByLevelAndParentIdsAndNumber(@Param("parentIds") List<Long> parentIds,@Param("categoryLevel")int categoryLevel, @Param("number")int number);