django 商品及购物车逻辑实现

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

创建菜单子应用

python manage.py startapp menu

测试

apps/menu/views

from django.http import HttpResponse
from django.views import Viewclass 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 jsonfrom django.http import HttpResponse, JsonResponse# 我们的菜单成功了状态码就是1000
# 失败了就是1001
# 其它不确定的1002
class MenuResponse():@staticmethoddef success(data):result = {"status":1000,"data":data}return HttpResponse(json.dumps(result), content_type = "application/json")@staticmethoddef failed(data):result = {"status": 1001, "data": data}return HttpResponse(json.dumps(result), content_type="application/json")@staticmethoddef other(data):result = {"status": 1002, "data": data}return HttpResponse(json.dumps(result), content_type="application/json")
# 商品的响应全部都是2开头的
class GoodsResponse():@staticmethoddef success(data):result = {"status":2000,"data":data}return HttpResponse(json.dumps(result), content_type = "application/json")@staticmethoddef failed(data):result = {"status": 2001, "data": data}return HttpResponse(json.dumps(result), content_type="application/json")@staticmethoddef other(data):result = {"status": 2002, "data": data}return HttpResponse(json.dumps(result), content_type="application/json")# 购物车的响应全部都是3开头的
class CartResponse():@staticmethoddef success(data):result = {"status":3000,"data":data}return JsonResponse(result,safe=False)@staticmethoddef failed(data):result = {"status": 3001, "data": data}return JsonResponse(result, safe=False)@staticmethoddef other(data):result = {"status": 3002, "data": data}return JsonResponse(result, safe=False)# 用户的响应全部都是4开头的
class UserResponse():@staticmethoddef success(data):result = {"status":4000,"data":data}return JsonResponse(result,safe=False)@staticmethoddef failed(data):result = {"status": 4001, "data": data}return JsonResponse(result, safe=False)@staticmethoddef other(data):result = {"status": 4002, "data": data}return JsonResponse(result, safe=False)

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

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

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

import decimalfrom django.db import models
import jsonfrom muxi_shop_back.settings import IMAGE_URLclass 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_idresult['name']=self.nameresult['sku_id']=self.sku_idresult['target_url']=self.target_urlresult['jd_price']=self.jd_priceresult['p_price']=self.p_priceresult['image']= IMAGE_URL + self.imageresult['shop_name']=self.shop_nameresult['shop_id']=self.shop_idresult['spu_id']=self.spu_idresult['mk_price']=self.mk_priceresult['vender_id']=self.vender_idresult['find']=self.findreturn json.dumps(result,cls=DecimalEncoder, ensure_ascii=False)class Meta:managed = Falsedb_table = 'goods'class DecimalEncoder(json.JSONEncoder):def default(self, o):if isinstance(o,decimal.Decimal):return float(o)

goods/urls

