基于springboot框架的电脑商城项目(九)

简介: 显示勾选的购物车信息(一)显示勾选的购物车信息(持久层)1.规划sql用户在购物车列表页中通过随机勾选相关的商品,在点击"结算"按钮后跳转到"确认订单页",在这个页面中需要展示用户在上个页面所勾选的"购物车列表页"中对应的数据.且展示的内容还是来自于购物车表,所以"购物车列表页"需要将用户勾选的商品id传递给"确认订单页"

显示勾选的购物车信息

(一)显示勾选的购物车信息(持久层)

1.规划sql

用户在购物车列表页中通过随机勾选相关的商品,在点击"结算"按钮后跳转到"确认订单页",在这个页面中需要展示用户在上个页面所勾选的"购物车列表页"中对应的数据.且展示的内容还是来自于购物车表,所以"购物车列表页"需要将用户勾选的商品id传递给"确认订单页"

select
    cid,
    uid,
    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
where
  cid in (?,?,?)
order by
  t_cart.created_time desc

2.设计接口和抽象方法

在CartMapper接口中添加findByCid2抽象方法

    List<CartVo> findByCid2(Integer[] cids);

在CartMapper.xml文件中添加SQL语句的映射配置

 <select id="findByCid2" resultType="com.cy.store.vo.CartVo">
        select cid,uid,pid,t_cart.price,t_cart.num,t_product.image,
               t_product.title,t_product.price as realPrice
        from t_cart left join t_product on t_product.id=t_cart.pid
        where cid in (
        <foreach collection="array" item="cid" separator=",">
            #{cid}
        </foreach>
            )
        order by t_cart.created_time desc
    </select>

foreach循环就是一个for循环
collection标识循环的是list集合还是数组,如果是list集合就用collection=“list”
item用来接收每次循环获取的值
separator标识循环出来的值中间用什么隔开,且最后循环出来的值后面不加

(二)显示勾选的购物车信息(业务层)

1.规划异常

查询语句,没有需要规划的异常,在业务层判断这几条购物车商品的数据归属是否正确,如果不正确也不需要抛出异常,直接从查询到的数据中移除该商品就行了

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

在ICartService接口中添加getByCids()抽象方法

    List<CartVo> getByCids(Integer uid,Integer[] cids);

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

  @Override
    public List<CartVo> getByCids(Integer uid, Integer[] cids) {
        List<CartVo> result = cartMapper.findByCid2(cids);
        if (result==null){
            throw new CartNotFoundException("商品不存在");
        }
        Iterator<CartVo> iterator = result.iterator();
        while (iterator.hasNext()){
            CartVo cartVo = iterator.next();
            Integer uid1 = cartVo.getUid();
            if (!uid1.equals(uid)){
                result.remove(cartVo);
                throw new AccessDeniedException("数据访问异常");
            }
        }
        return result;
    }

(三)显示勾选的购物车信息(控制层)

1.处理异常

没有异常需要处理

2.设计请求

请求路径:/carts/list

请求方式:GET

请求参数:Integer[] cids, HttpSession session

响应结果:JsonResult<List< CartVO>>

3.处理请求

在CartController类中添加处理请求的findVOByCids()方法。

@GetMapping("/list")
    public JsonResult<List<CartVo>> findVOByCids(Integer[] cids,HttpSession session){
    List<CartVo> cartVoList = cartService.getByCids(getuidfromsession(session), cids);
    return new JsonResult<>(ok,cartVoList);
}

(四)显示勾选的购物车信息(前端页面)

orderConfirm.js文件在orderConfirm.html页面中无用,所有在orderConfirm.html中注释掉

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

在orderConfirm.html页面编写js代码

<script type="text/javascript">
      $(document).ready(function() {
        showCartList();
      });
      function showCartList() {
        $("#cart-list").empty();
        $.ajax({
          url: "/carts/list",
          type: "GET",
          data: location.search.substr(1),
          dataType: "JSON",
          success: function(json) {
            if (json.state == 200) {
              var list = json.data;
              console.log(location.search.substr(1));//调试用
              //声明两个变量用于更新"确认订单"页的总件数和总价
              var allCount = 0;
              var allPrice = 0;
              for (var i = 0; i < list.length; i++) {
                var tr = '<tr>\n' +
                    '<td><img src="..#{image}collect.png" class="img-responsive" /></td>\n' +
                    '<td>#{title}</td>\n' +
                    '<td>¥<span>#{price}</span></td>\n' +
                    '<td>#{num}</td>\n' +
                    '<td><span>#{totalPrice}</span></td>\n' +
                    '</tr>';
                tr = tr.replace("#{image}",list[i].image);
                tr = tr.replace("#{title}",list[i].title);
                tr = tr.replace("#{price}",list[i].realPrice);
                tr = tr.replace("#{num}",list[i].num);
                tr = tr.replace("#{totalPrice}",list[i].realPrice*list[i].num);
                $("#cart-list").append(tr);
                //更新"确认订单"页的总件数和总价
                allCount += list[i].num;
                allPrice += list[i].realPrice*list[i].num;
              }
              $("#all-count").html(allCount);
              $("#all-price").html(allPrice);
            }
          },
          error: function (xhr) {
            alert("在确认订单页加载勾选的购物车数据时发生未知的异常"+xhr.status);
          }
        });
      }
    </script>


