zoukankan      html  css  js  c++  java
  • 购物车

    购物车

    settings配置

    # 缓存redis设置
    # 配置Redis为Django缓存
    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379/2",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
            }
        }
    }
    
    # 将session缓存在Redis中
    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    SESSION_CACHE_ALIAS = "default"
    
    # session 设置
    SESSION_COOKIE_AGE = 60 * 60 * 12  # 12小时
    SESSION_SAVE_EVERY_REQUEST = True
    SESSION_EXPIRE_AT_BROWSER_CLOSE = True  # 关闭浏览器,则COOKIE失效
    
    购物车中redis的操作(哈希类型)
    # 导入django-redis
    from django_redis import get_redis_connection
    
    # 连接redis
    conn = get_redis_connection('default')
    
    # 获取单个值(数量)
    cart_num = conn.hget(key, field)
    
    # 设置单个
    conn.hset(key, field, value)
    
    # 获取key下面的总数量
    cart_sum = conn.hlen(key)
    
    # 获取key下的所有的键值对
    conn.hgetall(key)
    
    # 删除某一条商品
    conn.hdel(key, field)
    

    django后台views代码

    class AddCart(View):
        """
        添加购物车
        """
        def post(self, request):
            """
            <QueryDict: {'user_id': ['10'], 'goods_id': ['5'], 'cart_num': ['1']}>
            """
            print(request.POST)
            user_id = request.POST.get('user_id')
            goods_id = request.POST.get('goods_id')
            cart_num = int(request.POST.get('cart_num'))
    
            try:
                numbers = int(cart_num)
            except Exception as e:
                return HttpResponse(json.dumps({'msg': '数量值不正确', 'code': 404}))
    
            # 连接redis
            conn = get_redis_connection('default')
    
            # 获取redis中商品的数量
            cart_count = conn.hget(user_id, goods_id)
            print(cart_count)
            if cart_count:
                numbers += int(cart_count)
            conn.hset(user_id, goods_id, numbers)
            cart_sum = conn.hlen(user_id)
            return HttpResponse(json.dumps({'msg': "OK", 'code': 200, 'cart_sum': cart_sum}))
    
    
    class ShowCartView(View):
        """
        获取购物车内的内容
        """
        def get(self, request, user_id):
            conn = get_redis_connection('default')
            cart_all = conn.hgetall(user_id)
            print(cart_all)
            goods_list = []
            for k, v in cart_all.items():
                goods_id = k.decode('utf-8')
                goods_num = v.decode('utf-8')
                goods = Goods.objects.get(pk=goods_id)
                goods_list.append({
                    'goods_name': goods.goods_name,
                    'goods_price': str(goods.goods_price),
                    'goods_code': goods.pk,
                    'goods_number': goods_num,
                    'goods_sum': float(goods.goods_price) * int(goods_num)
                })
            goods_sums = 0
            for i in goods_list:
                goods_sums += i.get('goods_sum')
            return HttpResponse(json.dumps({'msg': "OK", 'code': 200, 'goods_list': goods_list, 'goods_sums': goods_sums}))
    
    
    class JianView(View):
        """
        前端减数量接口
        """
        def post(self, request):
            print(request.POST)
            user_id = request.POST.get('user_id')
            goods_id = request.POST.get('goods_id')
            cart_num = int(request.POST.get('cart_num'))
    
            try:
                numbers = int(cart_num)
            except Exception as e:
                return HttpResponse(json.dumps({'msg': '数量值不正确', 'code': 404}))
            # 连接redis
            conn = get_redis_connection('default')
    
            # 获取redis中商品的数量
            cart_count = conn.hget(user_id, goods_id)
            print(cart_count)
    
            if cart_count:
                cart_count = int(cart_count)
                if cart_count > 1:
                    cart_count -= 1
    
                conn.hset(user_id, goods_id, cart_count)
                cart_sum = conn.hlen(user_id)
                return HttpResponse(json.dumps({'msg': "OK", 'code': 200, 'cart_sum': cart_sum}))
            else:
                return HttpResponse(json.dumps({'msg': "商品不存在", 'code': 200}))
    
    
    class JiaView(View):
        """
        前端加数量接口
        """
        def post(self, request):
            print(request.POST)
            user_id = request.POST.get('user_id')
            goods_id = request.POST.get('goods_id')
    
            # 连接redis
            conn = get_redis_connection('default')
    
            # 获取redis中商品的数量
            cart_count = conn.hget(user_id, goods_id)
            print(cart_count)
    
            if cart_count:
                cart_count = int(cart_count)
                cart_count += 1
    
                conn.hset(user_id, goods_id, cart_count)
                cart_sum = conn.hlen(user_id)
                return HttpResponse(json.dumps({'msg': "OK", 'code': 200, 'cart_sum': cart_sum}))
            else:
                return HttpResponse(json.dumps({'msg': "商品不存在", 'code': 200}))
    
    
    

    前端vue代码, 展示页面

    <template>
        <div>
            <table>
                <tr>
                    <td>编号</td>
                    <td>名称</td>
                    <td>价格</td>
                    <td>参数</td>
                    <td>详情</td>
                    <td>图片</td>
                    <td>分类</td>
                    <td>操作</td>
                </tr>
                <tr v-for="goods in goods_array">
                    <td>{{goods.id}}</td>
                    <td>
                        <router-link :to="{name: 'Detail', params: {'pk': goods.id}}">{{goods.goods_name}}</router-link>
                    </td>
                    <td>{{goods.goods_price}}</td>
                    <td>{{goods.parameter}}</td>
                    <td v-html="goods.goods_content"></td>
                    <td><img :src="'http://127.0.0.1:8000' + goods.goods_img" alt=""></td>
                    <td v-for="c in cate_array" v-if="c.id == goods.cate">{{c.cate_name}}</td>
                    <td>
                        <a href="#" @click.prevent="del_goods(goods.id)">删除</a>
                        <router-link :to="{name: 'UpdateGoods', params: {'pk': goods.id}}">修改</router-link>
                        <a href="#" @click.prevent="add_cart(goods.id)">加入购物车</a>
                        <router-link :to="{name: 'Cart'}">去购物车({{cart_sum}})</router-link>
                    </td>
                </tr>
            </table>
            <p>
                <button @click.prevent="up_num">上一页</button>
                <button v-for="p in page_array" @click.prevent="get_page_num(p)">{{p}}</button>
                <button @click.prevent="down_num">下一页</button>
            </p>
        </div>
    </template>
    
    <script>
    import axios from 'axios'
    export default {
        data() {
            return {
               goods_array: Array(),  // List() []
               cate_array: [],
               page: 1 ,
               page_array: [],
               current_page: '',
               sum_page: '',
               user_id: sessionStorage.getItem('user_id'),  // 通过session获取用户id
               cart_sum: ''
            }
        },
        methods: {
            get_goods() {  //跳转到当前页,并根据页码,获取当前页的商品信息
                axios({
                    url: 'http://127.0.0.1:8000/mdadmin/page_api/' + this.page,
                    method: 'get'
                }).then(res=>{
                    console.log(res.data)
                    this.goods_array = res.data.goods
                    this.page_array = res.data.page_list
                    this.current_page = res.data.number
                    this.sum_page = res.data.page_nums
                })
            },
            get_cate() {  // 获取分类
                axios({
                    url: 'http://127.0.0.1:8000/mdadmin/cate_api/',
                    method: 'get'
                }).then(res=>{
                    console.log(res.data)
                    this.cate_array = res.data
                })
            },
            del_goods(gid) { // 删除商品
                axios({
                    url: 'http://127.0.0.1:8000/mdadmin/goods_detail/' + gid + '/',
                    method: 'delete'
                }).then(res=>{
                    console.log(res.data)
                    window.location.reload()
                })
            },
            get_page_num(page_num) { // 获取页码,重新给page赋值,并调用get_goods()
                this.page = page_num
                this.get_goods()
            },
            up_num(){ // 上一页
                if(this.current_page>1 ) {
                    this.page -= 1
                    this.get_goods()
                }else if(this.current_page == 1){
                    this.page = 1
                    this.get_goods()
                }
            },
            down_num() {  // 下一页
                if(this.current_page < this.sum_page) {
                    this.page += 1
                    this.get_goods()
                }else if(this.current_page == this.sum_page){
                    this.page = this.sum_page
                    this.get_goods()
                }
            },
            add_cart(goods_id) {
                let form_data = new FormData()
                form_data.append('user_id', this.user_id)
                form_data.append('goods_id', goods_id)
                form_data.append('cart_num', 1)
                axios({
                    url: 'http://127.0.0.1:8000/mdadmin/add_cart/',
                    method: 'post',
                    data: form_data
                }).then(res=>{
                    console.log(res.data)
                    this.cart_sum = res.data.cart_sum
                })
            }
    
        },
        created() {
            this.get_goods()
            this.get_cate()
            
            if(sessionStorage.getItem('name')){
                
            }else{
                window.location.href = '/login'
            }
        }
    }
    </script>
    

    购物车页面

    <template>
        <div>
            <table>
                <tr>
                    <td>商品编号</td>
                    <td>名称</td>
                    <td>价格</td>
                    <td>数量</td>
                    <td>总价</td>
                </tr>
                <tr v-for="goods in goods_array">
                    <td>{{goods.goods_code}}</td>
                    <td>{{goods.goods_name}}</td>
                    <td>{{goods.goods_price | msg}}</td>
                    <td>
                        <button @click.prevent="jian(goods.goods_code)">-</button>
                        <input type="text" :value="goods.goods_number" style=" 20px" id="input1">
                        <button @click.prevent="jia(goods.goods_code)">+</button>
                    </td>
                    <td>{{goods.goods_sum | msg}}</td>
                </tr>
                <tr>
                    <td></td>
                    <td></td>
                    <td></td>
                    <td>总价:</td>
                    <td>{{goods_sums | msg}}</td>
                    
                </tr>
            </table>
        </div>
    </template>
    <script>
    import axios from 'axios'
    export default {
        data(){
            return {
                user_id: sessionStorage.getItem('user_id'),
                goods_array: [],
                goods_sums: ''
            }
        },
        methods: {
            get_goods() {
                axios({
                    url: 'http://127.0.0.1:8000/mdadmin/show_cart/' + this.user_id,
                    method: 'get'
                }).then(res=>{
                    console.log(res.data)
                    this.goods_array = res.data.goods_list
                    this.goods_sums = res.data.goods_sums
                })
            },
            jian(goods_id) {  // 减数量
                let form_data = new FormData()
                form_data.append('user_id', this.user_id)
                form_data.append('goods_id', goods_id)
                
                axios({
                    url: 'http://127.0.0.1:8000/mdadmin/jian/',
                    method: 'post',
                    data: form_data
                }).then(res=>{
                    if(res.data.code == 200){
                        this.get_goods()
                    }
                })
            },
            jia(goods_id) {  // 加数量
                let form_data = new FormData()
                form_data.append('user_id', this.user_id)
                form_data.append('goods_id', goods_id)
                
                axios({
                    url: 'http://127.0.0.1:8000/mdadmin/jia/',
                    method: 'post',
                    data: form_data
                }).then(res=>{
                    if(res.data.code == 200){
                        this.get_goods()
                    }
                })
            }
        },
    
        created() {
            if(sessionStorage.getItem('user_id')){
                this.get_goods()
            }else{
                window.location.href = '/login'
            }
        }
    }
    </script>
    
  • 相关阅读:
    poj3294 Life Forms(后缀数组)
    1628. White Streaks(STL)
    1523. K-inversions(K逆序对)
    1890. Money out of Thin Air(线段树 dfs转换区间)
    1350. Canteen(map)
    1521. War Games 2(线段树解约瑟夫)
    1003. Parity(并查集)
    1470. UFOs(三维树状数组)
    1471. Tree(LCA)
    1494. Monobilliards(栈)
  • 原文地址:https://www.cnblogs.com/qx1996liu/p/13809166.html
Copyright © 2011-2022 走看看