django 商品及购物车逻辑实现

news2024/12/25 12:55:04

基于类视图模式实现商品分类菜单接口开发

创建菜单子应用

python manage.py startapp menu

测试

apps/menu/views

from django.http import HttpResponse
from django.views import View


class GoodsMainMenu(View):
    def get(self,request):
        print("get请求")
        return HttpResponse("get 请求")

    def post(self,request):
        print("post请求")
        return HttpResponse("post 请求")

muxi_shop_back/urls

path("main_menu/", GoodsMainMenu.as_view()),

这时候测试请求
在这里插入图片描述

setting
把csrf中间件注释了

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    # "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]

接近cors跨域问题

# 解决跨域的一个插件
# pip install django-cors-headers
# 允许所有域名跨域
CORS_ORIGIN_ALLOW_ALL=True
# 允许携带cookie
CORS_ALLOW_CREDENTIALS=True

在这里插入图片描述

在这里插入图片描述

解决办法
在这里插入图片描述

获取一级菜单列表
在这里插入图片描述
在这里插入图片描述

获取二级菜单列表

在这里插入图片描述

封装统一的返回格式
utils/ResponseMessage

import json

from django.http import HttpResponse, JsonResponse


# 我们的菜单成功了状态码就是1000
# 失败了就是1001
# 其它不确定的1002
class MenuResponse():

    @staticmethod
    def success(data):
        result = {"status":1000,"data":data}
        return HttpResponse(json.dumps(result), content_type = "application/json")

    @staticmethod
    def failed(data):
        result = {"status": 1001, "data": data}
        return HttpResponse(json.dumps(result), content_type="application/json")

    @staticmethod
    def other(data):
        result = {"status": 1002, "data": data}
        return HttpResponse(json.dumps(result), content_type="application/json")
# 商品的响应全部都是2开头的
class GoodsResponse():

    @staticmethod
    def success(data):
        result = {"status":2000,"data":data}
        return HttpResponse(json.dumps(result), content_type = "application/json")

    @staticmethod
    def failed(data):
        result = {"status": 2001, "data": data}
        return HttpResponse(json.dumps(result), content_type="application/json")

    @staticmethod
    def other(data):
        result = {"status": 2002, "data": data}
        return HttpResponse(json.dumps(result), content_type="application/json")


# 购物车的响应全部都是3开头的
class CartResponse():

    @staticmethod
    def success(data):
        result = {"status":3000,"data":data}
        return JsonResponse(result,safe=False)

    @staticmethod
    def failed(data):
        result = {"status": 3001, "data": data}
        return JsonResponse(result, safe=False)

    @staticmethod
    def other(data):
        result = {"status": 3002, "data": data}
        return JsonResponse(result, safe=False)


# 用户的响应全部都是4开头的
class UserResponse():

    @staticmethod
    def success(data):
        result = {"status":4000,"data":data}
        return JsonResponse(result,safe=False)

    @staticmethod
    def failed(data):
        result = {"status": 4001, "data": data}
        return JsonResponse(result, safe=False)

    @staticmethod
    def other(data):
        result = {"status": 4002, "data": data}
        return JsonResponse(result, safe=False)

可以修改为
在这里插入图片描述

APIView继承实现商品类型接口开发

鼠标移动到不同的商品类型显示其对应的商品
在这里插入图片描述
在这里插入图片描述
goods/models

import decimal

from django.db import models
import json

from muxi_shop_back.settings import IMAGE_URL


