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

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

购物车操作:修改

分析


915af540f35d43e5b6f3ffc0731dd157.png

接口

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

3d84cce24ede451e89f51e6afff770a7.png

后端实现:更新

步骤一:修改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("失败");
    }
}

前端实现:修改


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

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

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

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

步骤四:删除之前绑定js

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


2463b0a23f104815bfa8f0b341ce6862.png

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

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

d758e58e12894f0f9991312970d987a7.png

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

 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

67eaa350273844769db9daff6326d211.png

前端实现:全选

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

74f7d84911e64c2ca892ce48f8b43ea2.png

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

ec12415d7cfb4c70b27d246be0b3b7e7.png

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

adf77bd67a4b4e26b0c9ab54d2bb3d36.png

步骤二:修改样式

3fdba2dfa14e4a3daaf7c7e6e8803028.png

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

步骤三:添加全选方法


bc54e18c13fd4e9e93f1b683593275af.png

 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绑定删除事件

72565600967248fead5a9b2a318a691c.png

步骤二:编写删除函数

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

结算


47daba83a6794b24b4e4710b1d36c31a.png

跳转页面

步骤一:给结算绑定事件

fcfacfa53f024be5a6293154615dec01.png

  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 组件

22c6b270302549369188570be27cdc1d.png

<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>

步骤三:完善登录

374ce0e245014c5ca35169a49c2950ce.png

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


相关文章
|
Java API Android开发
Android native应用开发简明教程 (1) - 本地开发武器库概览
native应用比起Java应用来,跟Android版本的相关性更高一些。 所以,这些API都是根据平台版本号分成不同的目录的。 我们来看看Android为我们提供了哪些API
6748 0
|
缓存 监控 前端开发
Go 语言中如何集成 WebSocket 与 Socket.IO,实现高效、灵活的实时通信
本文探讨了在 Go 语言中如何集成 WebSocket 与 Socket.IO,实现高效、灵活的实时通信。首先介绍了 WebSocket 和 Socket.IO 的基本概念及其优势,接着详细讲解了 Go 语言中 WebSocket 的实现方法,以及二者集成的重要意义和具体步骤。文章还讨论了集成过程中需要注意的问题,如协议兼容性、消息格式、并发处理等,并提供了实时聊天、数据监控和在线协作工具等应用案例,最后提出了性能优化策略,包括数据压缩、缓存策略和连接管理优化。旨在帮助开发者更好地理解并应用这些技术。
698 3
|
存储 开发框架 监控
一个轻量级的实时监控工具---WatchDog
一个轻量级的实时监控工具---WatchDog
412 0
|
监控 Java API
Java一分钟之-JPA事务管理:PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW等
【6月更文挑战第14天】Java企业开发中,事务管理确保数据一致性,Spring事务管理核心概念包括`PROPAGATION_REQUIRED`和`PROPAGATION_REQUIRES_NEW`。前者在无事务时新建,有事务时加入,常用于保证业务方法在事务中执行。后者始终创建新事务,独立于当前事务,适用于需隔离影响的场景。理解其应用场景和易错点,合理配置事务传播行为,能提升应用的健壮性和性能。通过监控和日志优化事务策略是关键。
413 1
|
存储 安全 API
oss客户端密钥管理数据密钥生成与使用
阿里云OSS中的客户端密钥管理涉及AccessKey ID和Secret的安全使用。数据加密可选SSE-OSS或使用KMS管理的CMK。若用KMS,KMS自动生成和管理数据密钥;否则,用户需安全生成密钥。上传下载时,通过SDK或API指定加密选项。密钥存储避免明文,利用KMS进行生命周期管理和访问控制,提升数据安全,满足合规需求。
2052 1
|
关系型数据库 MySQL Linux
Linux_Centos7在安装Mysql常见错误
Linux_Centos7在安装Mysql常见错误依赖时失败 问题一:Centos7在安装Mysql依赖(libs)或客户端(client)时失败 问题二:Centos7在安装Mysql服务器(server)时失败
1742 1
|
开发框架 Linux 开发者
深入了解Python游戏开发模块:pyglet
深入了解Python游戏开发模块:pyglet
475 0
|
人工智能 前端开发 算法
TopView.ai 技术栈
`Topview.ai` 是一个集成AI的视频编辑平台,利用OpenAI的GPT 4.0V和Gemini算法提供服务。其网站基于前沿的前端框架`Next.js`和`React`构建,后端基础设施依托于`AWS`云服务。[AI Video Editor](https://www.topview.ai)结合先进技术和用户友好的界面,为创意工作流程赋能。
|
Shell 网络安全 开发工具
上传代码到gitee
上传代码到gitee
247 0

热门文章

最新文章