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


    目录

    购物车操作:修改

    分析

    接口

    后端实现:更新

    前端实现:修改

    前端实现:全选

    后端实现:删除数据

    结算

    跳转页面

    购物车操作:修改

    分析

    接口

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

    后端实现:更新

    步骤一:修改service接口

    1. /**
    2. * 更新操作:如果数据存在修改数据,如果数据不存在删除数据
    3. * @param user
    4. * @param cartVoList
    5. */
    6. public void updateCart(User user, List cartVoList) ;

    步骤二:修改service实现类

    1. /**
    2. * 更新操作:如果数据存在修改数据,如果数据不存在删除数据
    3. * @param user
    4. * @param cartVoList
    5. */
    6. public void updateCart(User user, List cartVoList) {
    7. //1 获得购物车
    8. String key = "cart" + user.getId();
    9. String cartStr = stringRedisTemplate.opsForValue().get(key);
    10. // 处理是否有购物车
    11. Cart cart = JSON.parseObject( cartStr , Cart.class);
    12. if(cart == null) {
    13. throw new RuntimeException("购物车不存在");
    14. }
    15. //2 更新
    16. //2.1 处理请求数据
    17. Map requestMap = new HashMap<>();
    18. for (CartVo cartVo : cartVoList) {
    19. requestMap.put(cartVo.getSkuid(), cartVo);
    20. }
    21. //2.2 处理更新和删除
    22. Set keySet = new HashSet<>(cart.getData().keySet());
    23. for (Integer skuid : keySet) {
    24. CartVo cartRequest = requestMap.get(skuId);
    25. if(cartRequest != null) {
    26. // 更新
    27. cart.updateCart(cartRequest.getSkuid() , cartRequest.getCount() ,cartRequest.getChecked());
    28. } else {
    29. // 删除
    30. cart.deleteCart(skuId);
    31. }
    32. }
    33. //3 保存购物车
    34. stringRedisTemplate.opsForValue().set( key , JSON.toJSONString(cart) );
    35. }

    步骤三:修改controller

    1. @PutMapping
    2. public BaseResult updateCart(@RequestBody List cartVoList) {
    3. //1 获得用户信息
    4. // 1.1 获得token
    5. String token = request.getHeader("Authorization");
    6. // 1.2 解析token
    7. User loginUser = null;
    8. try {
    9. loginUser = JwtUtils.getObjectFromToken(token, jwtProperties.getPublicKey(),User.class);
    10. } catch (Exception e) {
    11. return BaseResult.error("token失效或未登录");
    12. }
    13. try {
    14. this.cartService.updateCart(loginUser ,cartVoList);
    15. return BaseResult.ok("成功");
    16. } catch (Exception e) {
    17. return BaseResult.error("失败");
    18. }
    19. }

    前端实现:修改

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

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

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

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

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

    1. methods: {
    2. minus : function(goods){
    3. if( goods.count > 1) {
    4. goods.count --;
    5. }
    6. },
    7. plus : function(goods){
    8. //可以考虑库存
    9. goods.count ++;
    10. },
    11. updateCount : function(goods,e){
    12. console.info(e.target.value);
    13. if( /^\d+$/.test( e.target.value) ){
    14. goods.count = e.target.value;
    15. } else {
    16. goods.count = 1;
    17. }
    18. },

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

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

    步骤四:删除之前绑定js

    前端实现:全选

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

    1. 步骤一:修改表格

    1. "col0">
    2.    "checkbox" v-model="allChecked" @click="checkAll()" /> 全选

     

    1. "col0">
    2.   
    3.    "checkbox" v-model="goods.checked" />

    步骤二:修改样式

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

    步骤三:添加全选方法

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

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

    1. watch: {
    2.     //深度监听
    3.     cart : {
    4.       async handler(val, oldVal) {
    5. //1 更新/删除,数据
    6. if(this.token != null){
    7.           let { data } = await this.$request.updateCart( val )
    8.           if(data.code == 1){
    9.             //alert(data.message);
    10.           }
    11.         } else {
    12.           //未登录
    13.           localStorage.setItem("cart" , JSON.stringify( val ))
    14. }
    15. //2 处理全选
    16. let checkCount = 0;
    17. this.cart.forEach( g => {
    18. if( g.checked ) {
    19. checkCount ++;
    20. }
    21. });
    22. //全选状态,选中个数 与 总个数 比较结果
    23. this.allChecked = (checkCount == this.cart.length);
    24.       },
    25.       immediate: false, //true代表如果在 watch 里声明了之后,就会立即先去执行里面的handler方法
    26.       deep: true      //深度监听,常用于对象下面属性的改变
    27.     }
    28.   },

    后端实现:删除数据

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

    步骤二:编写删除函数

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

    结算

    跳转页面

    步骤一:给结算绑定事件

    1. submit : function(){
    2. if(this.token != null){
    3. //登录
    4. //location.href = "flow2.html";
    5. this.$router.push('flow2')
    6. } else {
    7. //确定登录成功后调整的页面
    8. localStorage.setItem("returnURL","flow2");
    9. //没有登录
    10. //location.href = "login";
    11. this.$router.push('login')
    12. }
    13. },

    步骤二:编写flow2.vue 组件

    步骤三:完善登录

    1. let returnURL = localStorage.getItem("returnURL");
    2. if(returnURL != null){
    3. //删除跳转页面缓存
    4. localStorage.removeItem("returnURL");
    5. //需要跳转页面
    6. location.href= returnURL;
    7. } else {
    8. //默认:跳转首页
    9. location.href = "/";
    10. }
  • 相关阅读:
    第三章:最新版零基础学习 PYTHON 教程(第五节 - Python 运算符—Python 逻辑运算符及示例)
    GBase 8a 负载均衡策略及JDBC连接方式
    大厂光环下的功能测试,出去面试自动化一问三不知
    mac 下载使用sshpass+命令起别名
    如何利用IP定位技术进行反欺诈?
    【网页设计】期末大作业html+css (个人生活记录介绍网站)
    堆排序思想分享
    Java:单例模式探究
    机器学习-特征选择:如何使用互信息特征选择挑选出最佳特征?
    C#实现Windows服务安装卸载开启停止
  • 原文地址:https://blog.csdn.net/weixin_45481821/article/details/128052819