Преглед на файлове

Merge branch 'dev' of http://192.168.136.99:3000/servers/ASJServer into dev

lang преди 4 години
родител
ревизия
cd06db51b2
променени са 6 файла, в които са добавени 836 реда и са изтрити 23 реда
  1. 724 0
      AdminController/ServeManagementController.py
  2. 81 0
      AdminController/TestServeController.py
  3. 2 2
      AdminController/UserManageController.py
  4. 7 2
      Ansjer/urls.py
  5. 21 13
      Controller/CloudStorage.py
  6. 1 6
      Service/CloudLogs.py

+ 724 - 0
AdminController/ServeManagementController.py

@@ -0,0 +1,724 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import hashlib
+import json
+import time
+import urllib
+import uuid
+import boto3
+import threading
+import logging
+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
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Object.UidTokenObject import UidTokenObject
+from Service.CommonService import CommonService
+from django.db.models import Q, F
+from time import strftime
+
+
+class serveManagement(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):
+        language = request_dict.get('language', 'en')
+        response = ResponseObject(language, 'pc')
+        if operation == '??':
+            return 0
+        else:
+            tko = TokenObject(
+                request.META.get('HTTP_AUTHORIZATION'),
+                returntpye='pc')
+            if tko.code != 0:
+                return response.json(tko.code)
+            response.lang = tko.lang
+            userID = tko.userID
+            if operation == 'getVodBucketList':
+                return self.getVodBucketList(userID, request_dict, response)
+            elif operation == 'addOrEditVodBucket':
+                return self.addOrEditVodBucket(userID, request_dict, response)
+            elif operation == 'deleteVodBucket':
+                return self.deleteVodBucket(userID, request_dict, response)
+            elif operation == 'getStoreMealList':
+                return self.getStoreMealList(userID, request_dict, response)
+            elif operation == 'addOrEditStoreMeal':
+                return self.addOrEditStoreMeal(userID, request_dict, response)
+            elif operation == 'deleteStoreMeal':
+                return self.deleteStoreMeal(userID, request_dict, response)
+            elif operation == 'getStoreMealLanguage':
+                return self.getStoreMealLanguage(
+                    userID, request_dict, response)
+            elif operation == 'addOrEditStoreMealLanguage':
+                return self.addOrEditStoreMealLanguage(
+                    userID, request_dict, response)
+            elif operation == 'deleteStoreMealLanguage':
+                return self.deleteStoreMealLanguage(
+                    userID, request_dict, response)
+            elif operation == 'getCdkList':
+                return self.getCdkList(userID, request_dict, response)
+            elif operation == 'createCdk':
+                return self.createCdk(request_dict, response)
+            elif operation == 'deleteCdk':
+                return self.deleteCdk(request_dict, response)
+            elif operation == 'downloadCDK':
+                return self.downloadCDK(request_dict, response)
+            elif operation == 'getDeviceOrderList':
+                return self.getDeviceOrderList(request_dict, response)
+            elif operation == 'deleteDeviceOrder':
+                return self.deleteDeviceOrder(userID, request_dict, response)
+            elif operation == 'getDevicePackageList':
+                return self.getDevicePackageList(request_dict, response)
+            elif operation == 'deleteDevicePackage':
+                return self.deleteDevicePackage(userID, request_dict, response)
+            elif operation == 'experiencereset':  # 重置设备云存体验
+                return self.do_experience_reset(request_dict, userID, response)
+            else:
+                return response.json(404)
+
+    def getVodBucketList(self, userID, request_dict, response):
+        # 查询存储桶数据
+        print('request_dict: ', request_dict)
+
+        isSelect = request_dict.get('isSelect', None)
+        if isSelect:
+            # 获取全部数据作为存储桶选项
+            vod_bucket_qs = VodBucketModel.objects.all().values('id', 'bucket')
+            return response.json(
+                0, {'list': CommonService.qs_to_list(vod_bucket_qs)})
+
+        bucket = request_dict.get('bucket', None)
+        mold = request_dict.get('mold', None)
+        is_free = request_dict.get('is_free', None)
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            if bucket or mold or is_free:   # 条件查询
+                if bucket:
+                    vod_bucket_qs = VodBucketModel.objects.filter(
+                        bucket=bucket)
+                elif mold:
+                    vod_bucket_qs = VodBucketModel.objects.filter(
+                        mold=int(mold))
+                elif is_free:
+                    vod_bucket_qs = VodBucketModel.objects.filter(
+                        is_free=int(is_free))
+            else:   # 查询全部
+                vod_bucket_qs = VodBucketModel.objects.filter().all()
+            total = len(vod_bucket_qs)
+            vod_buckets = vod_bucket_qs[(page - 1) * line:page * line]
+            vod_bucket_list = []
+            for vod_bucket in vod_buckets:
+                vod_bucket_list.append({
+                    'bucketID': vod_bucket.id,
+                    'bucket': vod_bucket.bucket,
+                    'content': vod_bucket.content,
+                    'mold': vod_bucket.mold,
+                    'area': vod_bucket.area,
+                    'region': vod_bucket.region,
+                    'endpoint': vod_bucket.endpoint,
+                    'is_free': vod_bucket.is_free,
+                    'storeDay': vod_bucket.storeDay,
+                    'region_id': vod_bucket.region_id,
+                    'addTime': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(vod_bucket.addTime)),
+                    'updTime': time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(vod_bucket.updTime)),
+                })
+            print('vod_bucket_list: ', vod_bucket_list)
+            return response.json(
+                0, {'list': vod_bucket_list, 'total': total})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def addOrEditVodBucket(self, userID, request_dict, response):
+        # 添加/编辑存储桶
+        print('request_dict: ', request_dict)
+        bucketID = request_dict.get('bucketID', None)
+        bucket = request_dict.get('bucket', '').strip()   # 移除字符串头尾的空格
+        content = request_dict.get('content', '').strip()
+        mold = int(request_dict.get('mold', 1))
+        area = request_dict.get('area', '').strip()
+        region = request_dict.get('region', '').strip()
+        endpoint = request_dict.get('endpoint', '').strip()
+        is_free = int(request_dict.get('is_free', 0))
+        storeDay = int(request_dict.get('storeDay', 0))
+        region_id = int(request_dict.get('region_id', 1))
+        isEdit = request_dict.get('isEdit', None)
+
+        if not all([bucket, content, area, region, endpoint]):
+            return response.json(444)
+
+        try:
+            now_time = int(time.time())
+            vod_bucket_data = {
+                'bucket': bucket,
+                'content': content,
+                'mold': mold,
+                'area': area,
+                'region': region,
+                'endpoint': endpoint,
+                'is_free': is_free,
+                'storeDay': storeDay,
+                'region_id': region_id,
+            }
+            if isEdit:
+                if not bucketID:
+                    return response.json(444)
+                vod_bucket_data['updTime'] = now_time
+                VodBucketModel.objects.filter(
+                    id=bucketID).update(
+                    **vod_bucket_data)
+            else:
+                vod_bucket_data['addTime'] = now_time
+                VodBucketModel.objects.create(**vod_bucket_data)
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def deleteVodBucket(self, userID, request_dict, response):
+        # 删除存储桶
+        print('request_dict: ', request_dict)
+        bucketID = request_dict.get('bucketID', None)
+        if not bucketID:
+            return response.json(444)
+        try:
+            VodBucketModel.objects.filter(id=bucketID).delete()
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def getStoreMealList(self, userID, request_dict, response):
+        # 获取云存套餐信息数据
+        print('request_dict: ', request_dict)
+
+        isSelect = request_dict.get('isSelect', None)
+        if isSelect:
+            # 获取套餐ID作为选项
+            store_meal_qs = Store_Meal.objects.all().values('id', 'bucket__bucket')
+            return response.json(
+                0, {'list': CommonService.qs_to_list(store_meal_qs)})
+
+        bucket = request_dict.get('bucket', None)
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            if bucket:   # 条件查询
+                bucket_id = VodBucketModel.objects.filter(
+                    bucket=bucket).values('id')[0]['id']
+                store_meal_qs = Store_Meal.objects.filter(
+                    bucket_id=bucket_id)
+            else:   # 查询全部
+                store_meal_qs = Store_Meal.objects.filter()
+            store_meal_val = store_meal_qs.values(
+                'id',
+                'bucket__bucket',
+                'day',
+                'expire',
+                'commodity_type',
+                'commodity_code',
+                'is_discounts',
+                'discount_price',
+                'virtual_price',
+                'price',
+                'currency',
+                'symbol',
+                'is_show',
+                'add_time',
+                'update_time')
+            total = len(store_meal_val)
+            store_meals = store_meal_val[(page - 1) * line:page * line]
+            store_meal_list = []
+            for store_meal in store_meals:
+                # 获取支付方式列表
+                pay_type_list = [
+                    pay_type['id'] for pay_type in Store_Meal.objects.get(
+                        id=store_meal['id']).pay_type.values('id')]
+                # 组织响应数据
+                store_meal_list.append({
+                    'storeMealID': store_meal['id'],
+                    'bucket': store_meal['bucket__bucket'],
+                    'day': store_meal['day'],
+                    'expire': store_meal['expire'],
+                    'commodity_type': store_meal['commodity_type'],
+                    'pay_type': pay_type_list,
+                    'commodity_code': store_meal['commodity_code'],
+                    'is_discounts': store_meal['is_discounts'],
+                    'discount_price': store_meal['discount_price'],
+                    'virtual_price': store_meal['virtual_price'],
+                    'price': store_meal['price'],
+                    'currency': store_meal['currency'],
+                    'symbol': store_meal['symbol'],
+                    'is_show': store_meal['is_show'],
+                    'addTime': store_meal['add_time'].strftime("%Y-%m-%d %H:%M:%S"),
+                    'updTime': store_meal['update_time'].strftime("%Y-%m-%d %H:%M:%S"),
+                })
+            print('store_meal_list: ', store_meal_list)
+            return response.json(
+                0, {'list': store_meal_list, 'total': total})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def addOrEditStoreMeal(self, userID, request_dict, response):
+        # 添加/编辑套餐
+        print('request_dict: ', request_dict)
+        storeMealID = request_dict.get('storeMealID', None)
+        bucket = request_dict.get('bucket', '')
+        day = int(request_dict.get('day', 0))
+        expire = int(request_dict.get('expire', 0))
+        commodity_type = int(request_dict.get('commodity_type', 0))
+        pay_type = request_dict.get(
+            'pay_type', '')[
+            1:-1].split(',')    # '[1,2]' -> ['1','2']
+        commodity_code = request_dict.get('commodity_code', '')
+        is_discounts = int(request_dict.get('is_discounts', 0))
+        discount_price = request_dict.get('discount_price', '')
+        virtual_price = request_dict.get('virtual_price', '')
+        price = request_dict.get('price', '')
+        currency = request_dict.get('currency', '')
+        symbol = request_dict.get('symbol', '')
+        is_show = int(request_dict.get('is_show', 0))
+        isEdit = request_dict.get('isEdit', None)
+
+        if not all([bucket, pay_type, price, currency, symbol]):
+            return response.json(444)
+
+        try:
+            bucket_id = VodBucketModel.objects.filter(
+                bucket=bucket).values('id')[0]['id']
+            store_meal_data = {
+                'bucket_id': bucket_id,
+                'day': day,
+                'expire': expire,
+                'commodity_type': commodity_type,
+                'commodity_code': commodity_code,
+                'is_discounts': is_discounts,
+                'discount_price': discount_price,
+                'virtual_price': virtual_price,
+                'price': price,
+                'currency': currency,
+                'symbol': symbol,
+                'is_show': is_show,
+            }
+            if isEdit:
+                if not storeMealID:
+                    return response.json(444)
+                Store_Meal.objects.filter(
+                    id=storeMealID).update(
+                    **store_meal_data)
+                Store_Meal.objects.get(id=storeMealID).pay_type.set(pay_type)
+            else:
+                Store_Meal.objects.create(
+                    **store_meal_data).pay_type.set(pay_type)
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def deleteStoreMeal(self, userID, request_dict, response):
+        # 删除套餐信息
+        print('request_dict: ', request_dict)
+        storeMealID = request_dict.get('storeMealID', None)
+        if not storeMealID:
+            return response.json(444)
+        try:
+            Store_Meal.objects.filter(id=storeMealID).delete()
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def getStoreMealLanguage(self, userID, request_dict, response):
+        # 获取套餐语言
+        print('request_dict: ', request_dict)
+        storeMealID = request_dict.get('storeMealID', None)
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            if storeMealID:   # 条件查询
+                store_meal_lang_qs = Store_Meal.objects.filter(id=storeMealID)
+            else:   # 查询全部
+                store_meal_lang_qs = Store_Meal.objects.filter(
+                    lang__isnull=False)
+            store_meal_lang_val = store_meal_lang_qs.values(
+                'id',
+                'lang__id',
+                'lang__lang',
+                'lang__title',
+                'lang__content',
+                'lang__discount_content',
+            )
+            total = len(store_meal_lang_val)
+            store_meal_langs = store_meal_lang_val[(
+                page - 1) * line:page * line]
+            store_meal_lang_list = []
+            for store_meal_lang in store_meal_langs:
+                store_meal_lang_list.append({
+                    'storeMealID': store_meal_lang['id'],
+                    'langID': store_meal_lang['lang__id'],
+                    'lang': store_meal_lang['lang__lang'],
+                    'title': store_meal_lang['lang__title'],
+                    'content': store_meal_lang['lang__content'],
+                    'discountContent': store_meal_lang['lang__discount_content'],
+                })
+            print('store_meal_lang_list: ', store_meal_lang_list)
+            return response.json(
+                0, {'list': store_meal_lang_list, 'total': total})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def addOrEditStoreMealLanguage(self, userID, request_dict, response):
+        # 添加/编辑套餐语言
+        print('request_dict: ', request_dict)
+        storeMealID = request_dict.get('storeMealID', None)
+        lang = request_dict.get('lang', None)
+        title = request_dict.get('title', None)
+        content = request_dict.get('content', None)
+        discount_content = request_dict.get('discount_content', '')
+        isEdit = request_dict.get('isEdit', None)
+
+        if not all([storeMealID, lang, title, content]):
+            return response.json(444)
+
+        try:
+            # 查询套餐是否存在
+            store_meal_qs = Store_Meal.objects.get(id=storeMealID)
+            if not store_meal_qs:
+                return response.json(173)
+            if isEdit:  # 编辑
+                langID = request_dict.get('langID', None)
+                if not langID:
+                    return response.json(444)
+                Lang.objects.filter(
+                    id=langID).update(
+                    lang=lang,
+                    title=title,
+                    content=content,
+                    discount_content=discount_content)
+            else:   # 添加
+                lang_obj = Lang.objects.filter(
+                    lang=lang,
+                    title=title,
+                    content=content,
+                    discount_content=discount_content)
+                if not lang_obj.exists():
+                    # 数据不存在,lang表创建数据
+                    Lang.objects.create(
+                        lang=lang,
+                        title=title,
+                        content=content,
+                        discount_content=discount_content)
+                    lang_obj = Lang.objects.filter(
+                        lang=lang,
+                        title=title,
+                        content=content,
+                        discount_content=discount_content)
+                store_meal_qs.lang.add(*lang_obj)  # store_meal表添加语言数据
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def deleteStoreMealLanguage(self, userID, request_dict, response):
+        # 删除套餐语言
+        storeMealID = request_dict.get('storeMealID', None)
+        langID = request_dict.get('langID', None)
+
+        if not all([storeMealID, langID]):
+            return response.json(444)
+
+        try:
+            storeMeal_qs = Store_Meal.objects.get(id=storeMealID)
+            if not storeMeal_qs:
+                return response.json(173)
+            lang_qs = Lang.objects.filter(id=langID)
+            storeMeal_qs.lang.remove(*lang_qs)
+            return response.json(0)
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def getCdkList(self, userID, request_dict, response):
+        # 获取激活码列表
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+        cdk = request_dict.get('cdk', None)
+        order = request_dict.get('order', None)
+        is_activate = request_dict.get('is_activate', None)
+        mold = request_dict.get('mold', None)
+        lang = request_dict.get('lang', 'cn')
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            if cdk:
+                searchVal = cdk.strip()
+            if order:
+                searchVal = order.strip()
+            if is_activate:
+                searchVal = is_activate.strip()
+
+            cdk_qs = CDKcontextModel.objects.filter().all()
+            if cdk:
+                cdk_qs = cdk_qs.filter(cdk__contains=searchVal)
+            if order:
+                cdk_qs = cdk_qs.filter(order__contains=searchVal)
+            if is_activate:
+                cdk_qs = cdk_qs.filter(is_activate=searchVal)
+            if mold:
+                cdk_qs = cdk_qs.filter(rank__bucket__mold=mold)
+
+            cdk_qs = cdk_qs.filter(rank__lang__lang=lang)
+            cdk_qs = cdk_qs.annotate(rank__title=F('rank__lang__title'))
+            cdk_qs = cdk_qs.values(
+                'id',
+                'cdk',
+                'create_time',
+                'valid_time',
+                'is_activate',
+                'rank__id',
+                'rank__title',
+                'order',
+                'create_time',
+                'rank__bucket__mold')
+            cdk_qs = cdk_qs.order_by('-create_time')  # 根据CDK创建时间降序排序
+            count = cdk_qs.count()
+            cdk_qs = cdk_qs[(page - 1) * line:page * line]
+            return response.json(
+                0, {'list': list(cdk_qs), 'total': count})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def createCdk(self, request_dict, response):
+        cdk_num = request_dict.get("cdknum", None)
+        mold = request_dict.get('mold', None)
+        order = request_dict.get('order', None)
+        cdk_list = []
+        sm_qs = Store_Meal.objects.filter(
+            pay_type__payment='cdk_pay', bucket__mold=mold)
+        if sm_qs.exists:
+            rank = sm_qs[0].id
+            for i in range(int(cdk_num)):
+                nowTime = int(time.time())
+                cdk = hashlib.md5((str(uuid.uuid1()) +
+                                   str(nowTime)).encode('utf-8')).hexdigest()
+                cdk_model = CDKcontextModel(
+                    cdk=cdk,
+                    create_time=nowTime,
+                    valid_time=0,
+                    is_activate=0,
+                    rank_id=rank,
+                    order=order,
+                )
+                cdk_list.append(cdk_model)
+            try:
+                CDKcontextModel.objects.bulk_create(cdk_list)
+            except Exception as e:
+                print(repr(e))
+                return response.json(404, repr(e))
+            else:
+                return response.json(0)
+
+        return response.json(0)
+
+    def deleteCdk(self, request_dict, response):
+        cdk_id = request_dict.get("id", None)
+        try:
+            CDKcontextModel.objects.get(id=cdk_id).delete()
+            return response.json(0)
+        except Exception as e:
+            return response.json(500, repr(e))
+
+    def downloadCDK(self, request_dict, response):
+        region = request_dict.get('region', None)
+        content = ''
+        if region == 'cn':
+            # 下载国内未使用激活码
+            content += '激活码(国内)\n'
+            cdk_inactivate_qs = CDKcontextModel.objects.filter(
+                is_activate=0, rank__bucket__mold=0).values('cdk')
+        else:
+            # 下载国外未使用激活码
+            content += '激活码(国外)\n'
+            cdk_inactivate_qs = CDKcontextModel.objects.filter(
+                is_activate=0, rank__bucket__mold=1).values('cdk')
+        for cdk_inactivate in cdk_inactivate_qs:
+            content += cdk_inactivate['cdk'] + '\n'
+        # print(content)
+
+        response = StreamingHttpResponse(content)
+        response['Content-Type'] = 'application/octet-stream'
+        response['Content-Disposition'] = 'attachment;filename="CDK.txt"'
+        return response
+
+    def getDeviceOrderList(self, request_dict, response):
+        print('request_dict: ', request_dict)
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        orderID = request_dict.get('orderID', None)
+        userID__username = request_dict.get('userID__username', None)
+        currency = request_dict.get('currency', None)
+        payType = request_dict.get('payType', None)
+        status = request_dict.get('status', None)
+        timeRange = request_dict.getlist('timeRange[]', None)
+
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            omqs = Order_Model.objects.all()
+            # 筛选指定设备id的订单
+            if uid:
+                omqs = omqs.filter(UID=uid)
+            if channel:
+                omqs = omqs.filter(channel=channel)
+            if orderID:
+                omqs = omqs.filter(orderID=orderID)
+            if userID__username:
+                omqs = omqs.filter(userID__username=userID__username)
+            if currency:
+                omqs = omqs.filter(currency=currency)
+            if payType:
+                omqs = omqs.filter(payType=payType)
+            if status:
+                omqs = omqs.filter(status=status)
+            if timeRange:
+                startTime, endTime = int(timeRange[0][:-3]), int(timeRange[1][:-3])
+                omqs = omqs.filter(addTime__gte=startTime, addTime__lte=endTime)
+            if not omqs.exists():
+                return response.json(0, [])
+
+            count = omqs.count()
+
+            order_ql = omqs.values(
+                "orderID",
+                "UID",
+                "userID__username",
+                "channel",
+                "desc",
+                "price",
+                "currency",
+                "addTime",
+                "updTime",
+                "paypal",
+                "payType",
+                "rank__day",
+                "rank__price",
+                "status")
+            order_ql = order_ql.order_by('-addTime')  # 根据CDK创建时间降序排序
+            order_ql = order_ql[(page - 1) * line:page * line]
+            return response.json(
+                0, {'list': list(order_ql), 'total': count})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def deleteDeviceOrder(self, userID, request_dict, response):
+        orderID = request_dict.get('orderID', None)
+
+        if orderID:
+            Order_Model.objects.filter(orderID=orderID).delete()
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def getDevicePackageList(self, request_dict, response):
+        pageNo = request_dict.get('pageNo', None)
+        pageSize = request_dict.get('pageSize', None)
+        uid = request_dict.get('uid', None)
+        if not all([pageNo, pageSize]):
+            return response.json(444)
+
+        page = int(pageNo)
+        line = int(pageSize)
+        try:
+            ubqs = UID_Bucket.objects.all()
+            if uid:
+                ubqs = ubqs.filter(uid__contains=uid)
+
+            if not ubqs.exists():
+                return response.json(0, [])
+
+            count = ubqs.count()
+            ubqs = ubqs.values(
+                'id',
+                'uid',
+                'channel',
+                'status',
+                'endTime',
+                'bucket__bucket',
+                'bucket__storeDay',
+                'bucket__area')
+
+            ubqs = ubqs.order_by('-addTime')  # 根据CDK创建时间降序排序
+            ubqs = ubqs[(page - 1) * line:page * line]
+            return response.json(
+                0, {'list': list(ubqs), 'total': count})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))
+
+    def deleteDevicePackage(self, userID, request_dict, response):
+        orderID = request_dict.get('orderID', None)
+
+        if orderID:
+            Order_Model.objects.filter(orderID=orderID).delete()
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    # 重置设备云存体验
+    def do_experience_reset(self, request_dict, userID, response):
+        bid = request_dict.get("id", None)
+        ubq = UID_Bucket.objects.filter(id=bid)
+        if ubq:
+            eq = ExperienceContextModel.objects.filter(uid=ubq[0].uid)
+            if eq:
+                eq.delete()
+                Order_Model.objects.filter(uid_bucket_id=bid).delete()
+                ubq.delete()
+                return response.json(0)
+            else:
+                return response.json(10007)
+
+        else:
+            return response.json(0, '重置云存体验失败')

