廣告小程序後端開發(16.優惠券系統:原理流程圖,獎品實驗數據,生成二維碼)

業務需求:在一個廣告小程序內發許多其餘的小程序的優惠券。

1.原理流程圖

 

2.獎品(優惠券)實驗數據

1.修改apps/ad/models.py中的Prize表類

class Prize(models.Model):
    """獎品"""
    title = models.CharField(max_length=15, null=True, blank=True, verbose_name='標題', help_text='最多15字')
    url=models.CharField(max_length=200, null=True, blank=True, verbose_name='小程序url')
    area = models.ForeignKey(Area, null=True, blank=True, verbose_name="地區", on_delete=models.CASCADE)
    get_num=models.IntegerField(default=0,verbose_name='被領取數')
    price = models.IntegerField(default=0, verbose_name='所需積分')
    all_num=models.IntegerField(default=0,verbose_name='發佈數')
    is_out=models.BooleanField(default=False,verbose_name='是否已售罄')
    desc = models.TextField(default='', max_length=400, verbose_name='描述', help_text='最多400字')
    usage = models.TextField(default='', max_length=200, verbose_name='使用方式', help_text='最多200字')
    image = models.ImageField(max_length=200, default='', upload_to='prizeimg/', verbose_name='獎品圖片')
    end_time = models.DateTimeField(default=datetime.now, 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.title

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

    image_url.short_description = '獎品圖片'

執行數據更新命令:python

python manage.py makemigrations
python manage.py migrate

2.修改apps/ad/adminx.py中的PrizeAdmin

class PrizeAdmin(object):
    list_display = ["title", "get_num","is_out","url","price","area", "all_num", "desc","usage","end_time","image_url","add_time"]
    list_filter = ["title", "get_num","is_out","url", "price", "area","all_num", "desc","usage","end_time","add_time"]
    search_fields = ["title", "get_num", "price", "all_num", "desc","usage"]

3.經過xadmin後臺,直接向獎品表Prize中填入一些實驗

3.生成圖片二維碼

1.從網上下載14張(這個數目能夠自定義的),而後放到gg/static/下新建目錄2下,這些圖片用於生成二維碼的背景圖:

 

2.安裝myqr

pip install myqr

3.修改apps/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='二維碼')
    end_time = models.DateTimeField(default=datetime.now, 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 = '二維碼'

執行數據更新命令:django

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:
                    # 用戶未領取
                    # 扣除對應積分
                    if (user.jifen - prize.price)>=0:
                        user.jifen = user.jifen - prize.price
                        user.save()
                        # 製做二維碼
                        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.end_time=prize.end_time
                        new_getprize.twoimg='twoimg/'+two_name
                        new_getprize.save()
                        # 獎品被領取數+1
                        prize.is_out = False
                        prize.get_num += 1
                        prize.save()
                        msg = Message()
                        msg.user = user
                        msg.content = "您成功領取了 獎品:" +prize.title
                        msg.save()
                        return HttpResponse('200')
                    else:
                        # 積分不足
                        return HttpResponse('405')
        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()),
]
相關文章
相關標籤/搜索