购物车

扫码查看

django-redis 和 vue 实现的购物车

  • 安装模块

    • pip install django-redis
  • 后端代码

    # 导包
    from django_redis import get_redis_connection
    # 购物车
    class CartView(APIView):
        # 初始化函数
        def __init__(self):
            self.conn = get_redis_connection('default')
    
        # 获取购物车信息
        def get(self,request):
            # 读取数据
            uid = request.GET.get('id')
            key = 'cart_{}'.format(uid)  # cart_1
            tmp = self.conn.hgetall(key)  # {b'9':b'20',b'10':b'13'}
            if not tmp:
                return Response({
                    "status":201,
                    "msg":"购物车为空"
                })
            data = {k.decode('utf-8'):v.decode('utf-8') for k,v in tmp.items()}
            print(data)  #  {'10': '13', '9': '20'}
            # 如何获取商品Id
            # from now on, 循环里禁止查数据库  data.keys()  =>   dict_keys(['9','10'])
            print(list(data.keys()))  # ['9','10']
            # list = []
            # for i in data.keys():
            #     print(i)
            #     good = models.Goods.objects.filter(id=i).first()
            #     list.append(good)
            goods = models.Goods.objects.filter(id__in=data).all()
            data_list = []
            datax = {'a' + k.decode('utf-8'): v.decode('utf-8') for k, v in tmp.items()} # {'a10': '13', 'a9': '20'}
            for good in goods:
                gid = good.id
                info = {"id":gid,"name":good.name,"store":good.store,"price":float(good.price),"img":good.img,"count":datax.get('a'+str(gid))}
                data_list.append(info)
            return Response({
                "status":200,
                "msg": "",
                "data":data_list
            })
    
    
        # 添加购物车信息
        def post(self,request):
            data = request.data
            uid = data.get('uid','')
            gid = data.get('gid',0)
            count = data.get('count',0)
            # 存入redis
            key = 'cart_'+ str(uid)
            self.conn.hset(key,gid,count)
            return Response({
                "msg":"已设置"
            })
  • 前端

    <template>
        <div id='cart'>
            <div class="total_count">全部商品<em>2</em>件</div>
            <ul class="cart_list_th clearfix">
                <li class="col01">商品名称</li>
                <li class="col03">商品价格</li>
                <li class="col04">数量</li>
                <li class="col05">小计</li>
                <li class="col06">操作</li>
            </ul>
            <ul class="cart_list_td clearfix" v-for="(i,index) in goods">
                <li class="col01"></li>
                <li class="col02"><img :src="src+i.img"></li>
                <li class="col03">{{i.name}}</li>
                <li class="col05">{{i.price}}元</li>
                <li class="col06">
                    <div class="num_add">
                        <a href="javascript:;" class="add fl" @click="add(index)">+</a>
                        <input type="text" class="num_show fl"  v-model="i.count">
                        <a href="javascript:;" class="minus fl" @click="minus(index)">-</a>
                    </div>
                </li>
                <li class="col07">{{i.count*i.price}}元</li>
                <li class="col08"><a href="javascript:;">删除</a></li>
            </ul>
            <ul class="settlements">
                <li class="col01"></li>
                <li class="col02"></li>
                <li class="col03">合计(不含运费):<span>¥</span><em>{{totalPrice}}</em><br>共计<b>2</b>件商品</li>
                <li class="col04"><a>去结算</a></li>
            </ul>
        </div>
    </template>
    <script>
    export default {
        name:'cart',
        data() {
            return {
                goods:[],
                src:'/hou/static/goods/',
                totalPrice:0
            }
        },
        mounted(){
            this.axios({
                url:'/api/goods/cart/',
                method:'get',
                params:{"id":localStorage.getItem('uid')}
            }).then(res=>{
                this.goods = res.data.data;
                this.goods.forEach((item,index)=>{
                    this.totalPricefn(index,'');
                })
            })
        },
        methods:{
            add:function(index){
                this.goods[index].count++;
                this.totalPricefn(index,'+');
            },
            minus:function(index){
                if(this.goods[index].count>1){
                    this.goods[index].count--;
                    this.totalPricefn(index,'-');
                }
            },
            totalPricefn:function(index,params){
                if(params=='+'){
                    this.totalPrice += this.goods[index].price*1;
                }else if(params =='-'){
                    this.totalPrice -= this.goods[index].price*1;
                }else{
                    this.totalPrice += this.goods[index].price*this.goods[index].count;
                }
            }
        }
    }
    </script>
12-21 02:11
查看更多