+ 81 - 0
AdminController/TestServeController.py

@@ -0,0 +1,81 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+
+
+import json
+import time
+import urllib
+import uuid
+import boto3
+import threading
+import logging
+from boto3.session import Session
+from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
+from django.views.generic.base import View
+from Model.models import Device_Info, Role, MenuModel
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Object.UidTokenObject import UidTokenObject
+from Service.CommonService import CommonService
+from django.db.models import Q, F
+from time import strftime
+
+
+class TestServeView(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):
+        language = request_dict.get('language', 'en')
+        response = ResponseObject(language, 'pc')
+        if operation == '??':
+            return 0
+        else:
+            tko = TokenObject(
+                request.META.get('HTTP_AUTHORIZATION'),
+                returntpye='pc')
+            # if tko.code != 0:
+            #     return response.json(tko.code)
+            response.lang = tko.lang
+            userID = tko.userID
+            if operation == 'AItest':
+                return self.AItest(userID, request, request_dict, response)
+            if operation == 'doEdit':
+                return self.doEdit(userID, request_dict, response)
+            if operation == 'doDelete':
+                return self.doDelete(userID, request_dict, response)
+            else:
+                return response.json(404)
+
+    def AItest(self, userID, request, request_dict, response):
+        file = request.FILES.get('file', None)
+        if not file:
+            return response.json(444)
+        maxLabels = int(request_dict.get('maxLabels', 5))
+        minConfidence = float(request_dict.get('minConfidence', 55))
+
+        try:
+            client = boto3.client(
+                'rekognition',
+                aws_access_key_id='AKIA2E67UIMD6JD6TN3J',
+                aws_secret_access_key='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',
+                region_name='us-east-1')
+            # doc:
+            # https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rekognition.html#Rekognition.Client.detect_labels
+            rekognition_res = client.detect_labels(
+                Image={
+                    'Bytes': file.read()},
+                MaxLabels=maxLabels,
+                MinConfidence=minConfidence)
+            print('rekognition_res: ', rekognition_res)
+            return response.json(0, {'rekognition_res': rekognition_res})
+        except Exception as e:
+            print(e)
+            return response.json(500, repr(e))