class Goods(models.Model):
    type_id = models.IntegerField(blank=True, null=True)
    name = models.CharField(max_length=255, blank=True, null=True)
    sku_id = models.CharField(max_length=255, blank=True, null=True)
    target_url = models.CharField(max_length=255, blank=True, null=True)
    jd_price = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    p_price = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    image = models.CharField(max_length=255, blank=True, null=True)
    shop_name = models.CharField(max_length=255, blank=True, null=True)
    shop_id = models.IntegerField(blank=True, null=True)
    spu_id = models.CharField(max_length=255, blank=True, null=True)
    mk_price = models.DecimalField(max_digits=10, decimal_places=2, blank=True, null=True)
    vender_id = models.IntegerField(blank=True, null=True)
    find = models.IntegerField(blank=True, null=True)
    create_time = models.DateTimeField(blank=True, null=True)

    def __str__(self):
        result = {}
        result['type_id']=self.type_id
        result['name']=self.name
        result['sku_id']=self.sku_id
        result['target_url']=self.target_url
        result['jd_price']=self.jd_price
        result['p_price']=self.p_price
        result['image']= IMAGE_URL + self.image
        result['shop_name']=self.shop_name
        result['shop_id']=self.shop_id
        result['spu_id']=self.spu_id
        result['mk_price']=self.mk_price
        result['vender_id']=self.vender_id
        result['find']=self.find
        return json.dumps(result,cls=DecimalEncoder, ensure_ascii=False)

    class Meta:
        managed = False
        db_table = 'goods'

class DecimalEncoder(json.JSONEncoder):
    def default(self, o):
        if isinstance(o,decimal.Decimal):
            return float(o)

goods/urls

from django.urls import path

from .views import GoodsCategoryAPIView


urlpatterns = [
    path("category/<int:category_id>/<int:page>",GoodsCategoryAPIView.as_view()),

]

goods/views

from rest_framework.views import APIView

# APIView 继承了View
# 获取商品分类的接口
#访问方式 http://localhost:8000/goods/category/1
from apps.goods.models import Goods
from utils import ResponseMessage


class GoodsCategoryAPIView(APIView):
    def get(self,request,category_id,page):
        current_page = (page-1)*20
        end_data = page*20
        category_data = Goods.objects.filter(type_id=category_id).all()[current_page:end_data]
        result_list=[]
        for m in category_data:
            result_list.append(m.__str__())
        return ResponseMessage.GoodsResponse.success(result_list)

urls

from django.contrib import admin
from django.urls import path, include

from apps.menu.views import GoodsMainMenu,GoodsSubMenu


urlpatterns = [
    path("admin/", admin.site.urls),
    path("main_menu/", GoodsMainMenu.as_view()),
    path("sub_menu/", GoodsSubMenu.as_view()),
    path("goods/",include("goods.urls"))
]

setting

# 静态文件服务器配置
IMAGE_URL = "http://localhost:8000/static/product_images/"

在这里插入图片描述

序列化起实现商品详情数据查询接口

使用商品表的su_id 查询
在这里插入图片描述
在商品分类中任意点击一个商品进入就能看到该商品的商品详情
在这里插入图片描述
在这里插入图片描述
goods/views.py

class GoodsDetailAPIView(APIView):
    def get(self,request,sku_id):
        print(sku_id)
        goods_data = Goods.objects.filter(
            sku_id=sku_id
        ).first()
        # 进行序列化的动作 序列化的参数时instance, 反序列化的参数就是data
        result = GoodsSerializer(instance=goods_data)

        return ResponseMessage.GoodsResponse.success(result.data)

goods/urls

path("<str:sku_id>",GoodsDetailAPIView.as_view()),

goods/serializers.py

from rest_framework import serializers
from apps.goods.models import Goods
from muxi_shop_back.settings import IMAGE_URL

class GoodsSerializer(serializers.ModelSerializer):
    # 这里边写的字段就是你想要进行序列化时处理的字段
    # name = serializers.CharField()
    # 对序列化中的图片做处理
    image = serializers.SerializerMethodField()
    # 对序列化中的日期做处理
    create_time = serializers.DateTimeField("%Y-%m-%d %H:%M:%S")

    # 自动调用该方法  把 new_image_path 赋值给image   比如给序列化字段image做处理image前面加get
    def get_image(self,obj):
        new_image_path = IMAGE_URL + obj.image
        return new_image_path

    class Meta:
        model = Goods
        fields = "__all__"


不知道该序列化什么
在这里插入图片描述

    class Meta:
    	# 指定序列化的类
        model = Goods
        # 序列化所有的字段
        fields = "__all__"

在这里插入图片描述
1,2两种序列化都可以实现数据的返回
在这里插入图片描述

