chenjunkai 5 years ago
parent
commit
b67b6e2c9c
8 changed files with 391 additions and 6 deletions
  1. 234 0
      controller/Lottery.py
  2. 8 2
      langer/urls.py
  3. 15 0
      model/models.py
  4. 31 2
      model/tests.py
  5. 81 0
      object/AliSmsObject.py
  6. 4 0
      object/ResponseObject.py
  7. 1 1
      object/TokenObject.py
  8. 17 1
      service/CommonService.py

+ 234 - 0
controller/Lottery.py

@@ -0,0 +1,234 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: langer
+@software: PyCharm
+@DATE: 2019/9/26 16:24
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: Lottery.py
+@Contact: chanjunkai@163.com
+"""
+import json
+import time
+
+from django.views.generic import TemplateView
+
+from model.models import phoneNumModel
+from object.AliSmsObject import AliSmsObject
+from object.RedisObject import RedisObject
+from object.ResponseObject import ResponseObject
+from object.TokenObject import TokenObject
+from service.CommonService import CommonService
+from django.db.models import Q
+
+
+class AuthCodeView(TemplateView):
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validate(request_dict)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        response = ResponseObject()
+        phone = request_dict.get('phone', None)
+        if phone:
+            import re
+            # ret = re.match(r"1[35678]\d{9}", tel)
+            # 由于手机号位数大于11位也能匹配成功,所以修改如下:
+            ret = re.match(r"^1[35678]\d{9}$", phone)
+            if ret:
+                reds = RedisObject()
+                lottery_phone = reds.get_data('lottery_phone')
+                if lottery_phone:
+                    return response.json(301)
+                identifyingCode = CommonService.RandomStr(6, True)
+                aliSms = AliSmsObject()
+                sign_ms = 'Ansjer'
+                res = aliSms.send_code_sms(phone=phone, code=identifyingCode, sign_name=sign_ms,
+                                           temp_msg='SMS_151600991')
+                # print(res)
+                if res["Code"] == "OK":
+                    if reds.set_data(key=lottery_phone, val=identifyingCode, expire=300) is not True:
+                        # if reds.set_data(key=phone + '_identifyingCode', val=identifyingCode, expire=60) is not True:
+
+                        return response.json(10, '生成缓存系统错误')
+                    return response.json(0)
+                else:
+                    return response.json(10, res["Message"])
+            else:
+                return response.json(300)
+        else:
+            return response.json(444)
+
+
+class loginView(TemplateView):
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validate(request_dict)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        response = ResponseObject()
+        phone = request_dict.get('phone', None)
+        authcode = request_dict.get('authcode', None)
+        if phone and authcode:
+            reds = RedisObject()
+            lottery_phone = reds.get_data('lottery_phone')
+            if lottery_phone is not False:
+                if authcode == lottery_phone:
+                    nowTime = int(time.time())
+                    add_data = {
+                        'phone': phone,
+                        'addTime': nowTime,
+                        'updTime': nowTime
+                    }
+                    try:
+                        phoneNumModel.objects.create(**add_data)
+                    except:
+                        return response.json(404)
+                    else:
+                        tko = TokenObject()
+                        res = tko.generate({'userID': phone})
+                        return response.json(0, res)
+                else:
+                    return response.json(409)
+            else:
+                return response.json(407)
+        else:
+            return response.json(444)
+
+
+class drawView(TemplateView):
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validate(request_dict)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        tko = TokenObject(token=token)
+        if tko.code == 0:
+            phone = tko.userID
+            qs = phoneNumModel.objects.filter(phone=phone, status=0)
+            if qs.exists():
+                test = randomMachine()
+                # status c611=>1 , c612=>2 ,不中间=>3
+                test.setWeight({1: 1, 2: 1, 3: 50})
+                has_chow = test.drawing()
+                count_1 = phoneNumModel.objects.filter(status=1).count()
+                count_2 = phoneNumModel.objects.filter(status=2).count()
+                if has_chow == count_1 and count_1 == 5:
+                    return response.json(0, 3)
+                if has_chow == count_2 and count_2 == 5:
+                    return response.json(0, 3)
+                return response.json(0, has_chow)
+            else:
+                return response.json(0, '您已抽过奖了')
+        else:
+            return response.json(tko.code)
+
+
+class indexView(TemplateView):
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validate(request_dict)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        tko = TokenObject(token=token)
+        if tko.code == 0:
+            phone = tko.userID
+            qs = phoneNumModel.objects.filter(phone=phone).values('status')
+            # 获取所有中奖名单
+            phone_list = phoneNumModel.objects.filter(~Q(status=0)).values_list('phone', flat=True)
+            if qs.exists():
+                status = qs[0]['status']
+                # 中奖详情
+                # lottery_dict = {
+                #
+                # }
+                return response.json(0, {'status': status, 'phone_list': list(phone_list), 'user': phone})
+            else:
+                return response.json(0, '您已抽过奖了')
+        else:
+            return response.json(tko.code)
+
+
+class setAddrView(TemplateView):
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validate(request_dict)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        addr = request_dict.get('addr', None)
+        tko = TokenObject(token=token)
+        if tko.code == 0:
+            phone = tko.userID
+            qs = phoneNumModel.objects.filter(phone=phone)
+            qs = qs.filter(Q(status=1) | Q(status=2))
+
+            if qs.exists():
+                qs.update(addr=addr)
+                return response.json(0)
+            else:
+                return response.json(0, '您未中奖')
+        else:
+            return response.json(tko.code)
+
+
+class randomMachine(object):
+    import random as rd
+    def setWeight(self, weight):
+        self.weight = weight
+        self.chanceList = []
+        for k, v in self.weight.items():
+            for t in range(v):
+                self.chanceList.append(k)
+
+    def drawing(self):
+        r = self.rd.randrange(0, len(self.chanceList))  # 随机数
+        # print("随机数 : ", r)
+        has_chow = self.chanceList.pop(r)
+        # print(has_chow)
+        return has_chow
+
+    def graphicsUI(self):
+        pass
+
+    def start(self):
+        pass

+ 8 - 2
langer/urls.py

@@ -1,6 +1,6 @@
 from django.contrib import admin
 from django.urls import path, re_path
-from controller import User, LangSet, LangWord, LangArea, WebHook, AsImg, SysSet
+from controller import User, LangSet, LangWord, LangArea, WebHook, AsImg, SysSet, Lottery
 
 urlpatterns = [
     path('admin/', admin.site.urls),
@@ -24,5 +24,11 @@ urlpatterns = [
     path('sysSet/query', SysSet.queryView.as_view()),
     path('sysSet/update', SysSet.updateView.as_view()),
 
-    path('asimg/cycleImgView', AsImg.cycleImgView.as_view())
+    path('asimg/cycleImgView', AsImg.cycleImgView.as_view()),
+
+    # 抽奖模块
+    path('lottery/authcode', Lottery.AuthCodeView.as_view()),
+    path('lottery/login', Lottery.loginView.as_view()),
+    path('lottery/draw', Lottery.drawView.as_view()),
+    path('lottery/setAddr', Lottery.setAddrView.as_view()),
 ]

+ 15 - 0
model/models.py

@@ -99,3 +99,18 @@ class SysSetModel(models.Model):
         ordering = ('-addTime',)
         verbose_name = '系统配置表'
         db_table = 'sys_set'
+
+
+# 手机注册表 抽奖
+class phoneNumModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    phone = models.CharField(default='', verbose_name='手机', max_length=11)
+    status = models.SmallIntegerField(default=0, verbose_name='中奖状态')  # 1为c611,2为c612
+    addr = models.TextField(blank=True, default='', verbose_name=u'更新内容')
+    addTime = models.IntegerField(default=0, verbose_name='添加时间')
+    updTime = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        ordering = ('-addTime',)
+        verbose_name = '手机注册表'
+        db_table = 'phoneNum'

+ 31 - 2
model/tests.py

@@ -1,3 +1,32 @@
-from django.test import TestCase
+# 抽奖一次少一个名额
 
-# Create your tests here.
+class randomMachine(object):
+    import random as rd
+    def setWeight(self, weight):
+        self.weight = weight
+        self.chanceList = []
+        for k, v in self.weight.items():
+            for t in range(v):
+                self.chanceList.append(k)
+
+    def drawing(self):
+        r = self.rd.randrange(0, len(self.chanceList))  # 随机数
+        # print("随机数 : ", r)
+        has_chow = self.chanceList.pop(r)
+        # print(has_chow)
+        return has_chow
+
+    def graphicsUI(self):
+        pass
+
+    def start(self):
+        pass
+
+
+if __name__ == "__main__":
+    test = randomMachine()
+    test.setWeight({"中奖": 1, "不中奖": 100})
+
+    for i in range(100):
+        has_chow = test.drawing()
+        print(has_chow)

+ 81 - 0
object/AliSmsObject.py

@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+import uuid
+
+from aliyunsdkcore.client import AcsClient
+from aliyunsdkcore.profile import region_provider
+from aliyunsdkdysmsapi.request.v20170525 import SendSmsRequest
+import json
+"""
+短信业务调用接口示例,版本号:v20170525
+Created on 2017-06-12
+"""
+
+
+class AliSmsObject(object):
+
+    def __init__(self):
+        # 注意:不要更改
+        REGION = "cn-hangzhou"
+        PRODUCT_NAME = "Dysmsapi"
+        DOMAIN = "dysmsapi.aliyuncs.com"
+        aliSms = {
+            'ACCESS_KEY_ID': 'LTAIDFtlwLdttWiX',
+            'ACCESS_KEY_SECRET': 'Siu6SolsTN5A3evXUkFLyyr0QZ3iiT',
+        }
+        # self.ACCESS_KEY_ID = 'LTAIDFtlwLdttWiX'
+        # self.ACCESS_KEY_SECRET = 'Siu6SolsTN5A3evXUkFLyyr0QZ3iiT'
+        self.acs_client = AcsClient(aliSms['ACCESS_KEY_ID'], aliSms['ACCESS_KEY_SECRET'], REGION)
+        region_provider.add_endpoint(PRODUCT_NAME, REGION, DOMAIN)
+
+    def do_send_sms(self, business_id, phone_numbers, sign_name, template_code, template_param=None):
+        smsRequest = SendSmsRequest.SendSmsRequest()
+        # 申请的短信模板编码,必填
+        smsRequest.set_TemplateCode(template_code)
+
+        # 短信模板变量参数
+        if template_param is not None:
+            smsRequest.set_TemplateParam(template_param)
+
+        # 设置业务请求流水号,必填。
+        smsRequest.set_OutId(business_id)
+
+        # 短信签名
+        smsRequest.set_SignName(sign_name)
+
+        # 数据提交方式
+        # smsRequest.set_method(MT.POST)
+
+        # 数据提交格式
+        # smsRequest.set_accept_format(FT.JSON)
+
+        # 短信发送的号码列表,必填。
+        smsRequest.set_PhoneNumbers(phone_numbers)
+
+        # 调用短信发送接口,返回json
+        smsResponse = self.acs_client.do_action_with_exception(smsRequest)
+
+        # TODO 业务处理
+
+        return smsResponse
+
+    # 发送验证码
+    def send_code_sms(self, phone, code, sign_name,temp_msg):
+        __business_id = uuid.uuid1()
+        # print(__business_id)
+        # params = "{\"code\":\"{"+str(code)+"}\"}"
+        params = "{\"code\":\"" + str(code) + "\"}"
+        # params = u'{"name":"wqb","code":"12345678","address":"bz","phone":"13000000000"}'
+        # 签名
+        # sign_name = 'Ansjer'
+        # 模板信息
+        # temp_msg = 'SMS_151600991'
+        res = self.do_send_sms(__business_id, phone, sign_name, temp_msg, params)
+        # print(send_sms(__business_id, "13119657713", "云通信测试", "SMS_5250008", params))
+        res_json = json.loads(res.decode('utf-8'))
+        print(res_json)
+        # {"Message":"OK","RequestId":"985FA027-C887-4186-A8F5-B6B8F3D123DB","BizId":"973407842937195533^0","Code":"OK"}
+        # code = isv.BUSINESS_LIMIT_CONTROL 一分钟只能发一次
+        return res_json
+#
+# aliSms = AliSmsObject()
+# aliSms.send_sign_in_sms(phone=13119657713,code=123456)

+ 4 - 0
object/ResponseObject.py

@@ -10,10 +10,14 @@ class ResponseObject(object):
     def json(self, code, res={}, extra={}):
         msg_data = {
             0: 'Success',
+            300: '请输入正确的手机号码',
+            301: '验证码已发过,请等待',
             309: 'Please ReLogin! errmsg token',
             401: 'Invalid credentials !',
             403: 'permission denied',
             404: 'Server error',
+            407: '验证码过期',
+            409: '验证码错误',
             414: 'Invalid request path !',
             444: 'Wrong Parameter!',
             473: 'The same value exists !'

+ 1 - 1
object/TokenObject.py

@@ -15,7 +15,7 @@ import jwt, time, datetime
 
 OAUTH_ACCESS_TOKEN_SECRET = 'a+%zy^=@xxx%'
 OAUTH_REFRESH_TOKEN_SECRET = 'r+%zy^=@xaa%'
-OAUTH_ACCESS_TOKEN_TIME = datetime.timedelta(hours=10)
+OAUTH_ACCESS_TOKEN_TIME = datetime.timedelta(days=7)
 # refresh_token超时
 OAUTH_REFRESH_TOKEN_TIME = datetime.timedelta(days=30)
 

+ 17 - 1
service/CommonService.py

@@ -11,7 +11,7 @@
 @file: CommonService.py
 @Contact: chanjunkai@163.com
 """
-
+from random import Random  # 用于生成随机码
 import hashlib
 from urllib.request import urlopen
 
@@ -34,4 +34,20 @@ class CommonService:
 
         return hash.hexdigest()
 
+    @staticmethod
+    def RandomStr(randomlength=8, number=False):
+        str = ''
+        if number == False:
+            characterSet = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsT' \
+                           'tUuVvWwXxYyZz0123456789'
+        else:
+            characterSet = '0123456789'
+
+        length = len(characterSet) - 1
+
+        random = Random()
+        for index in range(randomlength):
+            str += characterSet[random.randint(0, length)]
+
+        return str
 # print(CommonService.get_remote_md5_sum(url='http://www.dvema.com/web/asdf'))