+ 2 - 2
AdminController/UserManageController.py

@@ -340,7 +340,7 @@ class UserManagement(View):
 
             else:
                 device_user_qs = Device_User.objects.filter().all()  # 查询全部
-            count = device_user_qs.count()
+            total = len(device_user_qs)
             device_users = device_user_qs[(page - 1) * line:page * line]
             user_list = []
             for device_user in device_users:
@@ -358,7 +358,7 @@ class UserManagement(View):
                     'online': device_user.online,
                 })
             print('user_list: ', user_list)
-            return response.json(0, {'list': user_list, 'total': count})
+            return response.json(0, {'list': user_list, 'total': total})
         except Exception as e:
             print(e)
             return response.json(500, repr(e))

+ 7 - 2
Ansjer/urls.py

@@ -19,7 +19,8 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     OrderTaskController, HistoryUIDController, UIDManageUserController, SerialNumberController, CompanyController, \
     RegionController, VPGController, LanguageController, TestController, DeviceConfirmRegion, S3GetStsController, \
     DetectControllerV2, ShadowController, TestDetectController, PcInfo, PctestController, DeviceDebug
-from AdminController import UserManageController, RoleController, MenuController
+from AdminController import UserManageController, RoleController, MenuController, TestServeController, \
+    ServeManagementController
 
 urlpatterns = [
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
@@ -344,8 +345,12 @@ urlpatterns = [
     #角色管理
     re_path('roleManagement/(?P<operation>.*)', RoleController.RoleView.as_view()),
 
-    #菜单管理
+    # 菜单管理
     re_path('menuManagement/(?P<operation>.*)', MenuController.MenuView.as_view()),
+    # 服务管理
+    re_path('serveManagement/(?P<operation>.*)', ServeManagementController.serveManagement.as_view()),
+    # 测试服务
+    re_path('testServe/(?P<operation>.*)', TestServeController.TestServeView.as_view()),
 
     #后台界面接口 -----------------------------------------------------
     re_path('(?P<path>.*)', LogManager.errorPath),

+ 21 - 13
Controller/CloudStorage.py

@@ -786,7 +786,7 @@ class CloudStorageView(View):
 
                     order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
                     datetime = time.strftime("%Y-%m-%d", time.localtime())
-                    sys_msg_text_list = ['温馨提示:尊敬的客户,您的'+UID+'设备在'+datetime+'已成功购买云存套餐', 'Warm tips: Dear customers, your '+UID+' device has successfully purchased the cloud storage package in '+datetime]
+                    sys_msg_text_list = ['温馨提示:尊敬的客户,您的'+UID+'设备在'+datetime+'已成功购买云存套餐', 'Dear customer,you already subscribed the cloud storage package successfully for device ' + UID + ' on '+ time.strftime("%b %dth,%Y", time.localtime())]
                     self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list, 'SMS_219738485')
                     red_url = "{SERVER_DOMAIN_SSL}web/paid2/success.html".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL)
                     if lang != 'cn':