购物车接口开发–实现数据的添加

在这里插入图片描述

cart/views

from django.http import HttpResponse

from rest_framework.views import APIView
from apps.cart.models import Cart
from apps.cart.serializers import CartSerializer
class CartAPIView(APIView):
    # 购物车应该登录之后才能访问

    def post(self,request):
        request_data = request.data
        email = request_data.get("email")
        sku_id = request_data.get('sku_id')
        nums = request_data.get('nums')

        # 判断数据是否存在  如果存在就更新,如果不存在就插入
        data_exists = Cart.objects.filter(email=email,is_delete = 0,sku_id=sku_id)
        # 存在即更新
        if data_exists.exists():
            exists_cart_data = data_exists.get(email=email,is_delete = 0,sku_id=sku_id)
            new_nums = nums + exists_cart_data.nums
            request_data["nums"] = new_nums
            # 反序列化  json转对象
            cart_ser = CartSerializer(data=request_data)
            cart_ser.is_valid(raise_exception=True)
            # 更新
            Cart.objects.filter(
                email=email, is_delete=0, sku_id=sku_id
            ).update(**cart_ser.data)
            return ResponseMessage.CartResponse.success("更新成功")
        else:
            # 不存在插入
            cart_ser = CartSerializer(data=request_data)
            cart_ser.is_valid(raise_exception=True)
            Cart.objects.create(**cart_ser.data)
            return ResponseMessage.CartResponse.success("插入成功")

cart/urls

from django.urls import path
from .views import CartAPIView


urlpatterns = [
    path("",CartAPIView.as_view()),

]

cart/serializers.py

from rest_framework import serializers

from apps.cart.models import Cart


class CartSerializer(serializers.ModelSerializer):
    sku_id = serializers.CharField(required=True)
    # email本身设置的是唯一的  所以这里重新设置一下覆盖掉
    email = serializers.CharField(required=True)
    class Meta:
        model = Cart
        fields = "__all__"

cart/models

from django.db import models

# Create your models here.
class Cart(models.Model):
    id = models.AutoField(primary_key=True,null=False,unique=True)
    email =  models.CharField(null=False,max_length=255,unique=True)
    sku_id = models.CharField(null=False,max_length=255,unique=True)
    nums = models.IntegerField()
    is_delete = models.IntegerField()
    class Meta:
        db_table="shopping_cart"

在这里插入图片描述

购物车接口开发 数据的查询

cart/views

    def get(self, request):
        email = request.GET.get("email")
        cart_result = Cart.objects.filter(email=email,is_delete=0)
        # many=True 返回多条
        cart_ser = CartSerializer(instance=cart_result,many=True)
        # return JsonResponse(cart_ser.data,safe=False)
        return ResponseMessage.CartResponse.success(cart_ser.data)

购物车查询接口Bug修复及数据逻辑删除

cart/views

class CartAPIView(APIView):
    # 购物车应该登录之后才能访问

    def post(self, request):
        request_data = request.data
        email = request_data.get("email")
        sku_id = request_data.get('sku_id')
        nums = request_data.get('nums')
        is_delete = request_data.get('is_delete')

        # 判断数据是否存在  如果存在就更新,如果不存在就插入
        data_exists = Cart.objects.filter(email=email, is_delete=0, sku_id=sku_id)
        # 存在即更新
        if data_exists.exists():
            exists_cart_data = data_exists.get(email=email, is_delete=0, sku_id=sku_id)
            if is_delete == 0:
                new_nums = nums + exists_cart_data.nums
                request_data["nums"] = new_nums
            elif is_delete == 1:
                new_nums = nums + exists_cart_data.nums
            # 反序列化  json转对象
            cart_ser = CartSerializer(data=request_data)
            cart_ser.is_valid(raise_exception=True)
            # 更新
            Cart.objects.filter(
                email=email, is_delete=0, sku_id=sku_id
            ).update(**cart_ser.data)
            if is_delete == 0:
                return ResponseMessage.CartResponse.success("更新成功")
            elif is_delete == 1:
                return ResponseMessage.CartResponse.success("删除成功")
        else:
            # 不存在插入
            cart_ser = CartSerializer(data=request_data)
            cart_ser.is_valid(raise_exception=True)
            Cart.objects.create(**cart_ser.data)
            return ResponseMessage.CartResponse.success("插入成功")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据类型【MySQL】

