电商+支付双系统项目------实现电商系统中分类模块的开发!

本篇文章主要介绍一下这个项目中电商系统的分类模块开发。电商系统有很多模块,除了分类模块,还有用户模块,购物车模块,订单模块等等。上一篇文章已经讲了用户模块,这篇文章我们讲讲项目中的分类模块。

有的人可能会很懵,分类模块是个啥?你说的用户模块是针对用户的,购物车模块是针对购物车的,分类模块是什么?其实,在电商系统中,分类模块是用于对商品进行分类和组织的功能模块。它允许商家将商品按照一定的标准进行分类,以便用户能够更容易地浏览和搜索他们感兴趣的商品。

通过上面两幅图,先带大家直观感受下分类模块大概是个啥,脑子里有个画面。

再来通过一个例子了解一下商品分类层级结构:

  • 服装(Clothing)
    • 男装(Men's Clothing)
      • 衬衫(Shirts)
      • 裤子(Pants)
      • 外套(Jackets)
    • 女装(Women's Clothing)
      • 连衣裙(Dresses)
      • 上衣(Tops)
      • 裙子(Skirts)
  • 鞋类(Shoes)
    • 男鞋(Men's Shoes)
      • 运动鞋(Athletic Shoes)
      • 皮鞋(Dress Shoes)
    • 女鞋(Women's Shoes)
      • 高跟鞋(High Heels)
      • 平底鞋(Flats)

在导航菜单中显示主分类(例如"服装"和"鞋类"),在各自的子菜单中显示子分类(例如"男装"和"女装")。

了解完分类模块到底是什么后,我们应该想想如何设计分类模块的代码?我们还是从Dao层->service层->controller层这个开发顺序。

设计Dao层

package com.imooc.mall.dao;import com.imooc.mall.pojo.Category;import java.util.List;public interface CategoryMapper {int deleteByPrimaryKey(Integer id); //根据主键id删除对应的商品分类记录int insert(Category record);  //插入一条商品分类记录int insertSelective(Category record);  //选择性地插入一条商品分类记录,只插入非空字段Category selectByPrimaryKey(Integer id);  //根据主键id查询对应的商品分类记录int updateByPrimaryKeySelective(Category record);  //选择性地更新商品分类记录,只更新非空字段int updateByPrimaryKey(Category record);  //更新商品分类记录的所有字段List<Category> selectAll();  //查询所有的商品分类记录,返回一个商品分类列表
}

上面的代码是一个名为CategoryMapper的接口,它定义了对商品分类数据进行操作的方法。这些方法定义了对商品分类表的常见操作,包括插入、更新、删除和查询等。它们提供了对商品分类数据的基本访问功能,供其他组件(如服务层)使用。实际的数据操作逻辑需要在CategoryMapper的实现类中进行实现。

关于这些方法的实现类真的很复杂,我的建议是了解一下就好,不算太重点,实现类其实就长这样:

Dao层设计好了我们接着来设计service层

设计service层

package com.imooc.mall.service;import com.imooc.mall.vo.CategoryVo;
import com.imooc.mall.vo.ResponseVo;import java.util.List;
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 {@Autowiredprivate CategoryMapper categoryMapper;/*** 耗时:http(请求微信api) > 磁盘 > 内存* mysql(内网+磁盘)* @return*/@Overridepublic 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 + streamList<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);}@Overridepublic 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 {@Autowiredprivate ICategoryService categoryService;@GetMapping("/categories")public ResponseVo<List<CategoryVo>> selectAll() {return categoryService.selectAll();}
}

这段代码是一个CategoryController类,它是一个基于Spring的RESTful风格的控制器。

通过定义这个控制器类,我们就可以将"/categories"路径映射到selectAll()方法,并在客户端发起GET请求时返回所有商品分类的信息。这样,当你访问"/categories"路径时,控制器会调用categoryService.selectAll()方法获取商品分类信息,并将结果封装在ResponseVo对象中返回给客户端。

这个控制器类的作用是将客户端请求与商品分类的业务逻辑进行关联,通过调用categoryService中的方法来处理和返回相应的结果。

怎么样?我讲的已经很明白了吧!

通过上面的讲解,我相信你应该知道分类模块是怎么用代码实现的了。这篇文章我讲了我是如何设计电商系统的分类模块的,当然,电商系统还有很多其他的模块,比如用户模块,购物车模块,订单模块等,我只是介绍了其中的一个模块,其他的模块等我下几篇文章会详细介绍!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2799602.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

第2讲:C语言数据类型和变量

第2讲&#xff1a;C语言数据类型和变量 目录1.数据类型介绍1.1字符型1.2整型1.3浮点型1.4 布尔类型1.5 各种数据类型的长度1.5.1 sizeof 操作符1.5.2 数据类型长度1.5.3 sizeof 中表达式不计算 2.signed 和 unsigned3.数据类型的取值范围4. 变量4.1 变量的创建4.2 变量的分类 5…

[word] word如何设置每行字符数 #笔记#经验分享#媒体

word如何设置每行字符数 如何设置每行字符数&#xff1f; 设置WORD设定每行中的字符数和每页中的行数的具体步骤如下&#xff1a; 我们需要准备的材料分别是&#xff1a;电脑、word文档。 1、首先我们打开需要编辑的word文档&#xff0c;点击打开“页面布局”。 2、然后我们…

【算法与数据结构】200、695、LeetCode岛屿数量(深搜+广搜) 岛屿的最大面积

文章目录 一、200、岛屿数量1.1 深度优先搜索DFS1.2 广度优先搜索BFS 二、695、岛屿的最大面积2.1 深度优先搜索DFS2.2 广度优先搜索BFS 三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、200、岛屿数量 1.1 深度优先搜…

CQT新里程碑:SOC 2 数据安全认证通过,加强其人工智能支持

Covalent Network&#xff08;CQT&#xff09;发展新里程碑&#xff1a;SOC 2 数据安全认证通过&#xff0c;进一步加强了其人工智能支持 Covalent Network&#xff08;CQT&#xff09;现已完成并通过了严格的 Service Organization Control&#xff08;SOC) 2 Type II 的合规性…

java数据结构与算法刷题-----LeetCode222. 完全二叉树的节点个数

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 1. 法一&#xff1a;利用完全二叉树性质&#xff0c;进行递归二分查找 解…

maven工程打包引入本地jar包

1、通过maven生成本地区仓库包 mvn install:install-file --settings D:\lkx\download\apache-maven-3.6.3\conf\settings.xml -Dfileaspose-cad-21.8.jar -DartifactIdaspose-cad -DgroupIdsystem.core -Dversion21.8 -Dpackagingjar -DgeneratePomtrue # --settings&#xf…

JS前端高频面试

JS数据类型有哪些&#xff0c;区别是什么 js数据类型分为原始数据类型和引用数据类型。 原始数据类型包括&#xff1a;number&#xff0c;string&#xff0c;boolean&#xff0c;null&#xff0c;undefined&#xff0c;和es6新增的两种类型&#xff1a;bigint 和 symbol。&am…

Observability:使用 OpenTelemetry 和 Elastic 监控 OpenAI API 和 GPT 模型

作者&#xff1a; 来自 Elastic David Hope ChatGPT 现在非常火爆&#xff0c;甚至席卷了整个互联网。 作为 ChatGPT 的狂热用户和 ChatGPT 应用程序的开发人员&#xff0c;我对这项技术的可能性感到非常兴奋。 我看到的情况是&#xff0c;基于 ChatGPT 的解决方案将会呈指数级…

TestNG与ExtentReport单元测试导出报告文档

TestNG与ExtentReport集成 目录 1 通过实现ITestListener的方法添加Reporter log 1.1 MyTestListener设置 1.2 输出结果 2 TestNG与ExtentReporter集成 2.1 项目结构 2.2 MyExtentReportListener设置 2.3 单多Suite、Test组合测试 2.3.1 单Suite单Test 2.3…

Pytorch 复习总结 3

Pytorch 复习总结&#xff0c;仅供笔者使用&#xff0c;参考教材&#xff1a; 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为&#xff1a;Pytorch 多层感知机。 本文先介绍了多层感知机的用法&#xff0c;再就训练过程中经常出现的过拟…

win10编译openjdk源码

上篇文章作者在ubuntu系统上实践完成openjdk源码的编译&#xff0c;但是平常使用更多的是window系统&#xff0c;ubuntu上编译出来JDK无法再windows上使用。所以作者又花费了很长时间在windows系统上完成openjdk源码的编译&#xff0c;陆续花费一个月的时间终于完成了编译。 本…

【Unity3D】ASE制作天空盒

找到官方shader并分析 下载对应资源包找到\DefaultResourcesExtra\Skybox-Cubed.shader找到\CGIncludes\UnityCG.cginc观察变量, 观察tag, 观察代码 需要注意的内容 ASE要处理的内容 核心修改 添加一个Custom Expression节点 code内容为: return DecodeHDR(In0, In1);outp…

[bing]“gang调度 Kubernetes的并发控制和一致性机制“论点的对应的源码分析

你是一位K8S专家。请分析在Kubernates&#xff08;https://github.com/kubernetes/kubernetes.git&#xff09;项目和调度coscheduling(https://github.com/kubernetes-sigs/scheduler-plugins/tree/master/pkg/coscheduling) 插件中支撑"PodGroup的管理和调度决策涉及到对…

Elasticsearch:使用 ELSER v2 进行语义搜索

在我之前的文章 “Elasticsearch&#xff1a;使用 ELSER 进行语义搜索”&#xff0c;我们展示了如何使用 ELESR v1 来进行语义搜索。在使用 ELSER 之前&#xff0c;我们必须注意的是&#xff1a; 重要&#xff1a;虽然 ELSER V2 已正式发布&#xff0c;但 ELSER V1 仍处于 [预览…

MKS薄膜规622/626/627/628/629说明接口定义等说明

MKS薄膜规622/626/627/628/629说明接口定义等说明

【day02】每天三道 java后端面试题:Java、C++和Go的区别 | Redis的特点和应用场景 | 计算机网络七层模型

文章目录 1. Java、C和 Go 语言的区别&#xff0c;各自的优缺点&#xff1f;2. 什么是Redis&#xff1f;Redis 有哪些特点&#xff1f; Redis有哪些常见的应用场景&#xff1f;3. 简述计算机网络七层模型和各自的作用&#xff1f; 1. Java、C和 Go 语言的区别&#xff0c;各自的…

Bert基础(三)--位置编码

背景 还是以I am good&#xff08;我很好&#xff09;为例。 在RNN模型中&#xff0c;句子是逐字送入学习网络的。换言之&#xff0c;首先把I作为输入&#xff0c;接下来是am&#xff0c;以此类推。通过逐字地接受输入&#xff0c;学习网络就能完全理解整个句子。然而&#x…

【实战】CEF框架集成MFC DLL的一些坑

文章目录 DLL 导出方式&#xff0c;函数指针的坑问题出现问题解决 CEF集成MFCafxwin.h预编译编译参数修改 DLL重命名 MFC作为微软的长期主力开发套件之一&#xff0c;之前很多设备开发的C/S端界面都是通过MFC框架来做的&#xff0c;而在我自己的CEF项目中&#xff0c;会集成很多…

顺序表详解(如何实现顺序表)

文章目录 前言 在进入顺序表前&#xff0c;我们先要明白&#xff0c;数据结构的基本概念。 一、数据结构的基本概念 1.1什么是数据结构 数据结构是由“数据”和“结构”两词组合而来。所谓数据就是&#xff1f;常见的数值1、2、3、4.....、姓名、性别、年龄&#xff0c;等。…

React基础-webpack+creact-react-app创建项目

学习视频&#xff1a;学习视频 2节&#xff1a;webpack工程化创建项目 2.1.webpack工程化工具&#xff1a;vite/rollup/turbopak; 实现组件的合并、压缩、打包等&#xff1b; 代码编译、兼容、校验等&#xff1b; 2.2.React工程化/组件开发 我们可以基于webpack自己去搭建…