手把手教你写购物车(完整篇1)

2023-11-02

购物车的设计与思路

1:在做任何业务的时候,首先要做的是把思路的流程捋清楚。再进行代码的编写,以及实现!
2:对业务涉及到的技术,如果没接触过的,首先要学习至会用为止。
3:如果思路不是很清楚的,可以查找类似的案列情况,学习思路流程。
4:具体的业务情况,还是要根据自己的情况,进行设计。

开始讲购物车,涉及的技术知识

1:Cookie —>cookie数据存放在客户的浏览器上
2:Session —>session数据放在服务器上
3:Redis —>储存的数据类型:(字符串) String, (集合) List, (哈希) hash, (集合) set, (有序集合) sorted set)

先看几个图片吧

这是京东的购物流程(用户未登录的情况下的)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

这是用户登录以后的流程。就拿买手机举例子。
同一个手机,比如荣耀20,不同参数的价格不同(6+64G的,和8+128G的)
这个例子是为了说明,价格不一定在商品表内。
价格表可能是独立出来的一张表,且与商品表是多对一的关系
商品表(一)-----------> 价格表(多)

在这里插入图片描述

在这里插入图片描述

这里,我把表结构设计一下
Product 商品表 (可以在数据库建表)
Price 价格类别表 (可以在数据库建表)
ShoppingCart 购物车类 (暂存表,数据存到Redis中去)
ShoppingItem 购物项类 (暂存表,数据存到Redis中去)

搭建SpringBoot项目工程
引入相关的依赖,关于jedis的,fastjson的依赖
Swagger是接口测试的工具。(有兴趣的可以看看我写的有一篇关于Swagger的文章,简单配置使用)
这里,持久层 我用的是JPA,不是Mybatis

<!-- 引入Swagger的依赖工具 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>
        <!-- fastjson-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.49</version>
        </dependency>
        <!-- jedis-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.6.0</version>
        </dependency>
		<!-- jpa-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

项目的大概目录结构

在这里插入图片描述

SwaggerConfig配置类

/**
 * @Auther: Administrator
 * @Date: 2020/4/23
 * @Description:
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket createRestApi () {
        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.any())
                .paths(PathSelectors.any()).build();
    }

    private ApiInfo apiInfo () {
        return new ApiInfoBuilder()
                .title("SpringBoot API Doc")
                .description("good")
                .version("1.0")
                .build();
    }
}

需要用到的几个类,上面讲过的,代码直接粘贴上来。

/**
 * 商品
 */
@Data
public class Product {

    /**
     * 商品的ID
     */
    private Long id;

    /**
     * 商品的名称
     */
    private String productName;

    /**
     *  商家的ID (一个商家多个产品)
     */
    private String businessId;

    /**
     * 价格的ID (一个商品多个价格)
     */
    private Integer priceId;

}
/**
 * 价格
 */
@Data
public class Price {

    /**
     * 价格的ID
     */
    private Long id;

    /**
     * 价格
     */
    private BigDecimal priceValue;

    /**
     * 类别 (不同的类别 不同的价格)
     */
    private Integer type;
}

/**
 * 购物车
 */
@Data
public class ShoppingCart {

    private static final long serialVersionUID = 1l;

    private List<ShoppingItem> items = new ArrayList<ShoppingItem>();

    public List<ShoppingItem> getItems() {
        return items;
    }

    public void setItems(List<ShoppingItem> items) {
        this.items = items;
    }

    /**
     * 添加购物项目
     */
    public void addShoppingItem (ShoppingItem shoppingItem) {

        if (items.contains(shoppingItem)) {
            for (ShoppingItem item: items) {
                item.setProductCount(shoppingItem.getProductCount() + item.getProductCount());
            }
        } else {
            items.add(shoppingItem);
        }
    }

    /**
     * 数量
     */
    public Integer getTotalCount () {
        Integer totalCount = 0;
        for (ShoppingItem shoppingItem: items) {
            totalCount += shoppingItem.getProductCount();
        }
        return totalCount;
    }

