광고 애플릿 백엔드 개발 (16 쿠폰 시스템 : 흐름도의 원리, 실험 상, 이차원 코드를 생성)

비즈니스 요구 : 쿠폰은 작은 광고 프로그램 내에서 다른 많은 작은 프로그램을 만들었다.

1. 원리 흐름도

 

2 상 (쿠폰) 실험

표 1. 클래스에서 상 응용 프로그램 / 광고 / models.py를 수정

클래스 상 (models.Model) :
     "" " 奖品" "" 
    제목 = models.CharField (MAX_LENGTH = 15, 널 (null) = 사실, 빈 = 사실, verbose_name = ' 标题' , help_text = ' 最多15字' ) 
    URL = 모델 .CharField (MAX_LENGTH = 200, 널 (null) = 사실, 빈 = 사실, verbose_name = ' 小程序URL ' ) 
    영역 = models.ForeignKey (지역, = TRUE = null의 경우, 빈 = 사실, verbose_name " 地区" , on_delete = models.CASCADE ) 
    get_num = models.IntegerField (기본값 = 0, verbose_name = ' 被领取数')
    가격 = models.IntegerField (기본값 = 0, verbose_name = ' 필수 사항 ' ) 
    all_num = models.IntegerField (기본값 = 0, verbose_name = ' 번호 발행 ' ) 
    is_out = models.BooleanField (기본값 = 거짓, verbose_name은 = ' 이었다 판매 ' ) 
    DESC = models.TextField (기본 = ' ' , 400 = MAX_LENGTH의 verbose_name = ' 설명 ' , help_text = ' 최대 400 자 ' ) 
    사용법 = models.TextField (기본 = ' ' , = 200 MAX_LENGTH의 verbose_name = ' 사용 ', Help_text = ' 최대 200 자 ' ) 
    이미지 = models.ImageField (MAX_LENGTH = 200, 기본 = '' 의 upload_to = ' prizeimg / ' 의 verbose_name = ' 상품 이미지 ' ) 
    END_TIME = models.DateTimeField (기본값 = DateTime.Now, = verbose_name ' 유효 ' ) 
    ADD_TIME = models.DateTimeField (기본값 = DateTime.Now = verbose_name ' 추가 시간 ' ) 

    클래스 메타 - : 
        verbose_name = " " 
        verbose_name_plural =verbose_name 

    데프  __str__ (자동) :
         리턴 self.title의 

    데프 이미지 URL (자동) :
         리턴 mark_safe ( ' <IMG SRC = "/ 미디어 / {0}"클래스 = "field_img"> ' .format (self.image)) 

    이미지 URL. SHORT_DESCRIPTION = ' 奖品图片'

데이터 업데이트 명령을 수행합니다 :

파이썬 manage.py의 makemigrations의 
파이썬 마이그레이션 manage.py를

2. PrizeAdmin에서 응용 프로그램 / 광고 / adminx.py 수정

클래스 PrizeAdmin (객체) : 
    list_display = [ " 제목 " , " get_num " , " is_out " , " URL " , " 가격 " , " 지역 " , " all_num " , " 내림차순 " , " 사용 " , " END_TIME " , " 이미지 URL " , "add_time "  ]
    list_filter= " 제목 " , " get_num " , " is_out " , " URL " , " 가격 " , " 지역 " , " all_num " , " DESC " , " 사용 " , " END_TIME " , " add_time " ] 
    search_fields = " 제목 " ," get_num " , " 가격 " , " all_num " , " 내림차순 " , " 사용 " ]

xadmin 배경으로 3. 직접 실험 상 테이블 수상의 일부를 입력합니다

3. 2 차원 코드 그림을 생성

인터넷 (14)로부터 1 받기 (이 수는 정의 할 수 있음), 그리고도 2 차원 코드에 대한 배경 이미지를 생성하는 새로운 디렉토리 아래 / 2를 정적 GG / 입력 :

 

2. myqr 설치

myqr를 설치 PIP

