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

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 【畅购商城】购物车模块之查看购物车

分析

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

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


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

接口

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

dd0832f7efeb43398a0130f15b399a72.png

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

后端实现


步骤一:修改CartService,添加 queryCartList 方法,从redis查询的购物车信息

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

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


/**
 * 
 * @param user
 * @return
 */
public Cart queryCartList(User user);

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

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

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

/**
 * 查询购物车
 * @return
 */
@GetMapping
public BaseResult queryCartList() {
    //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失效或未登录");
    }
    Cart cart = this.cartService.queryCartList(loginUser);
    return BaseResult.ok("查询成功", cart.getData().values());
}

前端实现:显示页面

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


56536a0677b64ea2bfbd46c534c04789.png

步骤二:导入js和css

  head: {
    title: '首页',
    link: [
      {rel:'stylesheet',href: '/style/cart.css'},
    ],
    script: [
      { type: 'text/javascript', src: '/js/cart1.js' },
    ]
  },

步骤三:添加公共组件


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

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

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

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

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

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


7e4d6ca2b0d44cf39403d14132362292.png

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

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

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

data() {
    return {
      cart : [],        //购物车对象
    }
  },
  async mounted() {
    //获得token信息,表示登录
    this.token = sessionStorage.getItem("token")
    if(this.token != null) {
      //登陆:服务器获得数据
      let { data } = await this.$request.getCart()
      this.cart = data.data
    } else {
      //未登录:从浏览器本地获得购物车
      let cartStr = localStorage.getItem("cart");
      if(cartStr != null) {
        this.cart = JSON.parse(cartStr);
      }
    }
  },

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

fc3a4221a37e43ffb7c995191b8bc817.png

 <tbody>
          <!-- 购物车列表 start -->
          <tr v-for="(goods,k) in cart" :key="k">
            <td class="col1">
              <a href=""><img :src="goods.midlogo" alt="" /></a>
              <strong><a href="">{{goods.goods_name}}</a></strong>
            </td>
            <td class="col2">
              <span style="display: block;" v-for="(value,key,index) in JSON.parse(JSON.parse(goods.spec_info).id_txt)"
                :key="index">{{key}}:{{value}}</span>
            </td>
            <td class="col3">¥<span>{{ (goods.price/100).toFixed(2) }}</span></td>
            <td class="col4">
              <a href="javascript:;" class="reduce_num"  @click.prevent="minus(goods)"></a>
              <input type="text" name="amount" v-model="goods.count" @keyup="updateCount(goods,$event)" value="1" class="amount"/>
              <a href="javascript:;" class="add_num"  @click.prevent="plus(goods)"></a>
            </td>
            <td class="col5">¥<span>{{ (goods.price / 100 * goods.count).toFixed(2) }}</span></td>
            <td class="col6"><a href="" @click.prevent="del(k)">删除</a></td>
          </tr>
          <!-- 购物车列表 end -->
        </tbody>

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


afb703686aa6444789066353faba7ada.png

 computed : {
    totalPrice : function(){      //计算总价格
      //所有小计的和
      let sum = 0 ;
      this.cart.forEach( g => {
        sum += (g.price * g.count);
      });
      return (sum/100).toFixed(2);
    }
  },
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
8月前
|
SQL JSON 前端开发
加入购物车【项目 商城】
加入购物车【项目 商城】
34 0
|
8月前
基础购物车
基础购物车
28 0
|
8月前
|
存储 JSON 前端开发
从零玩转系列之微信支付实战PC端装修我的订单页面2
从零玩转系列之微信支付实战PC端装修我的订单页面
65 0
|
8月前
|
前端开发 小程序 安全
从零玩转系列之微信支付实战PC端装修我的订单页面1
从零玩转系列之微信支付实战PC端装修我的订单页面
61 0
|
9月前
|
存储 NoSQL MongoDB
商城业务:购物车
商城业务:购物车
|
10月前
超市购物车功能
超市购物车功能
59 0
|
NoSQL 前端开发 Redis
【畅购商城】购物车模块之添加购物车
【畅购商城】购物车模块之添加购物车
100 0
【畅购商城】购物车模块之添加购物车
|
前端开发 JavaScript
【畅购商城】购物车模块之修改购物车以及结算
【畅购商城】购物车模块之修改购物车以及结算
141 0
【畅购商城】购物车模块之修改购物车以及结算
|
前端开发
【畅购商城】订单模块之收货人列表
【畅购商城】订单模块之收货人列表
49 0
【畅购商城】订单模块之收货人列表
|
前端开发
【畅购商城】详情页模块之评论
【畅购商城】详情页模块之评论
45 0
【畅购商城】详情页模块之评论