【畅购商城】购物车模块之修改购物车以及结算

news2024/10/5 18:25:37

目录

购物车操作:修改

分析

接口

后端实现:更新

前端实现:修改

前端实现:全选

后端实现:删除数据

结算

跳转页面

购物车操作:修改

分析

接口

PUT http://localhost:10010/cart-service/carts

后端实现:更新

步骤一:修改service接口

/**
 * 更新操作:如果数据存在修改数据,如果数据不存在删除数据
 * @param user
 * @param cartVoList
 */
public void updateCart(User user, List<CartVo> cartVoList) ;

步骤二:修改service实现类

/**
 * 更新操作:如果数据存在修改数据,如果数据不存在删除数据
 * @param user
 * @param cartVoList
 */
public void updateCart(User user, List<CartVo> cartVoList) {
    //1 获得购物车
    String key = "cart" + user.getId();
    String cartStr = stringRedisTemplate.opsForValue().get(key);
    // 处理是否有购物车
    Cart cart = JSON.parseObject( cartStr , Cart.class);
    if(cart == null) {
        throw new RuntimeException("购物车不存在");
    }

    //2 更新
    //2.1 处理请求数据
    Map<Integer,CartVo> requestMap = new HashMap<>();
    for (CartVo cartVo : cartVoList) {
        requestMap.put(cartVo.getSkuid(), cartVo);
    }

    //2.2 处理更新和删除
    Set<Integer> keySet = new HashSet<>(cart.getData().keySet());
for (Integer skuid : keySet) {
        CartVo cartRequest = requestMap.get(skuId);
        if(cartRequest != null) {
            // 更新
            cart.updateCart(cartRequest.getSkuid() , cartRequest.getCount() ,cartRequest.getChecked());
        } else {
            // 删除
            cart.deleteCart(skuId);
        }
    }

    //3 保存购物车
    stringRedisTemplate.opsForValue().set( key , JSON.toJSONString(cart) );
}

步骤三:修改controller

@PutMapping
public BaseResult updateCart(@RequestBody List<CartVo> cartVoList) {

    //1 获得用户信息
    // 1.1 获得token
    String token = request.getHeader("Authorization");
    // 1.2 解析token
    User loginUser = null;
    try {
        loginUser = JwtUtils.getObjectFromToken(token, jwtProperties.getPublicKey(),User.class);
    } catch (Exception e) {
        return BaseResult.error("token失效或未登录");
    }

    try {
        this.cartService.updateCart(loginUser ,cartVoList);

        return BaseResult.ok("成功");
    } catch (Exception e) {
        return BaseResult.error("失败");
    }

}

前端实现:修改

  1. 步骤0:修改apiclient.js,添加 updateCart函数
  2. 步骤一:修改flow1.vue 给按钮和文本框添加事件
  3. 步骤二:编写修改对应的事件
  4. 步骤三:编写购物车cart的监听函数,只要数据发生改变立即保存
  5. 步骤四:删除之前绑定js

步骤0:修改apiclient.js,添加 updateCart函数

  updateCart : ( params ) => {
    return axios.put("/gccartservice/carts" ,params )
  },

步骤一:修改flow1.vue 给按钮和文本框添加事件