订单显示收货地址

1.在orderConfirm.html页面中的ready函数中添加showAddressList方法的调用,使确认订单页加载时能够自动从后端获取该用户地址填充到select控件中并将第一个地址显示出来

$(document).ready(function() {
    showCartList();
    showAddressList();
});

2.在orderConfirm.html页面中编写showAddressList方法

function showAddressList() {
    $("#address-list").empty();
    $.ajax({
        url: "/addresses",
        type: "GET",
        dataType: "JSON",
        success: function(json) {
            if (json.state == 200) {
                var list = json.data;
                for (var i = 0; i < list.length; i++) {
                    /*
                                value="#{aid}"在该模块没有用,但是扔写上,只要是从数据库查到到的数据,都要让前端页
                                面的该条数据和id绑定(因为可能干别的什么时需要用到,就比如说下一个"创建订单"模块
                                就需要根据前端传给后端的aid查询用户选中的是哪一个地址然后将其加入订单表)
                     * */
                    var opt = '<option value="#{aid}">#{name}&nbsp;&nbsp;&nbsp;#{tag}&nbsp;&nbsp;&nbsp;#{provinceName}#{cityName}#{areaName}#{address}&nbsp;&nbsp;&nbsp;#{tel}</option>';
                    opt = opt.replace("#{aid}",list[i].aid);
                    opt = opt.replace("#{name}",list[i].name);
                    opt = opt.replace("#{tag}",list[i].tag);
                    opt = opt.replace("#{provinceName}",list[i].provinceName);
                    opt = opt.replace("#{cityName}",list[i].cityName);
                    opt = opt.replace("#{areaName}",list[i].areaName);
                    opt = opt.replace("#{address}",list[i].address);
                    opt = opt.replace("#{tel}",list[i].tel);
                    $("#address-list").append(opt);
                }
            }
        },
        error: function (xhr) {
            alert("在确认订单页加载用户地址时发生未知的异常"+xhr.status);
        }
    });
}

后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹











































相关文章
|
3月前
|
搜索推荐 JavaScript Java
基于springboot的家具商城销售系统
在数字化转型背景下,传统家具销售面临挑战。本研究基于Java、MySQL、Vue和Spring Boot技术,构建高效、智能的家具商城销售系统,推动行业线上线下融合,提升用户体验与企业竞争力,助力家具产业可持续发展。
|
4月前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
335 2
|
3月前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
5月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
6月前
|
Java Spring
聊聊你对SpringBoot框架的理解 ?
SpringBoot是Spring家族中流行的子项目,旨在简化Spring框架开发的繁琐配置。它主要提供三大功能:starter起步依赖简化依赖管理,自动配置根据条件创建Bean,以及内嵌Web服务器支持Jar包运行,极大提升了开发效率。
193 0
|
3月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
161 8
|
4月前
|
监控 Kubernetes Cloud Native
Spring Batch 批处理框架技术详解与实践指南
本文档全面介绍 Spring Batch 批处理框架的核心架构、关键组件和实际应用场景。作为 Spring 生态系统中专门处理大规模数据批处理的框架,Spring Batch 为企业级批处理作业提供了可靠的解决方案。本文将深入探讨其作业流程、组件模型、错误处理机制、性能优化策略以及与现代云原生环境的集成方式,帮助开发者构建高效、稳定的批处理系统。
507 1
|
6月前
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
694 0
|
5月前
|
Cloud Native Java API
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
1043 0
|
6月前
|
缓存 安全 Java
第五章 Spring框架
Spring IOC(控制反转)通过工厂模式管理对象的创建与生命周期,DI(依赖注入)则让容器自动注入所需对象,降低耦合。常见注解如@Component、@Service用于声明Bean,@Autowired用于注入。Bean默认单例,作用域可通过@Scope配置,如prototype、request等。Spring通过三级缓存解决循环依赖问题,但构造函数循环依赖需用@Lazy延迟加载。AOP通过动态代理实现,用于日志、事务等公共逻辑。事务通过@Transactional实现,需注意异常处理及传播行为。
106 0

热门文章

最新文章