Browse Source

Merge branch 'dev' into lang

lang 3 năm trước cách đây
mục cha
commit
389a5e5d82

+ 1 - 5
AdminController/LogManagementController.py

@@ -77,20 +77,16 @@ class LogManagementView(View):
                 request_qs = request_qs.filter(reason_phrase=reason_phrase)
 
             count = request_qs.count()
-            request_qs = request_qs.order_by('-add_time')  # 根据CDK创建时间降序排序
 
             request_qs = request_qs[(page - 1) * line:page * line]
             qs_list = []
             for requsetobj in request_qs:
-                hh = str(requsetobj.execute_time)
-                if len(hh)>4:
-                    hh = hh[0:4]
                 qs_list.append({
                     'id': requsetobj.id,
                     'method': requsetobj.method,
                     'url': requsetobj.url,
                     'parameter': requsetobj.parameter,
-                    'execute_time': hh,
+                    'execute_time': round(requsetobj.execute_time, 2),  # 时间保留小数点后两位
                     'status_code': requsetobj.status_code,
                     'reason_phrase': requsetobj.reason_phrase,
                     '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 threading
 import logging
+
+import xlwt
 from boto3.session import Session
 from django.http import JsonResponse, HttpResponseRedirect, HttpResponse, StreamingHttpResponse
 from django.views.generic.base import View
 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.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
@@ -35,9 +37,10 @@ class serveManagement(View):
     def validation(self, request_dict, request, operation):
         language = request_dict.get('language', 'en')
         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:
             tko = TokenObject(
                 request.META.get('HTTP_AUTHORIZATION'),
@@ -85,8 +88,8 @@ class serveManagement(View):
                 return self.deleteDevicePackage(userID, request_dict, response)
             elif operation == 'experiencereset':  # 重置设备云存体验
                 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:
                 return response.json(404)
 
@@ -746,6 +749,13 @@ class serveManagement(View):
         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)
+
         pageNo = request_dict.get('pageNo', None)
         pageSize = request_dict.get('pageSize', None)
         if not all([pageNo, pageSize]):
@@ -795,8 +805,26 @@ class serveManagement(View):
                     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)
+                # 过滤套餐关联的UID_Bucket数据
+                uid_bucket_qs = uid_bucket_qs.filter(
+                    uid__in=cg_qs.values('uid'))
+
             list_data = []
             count = uid_bucket_qs.count()
             uid_bucket_qs = uid_bucket_qs[(page - 1) * line:page * line]
@@ -841,9 +869,278 @@ class serveManagement(View):
                     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)
             return response.json(
                 0, {'list': list_data, 'total': count})
         except Exception as e:
             print(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)
             elif operation == 'doDelete':
                 return self.doDelete(userID, request_dict, response)
+            elif operation == 'resetPassword':
+                return self.resetPassword(request_dict, response)
             else:
                 return response.json(404)
 
     def getUserInfo(self, userID, request_dict, response):
         print('request_dict: ', request_dict)
         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)
         pageSize = request_dict.get('pageSize', None)
 
@@ -324,19 +329,18 @@ class UserManagement(View):
         page = int(pageNo)
         line = int(pageSize)
         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():
-                    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:
                 device_user_qs = Device_User.objects.filter()  # 查询全部
@@ -424,4 +428,19 @@ class UserManagement(View):
     def doDelete(self, userID, request_dict, response):
         userID = request_dict.get('userID', '')
         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__))))
 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'
 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.contrib.sessions.middleware.SessionMiddleware',
     'django.middleware.common.CommonMiddleware',
+    'MiddleWare.requestRecord.RequestRecordMiddleware',  # 记录请求信息
     # 'django.middleware.csrf.CsrfViewMiddleware',
     'corsheaders.middleware.CorsPostCsrfMiddleware',
     '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__))))
 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__))))
 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'
 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.AliPayObject import AliPayObject
 from Object.AliSmsObject import AliSmsObject
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
@@ -202,6 +203,7 @@ class CloudStorageView(View):
             qs = qs.filter(pay_type='10')
 
         qs = qs.filter(~Q(pay_type='11'))  # 过滤不显示激活码套餐
+        qs = qs.filter(is_show=0)  #过滤隐藏套餐
         #qs = qs.filter(id='11111111')
         #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'))