文章目录 数据类型分类 数值类型TINYINTINTBITFLOATDECIMAL 字符串类型CHARVARCHARCHAR 和 VARCHAR 的比较BLOBTEXTNULL 和 日期和时间类型ENUM 和 SETFIND_IN_SET 参考资料 阅读前导&#xff1a;SQL 规定关键字应该大写&#xff0c;实际上在命令行使用 SQL 语句时为了方便和可…

Spring | Spring Cache 缓存框架

Spring Cache 缓存框架&#xff1a; Spring Cache功能介绍Spring Cache的Maven依赖Spring Cache的常用注解EnableCaching注解CachePut注解Cacheable注解CacheEvict注解 Spring Cache功能介绍 Spring Cache是Spring的一个框架&#xff0c;实现了基于注解的缓存功能。只需简单加一…

40 JAVA安全-JWT安全及预编译CASE注入等

目录 SQL Injection(mitigation)演示案例:Javaweb-SQL注入攻击-预编译机制绕过Javaweb-身份验证攻击-JWT修改伪造攻击 jwt加解密&#xff1a;https://jwt.io/#debugger-io 通过前期的WEB漏洞的学习&#xff0c;掌握了大部分的安全漏洞的原理及利用&#xff0c;但在各种脚本语言…

互联网Java工程师面试题·Spring篇·第一弹

目录 1、一般问题 1.1、不同版本的 Spring Framework 有哪些主要功能&#xff1f; 1.2、什么是 Spring Framework&#xff1f; 1.3、列举 Spring Framework 的优点。 1.4、Spring Framework 有哪些不同的功能&#xff1f; 1.5、Spring Framework 中有多少个模块&#xff…

docker和k8s之间的关系

一句话总结&#xff1a;Docker只是容器的一种&#xff0c;它面向的是单体&#xff0c;K8S可以管理多种容器&#xff0c;它面向的是集群&#xff0c;Docker可以作为一种容器方案被K8S管理。 https://baijiahao.baidu.com/s?id1763716289717819767&wfrspider&forpc 背…

input框输入中文时,输入未完成触发事件。Vue中文输入法不触发input事件?

前言 在做搜索输入框时&#xff0c;产品期待实时搜索&#xff0c;就是边输入边搜索&#xff0c;然而对于中文输入法出现的效果&#xff0c;不同的产品可能有不同的意见&#xff0c;有的觉得输入未完成也应该触发搜索。但有的却认为应该在中文输入完成后再触发搜索。我发现在vu…

安全、高效远程访问大数据分析平台解决方法:Splunk Enterprise+Cpolar

文章目录 前言1. 搭建Splunk Enterprise2. windows 安装 cpolar3. 创建Splunk Enterprise公网访问地址4. 远程访问Splunk Enterprise服务5. 固定远程地址 前言 Splunk Enterprise是一个强大的机器数据管理平台&#xff0c;可帮助客户分析和搜索数据&#xff0c;以及可视化数据…

安装docker ,更换docker版本

docker dockerd & containerd Dockerd&#xff08;Docker 守护进程&#xff09;在其底层使用 Containerd 来管理容器。Containerd 是一个开源的容器运行时管理器&#xff0c;由 Docker 公司于2017年开发并开源&#xff0c;它负责实际的容器生命周期管理。 以下是 Docker 守…

Web前端-Vue2+Vue3基础入门到实战项目-Day5(自定义指令, 插槽, 案例商品列表, 路由入门)

自定义指令 基本使用 自定义指令: 自己定义的指令, 可以封装一些dom操作, 扩展额外功能全局注册// 1. 全局注册指令 Vue.directive(focus, {// inserted 会在 指令所在的元素, 被插入到页面中时触发inserted (el) {// el 就是指令所绑定的元素// console.log(el)el.focus()} …

