提交 1d9b5839 编写于 作者: C Corley

V1.5

上级 fdafa4bf
......@@ -146,7 +146,6 @@ MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
]
......
......@@ -25,6 +25,7 @@ import xadmin
from .settings import MEDIA_ROOT
from goods.views import GoodsListViewSet, CategoryViewSet
from users.views import SmsCodeViewSet, UserViewSet
from user_operation.views import UserFavViewSet
# Create a router and register our viewsets with it.
......@@ -42,6 +43,9 @@ router.register(r'codes', SmsCodeViewSet, basename='codes')
# 配置注册路由
router.register(r'users', UserViewSet, basename='users')
# 配置收藏路由
router.register(r'userfavs', UserFavViewSet, basename='userfavs')
urlpatterns = [
url(r'^xadmin/', xadmin.site.urls),
url(r'^media/(?P<path>.*)$', serve, {'document_root':MEDIA_ROOT}),
......
......@@ -16,4 +16,7 @@
先通过嵌套方式实现商品类别数据接口,再通过Vue展示商品分类,最后实现展示商品列表页数据和搜索功能。
#### V1.4
先实现在DRF中使用token,再使用JSON Web Token登录,再实现短信发送和注册功能,最后实现前后端结合、完成注册功能。
\ No newline at end of file
先实现在DRF中使用token,再使用JSON Web Token登录,再实现短信发送和注册功能,最后实现前后端结合、完成注册功能。
#### V1.5
主要实商品详情页功能,包括商品轮播图、商品信息等,还包括热卖商品的展示和收藏功能的实现。
\ No newline at end of file
......@@ -16,4 +16,4 @@ class GoodsFilter(django_filters.rest_framework.FilterSet):
class Meta:
model = Goods
fields = ['name', 'pricemin', 'pricemax']
\ No newline at end of file
fields = ['name', 'pricemin', 'pricemax', 'is_hot']
\ No newline at end of file
# Generated by Django 3.0.8 on 2020-07-29 11:12
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('goods', '0007_auto_20200725_0954'),
]
operations = [
migrations.AlterField(
model_name='goodsimage',
name='goods',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='images', to='goods.Goods', verbose_name='商品'),
),
]
......@@ -77,7 +77,7 @@ class Goods(models.Model):
class GoodsImage(models.Model):
'''商品轮播图'''
goods = models.ForeignKey(Goods, verbose_name='', related_name='商品', null=True, on_delete=models.SET_NULL)
goods = models.ForeignKey(Goods, verbose_name='商品', related_name='images', null=True, on_delete=models.SET_NULL)
image = models.ImageField(upload_to='', null=True, blank=True, verbose_name='图片')
image_url = models.CharField(max_length=300, null=True, blank=True, verbose_name='图片链接')
......
from rest_framework import serializers
from .models import Goods, GoodsCategory
from .models import Goods, GoodsCategory, GoodsImage
class TerCategorySerializer(serializers.ModelSerializer):
......@@ -29,9 +29,16 @@ class CategorySerializer(serializers.ModelSerializer):
fields = '__all__'
class GoodsImageSerializer(serializers.ModelSerializer):
class Meta:
model = GoodsImage
fields = ['image',]
class GoodsSerializer(serializers.ModelSerializer):
'''商品序列化'''
category = CategorySerializer()
images = GoodsImageSerializer(many=True)
class Meta:
model = Goods
fields = '__all__'
\ No newline at end of file
......@@ -14,7 +14,7 @@ class GoodsPagination(PageNumberPagination):
page_size_query_param = 'page_size'
max_page_size = 100
class GoodsListViewSet(mixins.ListModelMixin, viewsets.GenericViewSet):
class GoodsListViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, viewsets.GenericViewSet):
'''商品列表页,并实现分页、搜索、过滤、排序'''
queryset = Goods.objects.filter(is_delete=False).order_by('id')
......
# Generated by Django 3.0.8 on 2020-07-29 17:35
from django.conf import settings
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('goods', '0008_auto_20200729_1112'),
('user_operation', '0003_auto_20200725_0954'),
]
operations = [
migrations.AlterUniqueTogether(
name='userfav',
unique_together={('user', 'goods')},
),
]
......@@ -21,9 +21,11 @@ class UserFav(models.Model):
class Meta:
verbose_name = '用户收藏'
verbose_name_plural = verbose_name
# 联合唯一验证
unique_together = ('user', 'goods')
def __str__(self):
return self.user.name
return self.user.username
class UserLeavingMessage(models.Model):
......
from rest_framework import serializers
from rest_framework.validators import UniqueTogetherValidator
from .models import UserFav
class UserFavSerializer(serializers.ModelSerializer):
user = serializers.HiddenField(default=serializers.CurrentUserDefault())
class Meta:
model = UserFav
fields = ['id', 'user', 'goods']
validators = [
UniqueTogetherValidator(
queryset=UserFav.objects.filter(is_delete=False),
fields=['user', 'goods'],
message='请勿重复收藏'
)
]
\ No newline at end of file
from django.shortcuts import render
from rest_framework import viewsets, mixins
from rest_framework.permissions import IsAuthenticated
from rest_framework.authentication import SessionAuthentication
from rest_framework_jwt.authentication import JSONWebTokenAuthentication
from .models import UserFav
from .serializers import UserFavSerializer
from utils.permissions import IsOwnerOrReadOnly
# Create your views here.
class UserFavViewSet(mixins.CreateModelMixin, mixins.ListModelMixin, mixins.DestroyModelMixin, viewsets.GenericViewSet):
'''用户收藏'''
permission_classes = [IsAuthenticated, IsOwnerOrReadOnly]
serializer_class = UserFavSerializer
authentication_classes = [JSONWebTokenAuthentication, SessionAuthentication]
lookup_field = 'goods_id'
def get_queryset(self):
return UserFav.objects.filter(user=self.request.user, is_delete=False)
\ No newline at end of file
......@@ -37,7 +37,7 @@ class SmsSerializer(serializers.Serializer):
class UserRegSerializer(serializers.ModelSerializer):
'''用户序列化'''
code = serializers.CharField(max_length=4, min_length=4, label='验证码', write_only=True,
code = serializers.CharField(required=True, max_length=4, min_length=4, label='验证码', write_only=True,
help_text='验证码',
error_messages={
'required': '请输入验证码',
......
......@@ -80,7 +80,7 @@ class UserViewSet(CreateModelMixin, viewsets.GenericViewSet):
payload = jwt_payload_handler(user)
re_dict['token'] = jwt_encode_handler(payload)
re_dict['name'] = user.name if user.name else user.username
headers = self.get_success_headers(serializer.data)
headers = self.get_success_headers(re_dict)
return Response(re_dict, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer):
......
from rest_framework import permissions
class IsOwnerOrReadOnly(permissions.BasePermission):
'''对象级别的权限,仅允许对象的所有者对其进行编辑'''
def has_object_permission(self, request, view, obj):
if request.method in permissions.SAFE_METHODS:
return True
return obj.user == request.user
\ No newline at end of file
......@@ -31,7 +31,7 @@ export const getHotSearch = params => { return axios.get(`${host}/hotsearchs/`)
export const getGoods = params => { return axios.get(`${local_host}/goods/`, { params: params }) }
//商品详情
export const getGoodsDetail = goodId => { return axios.get(`${host}/goods/${goodId}`+'/') }
export const getGoodsDetail = goodId => { return axios.get(`${local_host}/goods/${goodId}`+'/') }
//获取购物车商品
export const getShopCarts = params => { return axios.get(`${host}/shopcarts/`) }
......@@ -43,15 +43,15 @@ export const updateShopCart = (goodsId, params) => { return axios.patch(`${host}
export const deleteShopCart = goodsId => { return axios.delete(`${host}/shopcarts/`+goodsId+'/') }
//收藏
export const addFav = params => { return axios.post(`${host}/userfavs/`, params) }
export const addFav = params => { return axios.post(`${local_host}/userfavs/`, params) }
//取消收藏
export const delFav = goodsId => { return axios.delete(`${host}/userfavs/`+goodsId+'/') }
export const delFav = goodsId => { return axios.delete(`${local_host}/userfavs/`+goodsId+'/') }
export const getAllFavs = () => { return axios.get(`${host}/userfavs/`) }
//判断是否收藏
export const getFav = goodsId => { return axios.get(`${host}/userfavs/`+goodsId+'/') }
export const getFav = goodsId => { return axios.get(`${local_host}/userfavs/`+goodsId+'/') }
//登录
export const login = params => {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册