一、后台管理系统表格分页形式的分类显示
先来看实现的效果。
这是所有商品的一级分类,选中一个一级分类后(如图中的“家电 数码 手机”)点击“下级分类管理”,即跳转至该分类的二级分类,如下图。
再选择二级分类中的“家电”后,点击“下级分类管理”,即跳转至该二级分类下的三级分类,如下图。
所有的分类都是记录在同一张表内,表内主要字段如下。
属性名 | 说明 |
---|---|
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.isEmpty(params.get("page")) || StringUtils.isEmpty(params.get("limit"))){
return ResultGenerator.genFailResult("参数异常");
}
PageQueryUtil pageQueryUtil = new PageQueryUtil(params);
return ResultGenerator.genSuccessResult(newBeeMallCategoryService.getCategoriesPage(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 = goodsCategoryMapper.getTotalGoodsCategories(pageQueryUtil);
PageResult pageResult = new PageResult(goodsCategories,total,pageQueryUtil.getLimit(),pageQueryUtil.getPage());
return pageResult;
}
GoodsCategoryMapper.java
/**
* 后台获取分类列表
* @param pageQueryUtil
* @return
*/
List<GoodsCategory> findGoodsCategoryList(PageQueryUtil pageQueryUtil);
/**
* 后台获取分类总数
* @param pageQueryUtil
* @return
*/
int getTotalGoodsCategories(PageQueryUtil pageQueryUtil);
GoodsCategoryMapper.xml
<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), NewBeeMallCategoryLevelEnum.LEVEL_ONE.getLevel());
if (!CollectionUtils.isEmpty(firstLevelCategories)){
//查询一级分类列表中第一个实体的所有二级分类
List<GoodsCategory> secondLevelCategories = newBeeMallCategoryService.selectByLevelAndParentIdsAndNumber(Collections.singletonList(firstLevelCategories.get(0).getCategoryId()), NewBeeMallCategoryLevelEnum.LEVEL_TWO.getLevel());
if (!CollectionUtils.isEmpty(secondLevelCategories)){