@@ -894,7 +894,8 @@ class CloudStorageView(View):
                 order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
                 datetime = time.strftime("%Y-%m-%d", time.localtime())
                 sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + UID + '设备在' + datetime + '已成功购买云存套餐',
-                                     'Warm tips: Dear customers, your '+UID+' device has successfully purchased the cloud storage package in '+datetime]
+                                     'Dear customer,you already subscribed the cloud storage package successfully for device ' + UID + ' on ' + time.strftime(
+                                         "%b %dth,%Y", time.localtime())]
 
                 self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list, 'SMS_219738485')
 
@@ -997,7 +998,9 @@ class CloudStorageView(View):
                     order_qs.update(status=1, updTime=nowTime, uid_bucket_id=uid_bucket_id)
                     datetime = time.strftime("%Y-%m-%d", time.localtime())
                     sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + UID + '设备在' + datetime + '已成功购买云存套餐',
-                                         'Warm tips: Dear customers, your '+UID+' device has successfully purchased the cloud storage package in '+datetime]
+                                         'Dear customer,you already subscribed the cloud storage package successfully for device ' + UID + ' on ' + time.strftime(
+                                             "%b %dth,%Y", time.localtime())]
+
                     self.do_vod_msg_Notice(UID, channel, userid, lang, sys_msg_text_list, 'SMS_219738485')
                     return HttpResponse(pay.xml_to_dict({'return_code': 'SUCCESS', 'return_msg': 'OK'}))
             else:
