商品分类业务实现
优化的策略: 数据库只查询一次,就可以获取商品分类三级嵌套结构
列表业务实现
封装Map,key为父级ID,value为子集列表,
- 判断!!!
- 如果没有存在key,将自己作为第一个元素存储;
- 如果已经存在key,将自己追加到value集合中
封装Map集合,根据数据结构动态根据level查询子级.
private Map<Integer, List<ItemCat>> getMap() {
HashMap<Integer,List<ItemCat>> map=new HashMap<>();
List<ItemCat> list = itemMapper.selectList(null);
//遍历所有的数据,按照parent_id为key,value为itemcat-list存为map集合
for (ItemCat itemCats:list) {
int parentId=itemCats.getParentId();
if (map.containsKey(parentId)){
map.get(parentId).add(itemCats);
}
else {
ArrayList<ItemCat> objects = new ArrayList<>();
objects.add(itemCats);
map.put(parentId, objects);
}
}
return map;
}
private List<ItemCat> getTwoList(Map<Integer, List<ItemCat>> map) {
//获取一级列表
List<ItemCat> onelist = map.get(0);
for (ItemCat oneItemCat:onelist) {
int parentId=oneItemCat.getId();
List<ItemCat> twolist = map.get(parentId);
oneItemCat.setChildren(twolist);
}
return onelist;
}
private List<ItemCat> getThreeList(Map<Integer, List<ItemCat>> map) {
List<ItemCat> oneList = getTwoList(map);
for (ItemCat oneItemCat:oneList) {
List<ItemCat> twoList = oneItemCat.getChildren();
if(twoList==null||twoList.size()==0){
continue;
}
for (ItemCat twoItemCat:twoList
) {
List<ItemCat> threeList = map.get(twoItemCat.getId());
twoItemCat.setChildren(threeList);
}
}
return oneList;
}
public List<ItemCat> findItemCatList(Integer level) {
Map<Integer,List<ItemCat>> map= getMap();
if(level==1){
return map.get(0);
}
if(level==2){
return getTwoList(map);
}
return getThreeList(map);
}
商品分类状态修改
业务分析
说明: 当用户点击状态码时,应该实现数据的修改操作.
<el-table-column prop="status" label="状态">
<!-- 定义作用域插槽 展现数据 scope.row展现行级元素 -->
<template slot-scope="scope">
<el-switch v-model="scope.row.status" active-color="#13ce66" inactive-color="#ff4949"
@change="updateStatus(scope.row)"></el-switch>
</template>
</el-table-column>
//根据ID修改状态信息
async updateStatus(itemCat) {
const {
data: result
} = await this.$http.put(`/itemCat/status/${itemCat.id}/${itemCat.status}`)
if (result.status !== 200) return this.$message.error("修改状态失败")
this.$message.success("状态修改成功")
},
/**
* 业务需求: ItemCat状态修改
* URL地址: /itemCat/status/{id}/{status}
* 参数: id/status
* 返回值: SysResult对象
*/
@PutMapping("/status/{id}/{status}")
public SysResult updateStatus(ItemCat itemCat){itemCatService.updateStatus(itemCat);
return SysResult.success();
}@Override
@Transactional //事务控制
public void updateStatus(ItemCat itemCat) {itemCatMapper.updateById(itemCat);
}
商品分类新增
: 商品分类实现中,需要添加一级/二级/三级分类信息. 但是父级下拉框中勾选1-2级菜单. 因为三级菜单不能当作父级. 当用户编辑完成之后,点击确定实现商品分类入库.
js代码
//动态获取商品分类信息 type=2表示获取2级商品分类信息
const {
data: result
} = await this.$http.get("/itemCat/findItemCatList/2")
if (result.status !== 200) return this.$message.error("获取商品分类列表失败!!")
this.parentItemCatList = result.data
},
//新增商品分类JS
async addItemCatForm() {
//先将整个表单进行校验
this.$refs.itemCatFormRef.validate(async validate => {
if (!validate) return
const {
data: result
} = await this.$http.post("/itemCat/saveItemCat", this.itemCatForm)
if (result.status !== 200) return this.$message.error("新增商品分类失败")
this.$message.success("新增商品分类成功!!!")
//新增成功,则刷新分类列表信息
this.findItemCatList();
this.addItemCatDialogVisible = false
})
/**
* 业务分析: 完成商品分类新增
* 请求类型: POST请求
* URL: /itemCat/saveItemCat
* 参数: 利用ItemCat对象接收 JSON
* 返回值: SysResult对象
*/
@PostMapping("/saveItemCat")
public SysResult saveItemCat(@RequestBody ItemCat itemCat){
itemCatService.saveItemCat(itemCat);
return SysResult.success();
}
@Override
@Transactional
public void saveItemCat(ItemCat itemCat) {
itemCat.setStatus(true) ;
itemCatMapper.insert(itemCat);
}
商品分类修改操作
由于有层级关系,所有修改只能修改名称
修改按钮js
<el-table-column label="操作">
<!-- 定义作用域插槽 定义标签等级-->
<template slot-scope="scope">
<el-button type="success" icon="el-icon-edit" @click="updateItemCatBtn(scope.row)">编辑</el-button>
<el-button type="danger" icon="el-icon-delete" @click="deleteItemCatBtn(scope.row)">删除</el-button>
</template>
</el-table-column>
//由于有层级关系,所有修改只能修改名称
updateItemCatBtn(itemCat) {
this.updateItemCatForm = itemCat
this.updateItemCatDialogVisible = true
},
修改确定!!
@PutMapping("/updateItemCat")
public SysResult updateItemCat(@RequestBody ItemCat itemCat){
itemCatService.updateItemCat(itemCat);
return SysResult.success();
}
@Override
@Transactional
public void updateItemCat(ItemCat itemCat) {
itemCatMapper.updateById(itemCat);
}
商品分类删除操作
业务说明
规则:
1.如果删除的商品分类是三级,则可以直接删除.
2.如果删除的商品分类是二级,则先删除三级,在删除二级.
3.如果删除的商品分类是一级,则先删除三级/二级/一级
注意事务的控制.
@Override @Transactional public void deleteItemCat(ItemCat itemCat) { if(itemCat.getLevel()==3){ itemMapper.deleteById(itemCat.getId()); } if (itemCat.getLevel()==2){ QueryWrapper<ItemCat> objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("parent_id", itemCat.getId()) .or().eq("id",itemCat.getId()); itemMapper.delete(objectQueryWrapper); } if (itemCat.getLevel()==1){ QueryWrapper<ItemCat> objectQueryWrapper = new QueryWrapper<>(); objectQueryWrapper.eq("parent_id", itemCat.getId()); List<Object> twolist = itemMapper.selectObjs(objectQueryWrapper); objectQueryWrapper.clear(); objectQueryWrapper.in(twolist.size()>0,"parent_id", twolist) .or().eq("parent_id", itemCat.getId()) .or().eq("id",itemCat.getId()); itemMapper.delete(objectQueryWrapper); } }