from django.urls import pathfrom .views import GoodsCategoryAPIViewurlpatterns = [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 ResponseMessageclass GoodsCategoryAPIView(APIView):def get(self,request,category_id,page):current_page = (page-1)*20end_data = page*20category_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, includefrom apps.menu.views import GoodsMainMenu,GoodsSubMenuurlpatterns = [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, 反序列化的参数就是dataresult = 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_URLclass 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前面加getdef get_image(self,obj):new_image_path = IMAGE_URL + obj.imagereturn new_image_pathclass Meta:model = Goodsfields = "__all__"

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

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

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

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

在这里插入图片描述

cart/views

from django.http import HttpResponsefrom 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.dataemail = 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.numsrequest_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 CartAPIViewurlpatterns = [path("",CartAPIView.as_view()),]

cart/serializers.py

from rest_framework import serializersfrom apps.cart.models import Cartclass CartSerializer(serializers.ModelSerializer):sku_id = serializers.CharField(required=True)# email本身设置的是唯一的  所以这里重新设置一下覆盖掉email = serializers.CharField(required=True)class Meta:model = Cartfields = "__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.dataemail = 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.numsrequest_data["nums"] = new_numselif 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.rhkb.cn/news/168643.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二叉搜索树进阶--AVL树详细实现过程

目录 AVL树概念AVL树实现AVL树基础结构插入插入&#xff1a;左旋实现插入&#xff1a;右旋实现 AVL树完整实现代码&#xff1a; 之前学习到的二叉搜索树虽可以缩短查找的效率&#xff0c;但如果数据有序或接近有序二叉搜索树将退化为单支树&#xff0c;查找元素相当于在顺序表中…

实现Traefik工具Dashboard远程访问:搭建便捷的远程管理平台

文章目录 前言1. Docker 部署 Trfɪk2. 本地访问traefik测试3. Linux 安装cpolar4. 配置Traefik公网访问地址5. 公网远程访问Traefik6. 固定Traefik公网地址 前言 Trfɪk 是一个云原生的新型的 HTTP 反向代理、负载均衡软件&#xff0c;能轻易的部署微服务。它支持多种后端 (D…

HTML笔记-狂神

1. 初识HTML 什么是HTML&#xff1f; Hyper Text Markup Language : 超文本标记语言 超文本包括&#xff1a;文字、图片、音频、视频、动画等 目前使用的是HTML5&#xff0c;使用 W3C标准 W3C标准包括&#xff1a; 结构化标准语言&#xff08;HTML、XML&#xff09; 表现标…

大二第三周总结(算法+生活)

算法&#xff1a; 题目&#xff1a;有效的括号 这个题目也是做过很多回了。主要就是数据结构中”栈“的应用&#xff0c;先进后出。 解题思路&#xff1a; 1.创建 Map 哈希表形成键值对映射 2.进行遍历字符串 在遍历过程中 如果 遍历到的字符c 是左括号&#xff0c;则入栈 pu…

大小端字节序存储

大小端字节序存储&#xff1a;是以字节为单位讨论它在内存中的存储顺序&#xff0c;而不是更小的二进制位 例如&#xff1a; int main() {int a 0x11223344;return 0; }a在内存中的存储16进制为44 33 22 11&#xff0c;两个16进制为一个单位进行存储&#xff0c;而两个十六进…

Leetcode—260.只出现一次的数字III【中等】

2023每日刷题&#xff08;三&#xff09; Leetcode—260.只出现一次的数字III 借助lowbit的解题思想 参考的灵茶山艾府大神的题解 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ int* singleNumber(int* nums, int numsSize, in…

git rebase 和 git merge的区别?

一、是什么 在使用 git 进行版本管理的项目中&#xff0c;当完成一个特性的开发并将其合并到 master 分支时&#xff0c;会有两种方式&#xff1a; git mergegit rebase git rebase 与 git merge都有相同的作用&#xff0c;都是将一个分支的提交合并到另一分支上&#xff0c…

谈谈你对spring boot 3.0的理解

谈谈你对spring boot 3.0的理解 一&#xff0c;Spring Boot 3.0 的兼容性 Spring Boot 3.0 在兼容性方面做出了很大的努力&#xff0c;以支持存量项目和老项目。尽管如此&#xff0c;仍需注意以下几点&#xff1a; Java 版本要求&#xff1a;Spring Boot 3.0 要求使用 Java 1…

Web前端—Flex布局:标准流、浮动、Flex布局、综合案例(短视频首页解决方案)

版本说明 当前版本号[20231024]。 20231024初版 目录 文章目录 版本说明目录Flex布局01-标准流02-浮动基本使用产品区域布局HTML标签CSS样式 清除浮动场景搭建额外标签法单伪元素法双伪元素法overfow法 03-Flex布局Flex组成主轴对齐方式侧轴对齐方式修改主轴方向弹性伸缩比弹…

概率论_概率公式中的分号(;)、逗号(,)、竖线(|) 及其优先级

目录 1.概率公式中的分号(;)、逗号(,)、竖线(|) 2.各种概率相关的基本概念 2.1 联合概率 2.2 条件概率&#xff08;定义&#xff09; 2.3 全概率(乘法公式的加强版) 2.4 贝叶斯公式 贝叶斯定理的公式推导 1.概率公式中的分号(;)、逗号(,)、竖线(|) ; 分号代表前后是两类…

最新Tuxera NTFS2023最新版Mac读写NTFS磁盘工具 更新详情介绍

Tuxera NTFS for Mac是一款Mac系统NTFS磁盘读写软件。在系统默认状态下&#xff0c;MacOSX只能实现对NTFS的读取功能&#xff0c;Tuxera NTFS可以帮助MacOS 系统的电脑顺利实现对NTFS分区的读/写功能。Tuxera NTFS 2023完美兼容最新版本的MacOS 11 Big Sur&#xff0c;在M1芯片…

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

目录 3、Beans 3.1、什么是 spring bean&#xff1f; 3.2、spring 提供了哪些配置方式&#xff1f; 3.3、spring 支持集中 bean scope&#xff1f; 3.4、spring bean 容器的生命周期是什么样的&#xff1f; 3.5、什么是 spring 的内部 bean&#xff1f; 3.6、什么是 spri…

【tg】4:NetworkManager :p2p、ice、消息收发

代码分布 NetworkManager 自成体系,看起来也么有啥依赖 class NetworkManager : public sigslot::has_slots<>, public std::enable_shared_from_this<NetworkManager

现在游戏出海有多少优势?

国内游戏市场趋于饱和&#xff0c;但是国外市场潜力仍然可观&#xff0c;因此很多人选择游戏出海&#xff0c;那么现在游戏出海有多少优势呢&#xff1f; 1、市场潜力 全球游戏市场潜力巨大&#xff0c;增长迅速。中国游戏公司具有强大的研发能力和创新能力&#xff0c;能够开…

[AUTOSAR][诊断管理][ECU][$19] 读取ECU的DTC故障信息

一、简介 在车载诊断中常用的诊断协议有ISO 14229等&#xff0c;在协议中主要定义了诊断请求、诊断响应的报文格式及ECU该如何处理诊断请求的应用。其中ISO 14229系列标准协议定义了用于行业内诊断通信的需求规范&#xff0c;也就是UDS。UDS主要应用于OSI七层模型的第七层——…

论文解读:Large Language Models as Analogical Reasoners

一、动机 大模型在各种类型的NLP任务上均展现出惊艳的表现。基于CoT propmt能够更好地激发大模型解决复杂推理问题的能力&#xff0c;例如解决数学解题&#xff0c;可以让模型生成reasoning path。现有的经典的CoT方法有few-shot cot、zero-shot cot等。然后现有的cot面临两个…

vue后台第二部步(布局和封装图标组件)

目录结构&#xff1b;根据需求修改、创建对应目录&#xff1b; src 应用部署目录├─api 接口├─assets 公共文件│ ├─theme.scss 主题样式…

数据库监控:关键指标和注意事项

【squids.cn】 全网zui低价RDS&#xff0c;免费的迁移工具DBMotion、数据库备份工具DBTwin、SQL开发工具等 听到模糊的说法“我们的数据库有问题”对于任何数据库管理员或管理员来说都是一场噩梦。有时是真的&#xff0c;有时不是&#xff0c;到底问题出在哪里呢&#xff1f;真…

《语音优先》智能语音技术驱动的交互界面设计与语音机器人设计(译者序)...

“言为心声,语为心境”&#xff0c;语言与对话是我们沟通与协作的重要方式。而智能语音技术是一种基于人工智能和自然语言处理技术的语音交互技术。它可以通过语音识别技术将用户的语音指令转换为文本&#xff0c;然后通过自然语言处理技术对文本进行分析和理解&#xff0c;最终…

2023Etsy入驻攻略——防封安全

2023了&#xff0c;跨境电商现在上车还来得及吗&#xff1f;当然&#xff01;Etsy是一个低成本低竞争高回报的平台&#xff0c;相较于其他电商平台&#xff0c;他的佣金非常低&#xff0c;利润率更高&#xff0c;非常合适跨境小白入局。 但由于目前Etsy关闭了中国大陆卖家的注…