@@ -1278,7 +1281,9 @@ class CloudStorageView(View):
                 sms = 'SMS_219738485'
                 datetime = time.strftime("%Y-%m-%d", time.localtime())
                 sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + uid + '设备在' + datetime + '已成功购买云存套餐',
-                                     'Warm tips: Dear customers, your '+uid+' device has successfully purchased the cloud storage package in '+datetime]
+                                     'Dear customer,you already subscribed the cloud storage package successfully for device ' + uid + ' on ' + time.strftime(
+                                         "%b %dth,%Y", time.localtime())]
+
                 # return response.json(0)
                 returnurl = "{SERVER_DOMAIN_SSL}cloudstorage/payOK?lang={lang}".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL,lang=lang)
                 if pay_type == 10:
@@ -1289,9 +1294,9 @@ class CloudStorageView(View):
                     )
                     returnurl = "{SERVER_DOMAIN_SSL}cloudstorage/payOK?paytype=10&lang={lang}".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL,lang=lang)
                     datetime = time.strftime("%Y-%m-%d", time.localtime())
-                    sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + uid + '设备在' + datetime + '已成功体验云存',
-                                         'Warm tips: respected customers, your '+uid+' device has successfully experienced cloud storage in '+datetime]
-                    sms = 'SMS_219743364'
+                    sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + uid + '设备在' + datetime + '已成功开通云存体验套餐',
+                                         'Dear customer,you already subscribed the free trial cloud storage service successfully for device ' + uid + ' on '+ time.strftime("%b %dth,%Y", time.localtime())]
+                    sms = 'SMS_222870823'
                 if pay_type == 11:
                     update_dict = {}
                     update_dict['is_activate'] = 1
