django 商品及购物车逻辑实现

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

创建菜单子应用

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("插入成功")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java实现连接SQL Server解决方案及代码

下面展示了连接SQL Server数据库的整个流程&#xff1a; 加载数据库驱动建立数据库连接执行SQL语句处理结果关闭连接 在连接之前&#xff0c;前提是确保数据库成功的下载&#xff0c;创建&#xff0c;配置好账号密码。 运行成功的代码&#xff1a; import java.sql.*;publi…

TOGAF(企业架构)

TOGAF 核心概念&#xff08;官方原版&#xff09; 什么是TOGAF&#xff1f; TOGAF?是一种经验证的企业架构方法和框架&#xff0c;被世界领先的组织用于提高业务效率。它是一个企业架构标准&#xff0c;确保企业架构专业人员之间的标准、方法和通信一致&#xff0c;以便我们…

【OpenCV实现图像的算数运算,性能测试和优化,改变颜色空间】

文章目录 OpenCV功能概要图像的算数运算性能测试和优化改变颜色空间对象追踪 OpenCV功能概要 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习库&#xff0c;提供了丰富的图像处理和计算机视觉算法。它支持多种编程语言&…

【计算机网络】HTTP协议

文章目录 1. HTTP介绍认识URL 2. HTTP消息结构请求request响应response 3. HTTP请求方法4. HTTP报头5. HTTP响应状态码6. Cookie和Session 1. HTTP介绍 HTTP&#xff08;hypertext transfer protocol&#xff09;是一种常用的应用层协议&#xff0c;用于在计算机之间传输超文本…

Linux常用命令——cksum命令

在线Linux命令查询工具 cksum 检查文件的CRC是否正确 补充说明 cksum命令是检查文件的CRC是否正确&#xff0c;确保文件从一个系统传输到另一个系统的过程中不被损坏。这种方法要求校验和在源系统中被计算出来&#xff0c;在目的系统中又被计算一次&#xff0c;两个数字进行…

Postman的简单使用

Postman简介 官网 Postman是Google公司开发的一款功能强大的网页调试与发送HTTP请求&#xff0c;并能运行测试用例的Chrome插件 使用Postman进行简单接口测试 新建测试 → 选择请求方式 → 请求URL&#xff0c;下面用百度作为例子&#xff1a; 参考文档 [1] Postman使用教程…

香港科技大学广州|可持续能源与环境学域博士招生宣讲会—广州大学城专场!!!(暨全额奖学金政策)

香港科技大学广州&#xff5c;可持续能源与环境学域博士招生宣讲会—广州大学城专场&#xff01;&#xff01;&#xff01;&#xff08;暨全额奖学金政策&#xff09; “面向未来改变游戏规则的——可持续能源与环境学域” &#xfffd;&#xfffd;&#xfffd;专注于能源环…

Mysql视图特性用户管理

目录 一、视图基本使用 二、用户管理 2.1 用户 ①用户信息 ②创建用户 tips:(解决无法创建用户) ③删除用户 ④修改用户密码 2.2数据库的权限 ①给用户授权 ②回收权限 视图&#xff1a;视图是一种虚拟表。视图是基于一个或多个基础表中的数据所创建的一个查询结果…

OTA: Optimal Transport Assignment for Object Detection 论文和代码学习

OTA 原因步骤什么是最优传输策略标签分配的OT正标签分配负标签分配损失计算中心点距离保持稳定动态k的选取 整体流程代码使用 论文连接&#xff1a; 原因 1、全部按照一个策略如IOU来分配GT和Anchors不能得到全局最优&#xff0c;可能只能得到局部最优。 2、目前提出的ATSS和P…

16结构型模式-组合模式

我们很容易将“组合模式”和“组合关系”搞混。组合模式最初只是用于解决树形结构的场景&#xff0c;更多的是处理对象组织结构之间的问题。而组合关系则是通过将不同对象封装起来完成一个统一功能. 1 组合模式介绍 将对象组合成树形结构以表示整个部分的层次结构.组合模式可…

