• 【畅购商城】购物车模块之查看购物车


    目录

    分析

    接口

    后端实现

    前端实现:显示页面

    前端实现:显示购物车信息

    分析

    1. 用户如果没有登录,购物车存放在浏览器端的localStorage处,且以数组的方式进行存储。
    2. 用户如果登录了,购物车存放在redis中,以Cart对象字符串方式存储。
      1. 问题:前后端数据不一致,无法使用一个也flow1.vue进行数据展示

    解决方案:将后端cart数据进行简化,Cart对象-->Map(data)-->List(values)

    结论:前端提供给页面统一数组,页面进行数据展示即可。

    接口

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

    1. {
    2.     "code"1,
    3.     "message""查询成功",
    4.     "data": {
    5.         "data": {
    6.             "2600242": {
    7.                 "skuid"2600242,
    8.                 "spuid"2,
    9.                 "price"84900.0,
    10.                 "count"17,
    11.                 "checked"true,
    12.                 "midlogo": null,
    13.                 "goods_name""华为 G9 青春版 白色 移动联通电信4G手机 双卡双待",
    14.                 "spec_info""{\"id_list\":\"1:1|2:6|6:22\",\"id_txt\":\"{\\\"机身颜色\\\":\\\"白色\\\",\\\"内存\\\":\\\"3GB\\\",\\\"机身存储\\\":\\\"16GB\\\"}\"}"
    15.             }
    16.         },
    17.         "total"1443300.0
    18.     },
    19.     "other": {}
    20. }

    后端实现

    1. 步骤一:修改CartService,添加 queryCartList 方法,从redis查询的购物车信息
    2. 步骤二:修改CartController,添加queryCartList 方法,仅返回购物车中的数据

    步骤一:修改CartService,添加 queryCartList 方法,

    1. /**
    2. *
    3. * @param user
    4. * @return
    5. */
    6. public Cart queryCartList(User user);

    步骤二:修改CartServiceImpl,从redis查询的购物车信息

    1. /**
    2. * 查询购物车
    3. * @param user
    4. * @return
    5. */
    6. public Cart queryCartList(User user) {
    7. String key = "cart" + user.getId();
    8. // 获取hash操作对象
    9. String cartString = this.stringRedisTemplate.opsForValue().get(key);
    10. // 2 获得购物车,如果没有创建一个
    11. return JSON.parseObject(cartString, Cart.class);
    12. }

    步骤三:修改CartController,添加queryCartList 方法,仅返回购物车中的数据

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

    前端实现:显示页面

    步骤一:创建 ~/pages/flow1.vue 组件,拷贝 ~/static/flow1.html内容

    步骤二:导入js和css

    1. head: {
    2. title: '首页',
    3. link: [
    4. {rel:'stylesheet',href: '/style/cart.css'},
    5. ],
    6. script: [
    7. { type: 'text/javascript', src: '/js/cart1.js' },
    8. ]
    9. },

    步骤三:添加公共组件

    ​​​​​​​前端实现:显示购物车信息

    1. 步骤一:修改api.js 查询购物车信息
    2. 步骤二:页面加载成功后,获得购物车信息(如果登录从后端获取,如果没有登录从浏览器端获得)
    3. 步骤三:遍历显示购物车信息,
    4. 步骤四:通过计算属性,计算总价格

    步骤一:修改apiclient.js 查询购物车信息

    1. //查询购物车
    2. getCart : () => {
    3. return axios.get("/cart-service/carts")
    4. },

    步骤二:页面加载成功后,获得购物车信息(如果登录从后端获取,如果没有登录从浏览器端获得)

    1. data() {
    2. return {
    3. cart : [],        //购物车对象
    4. }
    5. },
    6. async mounted() {
    7. //获得token信息,表示登录
    8. this.token = sessionStorage.getItem("token")
    9.     if(this.token != null) {
    10.       //登陆:服务器获得数据
    11.       let { data } = await this.$request.getCart()
    12.       this.cart = data.data
    13.     } else {
    14.       //未登录:从浏览器本地获得购物车
    15.       let cartStr = localStorage.getItem("cart");
    16.       if(cartStr != null) {
    17.         this.cart = JSON.parse(cartStr);
    18.       }
    19.     }
    20. },

    步骤三:遍历显示购物车信息

    1. for="(goods,k) in cart" :key="k">
    2. "col1">
    3. "col2">
    4. "display: block;" v-for="(value,key,index) in JSON.parse(JSON.parse(goods.spec_info).id_txt)"
    5. :key="index">{{key}}:{{value}}
    6. "col3">¥{{ (goods.price/100).toFixed(2) }}
    7. "col4">
    8. "text" name="amount" v-model="goods.count" @keyup="updateCount(goods,$event)" value="1" class="amount"/>
    9. "col5">¥{{ (goods.price / 100 * goods.count).toFixed(2) }}

    步骤四:通过计算属性,计算总价格

    1. computed : {
    2.     totalPrice : function(){      //计算总价格
    3.       //所有小计的和
    4.       let sum = 0 ;
    5.       this.cart.forEach( g => {
    6.         sum += (g.price * g.count);
    7.       });
    8.       return (sum/100).toFixed(2);
    9. }
    10.   },
  • 相关阅读:
    docker 部署tig监控服务
    傅里叶特征学习高频:Fourier 相关工作+实验分析+代码实现
    【数学】【位运算】Divan and bitwise operations—CF1614C
    定序器导出fbx到max里对位k动作
    开关电源环路学习笔记(7)-BUCK电源环路仿真实验验证
    【JavaSE】类和对象1:(类的定义和实例化,this引用,构造方法)
    Linux创建可执行脚本
    中国xx集团信息技术工程师面试
    基于RabbitMQ的模拟消息队列之五——虚拟主机设计
    java基础 io流 字节流 字符流 节点流 包装流 转换流 缓冲流 对象流 打印流 Properties类
  • 原文地址:https://blog.csdn.net/weixin_45481821/article/details/128052654