@@ -1300,8 +1305,8 @@ class CloudStorageView(View):
                     returnurl = "{SERVER_DOMAIN_SSL}cloudstorage/payOK?paytype=11&lang={lang}".format(SERVER_DOMAIN_SSL=SERVER_DOMAIN_SSL,lang=lang)
 
                     datetime = time.strftime("%Y-%m-%d", time.localtime())
-                    sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + uid + '设备在' + datetime + '已成功兑换云存',
-                                         'Warm tips: Dear customers, your '+uid+' device has been successfully converted to cloud deposit at '+datetime]
+                    sys_msg_text_list = ['温馨提示:尊敬的客户,您的' + uid + '设备在' + datetime + '已成功兑换云存套餐',
+                                         'Dear customer, you already redeemed for the cloud storage package successfully for device ' +uid +' on '+time.strftime("%b %dth,%Y", time.localtime())]
                     sms = 'SMS_219748439'
 
                 self.do_vod_msg_Notice(uid, channel, userID, lang, sys_msg_text_list, sms)
@@ -1375,9 +1380,12 @@ class CloudStorageView(View):
         if has_unused == 1:
             unuseds = Unused_Uid_Meal.objects.filter(uid=uid).annotate(unused_id=F('id')) \
                 .values("unused_id","uid","bucket__content","num","bucket__id","expire")
