1. 全局异常处理/事务控制关系
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5056ebd4c455f28305a194c55e3579a3.png)
2 商品分类业务实现
2.1 商品分类查询优化
2.1.1 现有代码存在的问题
问题说明: 如果经过2次for循环, 链接数据库的次数将会很多, 直接影响查询的效率.
优化: 尽可能的降低查询的次数,同时满足用户需求
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e92edaf863f1b60444150976025fd45b.png)
2.1.2 优化策略
数据结构: Map<K,V> map
Key=“父级ID” Value=List<当前父级的子级>
用法: 如果想要获取任意父级的子级 map.get(父级的ID)
用法说明: Value 只有父级的子级信息,没有嵌套结构
Map<父级ID,List<ItemCat{id=xx,name=xx,children=null}>>
2.1.3 封装Map集合
原理图:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/51df9ac113992f1e64e98f33446f5a52.png)
2.1.3 封装Map实现
public Map<Integer,List<ItemCat>> initMap(){
Map<Integer,List<ItemCat>> map = new HashMap<>();
List<ItemCat> itemCatList = itemCatMapper.selectList(null);
for(ItemCat itemCat : itemCatList){
int key = itemCat.getParentId();
if(map.containsKey(key)){
List<ItemCat> list = map.get(key);
list.add(itemCat);
}else{
List<ItemCat> list = new ArrayList<>();
list.add(itemCat);
map.put(key,list);
}
}
return map;
}
2.1.4 后台代码完整实现
public Map<Integer,List<ItemCat>> initMap(){
Map<Integer,List<ItemCat>> map = new HashMap<>();
List<ItemCat> itemCatList = itemCatMapper.selectList(null);
for(ItemCat itemCat : itemCatList){
int key = itemCat.getParentId();
if(map.containsKey(key)){
List<ItemCat> list = map.get(key);
list.add(itemCat);
}else{
List<ItemCat> list = new ArrayList<>();
list.add(itemCat);
map.put(key,list);
}
}
return map;
}
@Override
public List<ItemCat> findItemCatList(Integer level) {
long startTime = System.currentTimeMillis();
Map<Integer,List<ItemCat>> map = initMap();
if(level == 1){
return map.get(0);
}
if(level == 2){
return getLevel2List(map);
}
List<ItemCat> list = getLevel3List(map);
long endTime = System.currentTimeMillis();
System.out.println("耗时:"+(endTime-startTime)+"毫秒");
return list;
}
public List<ItemCat> getLevel3List(Map<Integer, List<ItemCat>> map) {
List<ItemCat> oneList = getLevel2List(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> getLevel2List(Map<Integer, List<ItemCat>> map) {
List<ItemCat> oneList = map.get(0);
for(ItemCat oneItemCat : oneList){
List<ItemCat> twoList = map.get(oneItemCat.getId());
oneItemCat.setChildren(twoList);
}
return oneList;
}
2.2 商品分类状态修改
2.2.1 页面JS分析
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e26b78896813cd5987609f109bc634ef.png)
2.2.2 业务接口文档说明
- 请求路径: /itemCat/status/{id}/{status}
- 请求类型: put
- 请求参数:
参数名称 | 参数说明 | 备注 |
---|
id | 用户ID值 | 不能为null |
status | 用户的状态信息 | 不能为null |
参数名称 | 参数说明 | 备注 |
---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 可以为null |
2.2.3 编辑ItemCatController
@PutMapping("/status/{id}/{status}")
public SysResult updateStatus(ItemCat itemCat){
itemCatService.updateStatus(itemCat);
return SysResult.success();
}
2.2.4 编辑ItemCatService
@Override
public void updateStatus(ItemCat itemCat) {
itemCatMapper.updateById(itemCat);
}
2.3 商品分类新增操作
2.3.1 业务说明
- 如果是一级菜单,则不需要勾选父级.
- 如果有父级,只能勾选1-2级.
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5eed8617e2f91df5ce0c446941aa9349.png)
2.3.2 页面JS说明
- 商品分类菜单信息 2级展现JS
async findParentItemCatList() {
const {
data: result
} = await this.$http.get("/itemCat/findItemCatList/2")
if (result.status !== 200) return this.$message.error("获取商品分类列表失败!!")
this.parentItemCatList = result.data
},
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
})
},
2.3.3 业务接口文档说明
- 请求路径: /itemCat/saveItemCat
- 请求类型: post
- 请求参数: 表单数据
参数名称 | 参数说明 | 备注 |
---|
name | 商品分类名称 | 不能为null |
parentId | 用户父级ID | 不能为null |
level | 分类级别 | 1 2 3 商品分类级别 |
参数名称 | 参数说明 | 备注 |
---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 可以为null |
2.3.4 编辑ItemCatController
@PostMapping("/saveItemCat")
public SysResult saveItemCat(@RequestBody ItemCat itemCat){
itemCatService.saveItemCat(itemCat);
return SysResult.success();
}
2.3.5 编辑ItemCatServiceImpl
@Override
@Transactional
public void saveItemCat(ItemCat itemCat) {
itemCat.setStatus(true);
itemCatMapper.insert(itemCat);
}
2.4 商品分类删除操作
2.4.1 业务说明
1.如果被删除的标签是3级标签,则可以直接删除.
2.如果被删除的标签是2级标签,则需要先删除3级,再删除2级.
3.如果被删除的标签是1级标签,则需要先删除3级,在删除2级.最后删除1级.
2.4.2 页面JS分析
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/71e7b38b64187fb326787dc09267c8e1.png)
2.4.3 业务接口文档说明
- 请求路径: /itemCat/deleteItemCat
- 请求类型: delete
- 业务描述: 当删除节点为父级时,应该删除自身和所有的子节点
- 请求参数:
参数名称 | 参数说明 | 备注 |
---|
id | 用户id号 | 不能为null |
level | 商品分类级别 一级,二级,三级 | |
参数名称 | 参数说明 | 备注 |
---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 可以为null |
2.4.4 编辑ItemCatController
@DeleteMapping("/deleteItemCat")
public SysResult deleteItemCat(Integer id,Integer level){
itemCatService.deleteItemCat(id,level);
return SysResult.success();
}
2.4.5 编辑ItemCatServiceImpl
@Override
@Transactional
public void deleteItemCat(Integer id, Integer level) {
if(level == 3){
itemCatMapper.deleteById(id);
}
if(level == 2){
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("parent_id",id);
itemCatMapper.delete(queryWrapper);
itemCatMapper.deleteById(id);
}
if(level == 1){
List<Integer> ids = new ArrayList<>();
QueryWrapper queryWrapper = new QueryWrapper();
queryWrapper.eq("parent_id",id);
List<ItemCat> twoList = itemCatMapper.selectList(queryWrapper);
for (ItemCat twoItemCat : twoList){
queryWrapper.clear();
queryWrapper.eq("parent_id",twoItemCat.getId());
itemCatMapper.delete(queryWrapper);
ids.add(twoItemCat.getId());
}
ids.add(id);
itemCatMapper.deleteBatchIds(ids);
}
}
3. 商品管理实现
3.1 表设计
1.item表设计 商品表(商品的基本信息)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f16636ba7e2f72a2ff17d9e976242362.png)
2.item_desc 表设计 商品详情表 item_desc 专门保存大字段(html/url/图片网址…)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c5a931e545ce749c343e110fa58a5362.png)
设计要求: item表与itemDesc表应该一对一. item.id = itemDesc.id
3.2.Item POJO对象设计
@TableName("item")
@Data
@Accessors(chain = true)
public class Item extends BasePojo{
@TableId(type = IdType.AUTO)
private Integer id;
private String title;
private String sellPoint;
private Integer price;
private Integer num;
private String images;
private Integer itemCatId;
private Boolean status;
}
3.3 商品列表展现
3.3.1 需求说明
要求: 当用户打开商品列表页面时,应该采用分页的方式 展现商品信息.
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/28db7f8d540b0bf78475046d1b493d88.png)
3.3.2 页面JS分析
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/84eaab18ddbd9f61342ae0ad1edd4c6b.png)
3.3.3 业务接口文档实现
- 请求路径: /item/getItemList?query=&pageNum=1&pageSize=10
- 请求类型: get
- 请求参数: 使用pageResult对象接收
参数名称 | 参数说明 | 备注信息 |
---|
query | 用户查询的数据 | 可以为null |
pageNum | 分页查询的页数 | 必须赋值不能为null |
pageSize | 分页查询的条数 | 必须赋值不能为null |
参数名称 | 参数说明 | 备注 |
---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 商品分页对象 |
3.3.4 编辑ItemController
@RestController
@CrossOrigin
@RequestMapping("/item")
public class ItemController {
@Autowired
private ItemService itemService;
@GetMapping("/getItemList")
public SysResult getItemList(PageResult pageResult){
pageResult = itemService.getItemList(pageResult);
return SysResult.success(pageResult);
}
}
3.3.5 编辑ItemServiceImpl
@Service
public class ItemServiceImpl implements ItemService{
@Autowired
private ItemMapper itemMapper;
@Override
public PageResult getItemList(PageResult pageResult) {
Page<Item> page = new Page<>(pageResult.getPageNum(),pageResult.getPageSize());
QueryWrapper queryWrapper = new QueryWrapper();
boolean flag = StringUtils.hasLength(pageResult.getQuery());
queryWrapper.like(flag,"title",pageResult.getQuery());
page = itemMapper.selectPage(page,queryWrapper);
long total = page.getTotal();
List<Item> list = page.getRecords();
return pageResult.setTotal(total).setRows(list);
}
}
3.3.6 页面效果展现
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/f46f25166c519e17b06ecbd4fa7615f0.png)