SpringBoot项目--电脑商城【显示购物车列表】

news2024/10/7 18:28:14

1.持久层

1.1规划需要执行的SQL语句

这里需要将商品表和购物车表进行连表查询

显示某用户的购物车列表数据的SQL语句大致是

多表查询如果字段不重复则不需要显示的表面表名

select
	cid, #日后勾选购物车商品模块需要用到cid来确定勾选的是购物车表的哪一条数据
	
	uid, #感觉没必要,因为uid可以从session中拿的呀,难道是为
	#了后面提交购物车订单时判断提交的商品的uid和登录的uid是否一致?
	
	pid, #日购提交订单模块需要用到pid来确定购买的是商品表的哪件商
	#品,然后对商品表的该商品的库存,销售热度等信息进行修改
	
	t_cart.price, #两个表都有该字段,需要指定获取的是哪个数据表的
	
	t_cart.num, #两个表都有该字段且含义不同,需要指定获取的是哪个数据表的
	
	title,
	
	t_product.price as realPrice, #为了在购物车列表页展示两个价格的差值
	
	image
	
from t_cart
left join t_product on t_cart.pid = t_product.id #把t_cart作为主表
where
	uid = #{uid}
order by
	t_cart.created_time desc #进行排序使最新加入购物车的在最上面

1.2 VO对象:显示给前端页面的数据【多表操作】

VO全称Value Object,值对象。当进行select查询时,查询的结果属于多张表中的内容,此时发现结果集不能直接使用某个POJO实体类来接收,因为POJO实体类不能包含多表查询出来的信息,解决方式是:重新去构建一个新的对象,这个对象用于存储所查询出来的结果集对应的映射,所以把这个对象称之为值对象.

在store包下创建一个vo包,在该包下面创建CartVO类,不需要继承BaseController类,那相应的就需要单独实现Serializable接口

/**
 * 不需要继承BaseController类,那相应的就需要单独实现Serializable接口
 * 购物车数据的VO类(Value Object)
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CartVO implements Serializable {
    private Integer cid;
    private Integer uid;
    private Integer pid;
    private Long price;
    private Integer num;
    private String title;
    private String image;
    private Long realPrice;
}

2.在CartMapper接口中添加抽象方法

/**
 * 查询某用户的购物车数据
 * @param uid 用户id
 * @return 该用户的购物车数据的列表
 */
List<CartVO> findVOByUid(Integer uid);

1.3 编写映射

    <select id="findVOByUid" resultType="com.example.mycomputerstore.VO.CartVO" >
        SELECT cid, uid, pid,
               t_cart.price, t_cart.num,
               t_product.title, t_product.image,
               t_product.price AS realprice
        FROM t_cart
                 LEFT JOIN t_product
                           ON t_cart.pid = t_product.id
        WHERE uid = #{uid}
        ORDER BY t_cart.created_time DESC
    </select>

1.4 单元测试

在CartMapperTests测试类中添加findVOByUid()方法的测试

    @Test
    public void findVOByUid(){
        System.out.println(cartMapper.findVOByUid(2));
    }

2.业务层

2.1 规划异常

查询不到就返回空,不需要规划异常【查询没有异常】

2.2设计接口和抽象方法及实现

1.在ICartService接口中添加findVOByUid()抽象方法

/**
 * 查询某用户的购物车数据
 * @param uid 用户id
 * @return 该用户的购物车数据的列表
 */
List<CartVO> getVOByUid(Integer uid);

2.在CartServiceImpl类中重写业务接口中的抽象方法

@Override
public List<CartVO> getVOByUid(Integer uid) {
    return cartMapper.findVOByUid(uid);
}

2.3单元测试

该业务层只是调用了持久层的方法并返回,可以不再测试

3.控制层

3.1 处理异常

业务层没有抛出异常,所以这里不需要处理异常

3.2 设计请求

  • /carts/
  • GET
  • HttpSession session
  • JsonResult<List<CartVO>>

3.3 处理请求

在CartController类中编写处理请求的代码。

    /**
     * 根据用户id查询购物车
     * @param session: 为了获取用户的uid
     * @return
     */
    @GetMapping({"/",""})//表示直接输入/cart就可以访问
    public JsonResult<List<CartVO>> getVOByUid(HttpSession session){
        List<CartVO> data = cartService.getVOByUid(getuidFromSession(session));
        return new JsonResult<>(OK,data);
    }