3. 수정 테이블 수준의 응용 프로그램 / user_operation / models.py의를 GetPrize :

class GetPrize(models.Model):
    """兑奖表"""
    user = models.ForeignKey(UserProfile, verbose_name="用户", on_delete=models.CASCADE)
    prize=models.ForeignKey(Prize, verbose_name="奖品", on_delete=models.CASCADE)
    title = models.CharField(max_length=15, null=True, blank=True, verbose_name='标题', help_text='最多15字')
    status = models.CharField(choices=(("0", "未使用"), ("1", "已使用")),default="0",max_length=6, verbose_name="使用状态")
    twoimg=models.ImageField(max_length=200, default='', upload_to='twoimg/', verbose_name='二维码')
    add_time = models.DateTimeField(default=datetime.now, verbose_name="添加时间")

    class Meta:
        verbose_name = "兑奖表"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.prize.title

    def image_url(self):
        return mark_safe('<img src="/media/{0}" class="field_img">'.format(self.twoimg))

    image_url.short_description = '二维码'

执行数据更新命令:

python manage.py makemigrations
python manage.py migrate

4.在apps/user_operation/views.py中新建BuyUseJiFen类:

#……
from users.models import UserProfile
from .serializers import MessageModelSerializer,GetPrizeModelSerializer
from .models import Message,GetPrize
from ad.models import Prize
from MyQR import myqr
import os,random
from gg.settings import BASE_DIR

#……


class BuyUseJiFen(APIView):
    """购买积分商品,生成二维码,控制每个用户领取一次"""
    renderer_classes = [JSONRenderer]  # 渲染器

    def get(self,request):
        token = request.GET.get('token')
        user = UserProfile.objects.filter(token=token).first()
        prizeid=request.GET.get('prizeid')
        if user and prizeid:
            prizeid_int = int(prizeid)
            prize = Prize.objects.filter(id=prizeid_int).first()
            if prize.get_num>=prize.all_num:
                # 如果奖品的领取数大于等于发布数,则返回已售罄
                prize.is_out=True
                prize.save()
                return HttpResponse('403')
            else:
                # 兑奖表,查看用户是否已经领取过了这个优惠券,如果已经领取过了则返回已经领取过了
                p=GetPrize.objects.filter(user=user,prize=prize).first()
                if p:
                    # 已经领取过了
                    return HttpResponse('404')
                else:
                    # 用户未领取
                    # 制作二维码
                    two_name=str(user.id)+'and'+prizeid+'.png'#生成二维码文件名
                    b = os.path.join(BASE_DIR, 'static/2/' + str(random.randint(1, 14)) + '.jpg')#背景图片路径
                    c_dir = os.path.join(BASE_DIR, 'media/twoimg')#生成二维码的存放目录
                    user_openid=user.open_id
                    url=prize.url+"?pid="+prizeid+"oid="+user_openid
                    myqr.run(words=url,version=5,level='H',picture=b,colorized=True,save_dir=c_dir,save_name=two_name)
                    # 生成兑奖表记录
                    new_getprize=GetPrize()
                    new_getprize.user=user
                    new_getprize.prize=prize
                    new_getprize.title=prize.title
                    new_getprize.twoimg='twoimg/'+two_name
                    new_getprize.save()
                    # 扣除对应积分
                    user.jifen=user.jifen-prize.price
                    user.save()
                    # 奖品被领取数+1
                    prize.is_out = False
                    prize.get_num += 1
                    prize.save()
                    return HttpResponse('200')
        else:
            return HttpResponse('参数不足')

5.在apps/user_operation/urls.py内配置路由:

from django.urls import path
from .views import GetMessage,ReadMessage,DelMessage,BuyUseJiFen

urlpatterns = [
    path('getmessage/',GetMessage.as_view()),
    path('readmessage/',ReadMessage.as_view()),
    path('delmessage/',DelMessage.as_view()),
    path('buyusejifen/',BuyUseJiFen.as_view()),
]

 

추천

출처www.cnblogs.com/xuepangzi/p/10992442.html