    /**
     * 金额
     */
    public BigDecimal getTotalMoney () {
        BigDecimal totalMoney = new BigDecimal(0);
        for (ShoppingItem shoppingItem: items) {
            BigDecimal count = new BigDecimal(shoppingItem.getProductCount().toString());
            BigDecimal productPrice = new BigDecimal(shoppingItem.getProductPrice().toString());
            totalMoney = totalMoney.add(count.multiply(productPrice));
        }
        return totalMoney;
    }
}
/**
 * 购物项
 */
@Data
public class ShoppingItem {

    /**
     * 商品
     */
    private Product product;

    /**
     * 数量
     */
    private Integer productCount;

    /**
     * 价格
     */
    private BigDecimal productPrice;

}

接下来,把service以及ipml的粘贴出来后,就是业务流程的问题了,
在这里,还是要再去看看Redis的数据存储结构,以便接下来的业务。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

手把手教你写购物车(完整篇1) 的相关文章

  • JSF2.0 中的空白输入字段未设置为 NULL

    我有一个支持 bean 其中 fileld 为 Long Double Integer String 当我没有在输入字段中指定任何内容时 长整型 整数和双精度值将被视为零 而不是空 我正在使用 tomcat 来部署我的应用程序 有什么解决办
  • 仅运行相应源代码已更改的单元测试?

    我正在 Jenkins CI 服务器中运行单元测试和 Selenium 测试 众所周知 在大型项目中测试需要很长时间才能运行 Java 是否有一个工具 框架只能触发其源代码已更改的测试 这是因为并非每次对 SCM 的提交都会影响源代码的所有
  • Java 比 Xmx 参数消耗更多内存

    我有一个非常简单的 Web 服务器类 基于 Java SEHttpServer class 当我使用此命令启动编译的类来限制内存使用时 java Xmx5m Xss5m Xrs Xint Xbatch Test 现在如果我使用检查内存top
  • 将 java 方法参数设置为最终参数

    那有什么区别final在下面的代码之间进行 将参数声明为有什么好处final public String changeTimezone Timestamp stamp Timezone fTz Timezone toTz return pu
  • 如何从球衣服务端点发送实体列表?

    我正在从球衣服务器发送实体列表 在客户端 我试图获取这些实体列表 但它给了元帅例外 为什么它在元素名末尾添加 s 即 emps 而不是 emp XmlRootElement public class Emp Server side code
  • 如何确定 JDialog 显示在哪个屏幕上

    我有一个非常大的应用程序 有多个对话框 我的任务是确保不完全可见的对话框 因为用户将其从可见屏幕区域拉出 移回屏幕中心 当我只处理一个屏幕时 这没问题 它工作得很好 但是 该应用程序的大多数用户的桌面上都有两个屏幕 当我尝试找出对话框显示在
  • 如何从 Java 生产代码中删除调试语句

    编译器是否可以从生产代码中删除用于调试目的 例如日志记录 的语句 调试语句需要以某种方式进行标记 可能使用注释 设置属性 debug true 并在每个调试语句中检查它很容易 但这会降低性能 如果编译器能够简单地使调试语句消失 那就太好了
  • 如何防止我的 servlet 被其他网站调用

    好的 我有一个像这样的简单的 servlet public class SimpleServlet extends HttpServlet public void doPost HttpServletRequest req HttpServ
  • 字符串 a == 字符串 b 的规则 [重复]

    这个问题在这里已经有答案了 我试图了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是什么 例如这个片段 public static void main String hi String s1 lol String s2 lol S
  • 覆盖乔达一周的第一天?

    是否有可能覆盖乔达弱的第一天sunday 因为 Joda 使用Monday作为一周的第一天 如果有办法的话 谁能解释一下 我在 SOF 中提到了以下主题 乔达时间 一周的第一天 https stackoverflow com questio
  • String.intern() 线程安全吗

    我想在Java中使用 String intern 来节省内存 对具有相同内容的字符串使用内部池 我从不同的线程调用这个方法 这是个问题吗 对你的问题的简短回答是肯定的 它是线程安全的 但是 您可能需要重新考虑使用此工具来减少内存消耗 原因是
  • Java中如何将Object[]转换为String[]?

    我有一个关于 Java 的问题 我有一个Object Java默认的 不是用户定义的 我想将它转换为String 谁能帮我 谢谢 这是转换 for int i 0 i lt objectArr length i try strArr i o
  • 在Android项目中引用(纯java)项目(找不到类)

    我试图在我的 Android 项目中引用一个纯 java 项目 gt Java 项目有一大堆我需要使用的类 哦 正如第一个回复所指出的 我正在使用 eclipse 是的 唯一的问题是 我总是找不到类 XXX 从方法 com example
  • Spring Boot 中的服务限流能力

    有什么办法可以实现Spring中其余服务的服务限制能力 特别是Spring boot 这里的期望是 我的服务暴露于外界 目前每秒 分钟的服务调用数量没有限制 我们希望通过设置限制来控制这一点 我有一个替代选项 通过跟踪并发哈希映射或任何缓存
  • jasper 报告文件中出现错误

    首先 我在 iReport 5 1 0 中创建一个 R D1 jrxml 文件 我执行该报告的 Java 代码如下所示 import java sql Connection import java sql DriverManager imp
  • 如何让 Camel FTP 按需只获取一次

    我对骆驼还很陌生 我一直在尝试让 Camel 根据需要仅通过 FTP 获取单个文件一次 我无法让它发挥作用 这是我尝试过的 让我知道什么是最好的方法以及我的代码有什么问题 1 读取文件后发送一条空消息当收到空消息时 停止路由 from di
  • 使用 ProcessBuilder 启动 CMD

    我尝试使用以下代码在 Windows 中启动 CMD 应用程序 但它无法按预期工作 来自不同网站的几个示例表明 cmd 作为 ProcessBuilder 构造中的参数应该有效 我需要做什么才能让我的 Java 应用程序在 Windows
  • 原子整数的compareandexchange()与compareandset()

    在研究 AtomicInteger 时 我发现这个 API 提供了两种方法 比较和交换 如果当前值被引用 则自动将该值设置为 newValue to 作为见证值 预期值 记忆效应为 由指定VarHandle compareAndExchan
  • Android NDK - 仅用 C/C++ 编写

    有没有一种可能的方法可以使用 C C 编写整个 NDK 应用程序 而无需像 hello jni 示例项目 HelloJni java 中那样的 Java 入门 类 以某种方式创建一个 HelloJni c 来执行相同的操作 从 Androi
  • Spring - 使用存储过程时使用 simplejdbccall 进行批量更新

    我正在使用 spring jdbc 模板 使用存储过程创建记录 public Long create City obj SimpleJdbcCall jdbcCall new SimpleJdbcCall getJdbcTemplate g