4. 前端页面

1.将cart.html页面的head头标签内引入的cart.js文件注释掉(这个就是文件的功能:点击"+“,”-",“删除”,"全选"等按钮时执行相应的操作)

<!-- <script src="../js/cart.js" type="text/javascript" charset="utf-8"></script> -->

多说一下,form标签的action="orderConfirm.html"属性(规定表单数据提交到哪里)和结算按钮的类型"type=submit"是必不可少的,这样点击"结算"时才能将数据传给"确认订单页"并在"确认订单页"展示选中的商品数据

当然也可以把这两个删掉,然后给结算按钮添加"type=button"然后给该按钮绑定一个点击事件实现页面跳转和数据传递,但是这样太麻烦了

 submit和button的区别

submit和button,二者都以按钮的形式展现,看起来都是按钮,所不同的是type属性和处发响应的事件上,submit会提交表单,button不会提交表单. submit默认为form提交,可以提交表单(form). button则响应用户自定义的事件,如果不指定onclick等事件处理函数,它是不做任何事情.

2.注意点:form表单结构。

  • action="orderConfirm.html"
  • id="cart-list"
  • type="button" value="  结  算  "

3.使用ajax发起请求用户购物车的数据

<script type="text/javascript">
			/*
			* 读取当前页面的加载
			* */
			$(document).ready(function (){
				//展示购物车列表
				showCartList()
			})

			//展示购物车列表
			function showCartList(){
				//清空tbody
				$("#cart-list").empty()
				$.ajax({
					url:"/cart",
					type:"GET",
					dataType:"JSON",
					success: function (e) {
						console.log(e.data)
						//获取数据
						let list = e.data;
						for (let i=0;i<list.length;i++) {
							/*
							*  name="cids" value="#{cid}":为了传到“确认支付”页面做准备
							* ..#{image}collect.png==数据库中的样式【/images/portal/00GuangBo1040A5GBR0731/】
							* 	实际上需要的是【../images/portal/00GuangBo1040A5GBR0731/collect.png】
							*   msg:表示真实价格
							* */
							let tr = '<tr>\n' +
									'<td>\n' +
									'<input name="cids" value="#{cid}" type="checkbox" class="ckitem" />\n' +
									'</td>\n' +
									'<td><img src="..#{image}collect.png" class="img-responsive" /></td>\n' +
									'<td>#{title}#{msg}</td>\n' +
									'<td>¥<span id="goodsPrice#{cid}">#{singlePrice}</span></td>\n' +
									'<td>\n' +
									'<input id="price-#{cid}"  type="button" value="-" class="num-btn" onclick="reduceNum(2)" />\n' +
									'<input id="goodsCount#{cid}" type="text" size="2" readonly="readonly" class="num-text" value="#{num}">\n' +
									'<input id="price+#{cid}" class="num-btn" type="button" value="+" onclick="addNum(2)" />\n' +
									'</td>\n' +
									'<td><span id="goodsCast#{cid}">#{totalPrice}</span></td>\n' +
									'<td>\n' +
									'<input type="button" onclick="delCartItem(this)" class="cart-del btn btn-default btn-xs" value="删除" />\n' +
									'</td>\n' +
									'</tr>'
							tr=tr.replace(/#{cid}/g,list[i].cid);
							tr=tr.replace(/#{image}/g,list[i].image);
							tr=tr.replace(/#{title}/g,list[i].title)
							//当前商品的真实的价格
							tr=tr.replace(/#{msg}/g,list[i].realPrice)
							tr=tr.replace("#{num}",list[i].num)
							//单价
							tr=tr.replace("#{singlePrice}",list[i].price)
							//总价
							tr=tr.replace(/#{totalPrice}/g,list[i].price*list[i].num)

							//将数据加入表中
							$("#cart-list").append(tr);
						}
					},
					error(xhr){
						alert("购物车列表数据加载产生未知的异常"+xhr.status)
					}
				})
			}
		</script>

这tr变量是怎么声明的呢:

先敲下var=‘’;然后在上面的html里面找到tbody下的任意一个tr标签复制在单引号里面,然后删掉制表符.最后对该字符串稍加改动:

1.第18行name=“cids” value="#{cid}"是为"点击结算按钮跳转到确认订单页面"模块做准备。这两个属性都是自己添加的,在tbody复制的tr标签里面没有,这两个属性是为了跳转到"确认订单页"时能够携带该参数(比如传递cids=1)

2.第26οnclick="addNum(#{cid})“是为"在购物车列表增加商品数量"模块做准备。是为了点击”+"后能调用addNum函数并传入对应的cid

3.第22行id="goodsPrice#{cid}"和第25行id="goodsCount#{cid}"和第28行id="goodsCast#{cid}"都是为"在购物车列表增加商品数量"模块做准备。在后端更新完商品数量相应的前端页面也要更新:

根据id="goodsCount#{cid}"获取数量相关的控件后更新其value属性的值(value属性用.val()赋值)
根据id="goodsPrice#{cid}"获取价格相关的控件后拿到其单价
将单价和数量相乘后,根据id="goodsCast#{cid}"获取总价相关的控件并更新其文本值(文本用.html()更新)
4.上面这三条都是和本模块无关的,其余的修改都是和本模块相关的,在tbody复制的tr标签里面都有,比葫芦画瓢就可以了

点击"结算"按钮页面跳转的实现:在cart.html页面点击"结算"后会跳转到"确认订单页"并将表单中的数据作为参数传递给"确认订单页"

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

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

相关文章

教你如何利用人工智能技术提升气象、海洋、水文领域工作学习效率

查看原文>>>基于Python机器学习、深度学习提升气象、海洋、水文领域实践应用能力 Python是功能强大、免费、开源&#xff0c;实现面向对象的编程语言&#xff0c;能够在不同操作系统和平台使用&#xff0c;简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库…

小程序 navigateBack 携带参数返回的三种方式(详细)

如果觉着主图好看,点个赞,你早晚也会看到这么好看的景色! 第一种方式 getCurrentPages 获取当前页面栈。数组中第一个元素为首页,最后一个元素为当前页面。不要尝试修改页面栈,会导致路由以及页面状态错误。不要在 App.onLaunch 的时候调用 getCurrentPages(),此时 page …

选择什么电容笔比较好?主动式电容笔推荐

随着科学技术的飞速发展&#xff0c;越来越多人把纸质转换为电子版了&#xff0c;许多小伙伴会入手电容笔来提高自己的生产效率。无论是写作还是绘画。都在使用电容笔。apple pencil的昂贵众所周知&#xff0c;而现在线上的电容笔多得让我们眼花缭乱&#xff0c;再从众多品牌中…

测试平台部署三——Nginx

测试平台部署——Nginx 一、nginx部署1、nginx的作用:2、案例1二、django静态文件配置和部署1、nginx工作原理2、反向代理一、nginx部署 1、nginx的作用: 静态文件服务器和反向代理django服务 进入nginx容器中 sudo docker run --rm -it nginx:alpine /bin/sh

VPN都容易受到泄露流量的TunnelCrack攻击

导读研究人员近日发现&#xff0c;影响市面上大多数VPN产品的几个漏洞可以被攻击者用来读取用户流量、窃取用户信息&#xff0c;甚至攻击用户设备。 我们实施的攻击从计算上来说开销并不大&#xff0c;这意味着任何拥有适当网络访问权限的人都可以执行攻击&#xff0c;而且攻击…

Seekbar细节

Seekbar可以自定义thumb图标&#xff0c;但是有时候发现thumb没有展示完全&#xff0c;或者图标周围显示的是背景色&#xff0c;此时就需要设置一些属性 android:background"null" android:thumbOffset"0dp" android:splitTrack"false" 设置an…

WSL Ubuntu设置中文语言环境

问题现象&#xff1a;终端、Edge、VScode等软件乱码 在这里插入图片描述 解决方法 ① 安装中文语言包 sudo apt-get install language-pack-zh-han*② 运行语言支持检查 sudo apt install $(check-language-support)③ 修改相关配置文件 sudo gedit /etc/default/locale替…

2023年9月DAMA-CDGA/CDGP数据治理认证报名到这错不了

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

如何利用Python中实现高效的网络爬虫

各位大佬们&#xff01;今天我要和大家分享一个有关Python的技巧&#xff0c;让你轻松实现高效的网络爬虫&#xff01;网络爬虫是在互联网时代数据获取的一项关键技能&#xff0c;而Python作为一门强大的编程语言&#xff0c;为我们提供了许多方便而高效的工具和库。让我们一起…

XSC63-300-S-CB、XSC80-400-S-CA、XSC100-700-S-LB方型气缸

XQVB40-16、XQ-VB63-16、XQ-VB100-16倍压增压阀 QCK2400、QCK2400A、QCK2422、QCK2422A磁性开关 AL-07R、AL-30R、KT-50R、AL-03R、AL-20R、AL-72R磁性开关 XSC32-40-S-LB、XSC40-100-S-FA、XSC50-200-S-FB、XSC63-300-S-CB、XSC80-400-S-CA、XSC100-700-S-LB方型气缸 QSC3…

DC电源模块对设计和布线的重要性

BOSHIDA DC电源模块对设计和布线的重要性 在电子设备中&#xff0c;DC电源模块的作用是将市电或其他源的交流电转换成适合设备使用的直流电&#xff0c;因此&#xff0c;DC电源模块是电子设备中不可或缺的一个部分。在实际设计和应用中&#xff0c;DC电源模块的设计和布线显得…

智慧燃气:智慧燃气发展的讨论

关键词&#xff1a;智慧燃气、智能管网、智慧燃气系统、智能燃气、智慧燃气建设、智慧燃气平台 智慧燃气是什么&#xff1f; 智慧燃气是以智能管网建设为基础&#xff0c;利用先进的通信、传感、储能、微电子、数据优化管理和智能控制等技术&#xff0c;实现天然气与其他能源…

四化智造MES(WEB)与金蝶云星空对接集成原材料/标准件采购查询(待采购)连通采购订单新增(其他采购订单行关闭-TEST)

四化智造MES&#xff08;WEB&#xff09;与金蝶云星空对接集成原材料/标准件采购查询&#xff08;待采购&#xff09;连通采购订单新增(其他采购订单行关闭-TEST) 数据源系统:四化智造MES&#xff08;WEB&#xff09; MES系统是集成生产管理、品质管理、设备管理、BI数据中心、…

【赠书活动】考研备考书单推荐

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

比亚迪用USB Server,实现U盾远程连接

在过去&#xff0c;比亚迪的资金管理系统需要与多个银行进行银企直连对接&#xff0c;而银企直连的前置机程序是部署在物理机上的。为了推进企业虚拟化转型&#xff0c;比亚迪决定将前置机程序迁移到虚拟机中。然而&#xff0c;面临的问题是各银行的专用Ukey无法在虚拟机中被识…

SAP-SD-销售订单的删除

销售订单的删除和采购订单的删除是不同的&#xff0c;采购订单只是在行项目上打删除标记&#xff0c;也就是逻辑删除&#xff0c;而销售订单是物料删除&#xff0c;可以删除行或删除抬头&#xff0c; 首先查看底表SE16N&#xff0c;查看记录 TCODE&#xff1a;VA02&#xff0c…

Leetcode150. 逆波兰表达式求值

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&a…

振弦采集仪应用地下管道的优秀方案

振弦采集仪应用地下管道的优秀方案 随着城市化建设的不断推进&#xff0c;地下管道已经成为了城市中不可或缺的重要设施。地下管道包括市政供水管道、燃气管道、通信电缆等&#xff0c;它们的安全运行直接影响到人民生命财产安全和城市正常运转。因此&#xff0c;对管道的监测和…

AI文本创作在百度App发文的实践

作者 | 内容生态端团队 导读 大语言模型&#xff08;LLM&#xff09;指包含数百亿&#xff08;或更多&#xff09;参数的语言模型&#xff0c;这些模型通常在大规模数据集上进行训练&#xff0c;以提高其性能和泛化能力。在内容创作工具接入文心一言AI能力后&#xff0c;可以为…

红帽 RHEL 源码限制成契机,AlmaLinux 获捐更可“做自己”

导读红帽在两个月前发布公告声称&#xff0c;将限制对 Red Hat Enterprise Linux (RHEL) 源代码的访问&#xff0c;早前曾报道&#xff0c;此举导致 AlmaLinux 、Rocky Linux 等 Linux 发行版未来发展严重受阻。 对于这一决策&#xff0c;AlmaLinux OS 基金会主席 Benny Vasque…