Explorar el Código

Merge branch 'dev' into lang

lang hace 3 años
padre
commit
389a5e5d82

+ 1 - 5
AdminController/LogManagementController.py

@@ -77,20 +77,16 @@ class LogManagementView(View):
                 request_qs = request_qs.filter(reason_phrase=reason_phrase)
                 request_qs = request_qs.filter(reason_phrase=reason_phrase)
 
 
             count = request_qs.count()
             count = request_qs.count()
-            request_qs = request_qs.order_by('-add_time')  # 根据CDK创建时间降序排序
 
 
             request_qs = request_qs[(page - 1) * line:page * line]
             request_qs = request_qs[(page - 1) * line:page * line]
             qs_list = []
             qs_list = []
             for requsetobj in request_qs:
             for requsetobj in request_qs:
-                hh = str(requsetobj.execute_time)
-                if len(hh)>4:
-                    hh = hh[0:4]
                 qs_list.append({
                 qs_list.append({
                     'id': requsetobj.id,
                     'id': requsetobj.id,
                     'method': requsetobj.method,
                     'method': requsetobj.method,
                     'url': requsetobj.url,
                     'url': requsetobj.url,
                     'parameter': requsetobj.parameter,
                     'parameter': requsetobj.parameter,
-                    'execute_time': hh,
+                    'execute_time': round(requsetobj.execute_time, 2),  # 时间保留小数点后两位
                     'status_code': requsetobj.status_code,
                     'status_code': requsetobj.status_code,
                     'reason_phrase': requsetobj.reason_phrase,
                     'reason_phrase': requsetobj.reason_phrase,
                     'add_time': requsetobj.add_time.strftime("%Y-%m-%d %H:%M:%S"),
                     'add_time': requsetobj.add_time.strftime("%Y-%m-%d %H:%M:%S"),

+ 303 - 6
AdminController/ServeManagementController.py

@@ -8,11 +8,13 @@ import uuid
 import boto3
 import boto3
 import threading
 import threading
 import logging
 import logging
+
+import xlwt
 from boto3.session import Session
 from boto3.session import Session
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse, StreamingHttpResponse
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse, StreamingHttpResponse
 from django.views.generic.base import View
 from django.views.generic.base import View
 from Model.models import Device_Info, Role, MenuModel, VodBucketModel, CDKcontextModel, Store_Meal, Order_Model, \
 from Model.models import Device_Info, Role, MenuModel, VodBucketModel, CDKcontextModel, Store_Meal, Order_Model, \
-    UID_Bucket, ExperienceContextModel, Lang, Device_User, CloudLogModel
+    UID_Bucket, ExperienceContextModel, Lang, Device_User, CloudLogModel, UidSetModel
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
 from Object.UidTokenObject import UidTokenObject
@@ -35,9 +37,10 @@ class serveManagement(View):
     def validation(self, request_dict, request, operation):
     def validation(self, request_dict, request, operation):
         language = request_dict.get('language', 'en')
         language = request_dict.get('language', 'en')
         response = ResponseObject(language, 'pc')
         response = ResponseObject(language, 'pc')
-        if operation == 'getCloudUserList':
-            return self.getCloudUserList(request_dict, response)
-            return 0
+        if operation == 'exportCloudUserList':  # 导出云存用户信息
+            return self.exportCloudUserList(request_dict, response)
+        elif operation == 'getCloudDataList':
+            return self.getCloudDataList(request_dict, response)
         else:
         else:
             tko = TokenObject(
             tko = TokenObject(
                 request.META.get('HTTP_AUTHORIZATION'),
                 request.META.get('HTTP_AUTHORIZATION'),
@@ -85,8 +88,8 @@ class serveManagement(View):
                 return self.deleteDevicePackage(userID, request_dict, response)
                 return self.deleteDevicePackage(userID, request_dict, response)
             elif operation == 'experiencereset':  # 重置设备云存体验
             elif operation == 'experiencereset':  # 重置设备云存体验
                 return self.do_experience_reset(request_dict, userID, response)
                 return self.do_experience_reset(request_dict, userID, response)
-            elif operation == 'getCloudUserList':  # 重置设备云存体验
-                return self.getCloudUserList(request_dict, userID, response)
+            elif operation == 'getCloudUserList':  # 获取云存用户信息
+                return self.getCloudUserList(request_dict, response)
             else:
             else:
                 return response.json(404)
                 return response.json(404)
 
 
@@ -746,6 +749,13 @@ class serveManagement(View):
         userEmail = request_dict.get('userEmail', None)
         userEmail = request_dict.get('userEmail', None)
         payType = request_dict.get('payType', None)
         payType = request_dict.get('payType', None)
 
 
+        # uid_set 表查询
+        ucode = request_dict.getlist('ucode', None)
+        version = request_dict.getlist('version', None)
+
+        # 日志表查询
+        logTimeRange = request_dict.getlist('logTimeRange[]', None)
+
         pageNo = request_dict.get('pageNo', None)
         pageNo = request_dict.get('pageNo', None)
         pageSize = request_dict.get('pageSize', None)
         pageSize = request_dict.get('pageSize', None)
         if not all([pageNo, pageSize]):
         if not all([pageNo, pageSize]):
@@ -795,8 +805,26 @@ class serveManagement(View):
                     id__in=order_qs.values_list(
                     id__in=order_qs.values_list(
                         'uid_bucket_id', flat=True))
                         'uid_bucket_id', flat=True))
 
 
+            uidset_qs = UidSetModel.objects.filter(
+                uid__in=uid_bucket_qs.values('uid'))
+            if ucode or version:
+                if ucode:
+                    uidset_qs = uidset_qs.filter(ucode=ucode)
+                if version:
+                    uidset_qs = uidset_qs.filter(version=version)
+
             cg_qs = CloudLogModel.objects.filter(
             cg_qs = CloudLogModel.objects.filter(
                 operation='cloudstorage/queryvodlist')
                 operation='cloudstorage/queryvodlist')
+            if logTimeRange:
+                logStartTime, logEndTime = int(
+                    logTimeRange[0][:-3]), int(logTimeRange[1][:-3])
+                cg_qs = cg_qs.filter(
+                    time__gte=logStartTime,
+                    time__lte=logEndTime)
+                # 过滤套餐关联的UID_Bucket数据
+                uid_bucket_qs = uid_bucket_qs.filter(
+                    uid__in=cg_qs.values('uid'))
+
             list_data = []
             list_data = []
             count = uid_bucket_qs.count()
             count = uid_bucket_qs.count()
             uid_bucket_qs = uid_bucket_qs[(page - 1) * line:page * line]
             uid_bucket_qs = uid_bucket_qs[(page - 1) * line:page * line]
@@ -841,9 +869,278 @@ class serveManagement(View):
                     data['playcount'] = cg_qs.filter(
                     data['playcount'] = cg_qs.filter(
                         operation='cloudstorage/queryvodlist', uid=order['UID']).count()
                         operation='cloudstorage/queryvodlist', uid=order['UID']).count()
 
 
+                for uidset in uidset_qs.filter(
+                        uid=uid_bucket.uid).values(
+                        'ucode',
+                        'version'):
+                    data['ucode'] = uidset['ucode']
+                    data['version'] = uidset['version']
+
                 list_data.append(data)
                 list_data.append(data)
             return response.json(
             return response.json(
                 0, {'list': list_data, 'total': count})
                 0, {'list': list_data, 'total': count})
         except Exception as e:
         except Exception as e:
             print(e)
             print(e)
             return response.json(500, repr(e))
             return response.json(500, repr(e))
+
+    def exportCloudUserList(self, request_dict, response):
+        # UID_Bucket表查询数据
+        uid = request_dict.get('uid', None)
+        status = request_dict.get('status', None)
+        use_status = request_dict.get('use_status', None)
+        has_unused = request_dict.get('has_unused', None)
+        addTimeRange = request_dict.getlist('addTimeRange[]', None)
+        endTimeRange = request_dict.getlist('endTimeRange[]', None)
+
+        # Order_Model表查询数据
+        username = request_dict.get('username', None)
+        phone = request_dict.get('phone', None)
+        userEmail = request_dict.get('userEmail', None)
+        payType = request_dict.get('payType', None)
+
+        #uid_set 表查询
+        ucode = request_dict.getlist('ucode', None)
+        version = request_dict.getlist('version', None)
+
+        # 日志表查询
+        logTimeRange = request_dict.getlist('logTimeRange[]', None)
+
+        try:
+            uid_bucket_qs = UID_Bucket.objects.all()
+            if uid:
+                uid_bucket_qs = uid_bucket_qs.filter(uid__contains=uid)
+            if status:
+                uid_bucket_qs = uid_bucket_qs.filter(status=status)
+            if use_status:
+                uid_bucket_qs = uid_bucket_qs.filter(use_status=use_status)
+            if has_unused:
+                uid_bucket_qs = uid_bucket_qs.filter(has_unused=has_unused)
+            if addTimeRange:
+                addStartTime, addEndTime = int(
+                    addTimeRange[0][:-3]), int(addTimeRange[1][:-3])
+                uid_bucket_qs = uid_bucket_qs.filter(
+                    addTime__gte=addStartTime,
+                    addTime__lte=addEndTime)
+            if endTimeRange:
+                endStartTime, endEndTime = int(
+                    endTimeRange[0][:-3]), int(endTimeRange[1][:-3])
+                uid_bucket_qs = uid_bucket_qs.filter(
+                    addTime__gte=endStartTime,
+                    addTime__lte=endEndTime)
+            if not uid_bucket_qs.exists():
+                return response.json(0, [])
+
+            order_qs = Order_Model.objects.filter(
+                uid_bucket_id__in=uid_bucket_qs.values('id'))
+            if username or phone or userEmail or payType:
+                if username:
+                    order_qs = order_qs.filter(userID__username=username)
+                if phone:
+                    order_qs = order_qs.filter(userID__phone__contains=phone)
+                if userEmail:
+                    order_qs = order_qs.filter(
+                        userID__userEmail__contains=userEmail)
+                if payType:
+                    order_qs = order_qs.filter(payType=int(payType))
+                # 过滤套餐关联的UID_Bucket数据
+                uid_bucket_qs = uid_bucket_qs.filter(
+                    id__in=order_qs.values_list(
+                        'uid_bucket_id', flat=True))
+
+            uidset_qs = UidSetModel.objects.filter(
+                uid__in=uid_bucket_qs.values('uid'))
+            if ucode or version:
+                if ucode:
+                    uidset_qs = uidset_qs.filter(ucode=ucode)
+                if version:
+                    uidset_qs = uidset_qs.filter(version=version)
+
+            cg_qs = CloudLogModel.objects.filter(
+                operation='cloudstorage/queryvodlist')
+            if logTimeRange:
+                logStartTime, logEndTime = int(
+                    logTimeRange[0][:-3]), int(logTimeRange[1][:-3])
+                cg_qs = cg_qs.filter(
+                    time__gte=logStartTime,
+                    time__lte=logEndTime)
+            list_data = []
+            count = uid_bucket_qs.count()
+            for uid_bucket in uid_bucket_qs:
+                data = {
+                    'id': uid_bucket.id,
+                    'uid': uid_bucket.uid,
+                    'channel': uid_bucket.channel,
+                    'status': uid_bucket.status,
+                    'endTime': time.strftime(
+                        "%Y--%m--%d %H:%M:%S",
+                        time.localtime(
+                            uid_bucket.endTime)),
+                    'addTime': time.strftime(
+                        "%Y--%m--%d %H:%M:%S",
+                        time.localtime(
+                            uid_bucket.addTime)),
+                    'use_status': uid_bucket.use_status,
+                    'has_unused': uid_bucket.has_unused}
+
+                for order in order_qs.filter(
+                        uid_bucket_id=uid_bucket.id).values(
+                        'uid_bucket_id',
+                        'desc',
+                        'userID__userID',
+                        'UID',
+                        'price',
+                        'payType',
+                        'userID__username',
+                        'userID__phone',
+                        'userID__userEmail',
+                        'userID__data_joined'):
+                    data['desc'] = order['desc']
+                    data['payType'] = order['payType']
+                    data['price'] = order['price']
+                    data['username'] = order['userID__username']
+                    data['phone'] = order['userID__phone']
+                    data['userEmail'] = order['userID__userEmail']
+                    data['data_joined'] = order['userID__data_joined'].strftime(
+                        "%Y-%m-%d %H:%M:%S")
+                    data['playcount'] = cg_qs.filter(
+                        operation='cloudstorage/queryvodlist', uid=order['UID']).count()
+
+                for uidset in uidset_qs.filter(
+                        uid=uid_bucket.uid).values(
+                        'ucode',
+                        'version'):
+                    data['ucode'] = uidset['ucode']
+                    data['version'] = uidset['version']
+
+                list_data.append(data)
+
+            response = HttpResponse(content_type='application/vnd.ms-excel')
+            response['Content-Disposition'] = 'attachment; filename=userinfo.xls'
+            workbook = xlwt.Workbook(encoding='utf-8')
+            sheet1 = workbook.add_sheet('UID')
+
+            headtitle = [
+              'id',
+              '用户账号',
+              '用户手机号',
+              '用户邮箱',
+              '注册时间',
+              '设备UID',
+              '设备通道',
+              '云存状态',
+              '添加时间',
+              '到期时间',
+              '使用状态',
+              '是否有未使用套餐',
+              '套餐描述',
+              '支付方式',
+              '价格',
+              '播放次数',
+              '产品编码',
+              '版本'
+            ]
+            headnum = 0
+            for title in headtitle:
+                sheet1.write(0, headnum, title)
+                headnum= headnum+1
+
+            fields = [
+              'id',
+              'username',
+              'phone',
+              'userEmail',
+              'data_joined',
+              'uid',
+              'channel',
+              'status',
+              'addTime',
+              'endTime',
+              'use_status',
+              'has_unused',
+              'desc',
+              'payType',
+              'price',
+              'playcount',
+              'ucode',
+              'version'
+            ]
+            num = 1
+            for item in list_data:
+                fieldnum = 0
+                for key in fields:
+                    val = item[key]
+                    if key == 'payType':
+                        if val == 1:
+                            val = 'PayPal'
+                        if val == 2:
+                            val = '支付宝'
+                        if val == 3:
+                            val = '微信支付'
+                        if val == 10:
+                            val = '免费体验'
+                        if val == 11:
+                            val = '激活码'
+
+                    sheet1.write(num, fieldnum, val)
+                    fieldnum = fieldnum+1
+                num =num+1
+            workbook.save(response)
+            return response
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def getCloudDataList(self, request_dict, response):
+        year = request_dict.get('year', None)
+        Jan = int(time.mktime(time.strptime(year + '-1-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Feb = int(time.mktime(time.strptime(year + '-2-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Mar = int(time.mktime(time.strptime(year + '-3-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Apr = int(time.mktime(time.strptime(year + '-4-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        May = int(time.mktime(time.strptime(year + '-5-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Jun = int(time.mktime(time.strptime(year + '-6-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Jul = int(time.mktime(time.strptime(year + '-7-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Aug = int(time.mktime(time.strptime(year + '-8-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Sep = int(time.mktime(time.strptime(year + '-9-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Oct = int(time.mktime(time.strptime(year + '-10-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Nov = int(time.mktime(time.strptime(year + '-11-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Dec = int(time.mktime(time.strptime(year + '-12-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+        Jan_next = int(time.mktime(time.strptime(str(int(year)+1) + '-1-1 00:00:00', "%Y-%m-%d %H:%M:%S")))
+
+        list_data = []
+        vod_bucket_qs = VodBucketModel.objects.filter()
+        if not vod_bucket_qs.exists():
+            return response.json(173)
+        try:
+            for vod_bucket in vod_bucket_qs:
+                vod_bucket_id = vod_bucket.id
+                store_meal = Store_Meal.objects.filter(bucket_id=vod_bucket_id, lang__lang='cn').values('lang__title', 'lang__content')
+                if not store_meal.exists():
+                    continue
+                name = store_meal[0]['lang__title']+'-'+store_meal[0]['lang__content']
+                order = Order_Model.objects.filter(rank__bucket_id=vod_bucket_id)
+                Jan_count = order.filter(status=1, addTime__range=[Jan, Feb]).count()
+                Feb_count = order.filter(status=1, addTime__range=[Feb, Mar]).count()
+                Mar_count = order.filter(status=1, addTime__range=[Mar, Apr]).count()
+                Apr_count = order.filter(status=1, addTime__range=[Apr, May]).count()
+                May_count = order.filter(status=1, addTime__range=[May, Jun]).count()
+                Jun_count = order.filter(status=1, addTime__range=[Jun, Jul]).count()
+                Jul_count = order.filter(status=1, addTime__range=[Jul, Aug]).count()
+                Aug_count = order.filter(status=1, addTime__range=[Aug, Sep]).count()
+                Sep_count = order.filter(status=1, addTime__range=[Sep, Oct]).count()
+                Oct_count = order.filter(status=1, addTime__range=[Oct, Nov]).count()
+                Nov_count = order.filter(status=1, addTime__range=[Nov, Dec]).count()
+                Dec_count = order.filter(status=1, addTime__range=[Dec, Jan_next]).count()
+                data = [Jan_count, Feb_count, Mar_count, Apr_count, May_count, Jun_count, Jul_count, Aug_count, Sep_count,
+                        Oct_count, Nov_count, Dec_count]
+
+                cloud_data = {
+                    'name': name,
+                    'type': 'line',
+                    'data': data,
+                }
+                list_data.append(cloud_data)
+
+            return response.json(0, {'list': list_data})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))

+ 32 - 13
AdminController/UserManageController.py

@@ -309,12 +309,17 @@ class UserManagement(View):
                 return self.AddOrEditAccount(userID, request_dict, response)
                 return self.AddOrEditAccount(userID, request_dict, response)
             elif operation == 'doDelete':
             elif operation == 'doDelete':
                 return self.doDelete(userID, request_dict, response)
                 return self.doDelete(userID, request_dict, response)
+            elif operation == 'resetPassword':
+                return self.resetPassword(request_dict, response)
             else:
             else:
                 return response.json(404)
                 return response.json(404)
 
 
     def getUserInfo(self, userID, request_dict, response):
     def getUserInfo(self, userID, request_dict, response):
         print('request_dict: ', request_dict)
         print('request_dict: ', request_dict)
         username = request_dict.get('username', '').strip()   # 移除字符串头尾的空格
         username = request_dict.get('username', '').strip()   # 移除字符串头尾的空格
+        NickName = request_dict.get('NickName', '').strip()
+        phone = request_dict.get('phone', '').strip()
+        userEmail = request_dict.get('userEmail', '').strip()
         pageNo = request_dict.get('pageNo', None)
         pageNo = request_dict.get('pageNo', None)
         pageSize = request_dict.get('pageSize', None)
         pageSize = request_dict.get('pageSize', None)
 
 
@@ -324,19 +329,18 @@ class UserManagement(View):
         page = int(pageNo)
         page = int(pageNo)
         line = int(pageSize)
         line = int(pageSize)
         try:
         try:
-            if username:    # 查询
-                # 校验查询输入数据是否匹配用户名,手机或邮箱正则
-                dataValid = DataValid()
-                if not (dataValid.name_validate(username) or dataValid.mobile_validate(username) \
-                        or dataValid.email_validate(username)):
-                    return response.json(444)
-                device_user_qs = Device_User.objects.filter(username=username)
+            if username or NickName or phone or userEmail:
+                # 条件查询
+                if username:
+                    device_user_qs = Device_User.objects.filter(username__contains=username)
+                if NickName:
+                    device_user_qs = Device_User.objects.filter(NickName__contains=NickName)
+                if phone:
+                    device_user_qs = Device_User.objects.filter(phone__contains=phone)
+                if userEmail:
+                    device_user_qs = Device_User.objects.filter(userEmail__contains=userEmail)
                 if not device_user_qs.exists():
                 if not device_user_qs.exists():
-                    device_user_qs = Device_User.objects.filter(phone=username)
-                    if not device_user_qs.exists():
-                        device_user_qs = Device_User.objects.filter(userEmail=username)
-                        if not device_user_qs.exists():
-                            return response.json(104)
+                    return response.json(0)
 
 
             else:
             else:
                 device_user_qs = Device_User.objects.filter()  # 查询全部
                 device_user_qs = Device_User.objects.filter()  # 查询全部
@@ -424,4 +428,19 @@ class UserManagement(View):
     def doDelete(self, userID, request_dict, response):
     def doDelete(self, userID, request_dict, response):
         userID = request_dict.get('userID', '')
         userID = request_dict.get('userID', '')
         Device_User.objects.filter(userID=userID).delete()
         Device_User.objects.filter(userID=userID).delete()
-        return response.json(0)
+        return response.json(0)
+
+    def resetPassword(self, request_dict, response):
+        userID = request_dict.get('userID', None)
+        if not userID:
+            return response.json(444)
+        try:
+            password = '123456'
+            is_update = Device_User.objects.filter(userID=userID).update(password=make_password(password))
+            if is_update:
+                return response.json(0)
+            else:
+                return response.json(177)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))

+ 8 - 1
Ansjer/cn_config/config_formal.py

@@ -121,4 +121,11 @@ APNS_MODE = 'prod'
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 SERVER_TYPE = os.environ.get('DJANGO_SETTINGS_MODULE')
 SERVER_TYPE = os.environ.get('DJANGO_SETTINGS_MODULE')
 
 
-TUTK_PUSH_DOMAIN = 'http://push.iotcplatform.com/tpns'
+TUTK_PUSH_DOMAIN = 'http://push.iotcplatform.com/tpns'
+
+# aws api key
+AWS_ARN_S3 = 'arn:aws-cn:s3'
+AVATAR_BUCKET = 'avatar-cn'
+REGION_NAME = 'cn-northwest-1'
+ACCESS_KEY_ID = 'AKIA2MMWBR4DSFG67DTG'
+SECRET_ACCESS_KEY = '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'

+ 9 - 1
Ansjer/cn_config/config_test.py

@@ -132,4 +132,12 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__fil
 APNS_MODE = 'dev'
 APNS_MODE = 'dev'
 SERVER_TYPE = os.environ.get('DJANGO_SETTINGS_MODULE')
 SERVER_TYPE = os.environ.get('DJANGO_SETTINGS_MODULE')
 
 
-TUTK_PUSH_DOMAIN = 'http://push.iotcplatform.com/tpns'
+TUTK_PUSH_DOMAIN = 'http://push.iotcplatform.com/tpns'
+
+
+# aws api key
+AWS_ARN_S3 = 'arn:aws-cn:s3'
+AVATAR_BUCKET = 'avatar-cn'
+REGION_NAME = 'cn-northwest-1'
+ACCESS_KEY_ID = 'AKIA2MMWBR4DSFG67DTG'
+SECRET_ACCESS_KEY = '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'

+ 1 - 0
Ansjer/cn_config/formal_settings.py

@@ -24,6 +24,7 @@ MIDDLEWARE = [
     'django.middleware.security.SecurityMiddleware',
     'django.middleware.security.SecurityMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.common.CommonMiddleware',
     'django.middleware.common.CommonMiddleware',
+    'MiddleWare.requestRecord.RequestRecordMiddleware',  # 记录请求信息
     # 'django.middleware.csrf.CsrfViewMiddleware',
     # 'django.middleware.csrf.CsrfViewMiddleware',
     'corsheaders.middleware.CorsPostCsrfMiddleware',
     'corsheaders.middleware.CorsPostCsrfMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',
     'django.contrib.auth.middleware.AuthenticationMiddleware',

+ 8 - 1
Ansjer/local_config/config_local.py

@@ -54,4 +54,11 @@ APNS_CONFIG = {
 }
 }
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 APNS_MODE = 'dev'
 APNS_MODE = 'dev'
-TUTK_PUSH_DOMAIN = 'http://push.iotcplatform.com/tpns'
+TUTK_PUSH_DOMAIN = 'http://push.iotcplatform.com/tpns'
+
+# aws api key
+AWS_ARN_S3 = 'arn:aws-cn:s3'
+AVATAR_BUCKET = 'avatar-cn'
+REGION_NAME = 'cn-northwest-1'
+ACCESS_KEY_ID = 'AKIA2MMWBR4DSFG67DTG'
+SECRET_ACCESS_KEY = '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'

+ 8 - 1
Ansjer/us_config/config_formal.py

@@ -121,4 +121,11 @@ APNS_MODE = 'prod'
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 SERVER_TYPE = os.environ.get('DJANGO_SETTINGS_MODULE')
 SERVER_TYPE = os.environ.get('DJANGO_SETTINGS_MODULE')
 
 
-TUTK_PUSH_DOMAIN = 'http://push.iotcplatform.com/tpns'
+TUTK_PUSH_DOMAIN = 'http://push.iotcplatform.com/tpns'
+
+# aws api key
+AWS_ARN_S3 = 'arn:aws:s3'
+AVATAR_BUCKET = 'avatar-us'
+REGION_NAME = 'us-east-1'
+ACCESS_KEY_ID = 'AKIA2E67UIMD45Y3HL53'
+SECRET_ACCESS_KEY = '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'

+ 8 - 1
Ansjer/us_config/config_test.py

@@ -132,4 +132,11 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__fil
 APNS_MODE = 'dev'
 APNS_MODE = 'dev'
 SERVER_TYPE = os.environ.get('DJANGO_SETTINGS_MODULE')
 SERVER_TYPE = os.environ.get('DJANGO_SETTINGS_MODULE')
 
 
-TUTK_PUSH_DOMAIN = 'http://push.iotcplatform.com/tpns'
+TUTK_PUSH_DOMAIN = 'http://push.iotcplatform.com/tpns'
+
+# aws api key
+AWS_ARN_S3 = 'arn:aws:s3'
+AVATAR_BUCKET = 'avatar-us'
+REGION_NAME = 'us-east-1'
+ACCESS_KEY_ID = 'AKIA2E67UIMD45Y3HL53'
+SECRET_ACCESS_KEY = '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'

+ 13 - 4
Controller/CloudStorage.py

@@ -44,6 +44,7 @@ from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssC
 from Object.AWS.S3Email import S3Email
 from Object.AWS.S3Email import S3Email
 from Object.AliPayObject import AliPayObject
 from Object.AliPayObject import AliPayObject
 from Object.AliSmsObject import AliSmsObject
 from Object.AliSmsObject import AliSmsObject
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
 from Object.UidTokenObject import UidTokenObject
@@ -202,6 +203,7 @@ class CloudStorageView(View):
             qs = qs.filter(pay_type='10')
             qs = qs.filter(pay_type='10')
 
 
         qs = qs.filter(~Q(pay_type='11'))  # 过滤不显示激活码套餐
         qs = qs.filter(~Q(pay_type='11'))  # 过滤不显示激活码套餐
+        qs = qs.filter(is_show=0)  #过滤隐藏套餐
         #qs = qs.filter(id='11111111')
         #qs = qs.filter(id='11111111')
         #qs = qs.filter(bucket__region_id=regionObj.region_id)  # 过滤大洲
         #qs = qs.filter(bucket__region_id=regionObj.region_id)  # 过滤大洲
         qs = qs.annotate(title=F('lang__title'),content=F('lang__content'),discount_content=F('lang__discount_content'))
         qs = qs.annotate(title=F('lang__title'),content=F('lang__content'),discount_content=F('lang__discount_content'))
@@ -1040,7 +1042,7 @@ class CloudStorageView(View):
 
 
         # if dv_qs[0]['vodPrimaryUserID'] != '' and dv_qs[0]['vodPrimaryUserID'] != userID:
         # if dv_qs[0]['vodPrimaryUserID'] != '' and dv_qs[0]['vodPrimaryUserID'] != userID:
         #     return response.json(10033)
         #     return response.json(10033)
-        smqs = Store_Meal.objects.filter(id=rank, pay_type=pay_type, lang__lang=lang). \
+        smqs = Store_Meal.objects.filter(id=rank, pay_type=pay_type, lang__lang=lang, is_show=0). \
             values('currency', 'price', 'lang__content', 'day',
             values('currency', 'price', 'lang__content', 'day',
                    'commodity_type', 'lang__title',
                    'commodity_type', 'lang__title',
                    'expire', 'commodity_code', 'discount_price', 'bucket__mold')
                    'expire', 'commodity_code', 'discount_price', 'bucket__mold')
@@ -1190,7 +1192,8 @@ class CloudStorageView(View):
         rank = request_dict.get('rank', None)
         rank = request_dict.get('rank', None)
         cdk = request_dict.get('cdk', None)
         cdk = request_dict.get('cdk', None)
         lang = request_dict.get('lang', 'en')
         lang = request_dict.get('lang', 'en')
-        if cdk != None and pay_type == 11:
+
+        if cdk is not None and pay_type == 11:
             cdk_qs = CDKcontextModel.objects.filter(cdk=cdk).values('is_activate', 'rank__id', 'rank__commodity_code')
             cdk_qs = CDKcontextModel.objects.filter(cdk=cdk).values('is_activate', 'rank__id', 'rank__commodity_code')
             if not cdk_qs.exists():
             if not cdk_qs.exists():
                 return response.json(10040)
                 return response.json(10040)
@@ -1199,9 +1202,14 @@ class CloudStorageView(View):
             rank = cdk_qs[0]['rank__id']
             rank = cdk_qs[0]['rank__id']
             commodity_code = cdk_qs[0]['rank__commodity_code']
             commodity_code = cdk_qs[0]['rank__commodity_code']
 
 
-        if uid == None or channel == None or commodity_code == None or pay_type == None or rank == None:
+        if uid is None or channel is None or commodity_code is None or pay_type is None or rank is None:
             return response.json(13, '参数有误.')
             return response.json(13, '参数有误.')
 
 
+        redisObj = RedisObject()
+        if redisObj.get_data(key=uid+'do_experience_order'):
+            return response.json(5)
+        redisObj.set_data(key=uid+'do_experience_order', val=uid, expire=300)
+
         dvq = Device_Info.objects.filter(UID=uid)
         dvq = Device_Info.objects.filter(UID=uid)
         dvq = dvq.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID')
         dvq = dvq.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID')
         if dvq.exists():
         if dvq.exists():
@@ -1217,7 +1225,7 @@ class CloudStorageView(View):
 
 
         orderID = CommonService.createOrderID()
         orderID = CommonService.createOrderID()
         nowTime = int(time.time())
         nowTime = int(time.time())
-        smqs = Store_Meal.objects.filter(id=rank,lang__lang=lang). \
+        smqs = Store_Meal.objects.filter(id=rank,lang__lang=lang,is_show=0). \
             values("day", "bucket_id", "bucket__storeDay", "expire", 'lang__content', 'price', 'currency', 'commodity_type')
             values("day", "bucket_id", "bucket__storeDay", "expire", 'lang__content', 'price', 'currency', 'commodity_type')
         if not smqs.exists():
         if not smqs.exists():
             return response.json(173)
             return response.json(173)
@@ -1310,6 +1318,7 @@ class CloudStorageView(View):
                     sms = 'SMS_219748439'
                     sms = 'SMS_219748439'
 
 
                 self.do_vod_msg_Notice(uid, channel, userID, lang, sys_msg_text_list, sms)
                 self.do_vod_msg_Notice(uid, channel, userID, lang, sys_msg_text_list, sms)
+                redisObj.del_data(key=uid+'do_experience_order')
                 result = returnurl
                 result = returnurl
                 return response.json(0, result)
                 return response.json(0, result)
         except Exception:
         except Exception:

+ 59 - 44
Controller/UserManger.py

@@ -1,8 +1,12 @@
 #!/usr/bin/env python
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 # -*- coding: utf-8 -*-
+import logging
 import os
 import os
 import traceback
 import traceback
 
 
+import boto3
+import botocore
+from botocore import client
 import simplejson as json
 import simplejson as json
 from django.core.files.storage import FileSystemStorage
 from django.core.files.storage import FileSystemStorage
 from django.http import HttpResponse
 from django.http import HttpResponse
@@ -10,7 +14,7 @@ from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
 from django.views.decorators.csrf import csrf_exempt
 from django.views.generic import TemplateView, View
 from django.views.generic import TemplateView, View
 
 
-from Ansjer.config import BASE_DIR
+from Ansjer.config import BASE_DIR, SERVER_TYPE, ACCESS_KEY_ID, SECRET_ACCESS_KEY, REGION_NAME, AVATAR_BUCKET
 from Ansjer.config import SERVER_DOMAIN
 from Ansjer.config import SERVER_DOMAIN
 from Model.models import Role, Device_User, UserOauth2Model, UserExModel
 from Model.models import Role, Device_User, UserOauth2Model, UserExModel
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
@@ -101,32 +105,33 @@ class perfectUserInfoView(TemplateView):
         userID = tko.userID
         userID = tko.userID
         if not userID:
         if not userID:
             return response.json(309)
             return response.json(309)
-        if userIcon != None:
-            location = 'static/User/Images/' + userID + '/'
-            fss = FileSystemStorage(location=location)
-            if fss.exists(userIcon.name):
-                fss.delete(userIcon.name)
-            filename = fss.save(userIcon.name, userIcon)
-            # userIconUrl = fss.url(filename)
-            userIconPath = fss.path(filename).replace('\\', '/')
-        else:
-            userIconPath = None
-        if userContent != None:
+        userIconPath = ''
+        if userIcon:
+            # 上传头像到aws s3
+            aws_s3_client = boto3.client(
+                's3',
+                region_name=REGION_NAME,
+                aws_access_key_id=ACCESS_KEY_ID,
+                aws_secret_access_key=SECRET_ACCESS_KEY,
+                config=botocore.client.Config(signature_version='s3v4'),
+            )
+            Key = userID + '/' + userIcon.name
+            aws_s3_client.put_object(Bucket=AVATAR_BUCKET, Key=Key, Body=userIcon)
+            userIconPath = userID + '/' + userIcon.name
+        if userContent:
             dataValid = json.loads(userContent)
             dataValid = json.loads(userContent)
             if 'userID' and 'password' and 'is_superuser' in dataValid.keys():
             if 'userID' and 'password' and 'is_superuser' in dataValid.keys():
                 return response.json(444)
                 return response.json(444)
-        if userIconPath == None and userContent == None:
+        if not userIconPath and not userContent:
             return response.json(444)
             return response.json(444)
-        elif userIconPath == None and userContent != None:
+        elif not userIconPath and userContent:
             return self.perfectUserInfoUpdate(userID, response, userContent=userContent)
             return self.perfectUserInfoUpdate(userID, response, userContent=userContent)
-        elif userIconPath != None and userContent == None:
+        elif userIconPath and not userContent:
             return self.perfectUserInfoUpdate(userID, response, userIconPath=userIconPath)
             return self.perfectUserInfoUpdate(userID, response, userIconPath=userIconPath)
         else:
         else:
-            return self.perfectUserInfoUpdate(userID, response, userIconPath=userIconPath,
-                                              userContent=userContent)
+            return self.perfectUserInfoUpdate(userID, response, userIconPath=userIconPath, userContent=userContent)
 
 
-    def perfectUserInfoUpdate(slef, userID, response, *args,
-                              **kwargs):
+    def perfectUserInfoUpdate(slef, userID, response, **kwargs):
         """
         """
         :param username:
         :param username:
         :param userContent:
         :param userContent:
@@ -139,24 +144,21 @@ class perfectUserInfoView(TemplateView):
             return response.json(104)
             return response.json(104)
         userIconPath = kwargs.get('userIconPath', None)
         userIconPath = kwargs.get('userIconPath', None)
         userContent = kwargs.get('userContent', None)
         userContent = kwargs.get('userContent', None)
-        if userIconPath is not None:
-            userIconPath = userIconPath[userIconPath.find('static/'):]
-            userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath[7:]
-        if userContent != None:
+        if userIconPath:
+            userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
+        if userContent:
             try:
             try:
                 UserData = json.loads(userContent)
                 UserData = json.loads(userContent)
             except Exception as e:
             except Exception as e:
                 return response.json(444, repr(e))
                 return response.json(444, repr(e))
         try:
         try:
-            if userIconPath is not None and userContent is not None:
+            if userIconPath and userContent:
                 User.update(userIconPath=userIconPath, userIconUrl=userIconUrl, **UserData)
                 User.update(userIconPath=userIconPath, userIconUrl=userIconUrl, **UserData)
-            elif userIconPath is None and userContent is not None:
+            elif not userIconPath and userContent:
                 User.update(**UserData)
                 User.update(**UserData)
-            elif userIconPath is not None and userContent is None:
+            elif userIconPath and not userContent:
                 User.update(userIconPath=userIconPath, userIconUrl=userIconUrl)
                 User.update(userIconPath=userIconPath, userIconUrl=userIconUrl)
         except Exception as e:
         except Exception as e:
-            errorInfo = traceback.format_exc()
-            print('修改设备信息错误: %s ' % errorInfo)
             return response.json(117, repr(e))
             return response.json(117, repr(e))
         else:
         else:
             res = CommonService.qs_to_dict(User)
             res = CommonService.qs_to_dict(User)
@@ -164,10 +166,7 @@ class perfectUserInfoView(TemplateView):
                 res['datas'][k]['fields'].pop('password')
                 res['datas'][k]['fields'].pop('password')
                 userIconPath = res['datas'][k]['fields']['userIconPath']
                 userIconPath = res['datas'][k]['fields']['userIconPath']
                 if userIconPath:
                 if userIconPath:
-                    if userIconPath.find('static/') != -1:
-                        userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
-                        userIconUrl = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
-                        res['datas'][k]['fields']['userIconUrl'] = userIconUrl
+                    res['datas'][k]['fields']['userIconUrl'] = userIconUrl
             return response.json(0, res)
             return response.json(0, res)
 
 
 
 
@@ -190,28 +189,44 @@ class getAvatarView(TemplateView):
 
 
     def getAvatar(self, filePath):
     def getAvatar(self, filePath):
         response = ResponseObject()
         response = ResponseObject()
-        if filePath == '' or filePath == None:
+        if not filePath:
             return response.json(800)
             return response.json(800)
+        if filePath == 'User/default.png' or filePath == 'User/defaultUser.png':
+            # 使用默认头像
+            try:
+                aws_s3_client = boto3.client(
+                    's3',
+                    region_name=REGION_NAME,
+                    aws_access_key_id=ACCESS_KEY_ID,
+                    aws_secret_access_key=SECRET_ACCESS_KEY,
+                    config=botocore.client.Config(signature_version='s3v4'),
+                )
+                get_object_response = aws_s3_client.get_object(Bucket=AVATAR_BUCKET, Key='default/default.png')
+                return HttpResponse(get_object_response['Body'], content_type="image/jpeg")
+            except Exception as e:
+                print(e)
+                return response.json(500, repr(e))
+        
         fullPath = os.path.join(BASE_DIR, "static", filePath).replace('\\', '/')
         fullPath = os.path.join(BASE_DIR, "static", filePath).replace('\\', '/')
-        defaultPath = os.path.join(BASE_DIR, "static", "User/default.png").replace('\\', '/')
         if os.path.isfile(fullPath):
         if os.path.isfile(fullPath):
             try:
             try:
-                Imagedata = open(fullPath, 'rb').read()
+                imageData = open(fullPath, 'rb').read()
+                return HttpResponse(imageData, content_type="image/jpeg")
             except Exception as e:
             except Exception as e:
                 return response.json(906, repr(e))
                 return response.json(906, repr(e))
-            else:
-                return HttpResponse(Imagedata, content_type="image/jpeg")
         else:
         else:
-            print('----------------')
-            print(defaultPath)
-            print('----------------')
             try:
             try:
-                Imagedata = open(defaultPath, 'rb').read()
+                aws_s3_client = boto3.client(
+                    's3',
+                    region_name=REGION_NAME,
+                    aws_access_key_id=ACCESS_KEY_ID,
+                    aws_secret_access_key=SECRET_ACCESS_KEY,
+                    config=botocore.client.Config(signature_version='s3v4'),
+                )
+                get_object_response = aws_s3_client.get_object(Bucket=AVATAR_BUCKET, Key=filePath)
+                return HttpResponse(get_object_response['Body'], content_type="image/jpeg")
             except Exception as e:
             except Exception as e:
                 return response.json(906, repr(e))
                 return response.json(906, repr(e))
-            else:
-                return HttpResponse(Imagedata, content_type="image/jpeg")
-            # return response.json(907)
 
 
 
 
 @csrf_exempt
 @csrf_exempt