+            month = 'month' if lang != 'cn' else '个月'
             for ub in unuseds:
-                storage_time = ub['num'] *  ub['expire']
-                storage = "{storage_time}个月".format(storage_time=storage_time)
+                storage_time = ub['num'] * ub['expire']
+                if lang != 'cn' and storage_time > 1:   # 英文大于一个月使用复数
+                    month += 's'
+                storage = "{storage_time}{month}".format(storage_time=storage_time, month=month)
                 unused_dict = {
                     "id":ub['unused_id'],
                     "uid":ub['uid'],
@@ -1521,7 +1529,7 @@ class CloudStorageView(View):
                     if ub['bucket__area'] == 'cn':
                         sys_msg_text = "温馨提示:尊敬的客户,您" + ub['uid'] + "设备的云存套餐将在" + time.strftime("%Y-%m-%d", time.localtime(ub['endTime'])) + "到期"
                     else:
-                        sys_msg_text = "Warm tips: Dear customers, the cloud storage package of your " + ub['uid'] + " device will expire at " + time.strftime("%Y-%m-%d", time.localtime(ub['endTime']))
+                        sys_msg_text = 'Dear customer,the cloud storage package for your device '+ub['uid']+' will expire on '+time.strftime('%m-%d-%y',time.localtme(ub['endTime']))
                     uq_list.append(SysMsgModel(
                         userID_id=oo['userID_id'],
                         addTime=now_time,
@@ -1668,7 +1676,7 @@ class CloudStorageView(View):
 
     def sendMessage(self, phone , params, temp_msg):
             # 购买成功
-            sign_ms = 'Ansjer'
+            sign_ms = '周视'
             # 发送手机验证码
             aliSms = AliSmsObject()
             res = aliSms.send_code_sms_cloud(phone=phone, params = params, sign_name=sign_ms,

+ 1 - 6
Service/CloudLogs.py

@@ -26,13 +26,8 @@ def batch_add_log_ctr(request, status_code):
         request_dict = request.POST
     else:
         return
-    api_list = [
-        'cloudstorage/getsignsts',
-        'cloudstorage/storeplaylist',
-        'cloudstorage/queryvodlist',
-    ]
     request_path = request.path.strip().strip('/')
-    if request_path in api_list:
+    if 'cloudstorage' in request_path :
         user = MiscellService.get_access_name(request_dict)
         uidToken = request_dict.get('uidToken', None)
         utko = UidTokenObject(uidToken)