Parcourir la source

Merge branch 'dev' of http://192.168.136.45:3000/SERVER/AnsjerServer into dev

WuYiPei il y a 5 ans
Parent
commit
ae9f9fc51f

+ 4 - 3
Ansjer/urls.py

@@ -7,8 +7,8 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     EquipmentManager, LogManager, PermissionManager, OTAEquipment, shareUserPermission, UidSetController, \
     UserManger, CheckUserData, \
     UserController, CloudVod, OrderContrller, VodBucket, DetectController, DeviceShare, UserBrandController, \
-    StsOssController, UIDPreview, OssCrd, SysMsg, UidUser, EquipmentManagerV2, PushDeploy, AppSetController,\
-    ApplicationController, UserExController
+    StsOssController, UIDPreview, OssCrd, SysMsg, UidUser, EquipmentManagerV2,EquipmentManagerV3, PushDeploy, AppSetController,\
+    ApplicationController, UserExController, CloudStorage
 
 urlpatterns = [
     url(r'^account/authcode$', UserController.authCodeView.as_view()),
@@ -185,7 +185,8 @@ urlpatterns = [
     url(r'^login/oauth/(?P<operation>.*)$', ApplicationController.AuthView.as_view()),
     url(r'^grant/code/(?P<operation>.*)$', ApplicationController.GrantCodeView.as_view()),
     url(r'^user/ex/(?P<operation>.*)$', UserExController.UserExView.as_view()),
-
+	url(r'^v3/equipment/(?P<operation>.*)$', EquipmentManagerV3.EquipmentManagerV3.as_view()),
+	url(r'^cloudstorage/(?P<operation>.*)$', CloudStorage.CloudStorageView.as_view()),
 
     # app 设备消息模板
     # 路由加参数参考

+ 608 - 0
Controller/CloudStorage.py

@@ -0,0 +1,608 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerFormal
+@software: PyCharm
+@DATE: 2018/12/5 9:30
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: CloudVod.py
+@Contact: chanjunkai@163.com
+"""
+import json
+import math
+import time
+import urllib
+from Object.AliPayObject import AliPayObject
+import oss2
+import paypalrestsdk
+import boto3
+from aliyunsdkcore import client
+from aliyunsdksts.request.v20150401 import AssumeRoleRequest
+from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from django.views.generic.base import View
+
+from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
+    SERVER_DOMAIN_SSL
+from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Object.UidTokenObject import UidTokenObject
+from Service.CommonService import CommonService
+from Service.ModelService import ModelService
+from Object.ETkObject import ETkObject
+
+
+# 设备信息添加
+class CloudStorageView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.POST, request, operation)
+
+    def validation(self, request_dict, request, operation):
+        response = ResponseObject()
+        if operation is None:
+            return response.json(444, 'error path')
+        elif operation == 'dopaypalcallback':
+            return self.do_pay_by_paypal_callback(request_dict, response)
+        elif operation == 'doalicallback':
+            return self.do_pay_by_ali_callback(request)
+        elif operation == 'getsignsts':
+            ip = CommonService.get_ip_address(request)
+            return self.do_get_sign_sts(request_dict, ip, response)
+        elif operation == 'storeplaylist':
+            return self.do_store_playlist(request_dict, response)
+        else:
+            token = request_dict.get('token', None)
+            # 设备主键uid
+            tko = TokenObject(token)
+            response.lang = tko.lang
+            if tko.code != 0:
+                return response.json(tko.code)
+            userID = tko.userID
+            if operation == 'createPayOrder':
+                return self.do_create_pay_order(request_dict, userID, response)
+            elif operation == 'changevodstatus':
+                return self.do_change_vod_status(request_dict, userID, response)
+            else:
+                return response.json(414)
+
+    def do_get_sign_sts(self, request_dict, ip, response):
+        uidToken = request_dict.get('uidToken', None)
+        utko = UidTokenObject(uidToken)
+        if utko.flag is False:
+            return response.json(444, 'uidToken')
+        uid = utko.UID
+        channel = utko.channel
+        print(channel)
+        print(uid)
+        now_time = int(time.time())
+        ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time). \
+            values("bucket__mold", "bucket__bucket", "bucket__endpoint", "bucket__region")
+        if ubqs.exists():
+            if ubqs[0]["bucket__mold"] == 0:
+                # 阿里云 oss sts
+                oc_qs = OssCrdModel.objects.filter(uid=uid, channel=channel). \
+                    values("addTime", "data")
+                if oc_qs.exists():
+                    endTime = int(oc_qs[0]["addTime"]) + 3500
+                    if endTime > now_time:
+                        print(endTime)
+                        print(now_time)
+                        res = json.loads(oc_qs[0]["data"])
+                        return JsonResponse(status=200, data=res)
+                # 套餐id
+                storage = '{uid}/vod{channel}/'.format(uid=uid, channel=channel)
+                bucket_name = ubqs[0]['bucket__bucket']
+                endpoint = ubqs[0]['bucket__endpoint']
+                access_key_id = OSS_STS_ACCESS_KEY
+                access_key_secret = OSS_STS_ACCESS_SECRET
+                region_id = ubqs[0]['bucket__region']
+                role_arn = OSS_ROLE_ARN
+                clt = client.AcsClient(access_key_id, access_key_secret, region_id)
+                req = AssumeRoleRequest.AssumeRoleRequest()
+                # 设置返回值格式为JSON。
+                req.set_accept_format('json')
+                req.set_RoleArn(role_arn)
+                req.set_RoleSessionName(uid + '_' + channel)
+                req.set_DurationSeconds(3600)
+                Resource_access = "acs:oss:*:*:{bucket_name}/{uid_channel}*". \
+                    format(bucket_name=bucket_name, uid_channel=storage)
+                print(Resource_access)
+                policys = {
+                    "Version": "1",
+                    "Statement": [
+                        {
+                            "Action": ["oss:PutObject", "oss:DeleteObject", ],
+                            "Resource": [Resource_access],
+                            "Effect": "Allow",
+                            "Condition": {
+                                "IpAddress": {"acs:SourceIp": ip}
+                                # "IpAddress": {"acs:SourceIp": "120.237.157.184"}
+                                # "IpAddress": {"acs:SourceIp": "*"}
+                            }
+                        }
+                    ]
+                }
+                req.set_Policy(Policy=json.dumps(policys))
+                body = clt.do_action(req)
+                # 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
+                token = json.loads(body.decode('utf-8'))
+                print(token)
+                res = {
+                    'AccessKeyId': token['Credentials']['AccessKeyId'],
+                    'AccessKeySecret': token['Credentials']['AccessKeySecret'],
+                    'SecurityToken': token['Credentials']['SecurityToken'],
+                    'Expiration': token['Credentials']['Expiration'],
+                    'expire': '3600',
+                    'endpoint': endpoint,
+                    'bucket_name': bucket_name,
+                    'arn': token['AssumedRoleUser']['Arn'],
+                    'code': 0,
+                    'storage': storage,
+                    'endTime': ubqs[0]['endTime'],
+                    'ip': ip}
+                if oc_qs.exists():
+                    oc_qs.update(data=json.dumps(res), addTime=now_time)
+                else:
+                    OssCrdModel.objects.create \
+                        (uid=uid, channel=channel, data=json.dumps(res), addTime=now_time)
+                return JsonResponse(status=200, data=res)
+            elif ubqs[0]["bucket__mold"] == 1:
+                # 亚马逊 s3 sts
+                sts_qs = StsCrdModel.objects.filter(uid=uid, channel=channel). \
+                    values("addTime", "data")
+                if sts_qs.exists():
+                    endTime = int(sts_qs[0]["addTime"]) + 3500
+                    if endTime > now_time:
+                        print(endTime)
+                        print(now_time)
+                        res = json.loads(sts_qs[0]["data"])
+                        return JsonResponse(status=200, data=res)
+                    # 套餐id
+                storage = '{uid}/vod{channel}/'.format(uid=uid, channel=channel)
+                bucket_name = ubqs[0]['bucket__bucket']
+                endpoint = ubqs[0]['bucket__endpoint']
+                region_id = ubqs[0]['bucket__region']
+
+                ###############
+                REGION_NAME = region_id
+                boto3_sts = boto3.client(
+                    'sts',
+                    aws_access_key_id='AKIA2E67UIMD45Y3HL53',
+                    aws_secret_access_key='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',
+                    region_name=REGION_NAME
+                )
+                Policy = {
+                    "Version": "2012-10-17",
+                    "Statement": [
+                        {
+                            "Effect": "Allow",
+                            "Action": "s3:*",
+                            "Resource": ["arn:aws:s3:::azvod1/{uid_channel}/*".
+                                             format(uid_channel=storage)]
+                        }
+                    ]
+                }
+                response = boto3_sts.get_federation_token(
+                    Name='{role_name}'.format(role_name=uid + '_' + channel),
+                    Policy=json.dumps(Policy),
+                    DurationSeconds=7200
+                )
+                ###############
+                res = {
+                    'AccessKeyId': response['Credentials']['AccessKeyId'],
+                    'AccessKeySecret': response['Credentials']['SecretAccessKey'],
+                    'SessionToken': response['Credentials']['SessionToken'],
+                    'Expiration': response['Credentials']['Expiration'],
+                    'expire': '3600',
+                    'endpoint': endpoint,
+                    'bucket_name': bucket_name,
+                    'arn': response['FederatedUser']['Arn'],
+                    'code': 0,
+                    'storage': storage,
+                    'endTime': ubqs[0]['endTime'],
+                    'ip': ip,
+                }
+                if sts_qs.exists():
+                    sts_qs.update(data=json.dumps(res), addTime=now_time)
+                else:
+                    StsCrdModel.objects.create(uid=uid, channel=channel, data=json.dumps(res), addTime=now_time)
+                return JsonResponse(status=200, data=res)
+            else:
+                res = {'code': 404, 'msg': 'data not exists!'}
+                return HttpResponse(json.dumps(res, ensure_ascii=False),
+                                    content_type="application/json,charset=utf-8")
+
+    def do_store_playlist(self, request_dict, response):
+        return
+
+    def do_change_vod_status(self, request_dict, userID, response):
+        uid = request_dict.get('uid', None)
+        status = request_dict.get('status', None)
+        channel = request_dict.get('channel', None)
+        if not all([uid, status, channel]):
+            dv_qs = Device_Info.objects.filter(UID=uid, userID_id=userID, isShare=False, isExist=1)
+            if dv_qs.exists():
+                now_time = int(time.time())
+                try:
+                    ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time).first()
+                except Exception as e:
+                    print(repr(e))
+                    return response.json(10, '未购买')
+                else:
+                    ubqs.update(status=status)
+                    if status == 0:
+                        return response.json(0)
+                    else:
+                        utko = UidTokenObject()
+                        utko.generate(data={'uid': uid, 'channel': channel})
+                        uidTK = utko.toke
+                        uidTkUrl = "{SERVER_DOMAIN}cloudstorage/getsignsts?uidToken={uidToken}". \
+                            format(uidToken=uidTK, SERVER_DOMAIN=SERVER_DOMAIN)
+                        storeHlsUrl = "{SERVER_DOMAIN}cloudstorage/storeplaylist?uidToken={uidToken}". \
+                            format(uidToken=uidTK, SERVER_DOMAIN=SERVER_DOMAIN)
+                        return response.json(0, {'uidTkUrl': uidTkUrl, 'storeHlsUrl': storeHlsUrl})
+            else:
+                return response.json(12)
+
+        else:
+            return response.json(444, 'uid,status,channel')
+
+    def do_pay_error(self):
+        response = HttpResponse()
+        response.content = '''
+<!DOCTYPE html>
+<html>
+<head>
+	<!--浏览器不缓存-->
+	<meta http-equiv="Pragma" content="no-cache">
+	<meta http-equiv="Cache-Control" content="no-cache">
+	<meta http-equiv="Expires" content="0">
+	<!--utf-8-->
+    <meta http-equiv="content-type" content="text/html;charset=utf-8">
+    <!-- viewport的<meta>标签,这个标签可以修改在大部分的移动设备上面的显示,为了确保适当的绘制和触屏缩放。-->
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <link rel="shortcut icon" href="https://test.dvema.com/web/images/favicon.ico" type="image/x-icon"  charset="utf-8"/>  
+    <title>Trading particulars</title>
+    <style>
+    	.title_head{
+    		height: 50px;
+    		border-radius: 5px;
+    		background-color: #c3c6c7; 
+    		text-align: center;
+    		line-height: 50px;
+    	}
+    	.content{
+    		text-align: center;
+    		margin-top: 50px;
+    		font-size: 20px;
+    		color : #ec7648
+    	}
+    	.content_img{
+    		width: 60px; 
+    		height: 60px;
+    	}
+    	.bottom{
+    		 margin-bottom: 10px; 
+    		 margin-top: 250px; 
+    		 color : #ec7648
+    	}
+    	.bottom_div{
+    		border: 1px solid #ec7648; 
+    		line-height: 38px; 
+    		text-align: center; 
+    		width: 100px; 
+    		height: 38px;
+    		border-radius: 5px;
+    	}
+    	
+    	.bottom_div:hover{
+    		background-color: #dde4e2;
+    	}
+    </style>
+</head>
+<body>
+	<div class="title_head">Trading particulars</div>
+    <div class="content">
+    	<p >
+    		<img src="https://test.dvema.com/web/images/failed.jpg" class="content_img">
+    		<br />
+    		Payment failure
+    	</p>
+    </div>
+    <center class="bottom">
+    	<div class="bottom_div" onclick="payOKButton()"> 
+    	 Finish
+    	</div>
+    </center>
+    <script> 	    // 点击付款成功按钮
+    function payOKButton() {
+        // 复杂数据
+        console.log('success')
+        window.webkit.messageHandlers.jsCallOC.postMessage({"status": 0});
+    }
+	</script>
+</body> 
+</html>
+                '''
+        return response
+
+    def do_pay_ok(self):
+        response = HttpResponse()
+        response.content = '''
+
+<!DOCTYPE html>
+<html>
+<head>
+	<!--浏览器不缓存-->
+	<meta http-equiv="Pragma" content="no-cache">
+	<meta http-equiv="Cache-Control" content="no-cache">
+	<meta http-equiv="Expires" content="0">
+	<!--utf-8-->
+    <meta http-equiv="content-type" content="text/html;charset=utf-8">
+    <!-- viewport的<meta>标签,这个标签可以修改在大部分的移动设备上面的显示,为了确保适当的绘制和触屏缩放。-->
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <link rel="shortcut icon" href="https://test.dvema.com/web/images/favicon.ico" type="image/x-icon"  charset="utf-8"/>  
+    <title>Trading particulars</title>
+    <style>
+    	.title_head{
+    		height: 50px;
+    		border-radius: 5px;
+    		background-color: #c3c6c7; 
+    		text-align: center;
+    		line-height: 50px;
+    	}
+    	.content{
+    		text-align: center;
+    		margin-top: 50px;
+    		font-size: 20px;
+    		color : green
+    	}
+    	.content_img{
+    		width: 60px; 
+    		height: 60px;
+    	}
+    	.bottom{
+    		 margin-bottom: 10px; 
+    		 margin-top: 250px; 
+    		 color : green
+    	}
+    	.bottom_div{
+    		border: 1px solid green; 
+    		line-height: 38px; 
+    		text-align: center; 
+    		width: 100px; 
+    		height: 38px;
+    		border-radius: 5px;
+    	}
+    	
+    	.bottom_div:hover{
+    		background-color: #dde4e2;
+    	}
+    </style>
+</head>
+<body>
+	<div class="title_head">Trading particulars</div>
+    <div class="content">
+    	<p >
+    		<img src="https://test.dvema.com/web/images/timg.jpg" class="content_img">
+    		<br />
+    		Successful payment
+    	</p>
+    </div>
+    <center class="bottom">
+    	<div class="bottom_div" onclick="payOKButton()"> 
+    	 Finish
+    	</div>
+    </center>
+    <script> 	    // 点击付款成功按钮
+    function payOKButton() {
+        // 复杂数据
+        console.log('success')
+        window.webkit.messageHandlers.jsCallOC.postMessage({"status": 1});
+    }
+	</script>
+</body> 
+</html>
+        '''
+        return response
+
+    def do_pay_by_ali_callback(self, request):
+        response = ResponseObject()
+        data = request.POST.dict()
+        signature = data["sign"]
+        data.pop('sign')
+        orderID = data['out_trade_no']
+
+        order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
+        print(order_qs)
+
+        if not order_qs.exists():
+            return response.json(404)
+        print(json.dumps(data))
+        print(signature)
+        # verify
+        aliPayObj = AliPayObject()
+        alipay = aliPayObj.conf()
+        success = alipay.verify(data, signature)
+        if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):
+            print("trade succeed")
+            nowTime = int(time.time())
+            order_list = order_qs.values("UID", "commodity_code", "channel")
+            UID = order_list[0]['UID']
+            channel = order_list[0]['channel']
+            commodity_code = order_list[0]['commodity_code']
+            order_qs.update(status=1, updTime=nowTime)
+            smqs = Store_Meal.objects.filter(commodity_code=commodity_code). \
+                values("day", "bucket_id", "bucket__storeDay")
+            bucketId = smqs[0]['bucket_id']
+            if not smqs.exists():
+                return response.json(0, '套餐已删除')
+            addTime = int(smqs[0]["day"]) * 24 * 3600
+            ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel). \
+                values("bucket_id", "endTime", "bucket__storeDay")
+            nowTime = int(time.time())
+            if ubqs.exists():
+                ubqs_count = ubqs.count()
+                ubq = ubqs[ubqs_count - 1, ubqs_count]
+                new_starTime = ubq['endTime'] + 1
+                ub_cqs = UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId,
+                                                   endTime=new_starTime + addTime)
+                uid_bucket_id = ub_cqs.id
+            else:
+                ub_cqs = UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId,
+                                                   endTime=nowTime + addTime)
+                uid_bucket_id = ub_cqs.id
+            order_qs.update \
+                (payTime=nowTime, status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
+            red_url = "{SERVER_DOMAIN}cloudVod/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
+            return HttpResponseRedirect(red_url)
+        return response.json(0, signature)
+
+    def do_pay_by_paypal_callback(self, request_dict, response):
+        paymentId = request_dict.get('paymentId', None)
+        PayerID = request_dict.get('PayerID', None)
+        orderID = request_dict.get('orderID', None)
+        if not paymentId or not PayerID or not orderID:
+            red_url = "{SERVER_DOMAIN}cloudVod/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
+            return HttpResponseRedirect(red_url)
+        paypalrestsdk.configure(PAYPAL_CRD)
+        # ID of the payment. This ID is provided when creating payment.
+        payment = paypalrestsdk.Payment.find(paymentId)
+        payres = payment.execute({"payer_id": PayerID})
+        print(payres)
+        if not payres:
+            red_url = "{SERVER_DOMAIN}cloudVod/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
+            return HttpResponseRedirect(red_url)
+        print("Payment execute successfully")
+        order_qs = Order_Model.objects.filter(orderID=orderID)
+        nowTime = int(time.time())
+        order_list = order_qs.values("UID", "channel", "commodity_code")
+        UID = order_list[0]['UID']
+        channel = order_list[0]['channel']
+        commodity_code = order_list[0]['commodity_code']
+        smqs = Store_Meal.objects.filter(commodity_code=commodity_code). \
+            values("day", "bucket_id", "bucket__storeDay")
+        bucketId = smqs[0]['bucket_id']
+        if not smqs.exists():
+            return response.json(0, '套餐已删除')
+        addTime = int(smqs[0]["day"]) * 24 * 3600
+        # ##
+        ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel, endTime__gte=nowTime). \
+            values("bucket__storeDay", "bucket__region", "endTime")
+        if ubqs.exists():
+            ubqs_count = ubqs.count()
+            ubq = ubqs[ubqs_count - 1, ubqs_count]
+            new_starTime = ubq['endTime'] + 1
+            ub_cqs = UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId,
+                                               endTime=new_starTime + addTime)
+            uid_bucket_id = ub_cqs.id
+        else:
+            ub_cqs = UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId, endTime=nowTime + addTime)
+            uid_bucket_id = ub_cqs.id
+        order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
+
+        # return response.json(0)
+        red_url = "{SERVER_DOMAIN}cloudVod/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
+        return HttpResponseRedirect(red_url)
+
+    def do_create_pay_order(self, request_dict, userID, response):
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        commodity_code = request_dict.get('commodity_code', None)
+        pay_type = int(request_dict.get('pay_type', None))
+        dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1)
+        if not dv_qs.exists():
+            return response.json(12)
+        smqs = Store_Meal.objects.filter(commodity_code=commodity_code, type=pay_type). \
+            values('currency', 'price', 'content', 'day', 'commodity_type', 'title', 'content')
+        if not smqs.exists():
+            return response.json(10, '套餐不存在')
+        currency = smqs[0]['currency']
+        price = smqs[0]['price']
+        content = smqs[0]['content']
+        day = smqs[0]['day']
+        commodity_type = smqs[0]['commodity_type']
+        # ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=nowTime). \
+        #     values("bucket__storeDay", "bucket__region", "endTime")
+        # if ubqs.exists():
+        #     ubqs_count = ubqs.count()
+        #     ubq = ubqs[ubqs_count - 1, ubqs_count]
+        #     new_starTime = ubq['endTime'] + 1
+        nowTime = int(time.time())
+        orderID = CommonService.createOrderID()
+        if pay_type == 0:
+            call_sub_url = "{SERVER_DOMAIN}cloudVod/dopaypalcallback?orderID={orderID}". \
+                format(SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
+            # call_sub_url = "http://192.168.136.40:8077/cloudVod/payExecute?orderID={orderID}".format(
+            #     SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
+            call_clc_url = "{SERVER_DOMAIN}cloudVod/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
+            paypalrestsdk.configure(PAYPAL_CRD)
+            payment = paypalrestsdk.Payment({
+                "intent": "sale",
+                "payer": {"payment_method": "paypal"},
+                "redirect_urls": {"return_url": call_sub_url, "cancel_url": call_clc_url},
+                "transactions": [{
+                    "item_list": {"items": [
+                        {"name": "Cloud video", "sku": "1", "price": price, "currency": "USD", "quantity": 1}]},
+                    "amount": {"total": price, "currency": currency},
+                    "description": content}]})
+            if payment.create():
+                print("Payment created successfully")
+            else:
+                print(payment.error)
+                return response.json(10, payment.error)
+            print(payment)
+            for link in payment.links:
+                if link.rel == "approval_url":
+                    approval_url = str(link.href)
+                    print("Redirect for approval: %s" % (approval_url))
+                    Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
+                                               desc=content, payType=pay_type, payTime=nowTime,
+                                               price=price, currency=currency, addTime=nowTime, updTime=nowTime,
+                                               endTime=(nowTime + int(day) * 3600 * 24), pay_url=approval_url,
+                                               commodity_code=commodity_code, commodity_type=commodity_type)
+                    return response.json(0, {"redirectUrl": approval_url, "orderID": orderID})
+            return response.json(10, 'generate_order_false')
+        else:
+            try:
+                aliPayObj = AliPayObject()
+                alipay = aliPayObj.conf()
+                subject = smqs[0]['title'] + smqs[0]['content']
+                order_string = alipay.api_alipay_trade_wap_pay(
+                    out_trade_no=orderID,
+                    total_amount=price,
+                    subject=subject,
+                    return_url="{SERVER_DOMAIN_SSL}cloudVod/payOK".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL),
+                    notify_url="{SERVER_DOMAIN_SSL}cloudVod/doalicallback".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
+                    # return_url="http://192.168.136.40/cloudVod/payOK",
+                    # notify_url="http://192.168.136.40/cloudVod/aliPayCallback"
+                )
+            except Exception as e:
+                print(repr(e))
+                return response.json(10, repr(e))
+            else:
+                if order_string:
+                    redirectUrl = aliPayObj.alipay_prefix + order_string
+                    Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
+                                               desc=content, payType=pay_type, payTime=nowTime,
+                                               price=price, currency=currency, addTime=nowTime, updTime=nowTime,
+                                               endTime=(nowTime + int(day) * 3600 * 24), pay_url=redirectUrl,
+                                               commodity_code=commodity_code, commodity_type=commodity_type)
+                    return JsonResponse(status=200, data={'result_code': 0, 'reason': 'success',
+                                                          'result': {"redirectUrl": redirectUrl, "orderID": orderID},
+                                                          'error_code': 0})
+                else:
+                    return response.json(10, '生成订单错误')

+ 187 - 1
Controller/CloudVod.py

@@ -98,6 +98,10 @@ class CloudVodView(View):
             return self.do_pay_error()
         elif operation == 'aliPayCallback':
             return self.do_ali_pay_callback(request)
+        elif operation == 'dopaypalcallback':
+            return self.do_pay_by_paypal_callback(request)
+        elif operation == 'doalicallback':
+            return self.do_pay_by_ali_callback(request)
         else:
             token = request_dict.get('token', None)
             # 设备主键uid
@@ -121,6 +125,8 @@ class CloudVodView(View):
                 return self.do_pay_by_ali(request_dict, userID, response)
             elif operation == 'orderStatus':
                 return self.do_pay_status(request_dict, userID)
+            elif operation == 'createPayOrder':
+                return self.do_create_pay_order(request_dict, userID, response)
             else:
                 return response.json(414)
 
@@ -229,7 +235,6 @@ class CloudVodView(View):
                 out_trade_no=orderID,
                 total_amount=price,
                 subject="测试哟",
-                # subject="实用性充气式玩具",
                 return_url="{SERVER_DOMAIN_SSL}cloudVod/payOK".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL),
                 notify_url="{SERVER_DOMAIN_SSL}cloudVod/aliPayCallback".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                 # return_url="http://192.168.136.40/cloudVod/payOK",
@@ -421,6 +426,186 @@ class CloudVodView(View):
         '''
         return response
 
+    def do_pay_by_ali_callback(self, request):
+        response = ResponseObject()
+        data = request.POST.dict()
+        signature = data["sign"]
+        data.pop('sign')
+        orderID = data['out_trade_no']
+
+        order_qs = Order_Model.objects.filter(orderID=orderID, status=0)
+        print(order_qs)
+
+        if not order_qs.exists():
+            return response.json(404)
+        print(json.dumps(data))
+        print(signature)
+        # verify
+        aliPayObj = AliPayObject()
+        alipay = aliPayObj.conf()
+        success = alipay.verify(data, signature)
+        if success and data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):
+            print("trade succeed")
+            nowTime = int(time.time())
+            order_list = order_qs.values("UID", "commodity_code", "channel")
+            UID = order_list[0]['UID']
+            channel = order_list[0]['channel']
+            commodity_code = order_list[0]['commodity_code']
+            order_qs.update(status=1, updTime=nowTime)
+            smqs = Store_Meal.objects.filter(commodity_code=commodity_code).\
+                values("day", "bucket_id", "bucket__storeDay")
+            bucketId = smqs[0]['bucket_id']
+            if not smqs.exists():
+                return response.json(0, '套餐已删除')
+            addTime = int(smqs[0]["day"]) * 24 * 3600
+            ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel). \
+                values("bucket_id", "endTime", "bucket__storeDay")
+            nowTime = int(time.time())
+            if ubqs.exists():
+                ubqs_count = ubqs.count()
+                ubq = ubqs[ubqs_count - 1, ubqs_count]
+                new_starTime = ubq['endTime'] + 1
+                UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId, endTime=new_starTime + addTime)
+            else:
+                UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId, endTime=nowTime + addTime)
+            red_url = "{SERVER_DOMAIN}cloudVod/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
+            return HttpResponseRedirect(red_url)
+        return response.json(0, signature)
+
+    def do_pay_by_paypal_callback(self, request_dict, response):
+        paymentId = request_dict.get('paymentId', None)
+        PayerID = request_dict.get('PayerID', None)
+        orderID = request_dict.get('orderID', None)
+        if not paymentId or not PayerID or not orderID:
+            red_url = "{SERVER_DOMAIN}cloudVod/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
+            return HttpResponseRedirect(red_url)
+        paypalrestsdk.configure(PAYPAL_CRD)
+        # ID of the payment. This ID is provided when creating payment.
+        payment = paypalrestsdk.Payment.find(paymentId)
+        payres = payment.execute({"payer_id": PayerID})
+        print(payres)
+        if not payres:
+            red_url = "{SERVER_DOMAIN}cloudVod/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
+            return HttpResponseRedirect(red_url)
+        print("Payment execute successfully")
+        order_qs = Order_Model.objects.filter(orderID=orderID)
+        nowTime = int(time.time())
+        order_qs.update(status=1, updTime=nowTime)
+        order_list = order_qs.values("UID", "channel", "commodity_code")
+        UID = order_list[0]['UID']
+        channel = order_list[0]['channel']
+        commodity_code = order_list[0]['commodity_code']
+        smqs = Store_Meal.objects.filter(commodity_code=commodity_code).\
+            values("day", "bucket_id", "bucket__storeDay")
+        bucketId = smqs[0]['bucket_id']
+        if not smqs.exists():
+            return response.json(0, '套餐已删除')
+        addTime = int(smqs[0]["day"]) * 24 * 3600
+        # ##
+        ubqs = UID_Bucket.objects.filter(uid=UID, channel=channel, endTime__gte=nowTime). \
+            values("bucket__storeDay", "bucket__region", "endTime")
+        if ubqs.exists():
+            ubqs_count = ubqs.count()
+            ubq = ubqs[ubqs_count - 1, ubqs_count]
+            new_starTime = ubq['endTime'] + 1
+            UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId, endTime=new_starTime + addTime)
+        else:
+            UID_Bucket.objects.create(uid=UID, channel=channel, bucket_id=bucketId, endTime=nowTime + addTime)
+            # return response.json(0)
+        red_url = "{SERVER_DOMAIN}cloudVod/payOK".format(SERVER_DOMAIN=SERVER_DOMAIN)
+        return HttpResponseRedirect(red_url)
+
+    def do_create_pay_order(self, request_dict, userID, response):
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        commodity_code = request_dict.get('commodity_code', None)
+        pay_type = int(request_dict.get('pay_type', None))
+        dv_qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False, isExist=1)
+        if not dv_qs.exists():
+            return response.json(12)
+        smqs = Store_Meal.objects.filter(commodity_code=commodity_code, type=pay_type). \
+            values('currency', 'price', 'content', 'day', 'commodity_type', 'title', 'content')
+        if not smqs.exists():
+            return response.json(10, '套餐不存在')
+        currency = smqs[0]['currency']
+        price = smqs[0]['price']
+        content = smqs[0]['content']
+        day = smqs[0]['day']
+        commodity_type = smqs[0]['commodity_type']
+        # ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=nowTime). \
+        #     values("bucket__storeDay", "bucket__region", "endTime")
+        # if ubqs.exists():
+        #     ubqs_count = ubqs.count()
+        #     ubq = ubqs[ubqs_count - 1, ubqs_count]
+        #     new_starTime = ubq['endTime'] + 1
+        nowTime = int(time.time())
+        orderID = CommonService.createOrderID()
+        if pay_type == 0:
+            call_sub_url = "{SERVER_DOMAIN}cloudVod/dopaypalcallback?orderID={orderID}". \
+                format(SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
+            # call_sub_url = "http://192.168.136.40:8077/cloudVod/payExecute?orderID={orderID}".format(
+            #     SERVER_DOMAIN=SERVER_DOMAIN, orderID=orderID)
+            call_clc_url = "{SERVER_DOMAIN}cloudVod/payError".format(SERVER_DOMAIN=SERVER_DOMAIN)
+            paypalrestsdk.configure(PAYPAL_CRD)
+            payment = paypalrestsdk.Payment({
+                "intent": "sale",
+                "payer": {"payment_method": "paypal"},
+                "redirect_urls": {"return_url": call_sub_url, "cancel_url": call_clc_url},
+                "transactions": [{
+                    "item_list": {
+                        "items": [
+                            {"name": "Cloud video", "sku": "1", "price": price, "currency": "USD", "quantity": 1}]},
+                    "amount": {"total": price, "currency": currency},
+                    "description": content
+                }]})
+            if payment.create():
+                print("Payment created successfully")
+            else:
+                print(payment.error)
+                return response.json(10, payment.error)
+            print(payment)
+            for link in payment.links:
+                if link.rel == "approval_url":
+                    approval_url = str(link.href)
+                    print("Redirect for approval: %s" % (approval_url))
+                    Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
+                                               desc=content,
+                                               price=price, currency=currency, addTime=nowTime, updTime=nowTime,
+                                               endTime=(nowTime + int(day) * 3600 * 24), paypal=approval_url,
+                                               commodity_code=commodity_code, commodity_type=commodity_type)
+                    return response.json(0, {"redirectUrl": approval_url, "orderID": orderID})
+            return response.json(10, 'generate_order_false')
+        else:
+            try:
+                aliPayObj = AliPayObject()
+                alipay = aliPayObj.conf()
+                subject = smqs[0]['title'] + smqs[0]['content']
+                order_string = alipay.api_alipay_trade_wap_pay(
+                    out_trade_no=orderID,
+                    total_amount=price,
+                    subject=subject,
+                    return_url="{SERVER_DOMAIN_SSL}cloudVod/payOK".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL),
+                    notify_url="{SERVER_DOMAIN_SSL}cloudVod/doalicallback".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
+                    # return_url="http://192.168.136.40/cloudVod/payOK",
+                    # notify_url="http://192.168.136.40/cloudVod/aliPayCallback"
+                )
+            except Exception as e:
+                print(repr(e))
+                return response.json(10, repr(e))
+            else:
+                if order_string:
+                    redirectUrl = aliPayObj.alipay_prefix + order_string
+                    Order_Model.objects.create(orderID=orderID, UID=uid, channel=channel, userID_id=userID,
+                                               desc=content, price=price, currency=currency, addTime=nowTime,
+                                               updTime=nowTime, endTime=nowTime + int(day) * 3600 * 24,
+                                               commodity_code=commodity_code, commodity_type=commodity_type,
+                                               paypal='', payType=1)
+                    return JsonResponse(status=200, data={'result_code': 0, 'reason': 'success',
+                                                          'result': {"redirectUrl": redirectUrl, "orderID": orderID},
+                                                          'error_code': 0})
+                else:
+                    return response.json(10, '生成订单错误')
+
     def do_create_order(self, request_dict, userID, response):
         uid = request_dict.get('uid', None)
         rank = request_dict.get('rank', None)
@@ -428,6 +613,7 @@ class CloudVodView(View):
         if not uid or not channel or not rank:
             return response.json(444, 'channel,rank')
         qs = Device_Info.objects.filter(userID_id=userID, UID=uid, isShare=False)
+
         if not qs.exists():
             return response.json(12)
         smqs = Store_Meal.objects.filter(id=rank). \

+ 3 - 0
Controller/DeviceManage.py

@@ -21,6 +21,7 @@ from Service.CommonService import CommonService
 from Model.models import Device_Info
 import traceback,datetime
 from django.utils import timezone
+from Object.RedisObject import RedisObject
 '''
 http://192.168.136.40:8077/device/manage?operation=query&token=test&page=1&line=10
 http://192.168.136.40:8077/device/manage?operation=delete&id=1&id=2
@@ -101,6 +102,8 @@ class DeviceManage(View):
 
     def delete(self, request_dict, userID, response):
         own_perm = ModelService.check_perm(userID=userID, permID=10)
+        redisObj = RedisObject(db=8)
+        redisObj.del_data(key='uid_qs_' + userID)
         if own_perm is True:
             id = request_dict.get('id', None)
             if id:

+ 17 - 3
Controller/EquipmentManager.py

@@ -2,7 +2,6 @@ import re
 import time
 import traceback
 import threading
-
 import simplejson as json
 from django.utils import timezone
 from Model.models import Device_User, Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidPushModel
@@ -15,7 +14,7 @@ from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
 from Object.ETkObject import ETkObject
 import oss2
 from django.http import JsonResponse
-
+from Object.RedisObject import RedisObject
 
 #     查询用户设备
 def queryUserEquipmentInterface(request):
@@ -85,6 +84,8 @@ def addNewUserEquipmentInterface(request):
         if dValid:
             return response.json(174)
         else:
+            redisObj = RedisObject(db=8)
+            redisObj.del_data(key='uid_qs_' + userID)
             UID = deviceData.get('UID', '')
             re_uid = re.compile(r'^[A-Za-z0-9]{20}$')
             if re_uid.match(UID):
@@ -149,8 +150,12 @@ def delUserEquipmentInterface(request):
     # 主用户删除设备全部删除
     try:
         dv_qs = Device_Info.objects.filter(userID_id=userID, id=id)
+        redisObj = RedisObject(db=8)
+        redisObj.del_data(key='uid_qs_' + userID)
         if dv_qs.exists():
             uid = dv_qs[0].UID
+            print('删除')
+            UID_Preview.objects.filter(uid=uid).delete()
             dv_qs.delete()
             asy = threading.Thread(target=ModelService.del_eq_info, args=(userID, uid))
             asy.start()
@@ -368,6 +373,8 @@ def addInterface(request):
                                              NickName=NickName, View_Account=View_Account,
                                              View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex)
                     userDevice.save()
+                    redisObj = RedisObject(db=8)
+                    redisObj.del_data(key='uid_qs_' + userID)
                 except Exception as e:
                     return response.json(10, repr(e))
                 else:
@@ -481,6 +488,8 @@ def admin_addInterface(request):
         else:
             UID = deviceData.get('UID', '')
             re_uid = re.compile(r'^[A-Za-z0-9]{20}$')
+            redisObj = RedisObject(db=8)
+            redisObj.del_data(key='uid_qs_' + userID)
             if re_uid.match(UID):
                 userDevice = Device_Info(id=CommonService.getUserID(getUser=False), userID_id=userID,
                                          **deviceData)
@@ -535,6 +544,7 @@ def admin_modifyInterface(request):
         return response.json(444, 'username')
     id = request_dict.get('id', None)
     print(deviceContent)
+
     if not deviceContent or not id:
         return response.json(444, 'content,id')
     tko = TokenObject(token)
@@ -552,6 +562,8 @@ def admin_modifyInterface(request):
 
     deviceData = json.loads(deviceContent)
     print(deviceData['UID'])
+    redisObj = RedisObject(db=8)
+    redisObj.del_data(key='uid_qs_' + userID)
     dValid = Device_Info.objects.filter(userID_id=userID, UID=deviceData['UID'])
     if dValid.exists():
         dValid_dict = CommonService.qs_to_dict(dValid)
@@ -754,7 +766,7 @@ def uid_status(request):
     # 判断用户是否绑定设备
     qs = UidSetModel.objects.filter(uid=uid).values('uid', 'detect_status', 'detect_interval', 'version', 'ucode',
                                                     'p2p_region', 'tz', 'video_code', 'channel', 'cloud_vod', 'id',
-                                                    'detect_group')
+                                                    'detect_group','is_alexa','region_alexa')
     # 判断uid配置表信息是否存在
     if qs.exists():
         # 获取uid推送是否添加过
@@ -774,6 +786,8 @@ def uid_status(request):
             'channel': qs[0]['channel'],
             'cloud_vod': qs[0]['cloud_vod'],
             'detect_group': qs[0]['detect_group'],  # 推送组
+            'is_alexa': qs[0]['is_alexa'],  # 推送组
+            'region_alexa': qs[0]['region_alexa'],  # 推送组
         }
         # 查询云存储相关信息
         ubqs = UID_Bucket.objects.filter(uid=uid). \

+ 212 - 0
Controller/EquipmentManagerV3.py

@@ -0,0 +1,212 @@
+import re
+import threading
+import time
+import traceback
+
+import oss2
+from django.db.models import Q
+from django.views.generic.base import View
+from Object.RedisObject import RedisObject
+from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
+from Model.models import Device_Info, UID_Bucket, UID_Preview, UidSetModel, UidPushModel
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+from Service.ModelService import ModelService
+import time,json
+
+class EquipmentManagerV3(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, request, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.POST, request, operation)
+
+    def validation(self, request_dict, request, operation):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        # 设备主键uid
+        tko = TokenObject(token)
+        if tko.code == 0:
+            response.lang = tko.lang
+            userID = tko.userID
+            # if operation == 'add':
+            #     return self.do_add(userID, request_dict, response)
+            if operation == 'query':
+                return self.do_query(userID, request_dict, response)
+            elif operation == 'query_reset':
+                return self.do_query_reset(userID, request_dict, response)
+            else:
+                return response.json(414)
+        else:
+            return response.json(tko.code)
+
+    def do_add(self, userID, request_dict, response, request):
+        token = request_dict.get('token', None)
+        UID = request_dict.get('UID', None)
+        NickName = request_dict.get('NickName', None)
+        View_Account = request_dict.get('View_Account', None)
+        View_Password = request_dict.get('View_Password', '')
+        Type = request_dict.get('Type', None)
+        ChannelIndex = request_dict.get('ChannelIndex', None)
+        if all([UID, NickName, View_Account, Type, ChannelIndex]):
+            tko = TokenObject(token)
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID
+                re_uid = re.compile(r'^[A-Za-z0-9]{20}$')
+                if re_uid.match(UID):
+                    is_exist = Device_Info.objects.filter(UID=UID, userID_id=userID)
+                    if is_exist:
+                        # 判断设备是否已存在
+                        if is_exist[0].isExist == 1:
+                            return response.json(174)
+                        else:
+                            is_exist.delete()
+                    # is_bind = Device_Info.objects.filter(UID=UID, isShare=False)
+                    # # 判断是否有已绑定用户
+                    # if is_bind:
+                    #     return response.json(15)
+                    try:
+                        # 判断是否有用户绑定
+                        nowTime = int(time.time())
+                        us_qs = UidSetModel.objects.filter(uid=UID)
+                        if not us_qs.exists():
+                            uid_set_create_dict = {
+                                'uid': UID,
+                                'addTime': nowTime,
+                                'updTime': nowTime,
+                                'ip': CommonService.get_ip_address(request),
+                                'channel': ChannelIndex,
+                                'nickname': NickName,
+                            }
+                            UidSetModel.objects.create(**uid_set_create_dict)
+                        pk = CommonService.getUserID(getUser=False)
+                        userDevice = Device_Info(id=pk, userID_id=userID, UID=UID,
+                                                 NickName=NickName, View_Account=View_Account,
+                                                 View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex)
+                        userDevice.save()
+                    except Exception as e:
+                        return response.json(10, repr(e))
+                    else:
+                        dvqs = Device_Info.objects.filter(id=pk).values('id', 'userID', 'NickName', 'UID',
+                                                                        'View_Account',
+                                                                        'View_Password', 'ChannelIndex', 'Type',
+                                                                        'isShare',
+                                                                        'primaryUserID', 'primaryMaster',
+                                                                        'data_joined', 'version',
+                                                                        'isVod', 'isExist')
+                        dvql = CommonService.qs_to_list(dvqs)
+                        ubqs = UID_Bucket.objects.filter(uid=UID). \
+                            values('bucket__content', 'status', 'channel', 'endTime', 'uid')
+                        res = dvql[0]
+                        res['vod'] = list(ubqs)
+                        return response.json(0, res)
+
+                else:
+                    return response.json(444, {'param': 'UID'})
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(444, {'param': 'UID,NickName,View_Account,View_Password,Type,ChannelIndex'})
+
+    # 新查询设备字段
+    def do_query(self, userID, request_dict, response):
+        token = request_dict.get('token', None)
+        page = request_dict.get('page', None)
+        line = request_dict.get('line', None)
+        NickName = request_dict.get('NickName', None)
+        page = int(page)
+        line = int(line)
+        uid = request_dict.get('uid', None)
+        tko = TokenObject(token)
+        response.lang = tko.lang
+        if page <= 0:
+            return response.json(0)
+        if tko.code == 0:
+            redisObj = RedisObject(db=8)
+            redis_value = redisObj.get_data(key='uid_qs_'+userID)
+            if redis_value == False:
+                print('缓存不存在就开始添加到缓存')
+                userID = tko.userID
+                dvqs = Device_Info.objects.filter(userID_id=userID)
+                # # 过滤已重置的设备
+                dvqs = dvqs.filter(~Q(isExist=2))
+
+                if NickName:
+                    dvqs = dvqs.filter(NickName__icontains=NickName)
+                if uid:
+                    dvqs = dvqs.filter(UID=uid)
+                dvql = dvqs[(page - 1) * line:page * line]. \
+                    values('id', 'userID', 'NickName', 'UID', 'View_Account',
+                           'View_Password', 'ChannelIndex', 'Type', 'isShare',
+                           'primaryUserID', 'primaryMaster', 'data_joined',
+                           'version',
+                           'isVod', 'isExist', 'NotificationMode')
+                dvls = CommonService.qs_to_list(dvql)
+                uid_list = []
+                for dvl in dvls:
+                    uid_list.append(dvl['UID'])
+                ubqs = UID_Bucket.objects.filter(uid__in=uid_list). \
+                    values('bucket__content', 'status', 'channel', 'endTime', 'uid')
+                upqs = UID_Preview.objects.filter(uid__in=uid_list).order_by('channel').values('id', 'uid', 'channel')
+                auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
+                bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
+                nowTime = int(time.time())
+                data = []
+                # 设备拓展信息表
+                us_qs = UidSetModel.objects.filter(uid__in=uid_list).values('uid', 'version', 'nickname','ucode')
+                uv_dict = {}
+                for us in us_qs:
+                    uv_dict[us['uid']] = {'version': us['version'], 'nickname': us['nickname'],'ucode':us['ucode']}
+                for p in dvls:
+                    p['vod'] = []
+                    for dm in ubqs:
+                        if p['UID'] == dm['uid']:
+                            if dm['endTime'] > nowTime:
+                                p['vod'].append(dm)
+                    p['preview'] = []
+                    for up in upqs:
+                        if p['UID'] == up['uid']:
+                            obj = 'uid_preview/{uid}/channel_{channel}.png'.format(uid=up['uid'], channel=up['channel'])
+                            img_sign = bucket.sign_url('GET', obj, 300)
+                            p['preview'].append(img_sign)
+                    p_uid = p['UID']
+                    if p_uid in uv_dict:
+                        # 设备版本号
+                        p['uid_version'] = uv_dict[p_uid]['version']
+                        p['ucode'] = uv_dict[p_uid]['ucode']
+                        # 设备昵称 调用影子信息昵称,先阶段不可
+                        if uv_dict[p_uid]['nickname']:
+                            p['NickName'] = uv_dict[p_uid]['nickname']
+                    else:
+                        # 设备版本号
+                        p['uid_version'] = ''
+                        p['ucode'] = ''
+                    data.append(p)
+                # 缓存时间为一个钟
+                redisObj.set_data(key='uid_qs_'+userID, val=data, expire=3600)
+                return response.json(0, data)
+            else:
+                print('去缓存找数据')
+                redis_value = redis_value.replace("'", '"')
+                redis_value = redis_value.replace("True", 'true')
+                redis_value = redis_value.replace("False", 'false')
+                # 返回固定值
+                return response.json(0, json.loads(redis_value))
+        else:
+            return response.json(tko.code)
+
+    # 新查询设备字段
+
+    def do_query_reset(self, userID, request_dict, response):
+        dvqs = Device_Info.objects.filter(userID_id=userID, isExist=2)
+        dvql = dvqs.values\
+            ('id', 'NickName', 'UID', 'ChannelIndex', 'Type', 'isShare')
+        res = CommonService.qs_to_list(dvql)
+        return response.json(0, res)

+ 24 - 10
Controller/MealManage.py

@@ -89,7 +89,8 @@ class MealManage(View):
             bucketQs = VodBucketModel.objects.filter(id=bucketID)
             if Store_Meal.objects.filter(id=id):
                 return response.json(10, '已存在')
-            store_meal = Store_Meal(id=id, title=title, price=price, content=content, day=day, bucket_id=bucketID,currency=currency,type=type)
+            store_meal = Store_Meal(id=id, title=title, price=price, content=content, day=day, bucket_id=bucketID,
+                                    currency=currency, type=type)
             store_meal.save()
         except Exception:
             errorInfo = traceback.format_exc()
@@ -225,13 +226,22 @@ class MealView(View):
         if tko.code != 0:
             return response.json(tko.code)
         elif operation == 'query':
-            return self.do_query(response)
+            return self.do_query(request_dict, response)
         else:
             return response.json(414)
 
-    def do_query(self, response):
-        qs = Store_Meal.objects.all().values("id", "title", "content", "price", "day", "currency", "bucket__storeDay",
-                                             "bucket__bucket", "bucket__area","type")
+    def do_query(self, request_dict, response):
+        mold = request_dict.get('request_dict', None)
+        if mold:
+            qs = Store_Meal.objects.filter(bucket__mold=1). \
+                values("id", "title", "content", "price", "day", "currency",
+                       "bucket__storeDay", "bucket__bucket", "bucket__area",
+                       "type")
+        else:
+            qs = Store_Meal.objects.all(). \
+                values("id", "title", "content", "price", "day", "currency",
+                       "bucket__storeDay", "bucket__bucket", "bucket__area",
+                       "type")
         if qs.exists():
             ql = list(qs)
             from operator import itemgetter
@@ -241,10 +251,14 @@ class MealView(View):
             for area, items in groupby(ql, key=itemgetter('bucket__area')):
                 res_c = {'area': area, 'items': list(items)}
                 res.append(res_c)
-            result = {'meals': res, 'extra': {
-                'cloud_banner': 'https://www.dvema.com/web/images/cloud_cn_banner.png',
-                'cloud_en_baner': 'https://www.dvema.com/web/images/cloud_en_banner.png'
-            }}
+            result = {
+                'meals': res,
+                'extra':
+                    {
+                        'cloud_banner': 'https://www.dvema.com/web/images/cloud_cn_banner.png',
+                        'cloud_en_baner': 'https://www.dvema.com/web/images/cloud_en_banner.png'
+                    }
+            }
             return response.json(0, result)
         else:
-            return response.json(0)
+            return response.json(0)

+ 5 - 1
Controller/UIDPreview.py

@@ -28,7 +28,7 @@ import time
 
 import oss2
 from django.views.generic.base import View
-
+from Object.RedisObject import RedisObject
 from Ansjer.config import OSS_STS_ACCESS_SECRET, OSS_STS_ACCESS_KEY
 from Model.models import UID_Preview, Device_Info
 from Object.ResponseObject import ResponseObject
@@ -79,6 +79,8 @@ class UIDPreview(View):
             bucket = oss2.Bucket(auth, 'oss-cn-hongkong.aliyuncs.com', 'statres')
 
             dvqs = Device_Info.objects.filter(UID=uid, userID_id=userID)
+            redisObj = RedisObject(db=8)
+            redisObj.del_data(key='uid_qs_'+userID)
             upqs = UID_Preview.objects.filter(uid=uid, channel=channel)
             if dvqs.exists():
                 if upqs.exists():
@@ -145,6 +147,8 @@ class UIDPreview(View):
         own_perm = ModelService.check_perm(userID, 20)
         if own_perm is True:
             id = request_dict.get('id')
+            redisObj = RedisObject(db=8)
+            redisObj.del_data(key='uid_qs_' + userID)
             UID_Preview.objects.filter(id=id).delete()
             return response.json(0)
         else:

+ 5 - 0
Controller/UidUser.py

@@ -27,6 +27,7 @@ from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Service.CommonService import CommonService
 from Service.ModelService import ModelService
+from Object.RedisObject import RedisObject
 '''
 http://192.168.136.40:8077/uiduser/add?token=local&UID=z123asdfqwerzxcvqw12&NickName=xxoxox&View_Account=user&View_Password=password&ChannelIndex=8&is_ap=1&Type=5&NickName=1234zcxv
 http://192.168.136.40:8077/uiduser/query?token=local&page=1&line=10&is_ap=1&NickName=1234zcxv&uid=zxcvasdfqwerzxcvqwer
@@ -127,6 +128,8 @@ def queryInterface(request):
     response.lang = tko.lang
     if page <= 0:
         return response.json(0)
+    redisObj = RedisObject(db=8)
+    redisObj.del_data(key='uid_qs_' + userID)
     if tko.code == 0:
         userID = tko.userID
         uid_user_qs = UidUserModel.objects.filter(userID_id=userID)
@@ -252,6 +255,8 @@ def deleteInterface(request):
         response.lang = tko.lang
         if tko.code == 0:
             userID = tko.userID
+            redisObj = RedisObject(db=8)
+            redisObj.del_data(key='uid_qs_' + userID)
             uid_user_qs = UidUserModel.objects.filter(userID_id=userID, id=id)
             if uid_user_qs.exists():
                 uid_user_qs.delete()

+ 50 - 20
Model/models.py

@@ -357,7 +357,7 @@ class FeedBackModel(models.Model):
 
 class User_Brand(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
-    # 关联用户 
+    # 关联用户
     userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE)
     deviceSupplier = models.CharField(max_length=32, default='', verbose_name='(必填)设备供应商 string  (例:华为、小米...)')
     deviceModel = models.CharField(max_length=32, default='', verbose_name='(必填)设备型号 string @mock=HM NOTE 1TD')
@@ -393,13 +393,16 @@ class VodBucketModel(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='主键')
     bucket = models.CharField(max_length=30, verbose_name='设备UID')
     storeDay = models.IntegerField(default=0, verbose_name='存储生命周期(天)')
-    content = models.TextField(verbose_name='描述')
+    content = models.TextField(verbose_name='描述', default='')
     endpoint = models.CharField(max_length=125, default='', verbose_name='存储节点')
     area = models.CharField(max_length=16, default='', verbose_name='区域')
     region = models.CharField(max_length=16, default='', verbose_name='regionID')
+
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
 
+    mold = models.SmallIntegerField(default=0, verbose_name='存储区域类型')  # 0:国内阿里 1:国外aws
+
     def __str__(self):
         return self.id
 
@@ -420,8 +423,10 @@ class Store_Meal(models.Model):
     add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间', auto_now_add=True)
     type = models.SmallIntegerField(default=0, verbose_name='付款类型')  # 0 是paypal,1为支付宝
     update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)
-    bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, default=1,
-                               verbose_name='存储空间')
+    bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE,
+                               default=1, verbose_name='存储空间')
+    commodity_type = models.SmallIntegerField(default=0, verbose_name='云存储套餐类型')  # 0:事件型 1:连续型
+    commodity_code = models.CharField(default='', max_length=16, verbose_name='套餐规格码', unique=True)
 
     def __str__(self):
         return self.id
@@ -453,7 +458,7 @@ class Equipment_Version(models.Model):
     update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)
     lang = models.CharField(blank=True, default='en', max_length=32, verbose_name=u'ota包内置语言')
     mci = models.CharField(default='', blank=True, max_length=10, verbose_name='设备类型')
-    img = models.CharField(max_length=300,blank=True, default='', verbose_name=u'图片路径')
+    img = models.CharField(max_length=300, blank=True, default='', verbose_name=u'图片路径')
     max_ver = models.CharField(default='', max_length=16, verbose_name='最大版本号')
 
     def __str__(self):
@@ -477,7 +482,7 @@ class App_Info(models.Model):
     app_type = models.IntegerField(default=0, blank=True, verbose_name=u'app类型')  # ios 1,android 2
     add_time = models.DateTimeField(blank=True, null=True, verbose_name=u'加入时间', auto_now_add=True)
     update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)
-    downloadLink = models.CharField(max_length=300,blank=True, default='', verbose_name='升级')
+    downloadLink = models.CharField(max_length=300, blank=True, default='', verbose_name='升级')
     img = models.CharField(default='', max_length=128, verbose_name='图片路径')
 
     def __str__(self):
@@ -522,11 +527,15 @@ class Order_Model(models.Model):
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
     endTime = models.IntegerField(verbose_name='结束时间', default=0)
     status = models.SmallIntegerField(default=0, verbose_name='付款状态')  # 0:否,1:成功
-    # 订单关联套餐
-    rank = models.ForeignKey(Store_Meal, to_field='id', default='', on_delete=models.CASCADE, verbose_name='套餐类型')
-    paypal = models.CharField(max_length=150, default='', verbose_name='paypal付款url')
     payType = models.SmallIntegerField(default=0, verbose_name='付款类型0:paypal,1:alipay')
 
+    payTime = models.IntegerField(verbose_name='支付成功时间', default=0)
+    nickname = models.CharField(default='', max_length=64, verbose_name='设备昵称')
+    uid_bucket_id = models.IntegerField(default=0, verbose_name='关联uid_bucket的字段')
+    commodity_type = models.SmallIntegerField(default=0, verbose_name='云存储套餐类型')
+    commodity_code = models.CharField(default='', max_length=16, verbose_name='套餐规格码')
+    pay_url = models.CharField(max_length=250,default='',verbose_name='支付url')
+
     def __str__(self):
         return self.orderID
 
@@ -576,6 +585,25 @@ class OssCrdModel(models.Model):
         ordering = ('-id',)
 
 
+class StsCrdModel(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='主键')
+    uid = models.CharField(max_length=20, verbose_name='设备UID')
+    channel = models.SmallIntegerField(default=0, verbose_name='通道')
+    data = models.TextField(verbose_name='设备sts')
+    addTime = models.IntegerField(verbose_name='添加时间', default=0)
+    bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, default=1,
+                               verbose_name='存储空间')
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'stscrd'
+        verbose_name = u'设备证书'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+
+
 class UID_Bucket(models.Model):
     id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
     uid = models.CharField(max_length=20, verbose_name='设备UID')
@@ -586,7 +614,7 @@ class UID_Bucket(models.Model):
 
     class Meta:
         db_table = 'vod_uid_bucket'
-        verbose_name = u'设备关联套餐表'
+        verbose_name = '设备关联套餐表'
         verbose_name_plural = verbose_name
         ordering = ('id',)
 
@@ -613,7 +641,7 @@ class SysMsgModel(models.Model):
     status = models.SmallIntegerField(verbose_name='是否已读', default=0)  # 0:否,1:是
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
-    eventType = models.IntegerField(verbose_name='消息类型', default=0) # 默认系统消息类型,0系统消息,1 ipcamera消息
+    eventType = models.IntegerField(verbose_name='消息类型', default=0)  # 默认系统消息类型,0系统消息,1 ipcamera消息
     uid = models.CharField(default='', max_length=20, db_index=True, verbose_name='设备UID')
 
     class Meta:
@@ -642,11 +670,12 @@ class UidSetModel(models.Model):
     nickname = models.CharField(default='', max_length=64, verbose_name='设备昵称')
     ip = models.CharField(max_length=20, default='', verbose_name=u'设备ip')
     # 设备重置后第一次启动时间
-    is_alexa = models.IntegerField(default=0, verbose_name='是否支持alexa') # 0为不支持,1为支持,2为开启alexa发现
-    detect_group = models.CharField(default='',max_length=32,verbose_name=u'检测类型')
+    is_alexa = models.IntegerField(default=0, verbose_name='是否支持alexa')  # 0为不支持,1为支持,2为开启alexa发现
+    detect_group = models.CharField(default='', max_length=32, verbose_name=u'检测类型')
     pwd = models.CharField(max_length=32, default='', verbose_name=u'设备密码')
     resetTime = models.IntegerField(default=0, verbose_name='设备重置时间')
     region_alexa = models.CharField(max_length=8, verbose_name='设备alexa区域', default='ALL')  # ALL CN EU US
+
     class Meta:
         db_table = 'uid_set'
         verbose_name = u'设备配置表'
@@ -772,10 +801,9 @@ class pushDeployModel(models.Model):
         ordering = ('-id',)
 
 
-
 class AppSetModel(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='主键自增id')
-    appBundleId = models.CharField(max_length=64,default='', verbose_name=u'APPid')
+    appBundleId = models.CharField(max_length=64, default='', verbose_name=u'APPid')
     content = models.TextField(default='', verbose_name=u'里面包含评分,用户帮助,ap添加方式,ap工具,广告模块等json字段值')
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.IntegerField(verbose_name='修改时间', default=0)
@@ -786,6 +814,7 @@ class AppSetModel(models.Model):
         verbose_name_plural = verbose_name
         ordering = ('-id',)
 
+
 # 认证客户端类型表
 class ApplicationModel(models.Model):
     CLIENT_TYPES = (
@@ -814,9 +843,9 @@ class ApplicationModel(models.Model):
     id = models.BigAutoField(primary_key=True)
     name = models.CharField(max_length=128, blank=True, verbose_name='client名字描述')
     client_id = models.CharField(max_length=50, unique=True, verbose_name='客户端id')
-    client_secret = models.CharField(max_length=50, unique=True,verbose_name='客户端secret')
+    client_secret = models.CharField(max_length=50, unique=True, verbose_name='客户端secret')
     client_type = models.CharField(max_length=32, choices=CLIENT_TYPES, verbose_name='客户端类型')
-    grant_type = models.CharField(max_length=32, choices=GRANT_TYPES,blank=True,null=True)
+    grant_type = models.CharField(max_length=32, choices=GRANT_TYPES, blank=True, null=True)
     redirect_uri = models.TextField(blank=True, null=True, verbose_name='重定向url')
     skip_auth = models.BooleanField(default=False, verbose_name='是否跳过点击授权')
     add_time = models.IntegerField(verbose_name='添加时间', default=0)
@@ -827,13 +856,14 @@ class ApplicationModel(models.Model):
         verbose_name = u'可授权客户端表'
         db_table = 'oauth_application'
 
+
 # 授权码信息表
 class GrantCodeModel(models.Model):
     id = models.BigAutoField(primary_key=True)
     userID = models.ForeignKey(Device_User, verbose_name="用户表userID", to_field='userID', on_delete=models.CASCADE)
     code = models.CharField(max_length=32, unique=True)
-    app_id = models.CharField(max_length=100, default='',verbose_name="appBundleId")
-    application = models.ForeignKey(ApplicationModel,verbose_name="用户表id", to_field='id', on_delete=models.CASCADE)
+    app_id = models.CharField(max_length=100, default='', verbose_name="appBundleId")
+    application = models.ForeignKey(ApplicationModel, verbose_name="用户表id", to_field='id', on_delete=models.CASCADE)
     expire_time = models.IntegerField(verbose_name='过期时间', default=0)
     add_time = models.IntegerField(verbose_name='添加时间', default=0)
     update_time = models.IntegerField(verbose_name='更新时间', default=0)
@@ -845,4 +875,4 @@ class GrantCodeModel(models.Model):
     class Meta:
         ordering = ('-add_time',)
         verbose_name = u'授权码表'
-        db_table = 'oauth_grant_code'
+        db_table = 'oauth_grant_code'

+ 1 - 1
Object/ETkObject.py

@@ -18,7 +18,7 @@ from random import Random
 
 
 class ETkObject(object):
-    def __init__(self, etk):
+    def __init__(self, etk=''):
         self.uid = ''
         self.parseUid(etk)
 

+ 1 - 1
Object/UidTokenObject.py

@@ -45,7 +45,7 @@ class UidTokenObject:
 
     def generate(self, data={}):
         token = jwt.encode(data, UID_TOKEN_KEY, algorithm='HS256').decode('utf-8')
-        self.token=token
+        self.token= token
         return token
 # uidToken = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1aWQiOiJNVUo4ODdOTFI4SzhHQk05MTExQSJ9.NHYNwmcRLCRBv2FUMA-FlM1Gtx4ir8rrwfoz7QQ67bM'
 # utko = UidTokenObject(uidToken)

+ 4 - 1
Object/mongodb.py

@@ -36,14 +36,17 @@ class mongodb(object):
             self.myclient = pymongo.MongoClient()
             self.db = self.myclient['ansjer']
 
-
+    # 创建mongodb的数据库名称
     def check_db_exist(self, database):
         dblist = self.myclient.database_names()
         if database in dblist:
+            print("数据库存在")
             return True
         else:
+            print("数据库不存在")
             return False
 
+
     def insert_one(self, col, data):
         column = self.db[col]
         res = column.insert_one(data)

+ 25 - 0
manage.py

@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+import os
+import sys
+
+if __name__ == "__main__":
+    # import socket
+    #
+    # addrs = socket.getaddrinfo(socket.gethostname(), None)
+    # for index, item in enumerate(addrs):
+    #     if index == 5:
+    #         ip = item[4][0]
+    #
+    #         print('当前局域网ip地址为:' + ip)
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Ansjer.local_settings")
+    try:
+        from django.core.management import execute_from_command_line
+    except ImportError as exc:
+        raise ImportError(
+            "Couldn't import Django. Are you sure it's installed and "
+            "available on your PYTHONPATH environment variable? Did you "
+            "forget to activate a virtual environment?"
+        ) from exc
+    execute_from_command_line(sys.argv)
+
+