@@ -1040,7 +1042,7 @@ class CloudStorageView(View):
 
         # if dv_qs[0]['vodPrimaryUserID'] != '' and dv_qs[0]['vodPrimaryUserID'] != userID:
         #     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',
                    'commodity_type', 'lang__title',
                    'expire', 'commodity_code', 'discount_price', 'bucket__mold')
@@ -1190,7 +1192,8 @@ class CloudStorageView(View):
         rank = request_dict.get('rank', None)
         cdk = request_dict.get('cdk', None)
         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')
             if not cdk_qs.exists():
                 return response.json(10040)
@@ -1199,9 +1202,14 @@ class CloudStorageView(View):
             rank = cdk_qs[0]['rank__id']
             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, '参数有误.')
 
+        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 = dvq.filter(~Q(vodPrimaryUserID='')).values('vodPrimaryUserID')
         if dvq.exists():
@@ -1217,7 +1225,7 @@ class CloudStorageView(View):
 
         orderID = CommonService.createOrderID()
         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')
         if not smqs.exists():
             return response.json(173)
@@ -1310,6 +1318,7 @@ class CloudStorageView(View):
                     sms = 'SMS_219748439'
 
                 self.do_vod_msg_Notice(uid, channel, userID, lang, sys_msg_text_list, sms)
+                redisObj.del_data(key=uid+'do_experience_order')
                 result = returnurl
                 return response.json(0, result)
         except Exception:

+ 59 - 44
Controller/UserManger.py

@@ -1,8 +1,12 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
+import logging
 import os
 import traceback
 
+import boto3
+import botocore
+from botocore import client
 import simplejson as json
 from django.core.files.storage import FileSystemStorage
 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.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 Model.models import Role, Device_User, UserOauth2Model, UserExModel
 from Object.RedisObject import RedisObject
@@ -101,32 +105,33 @@ class perfectUserInfoView(TemplateView):
         userID = tko.userID
         if not userID:
             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)
             if 'userID' and 'password' and 'is_superuser' in dataValid.keys():
                 return response.json(444)
-        if userIconPath == None and userContent == None:
+        if not userIconPath and not userContent:
             return response.json(444)
-        elif userIconPath == None and userContent != None:
+        elif not userIconPath and 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)
         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 userContent:
@@ -139,24 +144,21 @@ class perfectUserInfoView(TemplateView):
             return response.json(104)
         userIconPath = kwargs.get('userIconPath', 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:
                 UserData = json.loads(userContent)
             except Exception as e:
                 return response.json(444, repr(e))
         try:
-            if userIconPath is not None and userContent is not None:
+            if userIconPath and userContent:
                 User.update(userIconPath=userIconPath, userIconUrl=userIconUrl, **UserData)
-            elif userIconPath is None and userContent is not None:
+            elif not userIconPath and userContent:
                 User.update(**UserData)
-            elif userIconPath is not None and userContent is None:
+            elif userIconPath and not userContent:
                 User.update(userIconPath=userIconPath, userIconUrl=userIconUrl)
         except Exception as e:
-            errorInfo = traceback.format_exc()
-            print('修改设备信息错误: %s ' % errorInfo)
             return response.json(117, repr(e))
         else:
             res = CommonService.qs_to_dict(User)
@@ -164,10 +166,7 @@ class perfectUserInfoView(TemplateView):
                 res['datas'][k]['fields'].pop('password')
                 userIconPath = res['datas'][k]['fields']['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)
 
 
@@ -190,28 +189,44 @@ class getAvatarView(TemplateView):
 
     def getAvatar(self, filePath):
         response = ResponseObject()
-        if filePath == '' or filePath == None:
+        if not filePath:
             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('\\', '/')
-        defaultPath = os.path.join(BASE_DIR, "static", "User/default.png").replace('\\', '/')
         if os.path.isfile(fullPath):
             try:
-                Imagedata = open(fullPath, 'rb').read()
+                imageData = open(fullPath, 'rb').read()
+                return HttpResponse(imageData, content_type="image/jpeg")
             except Exception as e:
                 return response.json(906, repr(e))
-            else:
-                return HttpResponse(Imagedata, content_type="image/jpeg")
         else:
-            print('----------------')
-            print(defaultPath)
-            print('----------------')
             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:
                 return response.json(906, repr(e))
-            else:
-                return HttpResponse(Imagedata, content_type="image/jpeg")
-            # return response.json(907)
 
 
 @csrf_exempt