0


Django+DRF+Vue+Mysql+Redis OUC软件工程作业

交作业啦

前端:html+css+js+Vue+Element-ui

后端:Django+DRF+celery+haystack+django_crontab

数据库:Mysql+Redis

一些技术和功能:

  • 为session、短信验证码、用户浏览记录、购物车、异步任务队列 创建缓存
  • whoosh搜索引擎
  • 异步任务队列 用于发送邮件、短信
  • 定时任务 定时更新静态页面、刷新日志等
  • 腾讯云短信服务
  • chatGPT客服(New)
  • 支付宝沙盒
  • 客服群聊
  • 数据库乐观锁
  • 页面静态化
  • JWT认证
  • 发货地址、不同的商品的详情、售后服务等都可以通过后台设置
  • 自选CPU、内存、显卡
  • "点击此处确认验证邮箱"
  • 对于未登录的用户,购物车数据使用浏览器cookie保存 登陆后合并购物车 对于已登录的用户,购物车数据在后端使用Redis保存

效果如下:

代码过多,这里只展示一部分,欢迎感兴趣的小伙伴一起讨论学习:

  1. import os
  2. from alipay import AliPay
  3. from rest_framework import status
  4. from rest_framework.permissions import IsAuthenticated
  5. from rest_framework.response import Response
  6. from rest_framework.views import APIView
  7. from MyApps.orders.models import OrderInfo
  8. from MyApps.payment.models import Payment
  9. from django.conf import settings
  10. class PaymentView(APIView):
  11. """
  12. 支付
  13. """
  14. permission_classes = (IsAuthenticated,)
  15. def get(self, request, order_id):
  16. """
  17. 获取支付链接
  18. """
  19. # 判断订单信息是否正确
  20. try:
  21. order = OrderInfo.objects.get(order_id=order_id, user=request.user,
  22. pay_method=OrderInfo.PAY_METHODS_ENUM["ALIPAY"],
  23. status=OrderInfo.ORDER_STATUS_ENUM["UNPAID"])
  24. except OrderInfo.DoesNotExist:
  25. return Response({'message': '订单信息有误'}, status=status.HTTP_400_BAD_REQUEST)
  26. # 构造支付宝支付链接地址
  27. alipay = AliPay(
  28. appid=settings.ALIPAY_APPID,
  29. app_notify_url=None, # 默认回调url
  30. app_private_key_string=open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "keys",
  31. "app_private_key.pem")).read(),
  32. # app_private_key_string=settings.app_private_key_string,
  33. alipay_public_key_string=open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'keys',
  34. 'alipay_public_key.pem')).read(),
  35. # alipay_public_key_string=settings.alipay_public_key_string, # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
  36. sign_type="RSA2", # RSA 或者 RSA2
  37. debug=settings.ALIPAY_DEBUG # 默认False
  38. )
  39. order_string = alipay.api_alipay_trade_page_pay(
  40. out_trade_no=order_id,
  41. total_amount=str(order.total_amount),
  42. subject="联想商城%s" % order_id,
  43. return_url="http://localhost:63342/BMyStore/front_end_pc/pay_success.html",
  44. )
  45. # 需要跳转到https://openapi.alipay.com/gateway.do? + order_string
  46. # 拼接链接返回前端
  47. alipay_url = settings.ALIPAY_URL + "?" + order_string
  48. return Response({'alipay_url': alipay_url})
  49. # 支付宝回调函数接口 put /payment/status/?支付宝参数
  50. class PaymentStatusView(APIView):
  51. def put(self, request):
  52. # 接收参数,效验参数
  53. # 构造支付宝支付链接地址
  54. alipay_req_data = request.query_params
  55. if not alipay_req_data:
  56. return Response({"message": "缺少参数"}, status=status.HTTP_400_BAD_REQUEST)
  57. alipay_req_dict = alipay_req_data.dict()
  58. sign = alipay_req_dict.pop("sign")
  59. alipay = AliPay(
  60. appid=settings.ALIPAY_APPID,
  61. app_notify_url=None, # 默认回调url
  62. app_private_key_string=open(os.path.join(os.path.dirname(os.path.abspath(__file__)),
  63. "keys/app_private_key.pem")).read(),
  64. alipay_public_key_string=open(os.path.join(os.path.dirname(os.path.abspath(__file__)),
  65. "keys/alipay_public_key.pem")).read(),
  66. # 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,
  67. sign_type="RSA2", # RSA 或者 RSA2
  68. debug=settings.ALIPAY_DEBUG # 默认False
  69. )
  70. result = alipay.verify(alipay_req_dict, sign)
  71. # 保存数据,保存支付结果数据
  72. if result:
  73. order_id = alipay_req_dict.get("out_trade_no")
  74. trade_id = alipay_req_dict.get("trade_no")
  75. # 修改订单状态
  76. Payment.objects.create(
  77. order_id=order_id,
  78. trade_id=trade_id
  79. )
  80. OrderInfo.objects.filter(order_id=order_id).update(status=OrderInfo.ORDER_STATUS_ENUM["UNCOMMENT"])
  81. print('支付成功!')
  82. return Response({"trade_id": trade_id})
  83. return Response({"message": "参数有误"}, status=status.HTTP_400_BAD_REQUEST)
  1. from django_filters.rest_framework import DjangoFilterBackend
  2. from drf_haystack.viewsets import HaystackViewSet
  3. from rest_framework.filters import OrderingFilter
  4. from rest_framework.generics import ListAPIView, CreateAPIView, DestroyAPIView, RetrieveAPIView
  5. from rest_framework.pagination import PageNumberPagination
  6. from rest_framework.views import APIView
  7. from rest_framework.response import Response
  8. from rest_framework.viewsets import GenericViewSet
  9. from MyApps.goods import models
  10. from MyApps.goods.models import SKU, GoodsCategory, Collect, Comment1, SKUImage
  11. from MyApps.goods.serializers import SKUSerializer, SKUIndexSerializer, CollectSerializer, Comment1Serializer
  12. from rest_framework.permissions import IsAuthenticated
  13. from django_redis import get_redis_connection
  14. from rest_framework.filters import BaseFilterBackend
  15. from django_filters import FilterSet, filters
  16. class SKUListView(ListAPIView):
  17. """
  18. sku列表数据
  19. """
  20. serializer_class = SKUSerializer
  21. # 分页与排序
  22. filter_backends = (OrderingFilter,)
  23. ordering_fields = ("create_time", "price", "sales")
  24. def get_queryset(self):
  25. category_id = self.kwargs["category_id"]
  26. return SKU.objects.filter(category_id=category_id, is_launched=True)
  27. class SKUSearchViewSet(HaystackViewSet):
  28. """
  29. SKU搜索
  30. """
  31. index_models = [SKU]
  32. serializer_class = SKUIndexSerializer
  33. # 分页与排序
  34. # filter_backends = (OrderingFilter,)
  35. def list(self, request, *args, **kwargs):
  36. queryset = self.filter_queryset(self.get_queryset())
  37. ordering_fields = ("create_time", "price", "sales")
  38. od = request.query_params.get("ordering", None)
  39. if od in ordering_fields:
  40. queryset = queryset.order_by(od)
  41. page = self.paginate_queryset(queryset)
  42. if page is not None:
  43. serializer = self.get_serializer(page, many=True)
  44. return self.get_paginated_response(serializer.data)
  45. serializer = self.get_serializer(queryset, many=True)
  46. return Response(serializer.data)
  47. class CategoriesView(APIView):
  48. """获取当前分类信息"""
  49. def get(self, request, pk):
  50. """
  51. 1.获取前端数据
  52. 2. 查询当前三级分类信息
  53. 3.通过三级分类信息获取一二集分类
  54. 4. 返回
  55. :param request:
  56. :return:
  57. """
  58. cat3 = GoodsCategory.objects.get(id=pk) # 获取三级
  59. cat2 = cat3.parent # 自关联获取二级,
  60. cat1 = cat2.parent # 自关联获取一级
  61. # 返回数据
  62. return Response({
  63. "cat1": cat1.name,
  64. "cat2": cat2.name,
  65. "cat3": cat3.name
  66. })
  67. class GetGoodsView(APIView):
  68. """获取当前分类信息"""
  69. def get(self, request, pk):
  70. SKU1 = models.SKU.objects.filter(pk=pk).first()
  71. comment_count = SKU1.goods.comment_count
  72. collect_count = SKU1.goods.collect_count
  73. goods_id = SKU1.goods_id
  74. # 返回数据
  75. return Response({"goods_id": goods_id, 'comment_count': comment_count, 'collect_count': collect_count})
  76. class IsCollectedView(APIView):
  77. def post(self, request):
  78. print(request.data)
  79. sku_id = int(request.data.get("sku_id", -5))
  80. user_id = request.data.get("user_id", 1)
  81. if sku_id == -5:
  82. return Response({"res_data": 0})
  83. collecs = models.Collect.objects.filter(user_id=user_id)
  84. sku_id_list = [i.sku_id for i in collecs]
  85. print(sku_id in sku_id_list)
  86. res = 0
  87. if sku_id in sku_id_list:
  88. res = 1
  89. return Response({"res_data": res})
  90. ##################################
  91. class MyPageNumberPagination(PageNumberPagination):
  92. page_size_query_param = 'size'
  93. page_size = 10
  94. max_page_size = 100
  95. class CommentFilterSet(FilterSet):
  96. goods = filters.NumberFilter(field_name='goods', required=True)
  97. class Meta:
  98. model = models.Comment1
  99. fields = ['goods']
  100. class Comment1View(ListAPIView, GenericViewSet):
  101. filter_backends = [DjangoFilterBackend]
  102. filterset_class = CommentFilterSet
  103. queryset = models.Comment1.objects
  104. serializer_class = Comment1Serializer
  105. ################################################
  106. class SelfFilterBackend(BaseFilterBackend):
  107. def filter_queryset(self, request, queryset, view):
  108. return queryset.filter(user=request.user)
  109. class CollectViewSet(ListAPIView, CreateAPIView, GenericViewSet):
  110. permission_classes = [IsAuthenticated]
  111. filter_backends = [SelfFilterBackend, DjangoFilterBackend]
  112. pagination_class = MyPageNumberPagination
  113. # 当前登录用户的所有收藏记录
  114. queryset = models.Collect.objects
  115. serializer_class = CollectSerializer
  116. def perform_create(self, serializer):
  117. user = self.request.user
  118. instance = Collect.objects.filter(user=user, **serializer.validated_data).first()
  119. if not instance:
  120. instance = serializer.save(user=user)
  121. instance.sku.goods.collect_count += 1
  122. instance.sku.goods.save()
  123. return Response({"message": 'ok', 'data': {'active': True}})
  124. else:
  125. instance.delete()
  126. instance.sku.goods.collect_count -= 1
  127. instance.sku.goods.save()
  128. return Response({"message": 'ok', 'data': {'active': False}})
  129. class HotSkus(ListAPIView):
  130. serializer_class = SKUSerializer
  131. # 分页与排序
  132. filter_backends = (OrderingFilter,)
  133. ordering_fields = ("sales", "create_time", "price")
  134. def get_queryset(self):
  135. category_id = self.kwargs["category_id"]
  136. return SKU.objects.filter(category_id=category_id, is_launched=True).order_by('-sales')[:2]
  137. class ImgListView(APIView):
  138. def get(self, request):
  139. s_id = request.query_params.get("sku_id")
  140. img_list = SKUImage.objects.filter(sku_id=s_id)
  141. img_list = [i.image.path.split("BMyStore\\")[1] for i in img_list]
  142. return Response({"img_list": img_list})

有些代码写的略显丑陋 不过能跑就不改了 哈哈

标签: django python 后端

本文转载自: https://blog.csdn.net/suic009/article/details/128412841
版权归原作者 老师我作业忘带了 所有, 如有侵权,请联系我们删除。

“Django+DRF+Vue+Mysql+Redis OUC软件工程作业”的评论:

还没有评论