深度学习 anaconda 安装问题

配置anaconda 在官网下载匹配版本的anaconda&#xff08;官网下载可能时间比较长&#xff09;&#xff0c;可以选择清华镜像。 安装过程默认即可&#xff0c;或者根据情况进行修改。 旧版本是可以在安装的时候勾选添加路径到环境变量中的&#xff0c;但是我安装的是2023.9月…

分布式微服务技术栈-SpringCloud<Eureka,Ribbon,nacos>

微服务技术栈 一、微服务 介绍了解1 架构结构案例与 springboot 兼容关系拆分案例拆分服务拆分-服务远程调用 2 eureka注册中心Eureka-提供者与消费者Eureka-eureka原理分析Eureka-搭建eureka服务Eureka-服务注册Eureka-服务发现 3 Ribbon组件 负载均衡Ribbon-负载均衡原理Ribb…

Linux搭建Redis环境

1. 基础环境 名称说明CentOS 7.6Linux操作系统版本redis-5.0.0.tar.gzRedis二进制安装包 2. 服务安装 服务端路径&#xff1a;usr/loacl/redis/redis-server客户端路径&#xff1a;usr/loacl/redis/redis-cli # 解压二进制包 [rootzhouwei resource]# tar -zxvf redis-5.0.…

MySQL3:MySQL中一条更新SQL是如何执行的?

MySQL3&#xff1a;MySQL中一条更新SQL是如何执行的&#xff1f; MySQL中一条更新SQL是如何执行的&#xff1f;1.Buffer Pool缓冲池2.Redo logredo log作用Redo log文件位置redo log为什么是2个&#xff1f; 3.Undo log4.更新过程5.InnoDB官网架构InnoDB架构-内存结构①Buffer …

java类的动态加载

java类的动态加载 java动态加载的机制&#xff1a; ClassLoader->SecureClassloader–>URLClassLoader–>AppClassLoader loadClass–>findClass(重写方法)–>defineClass(从字节码加载类) 初始化的时候会加载静态代码块 实例化的时候会加载构造代码块、无参构…

S32K324 UDS Bootloader开发-需求篇

文章目录 前言内存分配UDS诊断协议需求CAN ID及时间参数UDS诊断服务Bootloader诊断服务APP诊断服务 DID22服务的DID:2E服务的DID:Routine Control DID&#xff1a; 刷写流程预编程主编程后编程 总结 前言 之前做过一个STM32的UDS Bootloader&#xff0c;协议栈主要是NXP官网下…

单片机矩阵键盘

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、什么是矩阵键盘&#xff1f;1.独立键盘2.矩阵键盘变化1变化2变化3 3. 通过变型&#xff0c;举一反三&#xff0c;就可以实现4*4的矩阵键盘扫描 二、使用步骤…

app开发者提升第四季度广告收入的方法

第四季度将迎来双十一、双十二、圣诞、元旦为主的电商购物季&#xff0c;这是一年中利用线上消费为全新年度和全新预算做好准备的最佳时机&#xff0c;从过往的变现成功案例中汇总了优化要点&#xff0c;帮助开发者在第四季度和未来一年获取更多广告收益。 https://www.shensh…

CSS - 常用属性和布局方式

目录 前言 一、常用属性 1.1、字体相关 1.2、文本相关 1.3、背景相关 1.3.1、背景颜色 1.3.2、背景图片 1.4、圆角边框 二、常用布局相关 2.1、display 2.2、盒子模型 2.2.1、基本概念 2.2.2、border 边框 2.2.3、padding 内边距 2.2.4、margin 外边距 2.3、弹…

sql server2014如何添加多个实例 | 以及如何删除多个实例中的单个实例

标题sql server2014如何添加多个实例 前提&#xff08;已安装sql server2014 且已有默认实例MSSQLSERVER&#xff09; 添加新的实例 其实就是根据安装步骤再安装一次&#xff08;区别在过程中说明&#xff09; 双击安装 选择“全新独立安装或添加现有功能” 然后下一步下一…