步骤二:编写修改对应的事件

 methods: {
    minus : function(goods){
      if( goods.count > 1) {
        goods.count --;
      }
    },
    plus : function(goods){
      //可以考虑库存
      goods.count ++;
    },
    updateCount : function(goods,e){
      console.info(e.target.value);
      if( /^\d+$/.test( e.target.value) ){
        goods.count = e.target.value;
      } else {
        goods.count = 1;
      }
    },

步骤三:编写购物车cart的监听函数,只要数据发生改变立即保存

watch: {
    //深度监听
    cart : {
      async handler(val, oldVal) {
        //1 更新/删除,数据
        if(this.token != null){
          let { data } = await this.$request.updateCart( val )
          if(data.code == 20000){
            //alert(data.message);
          }
        } else {
          //未登录
          localStorage.setItem("cart" , JSON.stringify( val ))
        }
      },
      immediate: false, //true代表如果在 watch 里声明了之后,就会立即先去执行里面的handler方法
      deep: true      //深度监听,常用于对象下面属性的改变
    }

  },

步骤四:删除之前绑定js

前端实现:全选

  1. 步骤一:修改表格
  2. 步骤二:修改样式
  3. 步骤三:添加全选方法
  4. 步骤四:监听购物车数据,修改全选状态

  1. 步骤一:修改表格

<th class="col0">
   <input type="checkbox" v-model="allChecked" @click="checkAll()" /> 全选
</th>

 

<td class="col0">
   <!-- :checked="goods.checked" -->
   <input type="checkbox" v-model="goods.checked" />
</td>

步骤二:修改样式

.mycart .col0{width: 5%;}
.mycart .col1{width: 35%;}

步骤三:添加全选方法

 data() {
    return {
      cart : [],        //购物车对象
      allChecked : false,   //全选状态
    }
  },
  methods: {
    checkAll : function(){
      //所有列表项的状态,与全选的状态,相反
      this.cart.forEach( g => {
        g.checked = !this.allChecked;
      });
    },
  },

步骤四:监听购物车数据,修改全选状态

watch: {
    //深度监听
    cart : {
      async handler(val, oldVal) {
        //1 更新/删除,数据
        if(this.token != null){
          let { data } = await this.$request.updateCart( val )
          if(data.code == 1){
            //alert(data.message);
          }
        } else {
          //未登录
          localStorage.setItem("cart" , JSON.stringify( val ))
        }
        //2 处理全选
        let checkCount = 0;
        this.cart.forEach( g => {
          if( g.checked ) {
            checkCount ++;
          }
        });
        //全选状态,选中个数  与 总个数 比较结果
        this.allChecked = (checkCount == this.cart.length);

      },
      immediate: false, //true代表如果在 watch 里声明了之后,就会立即先去执行里面的handler方法
      deep: true      //深度监听,常用于对象下面属性的改变
    }

  },

后端实现:删除数据

  1. 只需要修改数据即可,watch已经完成删除操作
  2. 步骤一:修改html绑定删除事件

步骤二:编写删除函数

 del (index){
      if(window.confirm("您确定要删除吗?")){
        this.cart.splice(index , 1)
      }
    },

结算

跳转页面

步骤一:给结算绑定事件

  submit : function(){
      if(this.token != null){
        //登录
        //location.href = "flow2.html";
        this.$router.push('flow2')
      } else {
        //确定登录成功后调整的页面
        localStorage.setItem("returnURL","flow2");
        //没有登录
        //location.href = "login";
        this.$router.push('login')

      }

    },

步骤二:编写flow2.vue 组件

<script>
import TopNav from '../components/TopNav'
import Footer from '../components/Footer'

export default {
  head: {
    title: '首页',
    link: [
      {rel:'stylesheet',href: '/style/fillin.css'},
    ],
    script: [
      { type: 'text/javascript', src: '/js/cart2.js' },
    ]
  },
  components: {
    TopNav,
    Footer,
  },
}
</script>

步骤三:完善登录

 let returnURL = localStorage.getItem("returnURL");
        if(returnURL != null){
          //删除跳转页面缓存
          localStorage.removeItem("returnURL");
          //需要跳转页面
          location.href= returnURL;
        } else {
          //默认:跳转首页
          location.href = "/";
        }

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

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

相关文章

python数学基础——单词统计

这个练习使用的是英文的单词统计&#xff0c;使用split通过单词中间的空格来做区分&#xff0c;在遍历的过程中通过对【字典】类型进行【字典推导式】的处理来计算每个单词出现的频次。但是由于过程中我们通过re的正则表达式来替换掉了很多的符号&#xff0c;并没有替换成空&am…

【网页设计】web前端期末大作业html+css

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

Day12--自定义组件-渲染my-search组件的基本结构

1.自定义搜索组件 我的操作&#xff1a; 1》在uni_modules中右键新建uni_modules插件&#xff1a; 2》看看效果图&#xff1a; ************************************************************************************************************** 2.在分类页面的 UI 结构中&…

工作中常用的设计模式--策略模式

一般做业务开发&#xff0c;不太容易有大量使用设计模式的场景。这里总结一下在业务开发中使用较为频繁的设计模式。当然语言为Java&#xff0c;基于Spring框架。 1 策略模式(Strategy Pattern) 一个类的行为或方法&#xff0c;在运行时可以根据条件的不同&#xff0c;有不同的…

verilog练习——基础语法

目录 基础语法 VL1 四选一多路器 VL2 异步复位的串联T触发器 VL3 奇偶校验 VL4 移位运算与乘法 VL5 位拆分与运算 VL6 多功能数据处理器 VL7 求两个数的差值 VL8 使用generate…for语句简化代码 VL9 使用子模块实现三输入数的大小比较 VL10 使用函数实现数据大小端转…

数据结构题目收录(二十五)

1、排序趟数与序列的原始状态无关的排序方法是&#xff08;&#xff09;。 Ⅰ、直接插入排序 Ⅱ、简单选择排序 Ⅲ、冒泡排序 Ⅳ、基数排序 A&#xff1a;Ⅰ、ⅢB&#xff1a;Ⅰ、Ⅱ、ⅣC&#xff1a;Ⅰ、Ⅱ、ⅢD&#xff1a;Ⅰ、Ⅳ 解析 交换类的排序&#xff0c;其趟数和…

GUI编程--PyQt5--QDiaglog

文章目录QDialogQFontDialogQColorDialogQFileDialogQInputDialogQDialog 对话框基类&#xff0c;继承QWidget&#xff1b;用于短期任务&#xff0c;分为模态、非模态 模态&#xff0c;阻塞在当前窗口&#xff1b;分为应用程序级别&窗口级别&#xff08;仅阻塞关联的窗口&…

关于使用鼠标时间mouseMove拖拽元素及元素抖动的解决方案

最近在做一个画布相关的项目时有一个场景是移动画布&#xff0c;最先开始想到的是拖拽事件&#xff0c;但是用户希望元素是实时的变化&#xff0c;所以决定使用mouseMove事件来做。 思路 通过mouseDown事件确定鼠标按下的位置根据mouseMove事件来计算出鼠标相对初始状态的横向…

MySQL锁杂谈

【说明】 1.MySQL版本5.7.37 2.事务隔离级别 REPEATABLE-READ 3.表结构 Create Table: CREATE TABLE isolation_innodb (id bigint(20) NOT NULL AUTO_INCREMENT,name varchar(10) DEFAULT NULL,money int(11) DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT4…

jsp库存管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 库存管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开 发&#xff0c;数据库为Mysql&#xff0c;使用ja…

VMware Cloud Director数据库操作

VMware Cloud Director 是一个云服务平台&#xff0c;以自助服务模式提供安全、隔离、弹性的虚拟数据中心计算、网络、存储和安全。在NFV整个架构中属于VIM层&#xff0c;与NFVI层&#xff08;对VMware来说即vSphere虚拟化环境&#xff09;对接获取虚拟化资源并提供给租户。 NF…

服务访问质量(QoS)——QoS技术概述与配置

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.QoS技术概述 1.QoS的应用需求 ①网络拥塞的影响&#xff1a…

【Linux】项目自动化构建工具:make/Makefile的使用

文章目录一、背景1、make和makefile是什么&#xff1f;2、为什么要使用make和makefile?二、原理1、使用make和makefile2、依赖关系和依赖方法3、具体原理4、项目清理一、背景 1、make和makefile是什么&#xff1f; make是一个命令&#xff0c;是一个解释makefile中指令的命令…

Linux项目:自主web服务器

文章目录项目描述Web与 http 发展史DNSURI URL URNHTTP 概述项目纲要项目架构套接字的封装HTTP服务启动日志信息与工具类请求、响应类读取请求读取请求行读取请求报头分析请求行分析请求报头读取正文构建响应预处理返回静态网页CGI机制CGI机制的基本概念CGI函数的实现子CGI程序…

【点云处理】点云法向量估计及其加速(4)

上篇文章【点云处理】点云法向量估计及其加速(3)介绍了如何使用pcl提供的gpu版本法向量计算接口对点云发向量计算进行加速。不足之处在于点云k近邻查找依然比较耗时&#xff0c;成为影响整体计算性能的瓶颈。这篇文章就如何优化点云K近邻查找效率进行实验。上一篇文章的示例代码…

redis数据库的下载安装/免安装版

文章目录下载方式一下载方式二免安装版redis是一款高性能的NOSQL系列的非关系型数据库这里分享三个下载源&#xff0c;只介绍免安装版下载方式一 官网下下载https://redis.io&#xff08;国外网站下载速度比较慢&#xff09; 下载方式二 Redis中文网http://www.redis.net.cn…

想你所想,华为云桌面Workspace助你轻松办公

想你所想&#xff0c;华为云桌面Workspace助你轻松办公 双11作为近年来最受关注的购物季&#xff0c;从最开始的电商&#xff0c;到现在各行各业纷纷下场推出活动&#xff0c;期望在此段时间内迅速积累用户&#xff0c;从而提升产品知名度和用户基础。华为云也不例外&#xff0…

学生个人博客网页设计作品 学生个人网页模板 个人网页制作 HTML学生个人网站作业设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

应用商店的ASO和搜索引擎的SEO的区别

ASO和SEO&#xff0c;目标相似&#xff0c;有着异曲同工之妙&#xff0c;两者都是提高搜索排名的方式&#xff0c;具体有什么区别呢&#xff1f;今天柚鸥ASO给大家做一下总结。 SEO是指搜索引擎优化&#xff0c;利用搜索引擎的规则来提高网站&#xff08;例如&#xff1a;百度…

室内定位解决方案-最新全套文件

室内定位解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 室内定位全套最新解决方案合集一、建设背景 室内定位顾名思义就是定位室内目标对象的位置&#xff0c;可以是人也可以是物体的位置的一种技术方案&#xff0c;根据定位精度的不同&#xff0c;被…