随机推荐

  • c++中和c语言不相同的地方

    c 糅合了c语言的语法 并且在c语言的基础上进行了改进 并且具有向下兼容的特性 但是c 改进了什么东西呢 今天就来学习一下吧 目录 命名空间 namespace cout与cin与endl 流插入符与流运算符 using namespace
  • [MySql]JDBC编程

    JDBC 即Java Database Connectivity java数据库连接 是一种用于执行SQL语句的Java API 它是Java中的数据库连接规范 这个API由 java sql javax sql 包中的一些类和接口组成 它
  • Vite unplugin-auto-import插件 自动引入组件

    文章目录 一 参考 二 快速入门 三 开发问题 3 1 解决eslint 报错的问题 3 2 解决 typescritp 报错的问题 unplugin auto import 自定义配置说明 一 参考 unplugin auto impor
  • QT textBrowser 设置每个字符串的颜色和大小

    QT textBrowser 设置每个字符串的颜色和大小 QT中textBrowser每行显示不同颜色 解决 Qt textBrowser 每行字体设置中的 n 缺失问题 原理 字体采用 html语言进行设置 方法 1 需要采用 appen
  • windows10 mvn安装后不是内部命令

    好气啊 maven 命令不识别 扒拉了半天 结果把全路径仍path一份就好使了 先记着吧
  • VS2010中C#调用C函数

    VS2010中C 调用C函数 2013 07 22 16 12 50 转载 分类 C Concept 1 创建C本地DLL文件 1 1 创建Win32Dll项目 1 2 创建DLL 点击完成 1 3 在 头文件 里新建文件 CPPLibra
  • 最小点覆盖问题详解

    那么一如既往 还是个人觉得学习某一个知识点之前先粗俗的了解其是个什么东东 然后再去了解概念比较好 那么下面结合题目来了解 首先最最重要的是理解题意 有k个任务 每个任务task i可以用机器A的x i模式做 也可以由机器B的y i模式做 值
  • 6款非常好用的设计软件盘点

    近年来 随着社会的发现 中国的设计行业也取得了快速的进步 人们对设计的要求越来越高 设计师也越来越多 设计成本也在上升 作为一名设计师 找到合适的设计软件尤为重要 以下是一些我认为有用的设计软件 供您参考 1 figma Figma是一个U
  • Linux网络莫名其妙ping不通外网

    做实验之前 网络设置一切正常 一开始能成功ping通外网 但是过一会儿就出问题 yum也用不了 查了所有的配置都没有任何问题 最后尝试了一下将原来的网段更换 将虚拟机里的虚拟网络编辑器NAT模式的子网IP更换一个网段 原来是158网段 现更
  • 利用Github快速搭建个人博客总结(亲测)

    近一年多时间一直都在用CSDN 讲真这个CSDN有时候资料很多 我也很自豪加入这个大家庭 不过身边有两个同学 一个在github托管了属于自己的博客 另一个在云上面编写了属于自己的博客 后者的理由是 CSDN太low 上面很多都是转发的文章
  • 机器学习—支持向量机理论详细推导(含例题讲解)(二)

    7 最大间隔算法 算法 输入 T x 1
  • 修改镜像配置后 启动docker失败

    背景 systemctl start docker失败 输出如下 systemctl restart docker Job for docker service failed because the control process exit
  • 机器学习中的类别不均衡问题

    基础概念 类别不均衡 指在分类算法中 不同样本类别的比例悬殊比较大 会对算法的学习过程造成重大干扰 比如 一个二分类的问题上 有1000个样本 其中5个正样本 995个负样本 在这种情况下 算法只需将所有的样本预测为负样本 那么它的精度也可
  • FTP协议详解

    一 FTP协议的概述 1 文件传送协议 File Transfer Protocol 是互联网上使用的最广泛的文件传输协议 用于Internet上的控制文件的双向传输 2 FTP提供交互式的访问 允许客户指明文件类型与格式 并允许文件具有存
  • Makefile(面试必备)

    1 Makefile基本介绍 1 1 makefile介绍 make是一个工程管理器 它可以根据文件时间自发检测更新的文件从而减少编译量 makefile文件和make工具一起使用 用于控制工程项目的编译和链接 也可以用来编写手册页和程序的
  • nginx部署vue项目并访问后端接口遇到 503 服务器不可用

    nginx部署vue项目并访问后端接口遇到Uncaught in promise Error Request failed with status code 503 今天在一台阿里云上部署了springboot后端 并测试通过 但是在部署v
  • pytorch版本官网命令

    COMMANDS FOR VERSIONS gt 1 0 0 v1 8 0 Conda OSX conda conda install pytorch 1 8 0 torchvision 0 9 0 torchaudio 0 8 0 c p
  • 多维时序

    多维时序 MATLAB实现GWO GRU灰狼算法优化门控循环单元的多变量时间序列预测 目录 多维时序 MATLAB实现GWO GRU灰狼算法优化门控循环单元的多变量时间序列预测 预测效果 基本介绍 程序设计 参考资料 预测效果 基本介绍 M
  • homestead实现外部局域网络其他主机的访问

    homestead 2 0 MAC环境 修改Homestead目录下的Vagrantfile文件 加上这么一行 config vm network public network ip 192 168 1 XXX IP地址为该局域网内其他未被
  • 手把手教你写购物车(完整篇1)

    购物车的设计与思路 1 在做任何业务的时候 首先要做的是把思路的流程捋清楚 再进行代码的编写 以及实现 2 对业务涉及到的技术 如果没接触过的 首先要学习至会用为止 3 如果思路不是很清楚的 可以查找类似的案列情况 学习思路流程 4 具体的