1、全局异常处理/事务控制关系
2、商品分类业务实现
2.1 商品分类查询优化
2.1.1 现有代码存在问题
问题说明: 如果经过2次for循环, 链接数据库的次数将会很多, 直接影响查询的效率.
优化: 尽可能的降低查询的次数,同时满足用户需求
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实现
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> catList = map.get(key);
catList.add(itemCat);
}else {
List<ItemCat> catList = new ArrayList<>();
catList.add(itemCat);
map.put(key, catList);
}
}
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> catList = map.get(key);
catList.add(itemCat);
}else {
List<ItemCat> catList = new ArrayList<>();
catList.add(itemCat);
map.put(key, catList);
}
}
return map;
}
@Override
public List<ItemCat> FindItemCatLiset(Integer level)
{
Map<Integer, List<ItemCat>> map = initMap();
if (level == 1)
{
return map.get(0);
}
if (level == 2)
{
return getLevelList2(map);
}
List<ItemCat> list = getLevelList3(map);
return list;
}
private List<ItemCat> getLevelList2(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;
}
private List<ItemCat> getLevelList3(Map<Integer, List<ItemCat>> map)
{
List<ItemCat> oneList = getLevelList2(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;
}
2.2 商品状态修改
2.2.1 页面JS分析
2.2.2 业务接口文档说明
- 请求路径: /itemCat/status/{id}/{status}
- 请求类型: put
- 请求参数:
参数名称 | 参数说明 | 备注 |
---|
id | 用户ID值 | 不能为null |
status | 用户的状态信息 | 不能为null |
- 返回值:SysResult对象
参数名称 | 参数说明 | 备注 |
---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 可以为null |
2.2.3 编辑ItemCatController
2.2.4 编辑ItemCatServiceImpl
2.3 商品分类新增操作
2.3.1 业务说明
- 如果是一级菜单则不需要勾选父级
- 如果是父级则只勾选1-2级
2.3.2 页面JS说明
- 商品分类菜单信息
async findParentItemCatList() {
//动态获取商品分类信息 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
})
},
2.3.3 业务接口文档说明
- 请求路径: /itemCat/saveItemCat
- 请求类型: post
- 请求参数: 表单数据
参数名称 | 参数说明 | 备注 |
---|
name | 商品分类名称 | 不能为null |
parentId | 用户父级ID | 不能为null |
level | 分类级别 | 1 2 3 商品分类级别 |
- 返回值: SysResult对象
参数名称 | 参数说明 | 备注 |
---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 可以为null |
2.3.4 编辑ItemCatController
2.3.5 编辑ItemCatServiceImpl
2.4 商品分类删除操作
2.4.1 业务说明
- 如果被删除的标签是3级标签,则可以直接删除.
- 如果被删除的标签是2级标签,则需要先删除3级,再删除2级.
- 如果被删除的标签是1级标签,则需要先删除3级,在删除2级.最后删除1级.
2.4.2 页面JS分析
2.4.3 业务接口文档说明
- 请求路径: /itemCat/deleteItemCat
- 请求类型: delete
- 业务描述: 当删除节点为父级时,应该删除自身和所有的子节点
- 请求参数:
参数名称 | 参数说明 | 备注 |
---|
id | 用户id号 | 不能为null |
level | 商品分类级别 一级,二级,三级 | |
- 返回值结果 SysResult对象
参数名称 | 参数说明 | 备注 |
---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 可以为null |
2.4.4 编辑ItemCatController
@DeleteMapping("/deleteItemCat")
public SysResult DeleteItemCat(Integer id,Integer level)
{
itemService.DeleteItemCat(id,level);
return SysResult.souccess();
}
2.4.5 编辑ItemCatServiceImpl
@Override
@Transactional
public void DeleteItemCat(Integer id, Integer level)
{
if (level == 3)
{
itemCatMapper.deleteById(id);
}
if (level == 2)
{
QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parent_id", id);
itemCatMapper.delete(queryWrapper);
itemCatMapper.deleteById(id);
}
if (level == 1)
{
List<Integer> ids = new ArrayList<>();
QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parent_id", id);
List<ItemCat> twoitemCatList = itemCatMapper.selectList(queryWrapper);
for (ItemCat itemCat : twoitemCatList)
{
queryWrapper.clear();
queryWrapper.eq("parent_id", itemCat.getId());
itemCatMapper.delete(queryWrapper);
ids.add(itemCat.getId());
}
ids.add(id);
itemCatMapper.deleteBatchIds(ids);
}
}
3、商品管理实现
3.1 表设计
- item表设计 商品表(商品的基本信息)
- item_desc 表设计 商品详情表 item_desc 专门保存大字段(html/url/图片网址…)
设计要求: item表与itemDesc表应该一对一. item.id = itemDesc.id
3.2 Item POJO对象设计
3.3 商品列表展现
3.3.1
要求: 当用户打开商品列表页面时,应该采用分页的方式 展现商品信息.
3.3.2 页面JS分析
3.3.3 业务接口文档实现
- 请求路径: /item/getItemList?query=&pageNum=1&pageSize=10
- 请求类型: get
- 请求参数: 使用pageResult对象接收
参数名称 | 参数说明 | 备注信息 |
---|
query | 用户查询的数据 | 可以为null |
pageNum | 分页查询的页数 | 必须赋值不能为null |
pageSize | 分页查询的条数 | 必须赋值不能为null |
- 返回值结果: SysResult对象
参数名称 | 参数说明 | 备注 |
---|
status | 状态信息 | 200表示服务器请求成功 201表示服务器异常 |
msg | 服务器返回的提示信息 | 可以为null |
data | 服务器返回的业务数据 | 商品分页对象 |
3.3.4 编辑ItemController
@GetMapping("/getItemList")
public SysResult getItem(PageResult pageResult)
{
pageResult = itemService.getItemList(pageResult);
return SysResult.souccess(pageResult);
}
3.3.5 编辑ItemServiceImpl
@Override
public PageResult getItemList(PageResult pageResult)
{
Page<Item> page = new Page<>(pageResult.getPageNum(),pageResult.getPageSize());
QueryWrapper<Item> 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 页面效果展现