hive 问题解决 Class path contains multiple SLF4J bindings

hive输入命令时出现日志冲突提示&#xff08;问题不复杂&#xff0c;是个warn&#xff0c;强迫症解决&#xff0c;做项目经常遇到&#xff0c;项目里是处理maven。这里处理方法思路类似。&#xff09; 问题&#xff1a; SLF4J: Class path contains multiple SLF4J bindings. …

【Java集合类面试十二】、HashMap为什么线程不安全?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;HashMap为什么线程不安全…

Python Opencv实践 - 车辆统计(2)检测线绘制,车辆数量计数和显示

针对我所使用的视频&#xff0c;对上一节的代码进行了修改&#xff0c;增加了更多参数。 Python Opencv实践 - 车辆统计&#xff08;1&#xff09;读取视频&#xff0c;移除背景&#xff0c;做预处理_亦枫Leonlew的博客-CSDN博客示例中的图像的腐蚀、膨胀和闭运算等需要根据具…

通过执行mysql命令查看mysql版本

第一种一条SQL命令搞定 SELECT version() 第二种操作方式 在终端输入命令即可查询 命令&#xff1a;mysql -V 第三种操作方式 在终端输入命令[也就是进入数据库的命令] 命令&#xff1a;mysql -uroot -p 第三种操作方式 需要进入数据库内输入命令进行查询&#xff1b; 命…

逐字稿 | 视频理解论文串讲(下)【论文精读】

1 为什么研究者这么想把这个双流网络替换掉&#xff0c;想用3D 卷积神经网络来做&#xff1f; 大家好&#xff0c;上次我们讲完了上半部分&#xff0c;就是 2D 网络和一些双流网络以及。它们的。变体。今天我们就来讲一下下半部分&#xff0c;就是 3D 网络和 video Transformer…

layui框架实战案例(24):layedit工具栏添加查看源代码按钮的解决方案

layUI框架实战案例系列文章 layui框架实战案例(21)&#xff1a;layui上传的哪些事(layui.upload组件、 file文件域、php后台上传)layui框架实战案例(20)&#xff1a;常用条件判断和信息展示技巧(图片预览、动态表格、短信已读未读、链接分享、信息脱敏、内置框架页)layui框架实…

企业如何防止文件泄密(图文+视频讲解)

数字化浪潮的推动下&#xff0c;企业文件已经成为企业竞争的核心资产之一。同时&#xff0c;文件泄密事件也频频发生&#xff0c;给企业带来了巨大的经济损失和声誉损失。 那如何有效地防止文件泄密已成为企业亟待解决的重要问题&#xff01;在查阅了大量资料后&#xff0c;小编…

Linux进程间通信之匿名管道

Linux进程间通信之匿名管道 进程间通信介绍1. 进程间通信的目的2. 进程间通信发展 什么是管道匿名管道1. 什么是匿名管道2. 匿名管道样例详解3. 原理4. 单个父进程与多个子进程管道间通信建立子进程任务相关的头文件主文件的建立执行结果 5. 管道读写规则6. 管道特点 进程间通信…

基于图像识别的跌倒检测算法 计算机竞赛

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于图像识别的跌倒检测算法 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/…

分布式事务及CAP和BASE定理

一、分布式事务 单体应用肯定就不存在分布式事务了&#xff0c;只有在分布式微服务系统中&#xff0c;各个服务之间通过RPC调用后&#xff0c;每个微服务有自己和数据库的连接&#xff0c;各个微服务的回滚不影响其他的微服务事务&#xff0c;这几必须使用分布式事务来解决分布…

CASAIM自动激光3D测量系统助力海外家电组装企业IQC来料检测装配尺寸测量

随着家电产品的不断创新发展&#xff0c;海外家电组装企业也面临着越来越高的质量标准&#xff0c;几何尺寸测量与控制是保证产品交付质量的基础。零部件、外壳壳体经过国内或东南亚其他地区生产好后&#xff0c;为了确保产品质量和一致性&#xff0c;外协件物料需要送往组装厂…