既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
import java.util.Set;
public interface ICategoryService {
ResponseVo<List<CategoryVo>> selectAll();
void findSubCategoryId(Integer id, Set<Integer> resultSet);
}
上面的代码是一个名为`ICategoryService`的接口,它定义了商品分类相关的服务方法。
这些方法定义了商品分类服务的功能,主要用于查询和处理商品分类相关的业务逻辑。
`selectAll()`方法用于获取所有商品分类的信息,而`findSubCategoryId()`方法用于查找指定分类下的所有子分类的主键id。这些方法可以被其他组件(如控制器层)调用,以实现具体的业务需求。
这里只提供了接口定义,并没有给出具体的实现逻辑。实际的业务逻辑需要在`ICategoryService`的实现类中进行编写。我们接下来就讲讲怎么编写这些实现类。
package com.imooc.mall.service.impl;
import com.imooc.mall.dao.CategoryMapper;
import com.imooc.mall.pojo.Category;
import com.imooc.mall.service.ICategoryService;
import com.imooc.mall.vo.CategoryVo;
import com.imooc.mall.vo.ResponseVo;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import static com.imooc.mall.consts.MallConst.ROOT_PARENT_ID;
@Service
public class CategoryServiceImpl implements ICategoryService {
@Autowired
private CategoryMapper categoryMapper;
/**
* 耗时:http(请求微信api) > 磁盘 > 内存
* mysql(内网+磁盘)
* @return
*/
@Override
public ResponseVo<List<CategoryVo>> selectAll() {
List<Category> categories = categoryMapper.selectAll();
//查出parent_id=0
// for (Category category : categories) {
// if (category.getParentId().equals(ROOT_PARENT_ID)) {
// CategoryVo categoryVo = new CategoryVo();
// BeanUtils.copyProperties(category, categoryVo);
// categoryVoList.add(categoryVo);
// }
// }
//lambda + stream
List<CategoryVo> categoryVoList = categories.stream()
.filter(e -> e.getParentId().equals(ROOT_PARENT_ID))
.map(this::category2CategoryVo)
.sorted(Comparator.comparing(CategoryVo::getSortOrder).reversed())
.collect(Collectors.toList());
//查询子目录
findSubCategory(categoryVoList, categories);
return ResponseVo.success(categoryVoList);
}
@Override
public void findSubCategoryId(Integer id, Set<Integer> resultSet) {
List<Category> categories = categoryMapper.selectAll();
findSubCategoryId(id, resultSet, categories);
}
private void findSubCategoryId(Integer id, Set<Integer> resultSet, List<Category> categories) {
for (Category category : categories) {
if (category.getParentId().equals(id)) {
resultSet.add(category.getId());
findSubCategoryId(category.getId(), resultSet, categories);
}
}
}
private void findSubCategory(List<CategoryVo> categoryVoList, List<Category> categories) {
for (CategoryVo categoryVo : categoryVoList) {
List<CategoryVo> subCategoryVoList = new ArrayList<>();
for (Category category : categories) {
//如果查到内容,设置subCategory, 继续往下查
if (categoryVo.getId().equals(category.getParentId())) {
CategoryVo subCategoryVo = category2CategoryVo(category);
subCategoryVoList.add(subCategoryVo);
}
subCategoryVoList.sort(Comparator.comparing(CategoryVo::getSortOrder).reversed());
categoryVo.setSubCategories(subCategoryVoList);
findSubCategory(subCategoryVoList, categories);
}
}
}
private CategoryVo category2CategoryVo(Category category) {
CategoryVo categoryVo = new CategoryVo();
BeanUtils.copyProperties(category, categoryVo);
return categoryVo;
}
}
我说实话,这里的实现类确实是有点难以理解的,所以我的建议是能看懂最好,看不懂就放一放,到时候等对项目有一个整体的了解再看也不迟。现在你要知道的就是service层有两个方法,一个方法是获取所有商品的分类信息,另一个方法是查找指定分类下的所有子分类的主键id。
设计完service层之后,我们来设计controller层。
### 设计controller层
package com.imooc.mall.controller;
import com.imooc.mall.service.ICategoryService;
import com.imooc.mall.vo.CategoryVo;
import com.imooc.mall.vo.ResponseVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class CategoryController {
@Autowired
private ICategoryService categoryService;
@GetMapping("/categories")
public ResponseVo<List<CategoryVo>> selectAll() {
return categoryService.selectAll();
}
}
这段代码是一个`CategoryController`类,它是一个基于Spring的RESTful风格的控制器。
通过定义这个控制器类,我们就可以将"/categories"路径映射到`selectAll()`方法,并在客户端发起GET请求时返回所有商品分类的信息。这样,当你访问"/categories"路径时,控制器会调用`categoryService.selectAll()`方法获取商品分类信息,并将结果封装在`ResponseVo`对象中返回给客户端。
这个控制器类的作用是将客户端请求与商品分类的业务逻辑进行关联,通过调用`categoryService`中的方法来处理和返回相应的结果。
![img](https://img-blog.csdnimg.cn/img_convert/6133ff8c0b320a5608c09a3bf32a142d.png)
![img](https://img-blog.csdnimg.cn/img_convert/e2e279674718b098309b9e778d89ce1d.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
研究,那么很难做到真正的技术提升。**
**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**