Эх сурвалжийг харах

Merge branch 'dev' into lang

# Conflicts:
#	Controller/TestApi.py
lang 4 жил өмнө
parent
commit
119ab77d08
47 өөрчлөгдсөн 5129 нэмэгдсэн , 215 устгасан
  1. 16 0
      Ansjer/asgi.py
  2. 179 8
      Ansjer/config.py
  3. 46 0
      Ansjer/generacode.py
  4. 27 0
      Ansjer/push_element_into_redis.py
  5. 25 3
      Ansjer/urls.py
  6. 16 0
      Ansjer/wsgi.py
  7. 14 3
      Controller/CloudStorage.py
  8. 67 8
      Controller/Cloudsum.py
  9. 226 0
      Controller/CompanyController.py
  10. 1 0
      Controller/DetectController.py
  11. 8 5
      Controller/EquipmentManager.py
  12. 2 2
      Controller/EquipmentManagerV2.py
  13. 31 7
      Controller/EquipmentManagerV3.py
  14. 10 11
      Controller/EquipmentOTA.py
  15. 541 0
      Controller/FileController.py
  16. 402 0
      Controller/HistoryUIDController.py
  17. 98 16
      Controller/IotCoreController.py
  18. 97 0
      Controller/LanguageController.py
  19. 99 0
      Controller/LogController.py
  20. 104 0
      Controller/OrderTaskController.py
  21. 291 0
      Controller/RegionController.py
  22. 71 0
      Controller/RegionCountryController.py
  23. 107 0
      Controller/SalesController.py
  24. 371 0
      Controller/SerialNumberController.py
  25. 63 0
      Controller/TestController.py
  26. 479 0
      Controller/UIDController.py
  27. 296 0
      Controller/UIDManageUserController.py
  28. 70 62
      Controller/UserController.py
  29. 0 61
      Controller/UserRegionController.py
  30. 163 0
      Controller/VPGController.py
  31. 16 6
      Controller/VerifyCodeController.py
  32. 1 1
      Controller/VoicePromptController.py
  33. 0 0
      Model/__init__.py
  34. 291 5
      Model/models.py
  35. 3 0
      Model/tests.py
  36. 3 0
      Model/views.py
  37. 367 0
      Object/IOTCore/IotObject.py
  38. 6 2
      Object/ResponseObject.py
  39. 4 4
      Object/TokenObject.py
  40. 113 0
      Object/uidManageResponseObject.py
  41. 55 0
      Service/AlgorithmService.py
  42. 81 0
      Service/CommonService.py
  43. 141 0
      Service/LogMiddleware.py
  44. 16 0
      Service/ModelService.py
  45. 95 0
      Service/OperatingLogs.py
  46. 15 11
      Service/TemplateService.py
  47. 2 0
      Service/middleware.py

+ 16 - 0
Ansjer/asgi.py

@@ -0,0 +1,16 @@
+"""
+ASGI config for AnsjerUIDManage project.
+
+It exposes the ASGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/
+"""
+
+import os
+
+from django.core.asgi import get_asgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'AnsjerUIDManage.settings')
+
+application = get_asgi_application()

+ 179 - 8
Ansjer/config.py

@@ -1,5 +1,5 @@
-#!/usr/bin/env python3  
-# -*- coding: utf-8 -*-  
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
 """
 @Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
 @AUTHOR: ASJRD018
@@ -34,11 +34,6 @@ AWS_SES_ACCESS_SECRET = 'oYJsF4h95ITWf3bxpPf5uUTvULPrq8DhRaQQzTjf'
 AWS_SES_ACCESS_REGION = 'us-east-1'
 AWS_SES_ACCESS_REGION_WEST = 'us-west-1'
 
-# Iot Core
-AWS_IOT_SES_ACCESS_ID = 'AKIA2E67UIMD62VUBV5I'
-AWS_IOT_SES_ACCESS_SECRET = '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'
-AWS_IOT_SES_ACCESS_REGION = 'us-east-1'
-
 AWS_BUCKET = 'ansjertest'
 # 设定离线时间为5分钟
 OFF_LINE_TIME_DELTA = 5
@@ -170,4 +165,180 @@ APP_FREQUENT = {
     5: '一个月',
     6: '一个月以上',
 
-}
+}
+
+# Iot Core国外
+AWS_IOT_SES_ACCESS_FOREIGN_ID = 'AKIA2E67UIMD62VUBV5I'
+AWS_IOT_SES_ACCESS_FOREIGN_SECRET = '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'
+AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA = 'us-east-1'
+AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA = 'ap-southeast-1'
+AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE = 'eu-west-1'
+
+# Iot Core国内
+AWS_IOT_SES_ACCESS_CHINA_ID = 'AKIA2MMWBR4DUUYPCFNJ'
+AWS_IOT_SES_ACCESS_CHINA_SECRET = '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'
+AWS_IOT_SES_ACCESS_CHINA_REGION = 'cn-northwest-1'
+
+IOT_HOST = {
+    1: 'a250bbr0p9u7as-ats.iot.cn-northwest-1.amazonaws.com.cn',
+    2: 'a2rqy12o004ad8-ats.iot.ap-southeast-1.amazonaws.com',
+    3: 'a2rqy12o004ad8-ats.iot.eu-west-1.amazonaws.com',
+    4: 'a2rqy12o004ad8-ats.iot.us-east-1.amazonaws.com'
+}
+ONLINE_DEVICE = 1000000
+
+SALES = {
+    2020: [
+        {
+            'name': 'United States',
+            'value': [3768901, 23.337, '美国']
+        },
+        {
+            'name': 'Japan',
+            'value': [1886988, 9.027, '日本']
+        },
+        {
+            'name': 'Russia',
+            'value': [1940038, 7.923, '俄国']
+        },
+        {
+            'name': 'Germany',
+            'value': [1319651, 6.253, '德国']
+        },
+        {
+            'name': 'France',
+            'value': [1291157, 5.825, '法国']
+        },
+        {
+            'name': 'United Kingdom',
+            'value': [1041917, 4.567, '英国']
+        },
+        {
+            'name': 'Italy',
+            'value': [859811, 3.875, '意大利']
+        }
+    ],
+    2019: [
+        {
+            'name': 'United States',
+            'value': [2768900, 37.374, '美国']
+        },
+        {
+            'name': 'Japan',
+            'value': [1086988, 14.672, '日本']
+        },
+        {
+            'name': 'Russia',
+            'value': [940038, 12.689, '俄国']
+        },
+        {
+            'name': 'Germany',
+            'value': [919651, 12.413, '德国']
+        },
+        {
+            'name': 'France',
+            'value': [691157, 9.329, '法国']
+        },
+        {
+            'name': 'United Kingdom',
+            'value': [541917, 7.315, '英国']
+        },
+        {
+            'name': 'Italy',
+            'value': [459811, 6.206, '意大利']
+        }
+    ],
+    2018: [
+        {
+            'name': 'United States',
+            'value': [2068912, 32.329, '美国']
+        },
+        {
+            'name': 'Japan',
+            'value': [1007988, 15.751, '日本']
+        },
+        {
+            'name': 'Germany',
+            'value': [909653, 14.214, '德国']
+        },
+        {
+            'name': 'Russia',
+            'value': [900038, 14.064, '俄国']
+        },
+
+        {
+            'name': 'France',
+            'value': [601158, 9.394, '法国']
+        },
+        {
+            'name': 'United Kingdom',
+            'value': [501920, 7.843, '英国']
+        },
+        {
+            'name': 'Italy',
+            'value': [409813, 6.404, '意大利']
+        }
+    ],
+    2017: [
+        {
+            'name': 'United States',
+            'value': [1668900, 30.914, '美国']
+        },
+        {
+            'name': 'Japan',
+            'value': [906988, 16.800, '日本']
+        },
+        {
+            'name': 'Germany',
+            'value': [809651, 14.998, '德国']
+        },
+        {
+            'name': 'Russia',
+            'value': [800038, 14.820, '俄国']
+        },
+        {
+            'name': 'France',
+            'value': [501157, 9.283, '法国']
+        },
+        {
+            'name': 'United Kingdom',
+            'value': [401920, 7.445, '英国']
+        },
+        {
+            'name': 'Italy',
+            'value': [309822, 5.739, '意大利']
+        }
+    ],
+    2016: [
+        {
+            'name': 'United States',
+            'value': [1468900, 31.943, '美国']
+        },
+        {
+            'name': 'Japan',
+            'value': [806988, 17.549, '日本']
+        },
+        {
+            'name': 'Germany',
+            'value': [709651, 15.432, '德国']
+        },
+        {
+            'name': 'Russia',
+            'value': [700038, 15.223, '俄国']
+        },
+
+        {
+            'name': 'France',
+            'value': [401157, 8.724, '法国']
+        },
+        {
+            'name': 'United Kingdom',
+            'value': [301917, 6.566, '英国']
+        },
+        {
+            'name': 'Italy',
+            'value': [209811, 4.562, '意大利']
+        }
+    ]
+
+}

+ 46 - 0
Ansjer/generacode.py

@@ -0,0 +1,46 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import json
+
+import xlwt
+
+from Object.TokenObject import TokenObject
+import base64
+import requests
+
+token = TokenObject()
+token = token.generate({'userID': str(2)})
+
+file = open('./file/UID-2020-09-09-06-14-44.txt', mode='r', encoding='utf-8')
+content = file.read()
+content = content.replace(' ', '\t')
+
+file1 = open('./file/UID_2020_09_09_06_14_44.txt', mode='w', encoding='utf-8')
+file1.write(content)
+file1.close()
+
+tmps = content.split('\n')
+workbook = xlwt.Workbook(encoding='utf-8')
+sheet1 = workbook.add_sheet('UID')
+num = 0
+for tmp in tmps:
+    lines = tmp.split('\t')
+    for i in range(len(lines)):
+        sheet1.write(num, i, lines[i].strip())
+    num += 1
+
+workbook.save('./file/UID_2020_09_09_06_14_44.xls')
+
+
+file.close()
+
+# url = 'http://192.168.136.35:8000/upload'
+# postData = {
+#     'area': 0,
+#     'token': token['access_token'],
+#     'fileName': content
+# }
+# # postData = json.dumps(postData)
+# print(postData)
+# res = requests.post(url=url, data=postData)
+# print(res)

+ 27 - 0
Ansjer/push_element_into_redis.py

@@ -0,0 +1,27 @@
+import _thread
+
+from Object.RedisObject import RedisObject
+
+key = 'serial_lock'
+key1 = 'create_serial_lock'
+key2 = 'company_serial_lock'
+redisObject = RedisObject()
+
+value = redisObject.lrange(key, 0, 1)
+if len(value) == 0:
+    redisObject.rpush(key, 1)
+
+value = redisObject.lrange(key1, 0, 1)
+if len(value) == 0:
+    redisObject.rpush(key1, 1)
+
+value = redisObject.lrange(key2, 0, 1)
+if len(value) == 0:
+    redisObject.rpush(key2, 1)
+
+
+
+
+
+
+

+ 25 - 3
Ansjer/urls.py

@@ -1,3 +1,4 @@
+from django.contrib import admin
 from django.conf.urls import url
 from django.urls import path, re_path
 
@@ -12,8 +13,10 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     ApplicationController, UserExController, CloudStorage, TestApi, UserBrandControllerV2, \
     StatisticsController, Alexa, FAQController, AppLogController, EquipmentVersionLimit, VoicePromptController, \
     CDKController, \
-    DeviceTypeController, CloudTest, Cloudsum, IotCoreController, OperatingLogs, ProcessInfo, UserRegionController, \
-    VerifyCodeController
+    DeviceTypeController, CloudTest, Cloudsum, IotCoreController, OperatingLogs, ProcessInfo, RegionCountryController, \
+    VerifyCodeController, FileController, UIDController, LogController, SalesController, \
+    OrderTaskController, HistoryUIDController, UIDManageUserController, SerialNumberController, CompanyController, \
+    RegionController, VPGController, LanguageController, TestController
 
 urlpatterns = [
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
@@ -274,12 +277,31 @@ urlpatterns = [
     #Iot Core
     url(r'iot/(?P<operation>.*)$', IotCoreController.IotCoreView.as_view()),
 
+    # 云分配UID
+    path('admin/', admin.site.urls),
+    re_path('user/(?P<operation>.*)', UIDManageUserController.UserView.as_view()),
+    re_path('uid/(?P<operation>.*)', UIDController.UIDView.as_view()),
+    re_path('history/(?P<operation>.*)', HistoryUIDController.HistoryUIDView.as_view()),
+    re_path('log/(?P<operation>.*)', LogController.LogView.as_view()),
+    re_path('orderTask/(?P<operation>.*)', OrderTaskController.OrderTaskView.as_view()),
+    path('upload', FileController.UploadUIDFileView.as_view()),
+    path('download', FileController.DownloadUIDFileView.as_view()),
+    path('sales', SalesController.SalesView.as_view()),
+    path('device/online', SalesController.DeviceOnlineView.as_view()),
+    re_path('serialNumber/(?P<operation>.*)', SerialNumberController.SerialNumberView.as_view()),
+    re_path('company/(?P<operation>.*)', CompanyController.CompanyView.as_view()),
+    re_path('region/(?P<operation>.*)', RegionController.RegionView.as_view()),
+    re_path('vpg/(?P<operation>.*)', VPGController.VPGView.as_view()),
+    re_path('language/(?P<operation>.*)', LanguageController.LanguageView.as_view()),
+
+
+    re_path('test/(?P<operation>.*)', TestController.TestView.as_view()),
     # 日志管理系统
     url(r'^OperatingLogs/(?P<operation>.*)$', OperatingLogs.OperatingLogsView.as_view()),
     url(r'^ProcessInfo/(?P<operation>.*)$', ProcessInfo.ProcessInfoView.as_view()),
     url(r'^Cloudsum/(?P<operation>.*)$', Cloudsum.Cloudsum.as_view()),
 
-    url(r'userRegion/(?P<operation>.*$)', UserRegionController.UserRegionView.as_view()),
+    url(r'regionCountry/(?P<operation>.*$)', RegionCountryController.RegionCountryView.as_view()),
 
     # 验证验证码
     url(r'verifyCode/(?P<operation>.*$)', VerifyCodeController.VerifyCodeView.as_view()),

+ 16 - 0
Ansjer/wsgi.py

@@ -0,0 +1,16 @@
+"""
+WSGI config for AnsjerUIDManage project.
+
+It exposes the WSGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'AnsjerUIDManage.settings')
+
+application = get_wsgi_application()

+ 14 - 3
Controller/CloudStorage.py

@@ -39,7 +39,8 @@ from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_AR
     SERVER_DOMAIN_SSL, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_ARN, APNS_MODE, APNS_CONFIG, BASE_DIR, \
     JPUSH_CONFIG, FCM_CONFIG, OAUTH_ACCESS_TOKEN_SECRET
 from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel, \
-    ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMassModel, SysMsgModel, UidPushModel, Unused_Uid_Meal
+    ExperienceContextModel, Pay_Type, CDKcontextModel, Device_User, SysMassModel, SysMsgModel, UidPushModel, \
+    Unused_Uid_Meal, RegionCountryModel
 from Object.AliPayObject import AliPayObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
@@ -211,7 +212,9 @@ class CloudStorageView(View):
         lang = request_dict.get('lang', 'en')
         qs = Store_Meal.objects
         eq = ExperienceContextModel.objects.filter(uid=uid, experience_type=0).values('id')
-        # userqs = Device_User.objects.filter(userID=userID).values('is_experience')
+
+        #userObj = Device_User.objects.get(userID=userID)
+        #regionObj = RegionCountryModel.objects.get(number=userObj.region_country)
 
         if mold:
             qs = qs.filter(bucket__mold=mold,lang__lang=lang)
@@ -224,6 +227,7 @@ class CloudStorageView(View):
             qs = qs.filter(pay_type='10')
 
         qs = qs.filter(~Q(pay_type='11'))  # 过滤不显示激活码套餐
+        #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.values("id", "title", "content", "price", "day", "currency", "bucket__storeDay",
                        "bucket__bucket", "bucket__area", "commodity_code",
@@ -1143,7 +1147,7 @@ class CloudStorageView(View):
         smqs = Store_Meal.objects.filter(id=rank, pay_type=pay_type, lang__lang=lang). \
             values('currency', 'price', 'lang__content', 'day',
                    'commodity_type', 'lang__title',
-                   'expire', 'commodity_code', 'discount_price')
+                   'expire', 'commodity_code', 'discount_price', 'bucket__mold')
         if not smqs.exists():
             return response.json(173)
         currency = smqs[0]['currency']
@@ -1160,6 +1164,13 @@ class CloudStorageView(View):
         #     ubqs_count = ubqs.count()
         #     ubq = ubqs[ubqs_count - 1, ubqs_count]
         #     new_starTime = ubq['endTime'] + 1
+        is_mold = 0  #判断国内外
+        if smqs[0]['bucket__mold']==0:
+            is_mold = 1
+
+        order_qs = Order_Model.objects.filter(UID=uid , rank__bucket__mold=is_mold)
+        if order_qs.exists():
+            return response.json(10041)
 
         orderID = CommonService.createOrderID()
         if pay_type == 1:

+ 67 - 8
Controller/Cloudsum.py

@@ -5,13 +5,20 @@
 @File :Cloudsum.py
 @IDE :PyCharm
 """
-from Model.models import Order_Model, UID_Bucket, UserExModel
+import json
+
+from Ansjer.config import SERVER_TYPE
+from Model.models import Order_Model, UID_Bucket, UserExModel, EquipmentLogModel
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from django.views import View
-from Service.ModelService import Device_User,ModelService
+
+from Service.CommonService import CommonService
+from Service.ModelService import Device_User, ModelService
 from django.db.models import Count, Sum
 
+
 class Cloudsum(View):
     def dispatch(self, requset, *args, **kwargs):
         return super(Cloudsum, self).dispatch(requset, *args, **kwargs)
@@ -45,6 +52,8 @@ class Cloudsum(View):
             return self.usercount(userID, request_dict, response)
         if operation == 'usercloud':
             return self.usercloud(userID, response)
+        if operation == 'equipment_logs':
+            return self.equipment_logs(userID, request_dict, response)
 
     # 类型:用户手机
     # 统计用户手机型号  已有
@@ -59,10 +68,10 @@ class Cloudsum(View):
         if own_permission is not True:
             return response.json(404)
         res = UserExModel.objects.extra(tables=['app_info'],
-                                        select={'appname':'app_info.appName',
-                                                'appversion':'app_info.newAppversion'},
-                                        where=["user_ex.appBundleId=app_info.appBundleId"]).\
-            values('appBundleId','appname','appversion').annotate(dates=Count('appBundleId')).order_by()
+                                        select={'appname': 'app_info.appName',
+                                                'appversion': 'app_info.newAppversion'},
+                                        where=["user_ex.appBundleId=app_info.appBundleId"]). \
+            values('appBundleId', 'appname', 'appversion').annotate(dates=Count('appBundleId')).order_by()
         print(res.query)
         print(res)
         return response.json(0, list(res))
@@ -82,7 +91,7 @@ class Cloudsum(View):
         #                                   where=["data_joined between '%s-01-01' and '%s-01-01' "],
         #                                   params=[usercountyear, usercountyear+1]).values(
         #     'dates').annotate(用户合计=Count('data_joined')).order_by('dates')
-        count = Device_User.objects.extra(select={'dates': "DATE_FORMAT(data_joined,'%%Y-%%m')"},).values(
+        count = Device_User.objects.extra(select={'dates': "DATE_FORMAT(data_joined,'%%Y-%%m')"}, ).values(
             'dates').annotate(用户合计=Count('data_joined')).order_by('dates')
         print(count.query)
         return response.json(0, list(count))
@@ -118,4 +127,54 @@ class Cloudsum(View):
             return response.json(404)
         a = Order_Model.objects.extra(select={'dates': "FROM_UNIXTIME(addTime,'%%Y-%%m')"}).values(
             'dates').filter(status=1).annotate(开通云存合计=Count('addTime')).order_by('dates')
-        return response.json(0, list(a))
+        return response.json(0, list(a))
+
+    def equipment_logs(self, userID, request_dict, response):
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        order = request_dict.get('order', '-id')
+        if order == '':
+            order = '-id'
+        if not page or not line:
+            return response.json(444, 'page,line')
+
+        own_perm = ModelService.check_perm(userID=userID, permID=30)
+        if own_perm is not True:
+            return response.json(404)
+
+        if SERVER_TYPE == 'Ansjer.formal_settings':
+            logKey = 'logger'
+        else:
+            logKey = 'test_logger'
+        # 判断redis列表长度
+        redisObj = RedisObject()
+        data_list = redisObj.lrange(logKey, 0, -1)
+        redisObj.del_data(key=logKey)
+        add_batch_log(data_list)
+
+        qs = EquipmentLogModel.objects.all().order_by(order)
+        if qs.exists():
+            count = qs.count()
+            res = qs[(page - 1) * line:page * line]
+            send_json = CommonService.qs_to_dict(res)
+            send_json['count'] = count
+            return response.json(0, send_json)
+        return response.json(0, {'datas': [], 'count': 0})
+
+# 访问日志批量添加
+def add_batch_log(data_list):
+    try:
+        if data_list:
+            querysetlist = []
+            for i in data_list:
+                data = json.loads(i.decode('utf-8'))
+                querysetlist.append(EquipmentLogModel(**data))
+            EquipmentLogModel.objects.bulk_create(querysetlist)
+        else:
+            return
+    except Exception as e:
+        print('ggga')
+        print(repr(e))
+        return False
+    else:
+        return True

+ 226 - 0
Controller/CompanyController.py

@@ -0,0 +1,226 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import logging
+import time
+
+from django.db import transaction
+from django.views import View
+
+from Model.models import CompanyModel, UserModel, SerialNumberModel, CompanySerialModel
+from Object.uidManageResponseObject import uidManageResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+from Service.ModelService import ModelService
+
+
+class CompanyView(View):
+
+    def get(self, request, *arg, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        operation = kwargs.get('operation', None)
+        return self.validate(request_dict, operation)
+
+    def post(self, request, *arg, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        operation = kwargs.get('operation', None)
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+
+        token = TokenObject(request_dict.get('token', None))
+
+        response = uidManageResponseObject()
+
+        if token.code != 0:
+            return response.json(token.code)
+
+        if operation == 'create':
+            return self.do_create(token.userID, request_dict, response)
+        elif operation == 'update':
+            return self.do_update(token.userID, request_dict, response)
+        elif operation == 'delete':
+            return self.do_delete(token.userID, request_dict, response)
+        elif operation == 'list':
+            return self.do_list(token.userID, request_dict, response)
+        elif operation == 'createSerial':
+            return self.do_create_serial(token.userID, request_dict, response)
+        else:
+            return response.json(404)
+
+    def do_create(self, userID, request_dict, response):
+
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        name = request_dict.get('name', None)
+        mark = request_dict.get('mark', None)
+
+        if name and mark:
+            now_time = int(time.time())
+            company_qs = CompanyModel.objects.filter(mark=mark)
+            if company_qs.exists():
+                return response.json(174)
+
+            secret = self.create_secret(mark)
+            print(secret)
+
+            company = CompanyModel(
+                name=name,
+                mark=mark,
+                secret=secret,
+                quantity=0,
+                add_time=now_time,
+                update_time=now_time
+            )
+            company.save()
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_update(self, userID, request_dict, response):
+
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        id = request_dict.get('id', None)
+
+        if id:
+            name = request_dict.get('name', None)
+            quantity = request_dict.get('quantity', None)
+
+            update = {}
+
+            if name:
+                update['name'] = name
+
+            if quantity:
+                update['quantity'] = quantity
+
+            company_qs = CompanyModel.objects.filter(id=id)
+            if company_qs.exists():
+                company_qs.update(**update)
+                return response.json(0)
+            else:
+                return response.json(173)
+
+        else:
+            return response.json(444)
+
+    def do_delete(self, userID, request_dict, response):
+
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        id = request_dict.get('id', None)
+
+        if id:
+            CompanyModel.objects.filter(id=id).delete()
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    @transaction.atomic
+    def do_create_serial(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        id = request_dict.get('id', None)
+        quantity = request_dict.get('quantity', None)
+
+        if id and quantity:
+            company_qs = CompanyModel.objects.filter(id=id)
+
+            if not company_qs.exists():
+                return response.json(444)
+
+            savePoint = transaction.savepoint()
+            try:
+                try:
+
+                    company = company_qs[0]
+                    start = company.quantity
+                    end = start + int(quantity)
+                    serial_qs = SerialNumberModel.objects.filter()[start:end]
+                    if serial_qs.exists():
+                        data = []
+                        now_time = int(time.time())
+                        for item in serial_qs:
+                            data.append(CompanySerialModel(
+                                company_id=company.id,
+                                serial_number_id=item.id,
+                                add_time=now_time,
+                                update_time=now_time
+                            ))
+
+                            if len(data) == 5000:
+                                CompanySerialModel.objects.bulk_create(data)
+                                data.clear()
+                        if len(data) > 0:
+                            CompanySerialModel.objects.bulk_create(data)
+                            data.clear()
+
+                        company.quantity = company.quantity + end - start
+                        company.save()
+                        return response.json(0)
+                    else:
+                        return response.json(173)
+                except Exception as e:
+                    # print('--------------------------error 5000')
+                    # print(repr(e))
+                    if savePoint:
+                        transaction.rollback(savePoint)
+                    djangoLogger = logging.getLogger('django')
+                    djangoLogger.exception(repr(e))
+                    return response.json(176, str(e))
+            except Exception as e:
+                # print('--------------------------error 5001')
+                # print(repr(e))
+                djangoLogger = logging.getLogger('django')
+                djangoLogger.exception(repr(e))
+                return response.json(176, str(e))
+        else:
+            return response.json(444)
+
+    def do_list(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        page = request_dict.get('page', None)
+        line = request_dict.get('limit', None)
+        if page and line:
+            page = int(page)
+            line = int(line)
+
+            start = (page - 1) * line
+            end = start + line
+
+            company_qs = CompanyModel.objects.filter()
+            count = company_qs.count()
+
+            company_qs = company_qs[start: end].values()
+            print(company_qs)
+
+            res = {
+                'count': count,
+                'data': list(company_qs)
+            }
+            return response.json(0, res)
+        else:
+            return response.json(444)
+
+    def create_secret(self, mark):
+        len1 = len(mark)
+        secret = ''
+        for i in range(len1):
+            secret += CommonService.RandomStr(randomlength=1)
+            secret += mark[i]
+
+        print(mark)
+        return CommonService.encode_data_without_salt(secret)

+ 1 - 0
Controller/DetectController.py

@@ -30,6 +30,7 @@ from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
 from Service.CommonService import CommonService
+from Service.ModelService import ModelService
 
 '''
 http://test.push.dvema.com/notify/push?uidToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOiJUNEFaM0NVS0NFUkg5RlpBMTExQSJ9.GtrXeq5gb2Z9M3mKECxi9eNQbPxqC-6PtgJkOOg6PwI&n_time=1598456451&channel=1&event_type=1&is_st=1

+ 8 - 5
Controller/EquipmentManager.py

@@ -363,6 +363,7 @@ def addInterface(request):
     View_Password = request_dict.get('View_Password', '')
     Type = request_dict.get('Type', None)
     ChannelIndex = request_dict.get('ChannelIndex', None)
+    version = request_dict.get('version', '')
     isCheckMainUser = request_dict.get('isCheckMainUser', None)
     isMainUserExists = False
     if all([UID, NickName, View_Account, Type, ChannelIndex]):
@@ -424,7 +425,7 @@ def addInterface(request):
                         'vodPrimaryUserID': vodPrimaryUserID,
                         'vodPrimaryMaster': vodPrimaryMaster,
                         'data_joined': '',
-                        'version': '',
+                        'version': version,
                         'isVod': 0,
                         'isExist': 1,
                         'userID__userEmail': ''
@@ -453,6 +454,7 @@ def addInterface(request):
                             'ip': CommonService.get_ip_address(request),
                             'channel': ChannelIndex,
                             'nickname': NickName,
+                            'version': version,
                         }
                         UidSetModel.objects.create(**uid_set_create_dict)
                     else:
@@ -460,7 +462,8 @@ def addInterface(request):
 
                     userDevice = Device_Info(id=pk, userID_id=userID, UID=UID,
                                              NickName=NickName, View_Account=View_Account,
-                                             View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex, vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
+                                             View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex,
+                                             version=version, vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
                     userDevice.save()
                     Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
                                                                vodPrimaryMaster=vodPrimaryMaster)
@@ -475,7 +478,7 @@ def addInterface(request):
                                                                     'isShare',
                                                                     'primaryUserID', 'primaryMaster', 'vodPrimaryUserID', 'vodPrimaryMaster', 'userID__userEmail',
                                                                     'data_joined', 'version',
-                                                                    'isVod', 'isExist')
+                                                                    'isVod', 'isExist', 'isCameraOpenCloud')
                     dvql = CommonService.qs_to_list(dvqs)
                     ubqs = UID_Bucket.objects.filter(uid=UID). \
                         values('bucket__content', 'status', 'channel', 'endTime', 'uid')
@@ -491,7 +494,7 @@ def addInterface(request):
         else:
             return response.json(tko.code)
     else:
-        return response.json(444, {'param': 'UID,NickName,View_Account,View_Password,Type,ChannelIndex'})
+        return response.json(444, {'param': 'UID,NickName,View_Account,View_Password,Type,ChannelIndex,version'})
 
 
 # 添加设备字段
@@ -811,7 +814,7 @@ def queryInterface(request):
         dvql = dvqs[(page - 1) * line:page * line].values('id', 'userID', 'NickName', 'UID', 'View_Account',
                                                           'View_Password', 'ChannelIndex', 'Type', 'isShare',
                                                           'primaryUserID', 'primaryMaster', 'data_joined', 'version', 'vodPrimaryUserID', 'vodPrimaryMaster', 'userID__userEmail',
-                                                          'isVod', 'isExist', 'NotificationMode')
+                                                          'isVod', 'isExist', 'NotificationMode', 'isCameraOpenCloud', 'endpoint')
         dvls = CommonService.qs_to_list(dvql)
         uid_list = []
         for dvl in dvls:

+ 2 - 2
Controller/EquipmentManagerV2.py

@@ -148,7 +148,7 @@ class EquipmentManagerV2(View):
                        'View_Password', 'ChannelIndex', 'Type', 'isShare',
                        'primaryUserID', 'primaryMaster', 'data_joined', 'vodPrimaryUserID', 'vodPrimaryMaster', 'userID__userEmail',
                        'version',
-                       'isVod', 'isExist', 'NotificationMode')
+                       'isVod', 'isExist', 'NotificationMode', 'isOpenCloud', 'endpoint')
             dvls = CommonService.qs_to_list(dvql)
             uid_list = []
             for dvl in dvls:
@@ -220,7 +220,7 @@ class EquipmentManagerV2(View):
                            'View_Password', 'ChannelIndex', 'Type', 'isShare',
                            'primaryUserID', 'primaryMaster', 'data_joined', 'vodPrimaryUserID', 'vodPrimaryMaster',
                            'userID__userEmail',
-                           'version', 'isVod', 'isExist', 'NotificationMode')
+                           'version', 'isVod', 'isExist', 'NotificationMode', 'isCameraOpenCloud', 'endpoint')
         dvls = CommonService.qs_to_list(dvql)
         uid_list = []
         for dvl in dvls:

+ 31 - 7
Controller/EquipmentManagerV3.py

@@ -52,6 +52,8 @@ class EquipmentManagerV3(View):
                 return self.do_fuzzy_query(userID, request_dict, response)
             elif operation == 'mainUserDevice':
                 return self.do_mainUserDevice( request_dict, response)
+            elif operation == 'getDeviceFeatures':
+                return self.do_get_device_features(request_dict, response)
             else:
                 return response.json(414)
         else:
@@ -68,6 +70,7 @@ class EquipmentManagerV3(View):
         View_Password = self.decode_pwd(View_Password)
         Type = request_dict.get('Type', None)
         ChannelIndex = request_dict.get('ChannelIndex', None)
+        version = request_dict.get('version', '')
         isCheckMainUser = request_dict.get('isCheckMainUser', None)
         isMainUserExists = False
         if all([UID, NickName, View_Account, Type, ChannelIndex]):
@@ -75,7 +78,7 @@ class EquipmentManagerV3(View):
             response.lang = tko.lang
             if tko.code == 0:
                 userID = tko.userID
-                re_uid = re.compile(r'^[A-Za-z0-9]{20}$')
+                re_uid = re.compile(r'^[A-Za-z0-9]{14,20}$')
                 if re_uid.match(UID):
                     is_exist = Device_Info.objects.filter(UID=UID, userID_id=userID)
                     if is_exist:
@@ -128,7 +131,7 @@ class EquipmentManagerV3(View):
                             'vodPrimaryUserID': vodPrimaryUserID,
                             'vodPrimaryMaster': vodPrimaryMaster,
                             'data_joined': '',
-                            'version': '',
+                            'version': version,
                             'isVod': 0,
                             'isExist': 1,
                             'userID__userEmail': ''
@@ -157,6 +160,7 @@ class EquipmentManagerV3(View):
                                 'ip': CommonService.get_ip_address(request_dict),
                                 'channel': ChannelIndex,
                                 'nickname': NickName,
+                                'version': version,
                             }
                             UidSetModel.objects.create(**uid_set_create_dict)
                         else:
@@ -165,6 +169,7 @@ class EquipmentManagerV3(View):
                         userDevice = Device_Info(id=pk, userID_id=userID, UID=UID,
                                                  NickName=NickName, View_Account=View_Account,
                                                  View_Password=View_Password, Type=Type, ChannelIndex=ChannelIndex,
+                                                 version=version,
                                                  vodPrimaryUserID=vodPrimaryUserID, vodPrimaryMaster=vodPrimaryMaster)
                         userDevice.save()
                         Device_Info.objects.filter(UID=UID).update(vodPrimaryUserID=vodPrimaryUserID,
@@ -191,7 +196,7 @@ class EquipmentManagerV3(View):
                                                                         'vodPrimaryUserID', 'vodPrimaryMaster',
                                                                         'userID__userEmail',
                                                                         'data_joined', 'version',
-                                                                        'isVod', 'isExist')
+                                                                        'isVod', 'isExist', 'isCameraOpenCloud')
                         dvql = CommonService.qs_to_list(dvqs)
                         ubqs = UID_Bucket.objects.filter(uid=UID). \
                             values('bucket__content', 'status', 'channel', 'endTime', 'uid')
@@ -205,7 +210,7 @@ class EquipmentManagerV3(View):
             else:
                 return response.json(tko.code)
         else:
-            return response.json(444, {'param': 'UID,NickName,View_Account,View_Password,Type,ChannelIndex'})
+            return response.json(444, {'param': 'UID,NickName,View_Account,View_Password,Type,ChannelIndex,version'})
 
     def do_modify(self, userID, request_dict, response, request):
         token = request_dict.get('token', None)
@@ -225,7 +230,6 @@ class EquipmentManagerV3(View):
         try:
             # deviceData = json.loads(deviceContent)
             deviceData = eval(deviceContent)
-
             if deviceData.__contains__('userID_id'):
                 asy = threading.Thread(target=ModelService.update_log,
                                        args=(CommonService.get_ip_address(request), userID, 'modifyV3', deviceData, id))
@@ -302,7 +306,8 @@ class EquipmentManagerV3(View):
                                'View_Password', 'ChannelIndex', 'Type', 'isShare',
                                'primaryUserID', 'primaryMaster', 'data_joined', 'vodPrimaryUserID', 'vodPrimaryMaster',
                                'userID__userEmail',
-                               'version', 'isVod', 'isExist', 'NotificationMode')
+                               'version', 'isVod', 'isExist', 'NotificationMode', 'isCameraOpenCloud',
+                               'endpoint')
             dvls = CommonService.qs_to_list(dvql)
             uid_list = []
             for dvl in dvls:
@@ -481,7 +486,7 @@ class EquipmentManagerV3(View):
                                              'View_Password', 'ChannelIndex', 'Type', 'isShare',
                                              'primaryUserID', 'primaryMaster', 'data_joined', 'vodPrimaryUserID',
                                              'vodPrimaryMaster', 'userID__userEmail',
-                                             'version', 'isVod', 'isExist', 'NotificationMode')
+                                             'version', 'isVod', 'isExist', 'NotificationMode', 'isCameraOpenCloud')
 
                 dvls = CommonService.qs_to_list(device_qs)
                 uid_list = []
@@ -654,3 +659,22 @@ class EquipmentManagerV3(View):
             qs = CommonService.qs_to_list(qs)
 
         return response.json(0, qs)
+
+    def do_get_device_features(self, request_dict, response):
+        uid = request_dict.get('uid', None)
+
+        if uid:
+            uid = CommonService.decode_data(uid)
+
+            if uid:
+                uid_qs = UidSetModel.objects.filter(uid=uid)
+                if uid_qs.exists():
+                    uid_qs = uid_qs.values('is_alexa', 'is_human', 'is_custom_voice', 'double_wifi')
+                    return response.json(0, uid_qs[0])
+                else:
+                    return response.json(173)
+            else:
+                return response.json(444)
+
+        else:
+            return response.json(444)

+ 10 - 11
Controller/EquipmentOTA.py

@@ -64,22 +64,21 @@ class EquipmentOTA(View):
 
     def delete(self, request_dict, userID, response):
         eid = request_dict.get('eid', None)
-        if not eid:
-            return response.json(444, 'eid')
+        version = request_dict.get('version', None)
+        if not eid or not version:
+            return response.json(444, 'eid or version')
         own_perm = ModelService.check_perm(userID=userID, permID=230)
         if not own_perm:
             return response.json(404)
-        ev = Equipment_Version.objects.filter(eid=eid)
-        if not ev.exists():
+        equipment_version = Equipment_Version.objects.filter(eid=eid, version=version)
+        if not equipment_version.exists():
             return response.json(173)
         try:
-            has_ev = Equipment_Version.objects.filter(filePath=ev[0].filePath)
-            if has_ev.exists():
-                pass
-            else:
-                filepath = os.path.join(BASE_DIR, ev[0].filePath)
-                os.remove(filepath)
-            ev.delete()
+            # 删除文件和相应数据
+            file_path = equipment_version[0].filePath
+            file_path = os.path.join(BASE_DIR, file_path).replace('\\', '/')
+            os.remove(file_path)
+            equipment_version.delete()
         except Exception as e:
             return response.json(176, repr(e))
         else:

+ 541 - 0
Controller/FileController.py

@@ -0,0 +1,541 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import base64
+import json
+import logging
+import os
+import time
+import zipfile
+
+import xlwt
+
+from django.http import StreamingHttpResponse, HttpResponse, QueryDict
+from django.utils.decorators import method_decorator
+from django.views import View
+from django.views.decorators.csrf import csrf_exempt
+from django.db import transaction
+
+from Ansjer.config import BASE_DIR
+from Model.models import UIDModel, UserUIDModel, UserModel, LogModel, MacModel, OrderTaskModel, OrderUIDModel
+from Object.RedisObject import RedisObject
+from Object.TokenObject import TokenObject
+from Object.uidManageResponseObject import uidManageResponseObject
+from Service.CommonService import CommonService
+
+
+class UploadUIDFileView(View):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, request, *args, **kwargs):
+        return super(UploadUIDFileView, self).dispatch(request, *args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        fileName = request.FILES.get('fileName', None)
+        return self.validate(fileName, request_dict, request)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        fileName = request.FILES.get('fileName', None)
+        return self.validate(fileName, request_dict, request)
+
+    def validate(self, fileName, request_dict, request):
+        token = request_dict.get('token', None)
+        area = request_dict.get('area', None)
+        isReset = request_dict.get('isReset', 0)
+        content = request_dict.get('fileName', None)
+        vpg_id = request_dict.get('vpg_id', None)
+
+        print('content')
+        print(content)
+
+        content = base64.b64decode(content).decode().strip()
+        content = content[3:(len(content) - 3)]
+        uids = content.split('\n')
+        # print(uids)
+        # print(len(uids))
+
+        response = uidManageResponseObject()
+
+        tko = TokenObject(token)
+        if tko.code != 0:
+            return response.json(tko.code)
+
+        # if not fileName and not area:
+        #     return response.json(444, 'fileName,area')
+
+        data = {}
+        duplicate = []
+        for line in uids:
+
+            if len(line) < 20:
+                continue
+
+            if data.__contains__(line):
+                duplicate.append(line)
+            else:
+                data[line] = ''
+
+        if isReset == 0:
+            return self.do_insert(data, duplicate, vpg_id, area, response, request, tko)
+        else:
+            return self.do_reset(data, response, area, request, tko)
+
+    @transaction.atomic
+    def do_insert(self, data, duplicate, vpg_id, area, response, request, token):
+        bulk = []
+        count = 0
+        add_time = int(time.time())
+        update_time = int(time.time())
+        keys = data.keys()
+
+        # 获取最新的mac
+        mac = MacModel.objects.filter().values('id', 'value', 'is_active')[0]
+        if not mac['is_active']:
+            return response.json(175)
+        # redisObject = RedisObject(db=3)
+        key = ''
+        tmpMac = mac['value']
+        savePoint = None
+        for item in keys:
+            key = item.strip()
+            # value = redisObject.get_data(key)
+            # if value is False:
+            #     # redisObject.set_data(key, '1', 600)
+            # else:
+            #     duplicate.append(key)
+            #     continue
+            bulk.append(UIDModel(
+                uid=item.strip(),
+                uid_extra='',
+                status=0,
+                add_time=add_time,
+                update_time=update_time,
+                area=area,
+                mac=mac['value'],
+                vpg_id=vpg_id
+            ))
+            try:
+                try:
+                    if (count % 5000) == 0:
+                        savePoint = transaction.savepoint()
+                        UIDModel.objects.bulk_create(bulk)
+                        bulk.clear()
+                        data = {
+                            'value': mac['value'],
+                            'is_active': tmpMac is not None
+                        }
+                        MacModel.objects.filter().update(**data)
+                except Exception as e:
+                    # print('--------------------------error 5000')
+                    # print(repr(e))
+                    if savePoint:
+                        transaction.rollback(savePoint)
+                    djangoLogger = logging.getLogger('django')
+                    djangoLogger.exception(repr(e))
+                    return response.json(174, str(e))
+                else:
+                    savePoint = None
+            except Exception as e:
+                # print('--------------------------error 5001')
+                # print(repr(e))
+                djangoLogger = logging.getLogger('django')
+                djangoLogger.exception(repr(e))
+                return response.json(174, str(e))
+            count += 1
+            tmpMac = CommonService.updateMac(mac['value'])
+            if tmpMac is None:
+                # 能分配的mac已用完
+                break
+            else:
+                mac['value'] = tmpMac
+
+        # 当bulk不足5000时,还有数据要插入
+        try:
+            try:
+                savePoint = transaction.savepoint()  # 事务保存点
+                if len(bulk) > 0:
+                    UIDModel.objects.bulk_create(bulk)
+                    bulk.clear()
+            except Exception as e:
+                # print('--------------------------error')
+                # print(repr(e))
+                if savePoint:
+                    transaction.rollback(savePoint)
+                djangoLogger = logging.getLogger('django')
+                djangoLogger.exception(repr(e))
+                return response.json(174)
+            else:
+                del data
+                del bulk
+                data = {
+                    'value': mac['value'],
+                    'is_active': tmpMac is not None
+                }
+                MacModel.objects.filter().update(**data)
+        except Exception as e:
+            # print('--------------------------error 1111')
+            # print(repr(e))
+            djangoLogger = logging.getLogger('django')
+            djangoLogger.exception(repr(e))
+            return response.json(174)
+
+        # print('重复:')
+        # print(duplicate)
+
+        try:
+            operation = self.formatOperation(operation='上传', quantity=int(count), area=int(area))
+            print(operation)
+            self.add_log(request, operation, token)
+        except Exception as e:
+            djangoLogger = logging.getLogger('django')
+            djangoLogger.exception(repr(e))
+
+        if tmpMac is None:
+            return response.json(175, {'last_uid': key})
+        return response.json(0, {'count': count, 'duplicate_count': len(duplicate), 'data': duplicate})
+
+    def do_reset(self, data, response, area, request, token):
+        keys = data.keys()
+        uids = []
+        count = 0
+        for key in keys:
+            uids.append(key.strip())
+            if len(uids) % 5000 == 0:
+                count += self.do_update_uid_status(uids, area)
+                uids.clear()
+
+        if len(uids) > 0:
+            count += self.do_update_uid_status(uids, area)
+            uids.clear()
+
+        operation = self.formatOperation('重置', int(count), int(area))
+        self.add_log(request, operation, token)
+        return response.json(0)
+
+    def do_update_uid_status(self, uids, area):
+        uid_qs = UIDModel.objects.filter(uid__in=uids, area=area, status=2)
+        if uid_qs.exists():
+            uid_ids = []
+            for uid in uid_qs:
+                if uid.status == 2:
+                    uid.status = 1
+                    uid_ids.append(uid.id)
+            UIDModel.objects.bulk_update(uid_qs, fields=['status'])
+
+            try:
+                OrderUIDModel.objects.filter(uid__id__in=tuple(uid_ids)).delete()
+            except Exception as e:
+                print(e)
+
+            return uid_qs.count()
+        return 0
+
+    def add_log(self, request, operation, token):
+        ip = CommonService.get_ip_address(request)
+        now_time = time.time()
+        content = json.loads(json.dumps(request.POST))
+        user_qs = UserModel.objects.filter(id=token.userID)
+
+        if content.__contains__('fileName'):
+            del content['fileName']
+        log = {
+            'status': 200,
+            'content': json.dumps(content),
+            'ip': ip,
+            'time': now_time,
+            'url': 'upload',
+            'operation': operation,
+            'user': user_qs[0]
+        }
+
+        try:
+            LogModel.objects.create(**log)
+        except Exception as e:
+            print('出错')
+            print(repr(e))
+
+    def formatOperation(self, operation, quantity, area):
+        str = '{operation}{quantity}个{area}UID'
+        if area == 0:
+            return str.format(operation=operation, quantity=quantity, area='国内')
+        else:
+            return str.format(operation=operation, quantity=quantity, area='国外')
+
+
+class DownloadUIDFileView(View):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, request, *args, **kwargs):
+        return super(DownloadUIDFileView, self).dispatch(request, *args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        token = request_dict.get('token', None)
+        area = request_dict.get('area', None)
+        quantity = int(request_dict.get('quantity', None))
+        fileType = request_dict.get('fileType', None)
+        order_number = request_dict.get('order_number', None)
+        board = request_dict.get('board', None)
+        plan = request_dict.get('plan', None)
+        checksum = request_dict.get('checksum', None)
+        ic_model = request_dict.get('ic_model', None)
+        order_quantity = request_dict.get('order_quantity', None)
+        response = uidManageResponseObject()
+
+        # print(area)
+        # print(quantity)
+        token = TokenObject(token)
+        if token.code != 0:
+            return response.json(token.code)
+
+        if not area or not order_number or not board or not plan or not checksum or not ic_model or not order_quantity or not fileType:
+            return response.json(444)
+
+        area = int(area)
+
+        if area >= 0 and quantity > 0:
+
+            # 保存订单信息
+            now_time = int(time.time())
+            order = {
+                'order_number': order_number,
+                'board': board,
+                'plan': plan,
+                'checksum': checksum,
+                'ic_model': ic_model,
+                'quantity': order_quantity,
+                'add_time': now_time
+            }
+
+            tmp = OrderTaskModel.objects.create(**order)
+            print(tmp)
+
+            order = OrderTaskModel.objects.filter(order_number=order_number).order_by('-add_time')[0]
+
+            uid_qs = UserUIDModel.objects.filter(user__id=token.userID, uid__status=1, uid__area=area)
+
+            uid_values = uid_qs.values('uid__id', 'uid__uid', 'uid__mac', 'uid__uid_extra', 'uid__add_time', 'uid__update_time', 'uid__area')
+
+            count = uid_values.count()
+            if count < quantity:
+                return response.json(444, '设备UID不足')
+
+            if uid_values.exists():
+
+                uid_values = uid_values[0:quantity]
+                uid_qs = uid_qs[0: quantity]
+                if fileType == 'txt':
+                    # return self.download_txt(uid_values, uid_qs, order)
+                    # return self.download_excel(uid_values, order)
+                    return self.download_zip(uid_values, order)
+                elif fileType == 'excel':
+                    return self.download_excel(uid_values, order)
+                else:
+                    return response.json(444, 'fileType')
+            else:
+                return response.json(444, '111')
+        else:
+            return response.json(444, '222')
+
+    def download_txt(self, uid_values, uid_qs, order):
+        updates = []
+        updates_uid = []
+        content = ''
+        now_time = int(time.time())
+        for i in range(len(uid_values)):
+            # print(item)
+            item = uid_values[i]
+            mac = str(item['uid__mac'])
+            index = mac.rfind(':')
+            tmp = mac[0:index] + '\t' + mac[index:]
+            content += tmp + '\t'
+            content += item['uid__uid'].strip()
+            content += '\r\n'
+            uidModel = UIDModel(
+                id=item['uid__id'],
+                uid=item['uid__uid'],
+                mac=item['uid__mac'],
+                uid_extra=item['uid__uid_extra'],
+                status=2,
+                add_time=item['uid__add_time'],
+                update_time=now_time,
+                area=item['uid__area']
+            )
+            updates.append(uidModel)
+
+            order_uid = OrderUIDModel(uid=uidModel, order=order, add_time=now_time, update_time=now_time)
+            updates_uid.append(order_uid)
+
+            if len(updates) % 5000 == 0:
+                UIDModel.objects.bulk_update(updates, fields=["status"])
+                OrderUIDModel.objects.bulk_create(updates_uid)
+                updates.clear()
+                updates_uid.clear()
+            # print(item['uid__uid'])
+
+        if len(updates) > 0:
+            UIDModel.objects.bulk_update(updates, fields=["status"])
+            OrderUIDModel.objects.bulk_create(updates_uid)
+            updates.clear()
+            updates_uid.clear()
+
+        del updates
+        del updates_uid
+        content = content[0:len(content) - 1]
+        response = StreamingHttpResponse(content)
+        response['Content-Type'] = 'application/octet-stream'
+        response['Content-Disposition'] = 'attachment;filename=UID'+time.strftime('-%Y-%m-%d-%H-%M-%S', time.localtime()) + '.txt'
+        return response
+
+    def download_excel(self, uid_qs, order):
+        response = HttpResponse(content_type='application/vnd.ms-excel')
+        response['Content-Disposition'] = 'attachment; filename=UID' + time.strftime('-%Y-%m-%d-%H-%M-%S',
+                                                                                     time.localtime()) + '.xls'
+        workbook = xlwt.Workbook(encoding='utf-8')
+        sheet1 = workbook.add_sheet('UID')
+        # row1 = [u'设备UID']
+        # for i in range(0, len(row1)):
+        #     sheet1.write(0, i, row1[i])
+
+        num = 1
+        updates = []
+        updates_uid = []
+        now_time = int(time.time())
+        for item in uid_qs:
+            uid = item['uid__uid']
+            mac = item['uid__mac']
+            index = mac.rfind(':')
+            sheet1.write(num, 0, mac[0:index])
+            sheet1.write(num, 1, mac[index:])
+            sheet1.write(num, 2, uid)
+            num += 1
+            uidModel = UIDModel(
+                id=item['uid__id'],
+                uid=item['uid__uid'],
+                mac=item['uid__mac'],
+                uid_extra=item['uid__uid_extra'],
+                status=2,
+                add_time=item['uid__add_time'],
+                update_time=now_time,
+                area=item['uid__area']
+            )
+            updates.append(uidModel)
+
+            order_uid = OrderUIDModel(uid=uidModel, order=order, add_time=now_time, update_time=now_time)
+            updates_uid.append(order_uid)
+
+            if len(updates) % 5000 == 0:
+                UIDModel.objects.bulk_update(updates, fields=["status"])
+                OrderUIDModel.objects.bulk_create(updates_uid)
+                updates.clear()
+                updates_uid.clear()
+            # print(item['uid__uid'])
+
+        if len(updates) > 0:
+            UIDModel.objects.bulk_update(updates, fields=["status"])
+            OrderUIDModel.objects.bulk_create(updates_uid)
+            updates.clear()
+            updates_uid.clear()
+
+        UIDModel.objects.bulk_update(updates, fields=["status"])
+        workbook.save(response)
+        return response
+
+    def download_zip(self, uid_qs, order):
+        dir_name = 'static/' + time.strftime('%Y_%m_%d_%H_%M_%S', time.localtime())
+        path = '/'.join((BASE_DIR, dir_name)).replace('\\', '/') + '/'
+        if not os.path.exists(path):
+            os.mkdir(path)
+
+        filename = time.strftime('_%Y_%m_%d_%H_%M_%S', time.localtime())
+        txt_filename = 'UID' + filename + '.txt'
+        excel_filename = 'UID' + filename + '.xls'
+
+        txt_file = open(path + txt_filename, 'w+')
+        workbook = xlwt.Workbook(encoding='utf-8')
+        sheet1 = workbook.add_sheet('UID')
+        num = 1
+
+        updates = []
+        updates_uid = []
+        content = ''
+        now_time = int(time.time())
+        for i in range(len(uid_qs)):
+            # print(item)
+            item = uid_qs[i]
+            uid = item['uid__uid']
+            mac = item['uid__mac']
+            index = mac.rfind(':')
+            tmp = mac[0:index] + '\t' + mac[index:]
+            content += tmp + '\t'
+            content += item['uid__uid'].strip()
+            content += '\r\n'
+
+            sheet1.write(num, 0, mac[0:index])
+            sheet1.write(num, 1, mac[index:])
+            sheet1.write(num, 2, uid)
+            num += 1
+
+            uidModel = UIDModel(
+                id=item['uid__id'],
+                uid=item['uid__uid'],
+                mac=item['uid__mac'],
+                uid_extra=item['uid__uid_extra'],
+                status=2,
+                add_time=item['uid__add_time'],
+                update_time=now_time,
+                area=item['uid__area']
+            )
+            updates.append(uidModel)
+
+            order_uid = OrderUIDModel(uid=uidModel, order=order, add_time=now_time, update_time=now_time)
+            updates_uid.append(order_uid)
+
+            if len(updates) % 5000 == 0:
+                UIDModel.objects.bulk_update(updates, fields=["status"])
+                OrderUIDModel.objects.bulk_create(updates_uid)
+                updates.clear()
+                updates_uid.clear()
+            # print(item['uid__uid'])
+
+        if len(updates) > 0:
+            UIDModel.objects.bulk_update(updates, fields=["status"])
+            OrderUIDModel.objects.bulk_create(updates_uid)
+            updates.clear()
+            updates_uid.clear()
+
+        del updates
+        del updates_uid
+        content = content[0:len(content) - 1]
+        txt_file.write(content)
+        txt_file.close()
+
+        workbook.save(path + excel_filename)
+
+        zip_name = path[0:path.rfind('/')] + '.zip'
+        return self.get_zip(path, os.listdir(path), zip_name)
+
+    def get_zip(self, path, files, zip_name):
+        zp = zipfile.ZipFile(zip_name, 'w', zipfile.ZIP_DEFLATED)
+        for file in files:
+            zp.write(filename=(path + file), arcname=str(file))
+        zp.close()
+
+        response = StreamingHttpResponse(open(zip_name, 'rb'))
+        response['content_type'] = "application/octet-stream"
+        response['Content-Disposition'] = 'attachment; filename=UID' + time.strftime('_%Y_%m_%d_%H_%M_%S',
+                                                                                     time.localtime()) + '.zip'
+        return response
+

+ 402 - 0
Controller/HistoryUIDController.py

@@ -0,0 +1,402 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import json
+import logging
+import time
+
+from django.db import transaction
+from django.http import StreamingHttpResponse
+from django.utils.decorators import method_decorator
+from django.views import View
+from django.views.decorators.csrf import csrf_exempt
+from django.db.models import Avg,Max,Min,Count,Sum, Q  #   引入函数
+
+from Model.models import UIDModel, UserModel, UserUIDModel, HistoryUIDModel
+from Object.RedisObject import RedisObject
+from Object.uidManageResponseObject import uidManageResponseObject
+from Object.TokenObject import TokenObject
+from Service.ModelService import ModelService
+
+
+class HistoryUIDView(View):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, request, *args, **kwargs):
+        return super(HistoryUIDView, self).dispatch(request, *args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        operation = kwargs.get('operation')
+        return self.validate(request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        operation = kwargs.get('operation')
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+        token = request_dict.get('token', None)
+        response = uidManageResponseObject()
+
+        token = TokenObject(token)
+        if token.code != 0:
+            return response.json(token.code)
+
+        if operation == 'quantity':
+            return self.do_quantity(request_dict, response)
+        elif operation == 'remove':
+            return self.do_remove(request_dict, response)
+        elif operation == 'download':
+            return self.download_txt(token, response)
+        elif operation == 'list':
+            return self.do_list(request_dict, response)
+        elif operation == 'delete':
+            return self.do_delete(token.userID, request_dict, response)
+        elif operation == 'batchDelete':
+            return self.do_batch_delete(token.userID, request_dict, response)
+        elif operation == 'adminUpdate':
+            return self.do_admin_update(token.userID, request_dict, response)
+        else:
+            return response.json(309)
+
+    # 查询当前可用的UID的数量
+    def do_quantity(self, request_dict, response):
+        token = request_dict.get('token', None)
+
+        token = TokenObject(token)
+        if token.code != 0:
+            return response.json(token.code)
+
+        user_qs = UserModel.objects.filter(id=token.userID)
+        if user_qs.exists():
+            user = user_qs[0]
+            if user.permission == '0':
+                return self.do_admin_quantity(request_dict, response, user.username)
+            else:
+                return self.do_not_admin_quantity(request_dict, response, user.username)
+        else:
+            return response.json(9)
+
+    # 管理员的查询UID数量操作
+    def do_admin_quantity(self, request_dict, response, admin):
+        datas = []
+        domestic = HistoryUIDModel.objects.filter(area=0, status=0).count()
+        foreign = HistoryUIDModel.objects.filter(area=1, status=0).count()
+        item = {}
+        item['isAdmin'] = 1
+        item['domestic'] = domestic
+        item['foreign'] = foreign
+        item['username'] = admin
+        datas.append(item)
+
+        user_qs = UserModel.objects.filter(~Q(Q(permission='0')))
+        for user in user_qs:
+            item = {'isAdmin': 0}
+            result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=0).aggregate(num=Count('uid__status'))
+            item['domestic'] = result['num']
+            result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=1).aggregate(num=Count('uid__status'))
+            item['foreign'] = result['num']
+            item['username'] = user.username
+            datas.append(item)
+
+        return response.json(0, {'data': datas})
+
+    # 非管理员的查询UID数量操作
+    def do_not_admin_quantity(self, request_dict, response, username):
+        user_qs = UserModel.objects.filter(username=username)
+        if user_qs.exists():
+            user = user_qs[0]
+            datas = []
+            item = {'isAdmin': 0}
+            result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=0).aggregate(num=Count('uid__status'))
+            item['domestic'] = result['num']
+            result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=1).aggregate(num=Count('uid__status'))
+            item['foreign'] = result['num']
+            item['username'] = user.username
+            datas.append(item)
+            return response.json(0, {'data': datas})
+        else:
+            return response.json(444)
+
+    # 分配UID
+    @transaction.atomic
+    def do_allot(self, request_dict, response):
+        username = request_dict.get('username', None)
+        quantity = int(request_dict.get('quantity', None))
+        area = request_dict.get('area', None)
+        token = request_dict.get('token', None)
+
+        token = TokenObject(token)
+        if token.code != 0:
+            return response.json(token.code)
+        user = UserModel.objects.get(id=token.userID)
+
+        if not user or '0' not in user.permission:
+            return response.json(404)
+
+        # 要分配的对象
+        allot_user_qs = UserModel.objects.filter(username=username)
+        if not allot_user_qs.exists():
+            return response.json(444, 'username')
+
+        # 取出对应区域可用的UID分配给allot_user
+        uid_qs = HistoryUIDModel.objects.filter(area=area, status=0)
+        count = uid_qs.count()
+        if count < quantity:
+            return response.json(444, '设备UID不足')
+
+        updates = []
+        datas = []
+        count = 0
+        if uid_qs.exists():
+            uid_qs = uid_qs[0:quantity]
+            now_time = int(time.time())
+            savePoint = transaction.savepoint()
+            for item in uid_qs:
+                item.status = 1
+                item.update_time = time.time()
+                user_uid = UserUIDModel()
+                user_uid.uid = item
+                user_uid.user = allot_user_qs[0]
+                user_uid.add_time = now_time
+                user_uid.update_time = now_time
+                datas.append(user_uid)
+                updates.append(item)
+
+                if len(datas) % 5000 == 0:
+                    result = self.do_update(datas, updates, savePoint)
+                    if result != 0:
+                        return response.json(result)
+
+            if len(datas) > 0:
+                result = self.do_update(datas, updates, savePoint)
+                if result != 0:
+                    return response.json(result)
+            redisObject = RedisObject()
+            values = uid_qs.values('uid')
+            print(values)
+            redisObject.set_data(key=token.token, val=json.dumps(list(values)), expire=3600)
+            del datas
+            del updates
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_update(self, datas, updates, savePoint, count=0):
+        try:
+            try:
+                if count == 2:
+                    raise Exception("Invalid level!")
+                UserUIDModel.objects.bulk_create(datas)
+                HistoryUIDModel.objects.bulk_update(updates, fields=['status', 'update_time'])
+                datas.clear()
+                updates.clear()
+            except Exception as e:
+                if savePoint:
+                    transaction.savepoint_rollback(savePoint)
+                djangoLogger = logging.getLogger('django')
+                djangoLogger.exception(repr(e))
+                return 174
+        except Exception as e:
+            return 174
+        return 0
+
+    # 把UID表中的数据移动到HistoryUID表中
+    def do_remove(self, request_dict, response):
+        token = TokenObject(request_dict.get('token', None))
+        id = request_dict.get('id', None)
+        start = request_dict.get('start', None)
+        stop = request_dict.get('stop', None)
+
+        if token.code != 0:
+            return response.json(token.code)
+
+        # 通过userID查找用户,判断是否是管理员
+        user_qs = UserModel.objects.filter(id=token.userID)
+        if user_qs.exists():
+            user = user_qs[0]
+            if user.permission != '0':
+                return response.json(404)
+        else:
+            return response.json(9)
+
+        if id:
+            return self.do_remove_by_id(id, response)
+        elif start and stop:
+            return self.do_bulk_remove(int(start), int(stop), response)
+        else:
+            return response.json(444, 'id,start,stop')
+
+    # 移除单条UID记录,id:记录id
+    def do_remove_by_id(self, id, response):
+        id = int(id)
+        uid_qs = HistoryUIDModel.objects.filter(id=id)
+        if not uid_qs.exists():
+            return response.json(173)
+
+        uid = uid_qs[0]
+        if uid:
+            data = {
+                'uid': uid.uid,
+                'uid_extra': uid.uid_extra,
+                'status': uid.status,
+                'add_time': uid.add_time,
+                'update_time': uid.update_time,
+                'area': uid.area
+            }
+            HistoryUIDModel.objects.create(**data)
+            uid.delete()
+            return response.json(0)
+        else:
+            return response.json(444, 'id')
+
+    # 批量移除UID记录。start:开始的UID记录的id;stop:结束的UID记录的id
+    def do_bulk_remove(self, start, stop, response):
+        uid_qs = UIDModel.objects.filter(id__range=(start, stop))
+        histories = []
+        if uid_qs.exists():
+            for item in uid_qs:
+                histories.append(HistoryUIDModel(
+                    uid=item.uid,
+                    uid_extra=item.uid_extra,
+                    status=item.status,
+                    add_time=item.add_time,
+                    update_time=item.update_time,
+                    area=item.area
+                ))
+                if len(histories) % 5000 == 0:
+                    HistoryUIDModel.objects.bulk_create(histories)
+                    histories.clear()
+            if len(histories) > 0:
+                HistoryUIDModel.objects.bulk_create(histories)
+                histories.clear()
+            uid_qs.delete()
+            return response.json(0)
+        else:
+            return response.json(173)
+
+    def download_txt(self, token, response):
+
+        redisObject = RedisObject()
+        uid_qs = redisObject.get_data(key=token.token)
+
+        if uid_qs is False:
+            return response.json(308)
+
+        uid_qs = json.loads(uid_qs)
+        content = ''
+        for item in uid_qs:
+            # print(item)
+            content += item['uid']
+            content += '\r\n'
+
+        redisObject.del_data(key=token.token)
+
+        content = content[0:len(content) - 1]
+        response = StreamingHttpResponse(content)
+        response['Content-Type'] = 'application/octet-stream'
+        filename = 'uid_need_to_set_up_push.txt'
+        response['Content-Disposition'] = 'attachment;filename=' + filename
+
+        return response
+
+    def do_list(self, request_dict, response):
+        page = request_dict.get('page', None)
+        line = request_dict.get('limit', None)
+        status = request_dict.get('status', None)
+        area = request_dict.get('area', None)
+        start_time = request_dict.get('starttime', None)
+        stop_time = request_dict.get('endtime', None)
+        uid = request_dict.get('uid', None)
+
+        if page and line:
+
+            uid_qs = HistoryUIDModel.objects.filter()
+            res = {
+                'count': 0,
+                'data': []
+            }
+
+            if uid_qs.exists():
+                page = int(page)
+                line = int(line)
+
+                start = (page - 1) * line
+                end = start + line
+
+                if uid:
+                    uid_qs = uid_qs.filter(uid=uid)
+
+                if status:
+                    uid_qs = uid_qs.filter(status=status)
+
+                if area:
+                    uid_qs = uid_qs.filter(area=area)
+
+                if start_time:
+                    uid_qs = uid_qs.filter(update_time__gte=start_time)
+
+                if stop_time:
+                    if stop_time > start:
+                        uid_qs = uid_qs.filter(update_time__lte=stop_time)
+
+                res['count'] = uid_qs.count()
+                uid_qs = uid_qs.values()[start:end]
+
+                res['data'] = list(uid_qs)
+
+            print(res)
+            return response.json(0, res)
+        else:
+            return response.json(444)
+
+    def do_delete(self, userID, request_dict, response):
+        uid = request_dict.get('uid', None)
+        user_qs = UserModel.objects.filter(id=userID)
+
+        if user_qs.exists():
+            user = user_qs[0]
+            if int(user.permission) != 0:
+                return response.json(309)
+
+            HistoryUIDModel.objects.filter(uid=uid).delete()
+            return response.json(0)
+        else:
+            return response.json(309)
+
+    def do_batch_delete(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        uids = request_dict.get('uidlist', None)
+
+        if uids:
+            uids = json.loads(uids)
+            HistoryUIDModel.objects.filter(uid__in=uids).delete()
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_admin_update(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        uid = request_dict.get('uid', None)
+        content = request_dict.get('content', None)
+
+        if uid and content:
+            content = json.loads(content)
+            print(content)
+            content['update_time'] = int(time.time())
+            uid_qs = HistoryUIDModel.objects.filter(uid=uid)
+            if uid_qs.exists():
+                uid_qs.update(**content)
+                return response.json(0)
+            else:
+                return response.json(173)
+        else:
+            return response.json(444)

+ 98 - 16
Controller/IotCoreController.py

@@ -1,11 +1,15 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
+import json
+import time
+
 import boto3
 from django.views import View
 
-from Ansjer.config import AWS_IOT_SES_ACCESS_REGION, AWS_IOT_SES_ACCESS_ID, \
-    AWS_IOT_SES_ACCESS_SECRET
+from Model.models import Device_User, Device_Info, RegionCountryModel, iotdeviceInfoModel
+from Object.IOTCore.IotObject import ChinaIOTClient, AsiaIOTClient, EuropeIOTClient, AmericaIOTClient
 from Object.ResponseObject import ResponseObject
+from Service.CommonService import CommonService
 
 
 class IotCoreView(View):
@@ -28,27 +32,105 @@ class IotCoreView(View):
 
         if operation == 'createProvisioningClaim':
             return self.create_provisioning_claim(request_dict, response)
+        elif operation == 'createKeysAndCertificate':
+            return self.create_keys_and_certificate(request_dict, response)
         else:
             return response.json(404)
 
+    # 即时预置注册  :已放弃
     def create_provisioning_claim(self, request_dict, response):
+        uid = request_dict.get('uid', None)
+        token = request_dict.get('token', None)
+        time_stamp = request_dict.get('time_stamp', None)
+
+        if uid and token and time_stamp:
+            token = int(CommonService.decode_data(token))
+            time_stamp = int(time_stamp)
+
+            now_time = int(time.time())
+            distance = now_time - time_stamp
+
+            # if token != time_stamp and distance > 600: 暂时去掉延时
+            if token != time_stamp:
+                return response.json(404)
 
-        country = request_dict.get('country', None)
-        state = request_dict.get('state', None)
+            region_country_qs = Device_Info.objects.filter(UID=uid).values('userID__region_country')
+            if not region_country_qs.exists() or region_country_qs[0]['userID__region_country'] == 0 :
+                return response.json(173)
 
-        if country and state:
+            region_country_qs = RegionCountryModel.objects.filter(number=region_country_qs[0]['userID__region_country'])
+            if region_country_qs.exists():
+                user_region = region_country_qs[0]
 
-            client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_REGION, aws_access_key_id=AWS_IOT_SES_ACCESS_ID,
-                                  aws_secret_access_key=AWS_IOT_SES_ACCESS_SECRET)
-            result = client.create_provisioning_claim(templateName='Ansjer_Iot_Queue')
+                if user_region.region_id == 1:
+                    iotClient = ChinaIOTClient()
 
-            res = {
-                'certificateId': result['certificateId'],
-                'certificatePem': result['certificatePem'],
-                'publicKey': result['keyPair']['PublicKey'],
-                'privateKey': result['keyPair']['PrivateKey'],
-                'endpoint': 'a2rqy12o004ad8-ats.iot.us-east-1.amazonaws.com'
-            }
-            return response.json(0, {'res': res})
+                    return response.json(0, {'res': iotClient.create_provisioning_claim('Ansjer_Iot_Queue')})
+                elif user_region.region_id == 2:
+                    iotClient = AsiaIOTClient()
+                    return response.json(0, {'res': iotClient.create_provisioning_claim('Ansjer_Iot_Queue')})
+                elif user_region.region_id == 3:
+                    iotClient = EuropeIOTClient()
+                    return response.json(0, {'res': iotClient.create_provisioning_claim('Ansjer_Iot_Queue')})
+                else:
+                    iotClient = AmericaIOTClient()
+                    return response.json(0, {'res': iotClient.create_provisioning_claim('Ansjer_Iot_Queue')})
         else:
             return response.json(444)
+
+    # CVM注册  :正使用
+    def create_keys_and_certificate(self, request_dict, response):
+        uid = request_dict.get('uid', None)
+        uid_code = request_dict.get('uid_code', None)
+        token = request_dict.get('token', None)
+        time_stamp = request_dict.get('time_stamp', None)
+
+        if uid and token and time_stamp and uid_code:
+            uid_code = CommonService.decode_data(uid_code)
+            token = int(CommonService.decode_data(token))
+            time_stamp = int(time_stamp)
+
+            now_time = int(time.time())
+            distance = now_time - time_stamp
+
+            # if token != time_stamp and distance > 600: 暂时去掉延时
+            if token != time_stamp or uid != uid_code or distance > 600 :
+                return response.json(404)
+
+            region_country_qs = Device_Info.objects.filter(UID=uid).values('userID__region_country')
+            if not region_country_qs.exists() or region_country_qs[0]['userID__region_country'] == 0 :
+                return response.json(173)
+
+            iotqs = iotdeviceInfoModel.objects.filter(uid=uid)
+
+            # 判断设备是否已注册证书
+            if not iotqs.exists():
+                region_country_qs = RegionCountryModel.objects.filter(
+                    number=region_country_qs[0]['userID__region_country'])
+                if region_country_qs.exists():
+                    user_region = region_country_qs[0]
+
+                    if user_region.region_id == 1:
+                        iotClient = ChinaIOTClient()
+
+                    elif user_region.region_id == 2:
+                        iotClient = AsiaIOTClient()
+
+                    elif user_region.region_id == 3:
+                        iotClient = EuropeIOTClient()
+
+                    else:
+                        iotClient = AmericaIOTClient()
+                    res = iotClient.create_keys_and_certificate(uid)
+                    Device_Info.objects.filter(UID=uid).update(endpoint=res[0]['endpoint'])
+                    iotdeviceInfoModel.objects.create(uid=uid, certificateId=res[0]['certificateId'],
+                                                      certificatePem=res[0]['certificatePem'],
+                                                      publicKey=res[0]['publicKey'],
+                                                      privateKey=res[0]['privateKey'],
+                                                      Thingname=res[1]['ThingName'])
+                    return response.json(0, {'res': res})
+            else:
+                # print('此设备已注册证书')
+                return response.json(10042)
+        else:
+            return response.json(444)

+ 97 - 0
Controller/LanguageController.py

@@ -0,0 +1,97 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import time
+
+from django.views import View
+
+from Model.models import LanguageModel
+from Object.uidManageResponseObject import uidManageResponseObject
+from Object.TokenObject import TokenObject
+from Service.ModelService import ModelService
+
+
+class LanguageView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = request.GET
+        return self.validate(request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = request.POST
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+        token = TokenObject(request_dict.get('token', None))
+
+        response = uidManageResponseObject()
+
+        if token.code != 0:
+            return response.json(token.code)
+
+        if operation == 'add':
+            return self.do_add(token.userID, request_dict, response)
+        elif operation == 'update':
+            return self.do_update(token.userID, request_dict, response)
+        elif operation == 'getLanguage':
+            return self.do_get(request_dict, response)
+        else:
+            return response.json(404)
+
+    def do_add(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        lang = request_dict.get('lang', None)
+        lang_youdao = request_dict.get('lang_youdao', None)
+
+        if lang:
+            now_time = int(time.time())
+
+            language = LanguageModel(lang=lang, lang_youdao=lang_youdao, add_time=now_time, update_time=now_time)
+            language.save()
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_update(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        id = request_dict.get('id', None)
+        if id:
+            lang = request_dict.get('lang', None)
+            lang_youdao = request_dict.get('lang_youdao', None)
+
+            update = {
+
+            }
+            if lang:
+                update['lang'] = lang
+
+            if lang_youdao:
+                update['lang_youdao'] = lang_youdao
+
+            LanguageModel.objects.filter(id=id).update(**update)
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_get(self, request_dict, response):
+        type = request_dict.get('type', None)
+
+        if type:
+            lang_qs = LanguageModel.objects.filter(lang=type)
+            if lang_qs.exists():
+                lang = lang_qs.values('id', 'lang', 'lang_youdao')
+
+                return response.json(0, lang)
+            else:
+                return response.json(173)
+        else:
+            return response.json(444)

+ 99 - 0
Controller/LogController.py

@@ -0,0 +1,99 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+from django.utils.decorators import method_decorator
+from django.views import View
+from django.views.decorators.csrf import csrf_exempt
+
+from Model.models import LogModel
+from Object.uidManageResponseObject import uidManageResponseObject
+from Object.TokenObject import TokenObject
+
+
+class LogView(View):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, request, *args, **kwargs):
+        return super(LogView, self).dispatch(request, *args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        operation = kwargs.get('operation')
+        return self.validate(request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        operation = kwargs.get('operation')
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+        token = TokenObject(request_dict.get('token', None))
+        response = uidManageResponseObject()
+
+        if token.code != 0:
+            return response.json(token.code)
+
+        if operation == 'query':
+            return self.do_query(request_dict, token, response)
+        elif operation == 'queryAll':
+            return self.do_query_all(request_dict, token, response)
+        elif operation == 'delete':
+            return self.do_delete(request_dict, response)
+        elif operation == 'adminQuery':
+            return self.do_admin_query(request_dict, token, response)
+        else:
+            return response.json(404)
+
+    def do_query(self, request_dict, token: TokenObject, response):
+        page = request_dict.get('page', None)
+        line = request_dict.get('line', None)
+
+        if page and line:
+            log_qs = LogModel.objects.filter(user__id=token.userID).values('id', 'operation', 'time', 'ip', 'user__username')
+            if log_qs.exists():
+                page = int(page)
+                line = int(line)
+                start = (page - 1) * line
+                count = log_qs.count()
+                data = log_qs[start:(start + line)]
+                return response.json(0, {'count': count, 'data': list(data)})
+            else:
+                return response.json(0, {'count': 0, 'data': []})
+        else:
+            return response.json(444)
+
+    def do_query_all(self, request_dict, token: TokenObject, response: uidManageResponseObject):
+        log_qs = LogModel.objects.filter(user__id=token.userID).values('id', 'operation', 'time', 'ip')
+        if log_qs.exists():
+            count = log_qs.count()
+            return response.json(0, {'count': count, 'data': list(log_qs)})
+        else:
+            return response.json(0, {'count': 0, 'data': []})
+
+    def do_delete(self, request_dict, response):
+        id = request_dict.get('id', None)
+
+        if id:
+            LogModel.objects.filter(id=id).delete()
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_admin_query(self, request_dict, token: TokenObject, response):
+        page = request_dict.get('page', None)
+        line = request_dict.get('limit', None)
+
+        if page and line:
+            log_qs = LogModel.objects.filter().values('id', 'operation', 'time', 'ip', 'user__username')
+            if log_qs.exists():
+                page = int(page)
+                line = int(line)
+                start = (page - 1) * line
+                count = log_qs.count()
+                data = log_qs[start:(start + line)]
+                return response.json(0, {'count': count, 'data': list(data)})
+            else:
+                return response.json(0, {'count': 0, 'data': []})
+        else:
+            return response.json(444)

+ 104 - 0
Controller/OrderTaskController.py

@@ -0,0 +1,104 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import json
+
+from django.views import View
+
+from Model.models import OrderTaskModel
+from Object.uidManageResponseObject import uidManageResponseObject
+from Object.TokenObject import TokenObject
+from Service.ModelService import ModelService
+
+
+class OrderTaskView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = request.GET
+        return self.validate(request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = request.POST
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+
+        token = request_dict.get('token', None)
+
+        response = uidManageResponseObject()
+        token = TokenObject(token)
+
+        if token.code != 0:
+            return response.json(0)
+
+        if operation == 'query':
+            return self.do_query(token.userID, request_dict, response)
+        elif operation == 'update':
+            return self.do_update(token.userID, request_dict, response)
+        elif operation == 'delete':
+            return self.do_delete(token.userID, request_dict, response)
+        else:
+            return response.json(404)
+
+    def do_query(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        page = request_dict.get('page', None)
+        line = request_dict.get('limit', None)
+
+        if page and line:
+
+            order_task_qs = OrderTaskModel.objects.filter()
+            res = {
+                'count': 0,
+                'data': []
+            }
+            if order_task_qs.exists():
+                page = int(page)
+                line = int(line)
+
+                res['count'] = order_task_qs.count()
+                start = (page - 1) * line
+                end = start + line
+
+                order_task_qs = order_task_qs[start:end].values()
+                res['data'] = list(order_task_qs)
+
+            return response.json(0, res)
+        else:
+            return response.json(444)
+
+    def do_update(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        id = request_dict.get('id', None)
+        content = request_dict.get('content', None)
+        print(content)
+
+        if id and content:
+            content = json.loads(content)
+            print(content)
+            OrderTaskModel.objects.filter(id=id).update(**content)
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_delete(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        id = request_dict.get('id', None)
+
+        if id:
+            OrderTaskModel.objects.filter(id=id).delete()
+            return response.json(0)
+        else:
+            return response.json(444)

+ 291 - 0
Controller/RegionController.py

@@ -0,0 +1,291 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import json
+import time
+
+from django.views import View
+
+from Model.models import RegionModel, CountryModel, LanguageModel, CountryLanguageModel
+from Object.uidManageResponseObject import uidManageResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+from Service.ModelService import ModelService
+
+
+class RegionView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = request.GET
+        return self.validate(request_dict, operation)
+
+    def post(self, request, *arg, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = request.POST
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+        token = TokenObject(request_dict.get('token', None))
+
+        response = uidManageResponseObject()
+
+        if operation == 'getCountry':
+            return self.get_country(request_dict, response)
+        else:
+            if token.code != 0:
+                return response.json(token.code)
+
+            if operation == 'add':
+                return self.do_add(token.userID, request_dict, response)
+            elif operation == 'update':
+                return self.do_update(token.userID, request_dict, response)
+            elif operation == 'delete':
+                return self.do_delete(token.userID, request_dict, response)
+            elif operation == 'list':
+                return self.do_list(token.userID, request_dict, response)
+            elif operation == 'addCountry':
+                return self.do_add_country(token.userID, request_dict, response)
+            elif operation == 'updateCountry':
+                return self.do_update_country(token.userID, request_dict, response)
+            elif operation == 'deleteCountry':
+                return self.do_delete_country(token.userID, request_dict, response)
+            elif operation == 'listCountry':
+                return self.do_list_country(token.userID, request_dict, response)
+            else:
+                return response.json(404)
+
+    def do_add(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        name = request_dict.get('region', None)
+
+        if name:
+            region = RegionModel(name=name)
+            region.save()
+
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_update(self,  userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        id = request_dict.get('id', None)
+        name = request_dict.get('region', None)
+
+        if id and name:
+            region_qs = RegionModel.objects.filter(id=id)
+            if region_qs.exists():
+                region = region_qs[0]
+                region.name = name
+                region.save()
+                return response.json(0)
+            else:
+                return response.json(173)
+        else:
+            return response.json(444)
+
+    def do_delete(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        id = request_dict.get('id', None)
+
+        if id:
+            region_qs = RegionModel.objects.filter(id=id)
+            if region_qs.exists():
+                region_qs.delete()
+                return response.json(0)
+            else:
+                return response.json(173)
+        else:
+            return response.json(444)
+
+    def do_list(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        page = request_dict.get('page', None)
+        line = request_dict.get('limit', None)
+
+        if page and line:
+            page = int(page)
+            line = int(line)
+
+            start = (page - 1) * line
+            end = start + line
+
+            region_qs = RegionModel.objects.filter()
+            count = region_qs.count()
+
+            region_qs = region_qs[start: end].values()
+
+            res = {
+                'count': count,
+                'data': list(region_qs)
+            }
+
+            return response.json(0, res)
+        else:
+            return response.json(444)
+
+    def do_add_country(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        number = request_dict.get('number', None)
+        region_id = request_dict.get('region_id', None)
+        countries = request_dict.get('countries', None)
+
+        if number and region_id and countries:
+
+            now_time = int(time.time())
+            countries = json.loads(countries)
+
+            country_qs =CountryModel.objects.filter(number=number)
+            if not country_qs.exists():
+                country = CountryModel(number=number, region_id=region_id, add_time=now_time, update_time=now_time)
+                country.save()
+            else:
+                country = country_qs[0]
+
+            for item in countries:
+                country_language_qs = CountryLanguageModel.objects.filter(language_id=item, country_id=country.id)
+                if not country_language_qs.exists():
+                    countryLanguage = CountryLanguageModel(
+                        country_name=countries[item], language_id=item, country_id=country.id, add_time=now_time, update_time=now_time)
+                    countryLanguage.save()
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_update_country(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        id = request_dict.get('country_id', None)
+        number = request_dict.get('number', None)
+        region_id = request_dict.get('region_id', None)
+        countries = request_dict.get('countries', None)
+
+        if id and number and region_id and countries:
+
+            country_qs = CountryModel.objects.filter(id=id)
+            if not country_qs.exists():
+                return response.json(173)
+
+            now_time = int(time.time())
+            countries = json.loads(countries)
+            country = {
+                'number': number,
+                'region_id': region_id,
+                'update_time': now_time,
+            }
+
+            country_qs.update(**country)
+
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_delete_country(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        id = request_dict.get('id', None)
+
+        if id:
+            country_qs = CountryModel.objects.filter(id=id)
+            if country_qs.exists():
+                country_qs.delete()
+                return response.json(0)
+            else:
+                return response.json(173)
+        else:
+            return response.json(444)
+
+    def do_list_country(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        region_id = request_dict.get('region_id', None)
+        page = request_dict.get('page', None)
+        line = request_dict.get('limit', None)
+
+        if page and line:
+            page = int(page)
+            line = int(line)
+
+            start = (page - 1) * line
+            end = start + line
+
+            region_qs = CountryLanguageModel.objects.filter(language_id=1)
+            if region_id:
+                region_qs = region_qs.filter(country__region__id=region_id)
+
+            count = region_qs.count()
+
+            if region_qs.exists():
+                region_qs = region_qs[start: end].values('country_id', 'country_name', 'country__number', 'country__region__name', 'add_time', 'update_time')
+            else:
+                region_qs = []
+            res = {
+                'count': count,
+                'data': list(region_qs)
+            }
+
+            return response.json(0, res)
+        else:
+            return response.json(444)
+
+    def get_country(self, request_dict, response):
+        type = request_dict.get('type', None)
+        token = request_dict.get('token', None)
+        time_stamp = request_dict.get('time_stamp', None)
+
+        if token and time_stamp and type:
+            token = int(CommonService.decode_data(token))
+            time_stamp = int(time_stamp)
+
+            now_time = int(time.time())
+            distance = now_time - time_stamp
+
+            if token != time_stamp or distance > 300 or distance < 0:
+                return response.json(404)
+
+            lang_qs = LanguageModel.objects.filter(lang=type)
+
+            if not lang_qs.exists():
+                lang_qs = LanguageModel.objects.filter(lang='en')
+
+            lang = lang_qs[0]
+            country_qs = CountryLanguageModel.objects.filter(language_id=lang.id).values('country_name', 'country__number')
+
+            return response.json(0, list(country_qs))
+        else:
+            return response.json(444)
+
+    def get_country_info(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        country_number = request_dict.get('country_number', None)
+
+        if country_number:
+            country_language_qs = CountryLanguageModel.objects.filter(country__number=country_number)
+            if country_language_qs.exists():
+                country_language_qs = country_language_qs
+        pass

+ 71 - 0
Controller/RegionCountryController.py

@@ -0,0 +1,71 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import time
+
+from django.views import View
+
+from Model.models import Device_User, RegionCountryModel
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+import  json
+
+class RegionCountryView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = request.GET
+        return self.validate(request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = request.POST
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+        token = TokenObject(request_dict.get('token', None))
+
+        response = ResponseObject()
+
+        if token.code != 0:
+            return response.json(token.code)
+
+        if operation == 'initUserRegion':
+            return self.do_initUserRegion(token.userID, request_dict, response)
+        elif operation == 'initRegionDate':
+            return self.do_initRegionDate(request_dict, response)
+        else:
+            return response.json(404)
+
+    def do_initUserRegion(self, userID, request_dict, response):
+        user_qs = Device_User.objects.filter(userID=userID)
+        number = request_dict.get('number', None)
+        if not user_qs.exists():
+            return response.json(309)
+        user_qs[0].region_country = number
+        user_qs[0].save()
+        return response.json(0)
+
+    def do_initRegionDate(self, request_dict, response):
+        filepath = request_dict.get('filepath')
+
+        with open(filepath, 'r', encoding='UTF-8') as f:
+            region_list = json.load(f)
+
+        #region_list = json.loads(fobj)
+        now_time = int(time.time())
+        regin_list = []
+        for region in region_list:
+            name = region['name']
+            region_id = region['region_id']
+
+            countries_list = region['countries']
+            for countries in countries_list:
+                cn = countries['cn']
+                en = countries['en']
+                number = countries['number']
+                regin_list.append(RegionCountryModel(number=number, region_id=region_id, name=name, cn=cn, en=en, add_time=now_time, update_time=now_time))
+
+        RegionCountryModel.objects.bulk_create(regin_list)
+        return response.json(0)

+ 107 - 0
Controller/SalesController.py

@@ -0,0 +1,107 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import datetime
+import json
+import random
+
+from django.utils.decorators import method_decorator
+from django.views import View
+from django.views.decorators.csrf import csrf_exempt
+
+from Ansjer.config import SALES, ONLINE_DEVICE
+from Object.uidManageResponseObject import uidManageResponseObject
+
+
+class SalesView(View):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, request, *args, **kwargs):
+        return super(SalesView, self).dispatch(request, *args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def post(self, request, *args, **kwargs):
+        request_dict = request.POST
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        year = request_dict.get('year', 0)
+        response = uidManageResponseObject()
+        if year:
+            year = int(year)
+            if year == 0:
+                data = SALES.copy()
+                data[2020] = self.get_last_year_data(SALES[2020])
+                return response.json(0, {'data': self.format_data(data)})
+            elif 2015 < year < 2020:
+                data = {year: SALES[year]}
+                return response.json(0, {'data': self.format_data(data)})
+            elif year == 2020:
+                data = {year: self.get_last_year_data(SALES[year])}
+                return response.json(0, {'data': self.format_data(data)})
+            else:
+                return response.json(444)
+        else:
+            return response.json(444)
+
+    def get_last_year_data(self, data):
+        result = []
+        month = datetime.datetime.now().month
+        print(month)
+        sum = 0
+        for item in data:
+            value = item['value']
+            sale = int(value[0] / 12 * month)
+            sum += sale
+
+        for item in data:
+            tmp = {}
+            tmp['name'] = item['name']
+            value = item['value']
+            sale = int(value[0] / 12 * month)
+            percent = round(sale * 100 / sum, 3)
+
+            tmpValue = []
+            tmpValue.append(sale)
+            tmpValue.append(percent)
+            tmpValue.append(value[2])
+            tmp['value'] = tmpValue
+            result.append(tmp)
+        print(result)
+        return result
+
+    def format_data(self, data: dict):
+        result = []
+        keys = data.keys()
+        for key in keys:
+            tmp = {
+                'time': key,
+                'data': data[key]
+            }
+            result.append(tmp)
+        return result
+
+
+class DeviceOnlineView(View):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, request, *args, **kwargs):
+        return super(DeviceOnlineView, self).dispatch(request, *args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request_dict = request.GET
+        return self.validate(request_dict)
+
+    def post(self, request, *args, **kwargs):
+        request_dict = request.POST
+        return self.validate(request_dict)
+
+    def validate(self, request_dict):
+        response = uidManageResponseObject()
+        return response.json(0,{'online': random.randint((0.9 * ONLINE_DEVICE), ONLINE_DEVICE)})
+
+
+
+

+ 371 - 0
Controller/SerialNumberController.py

@@ -0,0 +1,371 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import logging
+import random
+import time
+
+from django.db import transaction
+from django.views import View
+
+from Model.models import SerialNumberModel, CompanySerialModel, UIDCompanySerialModel, CompanyModel, RegionModel, \
+    CountryModel, UIDModel
+from Object.RedisObject import RedisObject
+from Object.uidManageResponseObject import uidManageResponseObject
+from Object.TokenObject import TokenObject
+from Service.AlgorithmService import AlgorithmBaseOn35
+from Service.CommonService import CommonService
+from Service.ModelService import ModelService
+
+
+class SerialNumberView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = request.GET
+        return self.validate(request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = request.POST
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+        token = TokenObject(request_dict.get('token', None))
+        response = uidManageResponseObject()
+
+        if operation == 'getUID':
+            return self.do_get_uid(request_dict, response)
+        elif operation == 'getSerial':
+            return self.do_get_serial_number(request_dict, response)
+        else:
+            if token.code != 0:
+                return response.json(token.code)
+
+            if operation == 'create':
+                return self.do_create(request_dict, response)
+            elif operation == 'list':
+                return self.do_list(token.userID, request_dict, response)
+            elif operation == 'update':
+                return self.do_update(token.userID, request_dict, response)
+            elif operation == 'attachUID':
+                return self.do_attach_uid(request_dict, response)
+            elif operation == 'detachUID':
+                return self.do_detach_uid(token.userID, request_dict, response)
+            else:
+                return response.json(404)
+
+    def do_create(self, request_dict, response):
+        quantity = request_dict.get('quantity', None)
+
+        if quantity:
+            start_time = time.strftime('%Y-%m-%d %H:%M:%S')
+            print('start create ' + start_time)
+            quantity = int(quantity)
+            tmp = []
+            algorithm = AlgorithmBaseOn35()
+
+            sum = SerialNumberModel.objects.count()
+
+            for i in range(quantity):
+                serial_number = algorithm.getLetter(sum)
+                tmp_len = 6 - len(serial_number)
+                # 前面补0
+                for j in range(tmp_len):
+                    serial_number = '0' + serial_number
+
+                tmp.append(serial_number)
+                sum += 1
+
+            # 把序列号的顺序打乱
+            random.shuffle(tmp)
+
+            data = []
+            now_time = int(time.time())
+            for item in tmp:
+                data.append(SerialNumberModel(serial_number=item, add_time=now_time))
+
+                if len(data) == 10000:
+                    SerialNumberModel.objects.bulk_create(data)
+                    data.clear()
+
+            if len(data) > 0:
+                SerialNumberModel.objects.bulk_create(data)
+                data.clear()
+            start_time = time.strftime('%Y-%m-%d %H:%M:%S')
+            print('start create ' + start_time)
+
+            redis = RedisObject()
+            redis.del_data(key='serial_number_count')
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    # 提供给pc端获取序列号
+    def do_get_serial_number(self, request_dict, response):
+        quantity = request_dict.get('quantity', None)
+        company_id = request_dict.get('company_id', None)
+        token = request_dict.get('token', None)
+        time_stamp = request_dict.get('time_stamp', None)
+
+        if token and time_stamp and quantity and company_id:
+
+            token = int(CommonService.decode_data(token))
+            time_stamp = int(time_stamp)
+
+            now_time = int(time.time())
+            distance = now_time - time_stamp
+
+            if token != time_stamp or distance > 300 or distance < 0:
+                return response.json(404)
+
+            redisObject = RedisObject()
+            key = 'serial_lock'
+            value = redisObject.lpop(key)
+            count = 0
+            while value is False and count < 5:
+                time.sleep(1)
+                value = redisObject.lpop(key)
+                count += 1
+
+            if count == 5 and value is False:
+                return response.json(5)
+
+            quantity = int(quantity)
+
+            company_serial_qs = CompanySerialModel.objects.filter(company__secret=company_id, status=0)
+            if not company_serial_qs.exists():
+                redisObject.rpush(key, value)
+                return response.json(373)
+
+            # 存在对应的企业
+            company_serial_qs = company_serial_qs[0:quantity]
+
+            company_serial_qs = company_serial_qs.values('id', 'serial_number__serial_number', 'company__mark')
+            data = []
+            ids = []
+            for serial in company_serial_qs:
+                ids.append(serial['id'])
+                data.append(serial['serial_number__serial_number'] + serial['company__mark'])
+            CompanySerialModel.objects.filter(id__in=ids).update(status=1)
+            redisObject.rpush(key, value)
+            return response.json(0, data)
+        else:
+            return response.json(444)
+
+    def do_list(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        page = request_dict.get('page', None)
+        line = request_dict.get('limit', None)
+        serial_number = request_dict.get('serial_number', None)
+        status = request_dict.get('status', None)
+
+        if page and line:
+            page = int(page)
+            line = int(line)
+
+            serial_qs = SerialNumberModel.objects.filter()
+
+            if serial_number:
+                serial_qs = serial_qs.filter(serial_number__contains=serial_number)
+
+            if status:
+                serial_qs = serial_qs.filter(status=status)
+
+            count = serial_qs.count()
+
+            start = (page - 1) * line
+            end = start + line
+
+            serial_qs = serial_qs[start: end].values()
+            res = {
+                'count': count,
+                'data': list(serial_qs)
+            }
+
+            return response.json(0, res)
+        else:
+            return response.json(444)
+
+    @transaction.atomic
+    def do_attach_uid(self, request_dict, response):
+        serial_number = request_dict.get('serial_number', None)
+        country_id = request_dict.get('country_id', None)
+        company_id = request_dict.get('company_id', None)
+
+        if serial_number and len(serial_number) == 9 and country_id and company_id:
+            mark = serial_number[6:9]
+            serial = serial_number[0:6]
+
+            savePoint = transaction.savepoint()
+            try:
+                try:
+
+                    # 判断序列号是否已和UID关联
+                    company_serial_qs = CompanySerialModel.objects.filter(company__secret=company_id,
+                                                                          serial_number__serial_number=serial)
+                    if not company_serial_qs.exists():
+                        return response.json(173)
+
+                    # 当序列号已关联UID
+                    company_serial = company_serial_qs[0]
+
+                    if company_serial.status == 0:
+                        # 该序列号未绑定企业
+                        return response.json(173)
+                    elif company_serial.status == 1:
+                        # 确定所在区域
+                        country_qs = CountryModel.objects.filter(number=country_id)
+                        if not country_qs.exists():
+                            return response.json(374)
+
+                        region = country_qs.values('region_id')[0]
+
+                        count = 0
+                        while count < 3:
+                            uid_qs = UIDModel.objects.filter(vpg__company_id=company_serial.company.id, vpg__region_id=region['region_id'],
+                                                             status=0)
+                            if uid_qs.exists():
+                                uid = uid_qs[0]
+                                print(uid)
+                                # uid.status = 2
+                                # uid.update_time = int(time.time())
+                                result = UIDModel.objects.filter(id=uid.id, status=0).update(**{
+                                    'status': 2, 'update_time': int(time.time())
+                                })
+
+                                if int(result) <= 0:
+                                    count += 1
+                                    continue
+
+                                now_time = int(time.time())
+                                uid_serial = UIDCompanySerialModel(uid_id=uid.id, company_serial_id=company_serial.id,
+                                                                   add_time=now_time, update_time=now_time)
+                                uid_serial.save()
+
+                                company_serial.status = 2
+                                company_serial.save()
+
+                                res = {
+                                    'uid': CommonService.encode_data(uid.uid),
+                                    'mac': CommonService.encode_data(uid.mac),
+                                    'extra': uid.uid_extra
+                                }
+                                return response.json(0, res)
+                            else:
+                                return response.json(375)
+
+                        return response.json(5)
+                    else:
+                        uid_qs = UIDCompanySerialModel.objects.filter(company_serial_id=company_serial.id)
+                        if uid_qs.exists():
+                            uid = uid_qs.values('uid__uid', 'uid__mac', 'uid__uid_extra')[0]
+                            res = {
+                                'uid': CommonService.encode_data(uid['uid__uid']),
+                                'mac': CommonService.encode_data(uid['uid__mac']),
+                                'extra': uid['uid__uid_extra']
+                            }
+                            return response.json(0, res)
+                        else:
+                            return response.json(173)
+                except Exception as e:
+                    # print('--------------------------error 5000')
+                    # print(repr(e))
+                    if savePoint:
+                        transaction.rollback(savePoint)
+                    djangoLogger = logging.getLogger('django')
+                    djangoLogger.exception(repr(e))
+                    return response.json(176, str(e))
+            except Exception as e:
+                # print('--------------------------error 5001')
+                # print(repr(e))
+                djangoLogger = logging.getLogger('django')
+                djangoLogger.exception(repr(e))
+                return response.json(176, str(e))
+
+        else:
+            return response.json(444)
+
+    def do_get_uid(self, request_dict, response):
+        serial_number = request_dict.get('serial_number', None)
+        token = request_dict.get('token', None)
+        time_stamp = request_dict.get('time_stamp', None)
+
+        if token and time_stamp and serial_number and len(serial_number) == 9:
+
+            token = int(CommonService.decode_data(token))
+            time_stamp = int(time_stamp)
+
+            now_time = int(time.time())
+            distance = now_time - time_stamp
+
+            if token != time_stamp or distance > 300 or distance < 0:
+                return response.json(404)
+
+            mark = serial_number[6:9]
+            serial = serial_number[0:6]
+            uid_company_serial_qs = UIDCompanySerialModel.objects.filter(company_serial__company__mark=mark, company_serial__serial_number__serial_number=serial)
+
+            if uid_company_serial_qs.exists():
+                uid = uid_company_serial_qs.values('uid__uid', 'uid__mac', 'uid__uid_extra')[0]
+
+                res = {
+                    'uid': CommonService.encode_data(uid['uid__uid']),
+                    'mac': CommonService.encode_data(uid['uid__mac']),
+                    'extra': uid['uid__uid_extra']
+                }
+
+                return response.json(0, res)
+            else:
+                return response.json(173)
+        else:
+            return response.json(444)
+
+    def do_detach_uid(self, userID, request_dict, response):
+        uid = request_dict.get('uid', None)
+
+        if uid:
+            uid = CommonService.decode_data(uid)
+            uid_serial_qs = UIDCompanySerialModel.objects.filter(uid__uid=uid)
+            if uid_serial_qs.exists():
+                uid_serial = uid_serial_qs[0]
+
+                company_serial_qs = CompanySerialModel.objects.filter(id=uid_serial.company_serial.id)
+                if company_serial_qs.exists():
+                    company_serial = company_serial_qs[0]
+                    company_serial.status = 1
+                    company_serial.save()
+
+                uid_qs = UIDModel.objects.filter(uid=uid)
+                if uid_qs.exists():
+                    uid = uid_qs[0]
+                    uid.status = 0
+                    uid.save()
+                uid_serial.delete()
+                return response.json(0)
+            else:
+                return response.json(173)
+        else:
+            return response.json(444)
+
+    def do_update(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        id = request_dict.get('id', None)
+        status = request_dict.get('status', None)
+
+        if id and status:
+            serial_number_qs = SerialNumberModel.objects.filter(id=id)
+            if serial_number_qs.exists():
+                serial_number_qs.update(**{'status': status})
+                return response.json(0)
+            else:
+                return response.json(173)
+        else:
+            return response.json(444)

+ 63 - 0
Controller/TestController.py

@@ -0,0 +1,63 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import hashlib
+
+from django.contrib.auth.hashers import make_password, check_password
+from django.views import View
+
+from Object.uidManageResponseObject import uidManageResponseObject
+
+
+class TestView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = request.GET
+        return self.validate(request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = request.POST
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+
+        response = uidManageResponseObject()
+
+        if operation == 'createPassword':
+            return self.do_create_password(request_dict, response)
+        elif operation == 'checkPassword':
+            return self.do_check_password(request_dict, response)
+        else:
+            return response.json(404)
+
+    def do_create_password(self, request_dict, response):
+        password = request_dict.get('password', None)
+        print(password)
+        result = make_password(password)
+        print(result)
+        print(check_password(password, result))
+        return response.json(0, result)
+
+    def do_check_password(self, request_dict, response):
+        password = request_dict.get('password', None)
+        password2 = request_dict.get('password2', None)
+        print(password)
+        print(password2)
+        check = check_password(password, password2)
+
+        return response.json(0, check)
+
+    # def make_password(self, password):
+    #     md5 = hashlib.md5()
+    #     md5.update(str(password).encode('utf-8'))
+    #     return md5.hexdigest()
+    #
+    # def check_password(self, password, encryp):
+    #     print(password)
+    #     print(encryp)
+    #     password1 = self.make_password(password)
+    #     print(password1)
+    #     return encryp == self.make_password(password)

+ 479 - 0
Controller/UIDController.py

@@ -0,0 +1,479 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import json
+import logging
+import time
+
+from django.db import transaction
+from django.http import StreamingHttpResponse
+from django.utils.decorators import method_decorator
+from django.views import View
+from django.views.decorators.csrf import csrf_exempt
+from django.db.models import Avg,Max,Min,Count,Sum, Q  #   引入函数
+
+from Model.models import UIDModel, UserModel, UserUIDModel, HistoryUIDModel
+from Object.RedisObject import RedisObject
+from Object.uidManageResponseObject import uidManageResponseObject
+from Object.TokenObject import TokenObject
+from Service.ModelService import ModelService
+
+
+class UIDView(View):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, request, *args, **kwargs):
+        return super(UIDView, self).dispatch(request, *args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        operation = kwargs.get('operation')
+        return self.validate(request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        operation = kwargs.get('operation')
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+        token = request_dict.get('token', None)
+        response = uidManageResponseObject()
+
+        token = TokenObject(token)
+        if token.code != 0:
+            return response.json(token.code)
+
+        if operation == 'quantity':
+            return self.do_quantity(request_dict, response)
+        elif operation == 'allot':
+            return self.do_allot(request_dict, response)
+        elif operation == 'remove':
+            return self.do_remove(request_dict, response)
+        elif operation == 'download':
+            return self.download_txt(token, response)
+        elif operation == 'download_1':
+            return self.download_txt_two(token, response)
+        elif operation == 'list':
+            return self.do_list(request_dict, response)
+        elif operation == 'delete':
+            return self.do_delete(token.userID, request_dict, response)
+        elif operation == 'batchDelete':
+            return self.do_batch_delete(token.userID, request_dict, response)
+        elif operation == 'adminUpdate':
+            return self.do_admin_update(token.userID, request_dict, response)
+        elif operation == 'history':
+            return self.do_history(token.userID, request_dict, response)
+        elif operation == 'statistics':
+            return self.do_admin_statistics(token.userID, request_dict, response)
+        else:
+            return response.json(309)
+
+    # 查询当前可用的UID的数量
+    def do_quantity(self, request_dict, response):
+        token = request_dict.get('token', None)
+
+        token = TokenObject(token)
+        if token.code != 0:
+            return response.json(token.code)
+
+        user_qs = UserModel.objects.filter(id=token.userID)
+        if user_qs.exists():
+            user = user_qs[0]
+            if user.permission == '0':
+                return self.do_admin_quantity(request_dict, response, user.username)
+            else:
+                return self.do_not_admin_quantity(request_dict, response, user.username)
+        else:
+            return response.json(9)
+
+    # 管理员的查询UID数量操作
+    def do_admin_quantity(self, request_dict, response, admin):
+        datas = []
+        domestic = UIDModel.objects.filter(area=0, status=0).count()
+        foreign = UIDModel.objects.filter(area=1, status=0).count()
+        item = {}
+        item['isAdmin'] = 1
+        item['domestic'] = domestic
+        item['foreign'] = foreign
+        item['username'] = admin
+        datas.append(item)
+
+        user_qs = UserModel.objects.filter(~Q(Q(permission='0')))
+        for user in user_qs:
+            item = {'isAdmin': 0}
+            result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=0).aggregate(num=Count('uid__status'))
+            item['domestic'] = result['num']
+            result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=1).aggregate(num=Count('uid__status'))
+            item['foreign'] = result['num']
+            item['username'] = user.username
+            datas.append(item)
+
+        return response.json(0, {'data': datas})
+
+    # 非管理员的查询UID数量操作
+    def do_not_admin_quantity(self, request_dict, response, username):
+        user_qs = UserModel.objects.filter(username=username)
+        if user_qs.exists():
+            user = user_qs[0]
+            datas = []
+            item = {'isAdmin': 0}
+            result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=0).aggregate(num=Count('uid__status'))
+            item['domestic'] = result['num']
+            result = UserUIDModel.objects.filter(user__id=user.id, uid__status=1, uid__area=1).aggregate(num=Count('uid__status'))
+            item['foreign'] = result['num']
+            item['username'] = user.username
+            datas.append(item)
+            return response.json(0, {'data': datas})
+        else:
+            return response.json(444)
+
+    # 分配UID
+    @transaction.atomic
+    def do_allot(self, request_dict, response):
+        username = request_dict.get('username', None)
+        quantity = int(request_dict.get('quantity', None))
+        area = request_dict.get('area', None)
+        token = request_dict.get('token', None)
+
+        token = TokenObject(token)
+        if token.code != 0:
+            return response.json(token.code)
+        user = UserModel.objects.get(id=token.userID)
+
+        if not user or '0' not in user.permission:
+            return response.json(404)
+
+        # 要分配的对象
+        allot_user_qs = UserModel.objects.filter(username=username)
+        if not allot_user_qs.exists():
+            return response.json(444, 'username')
+
+        # 取出对应区域可用的UID分配给allot_user
+        uid_qs = UIDModel.objects.filter(area=area, status=0)
+        count = uid_qs.count()
+        if count < quantity:
+            return response.json(444, '设备UID不足')
+
+        updates = []
+        datas = []
+        count = 0
+        if uid_qs.exists():
+            uid_qs = uid_qs[0:quantity]
+            now_time = int(time.time())
+            savePoint = transaction.savepoint()
+            for item in uid_qs:
+                item.status = 1
+                item.update_time = time.time()
+                user_uid = UserUIDModel()
+                user_uid.uid = item
+                user_uid.user = allot_user_qs[0]
+                user_uid.add_time = now_time
+                user_uid.update_time = now_time
+                datas.append(user_uid)
+                updates.append(item)
+
+                if len(datas) % 5000 == 0:
+                    result = self.do_update(datas, updates, savePoint)
+                    if result != 0:
+                        return response.json(result)
+
+            if len(datas) > 0:
+                result = self.do_update(datas, updates, savePoint)
+                if result != 0:
+                    return response.json(result)
+            redisObject = RedisObject()
+            values = uid_qs.values('uid')
+            print(values)
+            redisObject.set_data(key=token.token, val=json.dumps(list(values)), expire=3600)
+            del datas
+            del updates
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_update(self, datas, updates, savePoint, count=0):
+        try:
+            try:
+                UserUIDModel.objects.bulk_create(datas)
+                UIDModel.objects.bulk_update(updates, fields=['status', 'update_time'])
+                datas.clear()
+                updates.clear()
+            except Exception as e:
+                if savePoint:
+                    transaction.savepoint_rollback(savePoint)
+                djangoLogger = logging.getLogger('django')
+                djangoLogger.exception(repr(e))
+                return 174
+        except Exception as e:
+            return 174
+        return 0
+
+    # 把UID表中的数据移动到HistoryUID表中
+    def do_remove(self, request_dict, response):
+        token = TokenObject(request_dict.get('token', None))
+        id = request_dict.get('id', None)
+        start = request_dict.get('start', None)
+        stop = request_dict.get('stop', None)
+
+        if token.code != 0:
+            return response.json(token.code)
+
+        # 通过userID查找用户,判断是否是管理员
+        user_qs = UserModel.objects.filter(id=token.userID)
+        if user_qs.exists():
+            user = user_qs[0]
+            if user.permission != '0':
+                return response.json(404)
+        else:
+            return response.json(9)
+
+        if id:
+            return self.do_remove_by_id(id, response)
+        elif start and stop:
+            return self.do_bulk_remove(int(start), int(stop), response)
+        else:
+            return response.json(444, 'id,start,stop')
+
+    # 移除单条UID记录,id:记录id
+    def do_remove_by_id(self, id, response):
+        id = int(id)
+        uid_qs = UIDModel.objects.filter(id=id)
+        if not uid_qs.exists():
+            return response.json(173)
+
+        uid = uid_qs[0]
+        if uid:
+            data = {
+                'uid': uid.uid,
+                'uid_extra': uid.uid_extra,
+                'status': uid.status,
+                'add_time': uid.add_time,
+                'update_time': uid.update_time,
+                'area': uid.area
+            }
+            HistoryUIDModel.objects.create(**data)
+            uid.delete()
+            return response.json(0)
+        else:
+            return response.json(444, 'id')
+
+    # 批量移除UID记录。start:开始的UID记录的id;stop:结束的UID记录的id
+    def do_bulk_remove(self, start, stop, response):
+        uid_qs = UIDModel.objects.filter(id__range=(start, stop))
+        histories = []
+        if uid_qs.exists():
+            for item in uid_qs:
+                histories.append(HistoryUIDModel(
+                    uid=item.uid,
+                    uid_extra=item.uid_extra,
+                    status=item.status,
+                    add_time=item.add_time,
+                    update_time=item.update_time,
+                    area=item.area
+                ))
+                if len(histories) % 5000 == 0:
+                    HistoryUIDModel.objects.bulk_create(histories)
+                    histories.clear()
+            if len(histories) > 0:
+                HistoryUIDModel.objects.bulk_create(histories)
+                histories.clear()
+            uid_qs.delete()
+            return response.json(0)
+        else:
+            return response.json(173)
+
+    def download_txt(self, token, response):
+
+        redisObject = RedisObject()
+        uid_qs = redisObject.get_data(key=token.token)
+
+        if uid_qs is False:
+            return response.json(308)
+
+        uid_qs = json.loads(uid_qs)
+        content = ''
+        for item in uid_qs:
+            # print(item)
+            content += item['uid']
+            content += '\r\n'
+
+        redisObject.del_data(key=token.token)
+
+        content = content[0:len(content) - 1]
+        response = StreamingHttpResponse(content)
+        response['Content-Type'] = 'application/octet-stream'
+        filename = 'uid_need_to_set_up_push.txt'
+        response['Content-Disposition'] = 'attachment;filename=' + filename
+
+        return response
+
+    def download_txt_two(self, token, response):
+
+        uid_qs = UIDModel.objects.filter(status=1)
+
+        if not uid_qs.exists():
+            return response.json(308)
+
+        uid_qs = uid_qs.values()
+        content = ''
+        for item in uid_qs:
+            # print(item)
+            content += item['uid']
+            content += '\r\n'
+
+        content = content[0:len(content) - 1]
+        response = StreamingHttpResponse(content)
+        response['Content-Type'] = 'application/octet-stream'
+        filename = 'uid_need_to_set_up_push.txt'
+        response['Content-Disposition'] = 'attachment;filename=' + filename
+
+        return response
+
+    def do_list(self, request_dict, response):
+        page = request_dict.get('page', None)
+        line = request_dict.get('limit', None)
+        status = request_dict.get('status', None)
+        area = request_dict.get('area', None)
+        start_time = request_dict.get('starttime', None)
+        stop_time = request_dict.get('endtime', None)
+        uid = request_dict.get('uid', None)
+
+        if page and line:
+
+            uid_qs = UIDModel.objects.filter()
+            res = {
+                'count': 0,
+                'data': []
+            }
+
+            if uid_qs.exists():
+                page = int(page)
+                line = int(line)
+
+                start = (page - 1) * line
+                end = start + line
+
+                if uid:
+                    uid_qs = uid_qs.filter(uid=uid)
+
+                if status:
+                    uid_qs = uid_qs.filter(status=status)
+
+                if area:
+                    uid_qs = uid_qs.filter(area=area)
+
+                if start_time:
+                    uid_qs = uid_qs.filter(update_time__gte=start_time)
+
+                if stop_time:
+                    if stop_time > start:
+                        uid_qs = uid_qs.filter(update_time__lte=stop_time)
+
+                res['count'] = uid_qs.count()
+                uid_qs = uid_qs.values()[start:end]
+
+                res['data'] = list(uid_qs)
+
+            print(res)
+            return response.json(0, res)
+        else:
+            return response.json(444)
+
+    def do_delete(self, userID, request_dict, response):
+        uid = request_dict.get('uid', None)
+        user_qs = UserModel.objects.filter(id=userID)
+
+        if user_qs.exists():
+            user = user_qs[0]
+            if int(user.permission) != 0:
+                return response.json(309)
+
+            UIDModel.objects.filter(uid=uid).delete()
+            return response.json(0)
+        else:
+            return response.json(309)
+
+    def do_batch_delete(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        uids = request_dict.get('uidlist', None)
+
+        if uids:
+            uids = json.loads(uids)
+            UIDModel.objects.filter(uid__in=uids).delete()
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_admin_update(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        uid = request_dict.get('uid', None)
+        content = request_dict.get('content', None)
+        print(content)
+
+        if uid and content:
+            content = json.loads(content)
+            print(content)
+            content['update_time'] = int(time.time())
+            uid_qs = UIDModel.objects.filter(uid=uid)
+            if uid_qs.exists():
+                uid_qs.update(**content)
+                return response.json(0)
+            else:
+                return response.json(173)
+        else:
+            return response.json(444)
+
+    def do_history(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        uid_qs = UIDModel.objects.filter(status=2)
+
+        if uid_qs.exists():
+
+            uids = []
+            for uid in uid_qs:
+                uids.append(uid)
+
+                if (len(uids) % 5000) == 0:
+                    HistoryUIDModel.objects.bulk_create(uids)
+                    uids.clear()
+
+            if len(uids) > 0:
+                HistoryUIDModel.objects.bulk_create(uids)
+                uids.clear()
+
+        uid_qs.delete()
+
+        return response.json(0)
+
+    def do_admin_statistics(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        uid_not_use = UIDModel.objects.filter(status=0).count()
+
+        uid_allocated = UIDModel.objects.filter(status=1).count()
+
+        uid_has_use = UIDModel.objects.filter(status=2).count()
+
+        total = uid_not_use + uid_allocated + uid_has_use
+
+        res = {
+            'uid_not_use': uid_not_use,
+            'uid_allocated': uid_allocated,
+            'uid_has_use': uid_has_use,
+            'total': total
+        }
+
+        return response.json(0, res)
+

+ 296 - 0
Controller/UIDManageUserController.py

@@ -0,0 +1,296 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import time
+
+from django.db.models import Q
+from django.utils.decorators import method_decorator
+from django.views import View
+from django.views.decorators.csrf import csrf_exempt
+
+from Model.models import UserModel
+from Object.uidManageResponseObject import uidManageResponseObject
+from Object.TokenObject import TokenObject
+from Service.ModelService import ModelService
+
+
+class UserView(View):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, request, *args, **kwargs):
+        return super(UserView, self).dispatch(request, *args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        # print('get')
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        operation = kwargs.get('operation')
+        return self.validation(request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        operation = kwargs.get('operation')
+        return self.validation(request_dict, operation)
+
+    def validation(self, request_dict, operation):
+
+        if operation == 'login':
+            return self.login(request_dict)
+        elif operation == 'logout':
+            return self.logout(request_dict)
+        else:
+            token = request_dict.get('token', None)
+
+            token = TokenObject(token)
+            response = uidManageResponseObject()
+            if token.code != 0:
+                return response.json(token.code)
+
+            if operation == 'query':
+                return self.do_query(request_dict)
+            elif operation == 'modify':
+                return self.do_modify_password(request_dict)
+            elif operation == 'list':
+                return self.do_list(request_dict)
+            elif operation == 'adminAdd':
+                return self.do_admin_add(token.userID, request_dict, response)
+            elif operation == 'adminDelete':
+                return self.do_admin_delete(token.userID, request_dict, response)
+            elif operation == 'adminUpdate':
+                return self.do_admin_update(token.userID, request_dict, response)
+            elif operation == 'adminReset':
+                return self.do_admin_reset(token.userID, request_dict, response)
+            else:
+                return uidManageResponseObject().json(309)
+
+    def login(self, request_dict):
+        username = request_dict.get('username', None)
+        password = request_dict.get('password', None)
+
+        response = uidManageResponseObject()
+
+        if username is None or password is None:
+            return response.json(444)
+
+        user = UserModel.objects.filter(username=username)
+        if user.exists():
+            if user[0].password != password:
+                return response.json(99)
+            else:
+                token = TokenObject()
+                res = token.generate({'userID': user[0].id})
+                res['permission'] = user[0].permission
+                res['username'] = user[0].username
+                user[0].online = 1
+                update = {
+                    'online': 1
+                }
+                user.update(**update)
+                return response.json(0, res)
+        else:
+            return response.json(99)
+
+    def do_query(self, request_dict):
+        # print('do_query')
+        token = TokenObject(request_dict.get('token', None))
+        # page = request_dict.get('page', None)
+        # line = request_dict.get('line', None)
+        # username = request_dict.get('username', None)
+        response = uidManageResponseObject()
+
+        if token.code != 0:
+            return response.json(token.code)
+
+        # if username:
+        #     user_qs = UserModel.objects.filter(username__icontains=username)
+        #     if user_qs.exists():
+        #         users = list(user_qs.values('username'))
+        #         return response.json(0, {'data': users})
+        #     else:
+        #         return response.json(0, {'data': []})
+        # elif page and line:
+        #     print('query_page')
+        #     user_qs = UserModel.objects.filter(id=token.userID)
+        #     if user_qs.exists():
+        #         user = user_qs[0]
+        #         if user.permission == '0':
+        #             return self.do_query_pagination(int(page), int(line), response)
+        #         else:
+        #             return response.json(404)
+        #     else:
+        #         return response.json(9)
+
+        user_qs = UserModel.objects.filter(~Q(Q(permission='0'))).values('id', 'username')
+
+        return response.json(0, {'data': list(user_qs)})
+
+    def do_query_pagination(self, page, line, response):
+        # print('query start')
+        user_qs = UserModel.objects.filter().values()
+        if user_qs.exists():
+            count = user_qs.count()
+            start = (page - 1) * line
+            end = start + line
+            users = list(user_qs[start:end])
+            # print('query end')
+            return response.json(0, {'count': count, 'data': users})
+        else:
+            return response.json(0, {'count': 0, 'data': []})
+
+    def do_modify_password(self, request_dict):
+        token = request_dict.get('token', None)
+        old_password = request_dict.get('oldPassword', None)
+        new_password = request_dict.get('newPassword', None)
+        token = TokenObject(token)
+
+        response = uidManageResponseObject()
+        if token.code != 0:
+            return response.json(token.code)
+
+        if old_password and new_password:
+            user_qs = UserModel.objects.filter(id=token.userID)
+            if user_qs.exists():
+                if user_qs[0].password != old_password:
+                    return response.json(47)
+                user = {
+                    'password': new_password
+                }
+                user_qs.update(**user)
+                return response.json(0)
+            else:
+                return response.json(9)
+        else:
+            return response.json(444)
+
+    def logout(self, request_dict):
+        token = request_dict.get('token', None)
+        token = TokenObject(token)
+        response = uidManageResponseObject()
+        if token.code != 0:
+            return response.json(0)
+
+        user_qs = UserModel.objects.filter(id=token.userID)
+        if user_qs.exists():
+            user = {
+                'online': 0
+            }
+            user_qs.update(**user)
+            return response.json(0)
+        else:
+            return response.json(0)
+
+    def do_list(self, request_dict):
+        token = request_dict.get('token', None)
+
+        response = uidManageResponseObject()
+        token = TokenObject(token)
+        if token.code != 0:
+            return response.json(token.code)
+
+        page = request_dict.get('page', None)
+        line = request_dict.get('limit', None)
+
+        if page and line:
+            user_qs = UserModel.objects.filter()
+
+            res = {
+                'count': user_qs.count(),
+                'data': []
+            }
+            if user_qs.exists():
+                page = int(page)
+                line = int(line)
+
+                start = (page - 1) * line
+                end = start + line
+
+                user_qs = user_qs[start:end].values('id', 'username', 'permission', 'phone', 'login_time', 'add_time')
+
+                res['data'] = list(user_qs)
+            return response.json(0, res)
+        else:
+            return response.json(444)
+
+    def do_admin_add(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        print(request_dict)
+        username = request_dict.get('username', None)
+        password = request_dict.get('password', None)
+        phone = request_dict.get('phone', None)
+        role = request_dict.get('role', None)
+
+        if username and password and role:
+            user = UserModel()
+            user.username = username
+            user.password = password
+            user.permission = role
+            user.phone = phone
+            user.add_time = int(time.time())
+            user.save()
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_admin_delete(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        username = request_dict.get('username', None)
+
+        if username:
+            user_qs = UserModel.objects.filter(username=username)
+            if user_qs.exists():
+                user_qs.delete()
+                return response.json(0)
+            else:
+                return response.json(9)
+        else:
+            return response.json(444)
+
+    def do_admin_update(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        username = request_dict.get('username', None)
+        role = request_dict.get('role', None)
+        password = request_dict.get('password', None)
+        phone = request_dict.get('phone', None)
+
+        if username:
+            update_data = {}
+
+            if role:
+                update_data['permission'] = role
+
+            if password:
+                update_data['password'] = password
+
+            if phone:
+                update_data['phone'] = phone
+
+            UserModel.objects.filter(username=username).update(**update_data)
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_admin_reset(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        username = request_dict.get('username', None)
+
+        if username:
+            user_qs = UserModel.objects.filter(username=username)
+            if user_qs.exists():
+                user_qs.update(password='123456')
+                return response.json(0)
+            else:
+                return response.json(9)
+        else:
+            return response.json(444)

+ 70 - 62
Controller/UserController.py

@@ -32,7 +32,7 @@ from ratelimit.decorators import ratelimit
 from Ansjer.config import AuthCode_Expire, SERVER_DOMAIN, APNS_CONFIG, JPUSH_CONFIG, FCM_CONFIG, TUTK_PUSH_DOMAIN
 from Controller.CheckUserData import DataValid, date_handler, RandomStr
 from Model.models import Device_User, Role, UidPushModel, UserOauth2Model, UserExModel, Device_Info, UidSetModel, \
-    UserAppFrequencyModel, CountryIPModel, UserRegionModel
+    UserAppFrequencyModel, CountryIPModel
 from Object.AWS.SesClassObject import SesClassObject
 from Object.AliSmsObject import AliSmsObject
 from Object.RedisObject import RedisObject
@@ -861,6 +861,7 @@ class v2registerView(TemplateView):
         authcode = request_dict.get('authcode', None)
         lang = request_dict.get('lang', None)
         unique = request_dict.get('unique', None)
+        number = request_dict.get('number', None)
         if unique:
             delete_local_account(unique)
         response = ResponseObject(lang)
@@ -871,13 +872,13 @@ class v2registerView(TemplateView):
         if authcode is None:
             return response.json(444, 'identifyingCode')
         if phone is not None:
-            return self.do_phone_register(phone, password, authcode, response)
+            return self.do_phone_register(phone, password, authcode, number, response)
         elif email is not None:
-            return self.do_email_register(email, password, authcode, response)
+            return self.do_email_register(email, password, authcode, number, response)
         else:
             return response.json(444, 'phone or email')
 
-    def do_phone_register(self, phone, password, authcode, response):
+    def do_phone_register(self, phone, password, authcode, number, response):
         data_valid = DataValid()
         if data_valid.mobile_validate(phone) is not True:
             return response.json(100)
@@ -896,15 +897,19 @@ class v2registerView(TemplateView):
         if phone_qs.exists():
             return response.json(101)
         try:
-            users = Device_User.objects.create(
-                username=phone,
-                NickName=phone,
-                phone=phone,
-                password=make_password(password),
-                userID=CommonService.getUserID(μs=False, setOTAID=True),
-                is_active=True,
-                user_isValid=True,
-            )
+            create_data = {
+                "username": phone,
+                "NickName": phone,
+                "phone": phone,
+                "password": make_password(password),
+                "userID": CommonService.getUserID(μs=False, setOTAID=True),
+                "is_active": True,
+                "user_isValid": True,
+            }
+            if number:
+                create_data["region_country"] = number
+
+            users = Device_User.objects.create(**create_data)
         except Exception as e:
             errorInfo = traceback.format_exc()
             print(errorInfo)
@@ -943,7 +948,7 @@ class v2registerView(TemplateView):
         print(res)
         return response.json(0, res)
 
-    def do_email_register(self, email, password, authcode, response):
+    def do_email_register(self, email, password, authcode, number, response):
         data_valid = DataValid()
         if data_valid.email_validate(email) is not True:
             return response.json(105)
@@ -962,15 +967,18 @@ class v2registerView(TemplateView):
         if email_qs.exists():
             return response.json(103)
         try:
-            users = Device_User.objects.create(
-                username=email,
-                NickName=email,
-                userEmail=email,
-                password=make_password(password),
-                userID=CommonService.getUserID(μs=False, setOTAID=True),
-                is_active=True,
-                user_isValid=True,
-            )
+            create_data = {
+                "username": email,
+                "NickName": email,
+                "userEmail": email,
+                "password": make_password(password),
+                "userID": CommonService.getUserID(μs=False, setOTAID=True),
+                "is_active": True,
+                "user_isValid": True,
+            }
+            if number:
+                create_data["region_country"] = number
+            users = Device_User.objects.create(**create_data)
         except Exception as e:
             errorInfo = traceback.format_exc()
             print(errorInfo)
@@ -1004,6 +1012,8 @@ class v3registerView(TemplateView):
         authcode = request_dict.get('authcode', None)
         lang = request_dict.get('lang', None)
         unique = request_dict.get('unique', None)
+        number = request_dict.get('number', None)
+
         if unique:
             delete_local_account(unique)
         response = ResponseObject(lang)
@@ -1050,13 +1060,13 @@ class v3registerView(TemplateView):
             if authcode is None:
                 return response.json(444, 'identifyingCode')
             if phone is not None:
-                return self.do_phone_register(phone, password, authcode, response)
+                return self.do_phone_register(phone, password, authcode, number, response)
             elif email is not None:
-                return self.do_email_register(email, password, authcode, response)
+                return self.do_email_register(email, password, authcode, number, response)
             else:
                 return response.json(444, 'phone or email')
 
-    def do_phone_register(self, phone, password, authcode, response):
+    def do_phone_register(self, phone, password, authcode, number, response):
         data_valid = DataValid()
         if data_valid.mobile_validate(phone) is not True:
             return response.json(100)
@@ -1075,15 +1085,20 @@ class v3registerView(TemplateView):
         if phone_qs.exists():
             return response.json(101)
         try:
-            users = Device_User.objects.create(
-                username=phone,
-                NickName=phone,
-                phone=phone,
-                password=make_password(password),
-                userID=CommonService.getUserID(μs=False, setOTAID=True),
-                is_active=True,
-                user_isValid=True,
-            )
+            create_data = {
+                "username": phone,
+                "NickName": phone,
+                "phone": phone,
+                "password": make_password(password),
+                "userID": CommonService.getUserID(μs=False, setOTAID=True),
+                "is_active": True,
+                "user_isValid": True,
+            }
+            if number:
+                create_data["region_country"] = number
+
+            users = Device_User.objects.create(**create_data)
+
         except Exception as e:
             errorInfo = traceback.format_exc()
             print(errorInfo)
@@ -1121,7 +1136,7 @@ class v3registerView(TemplateView):
         res['phone'] = user_list[0]["phone"] if user_list[0]["phone"] is not None else ''
         return response.json(0, res)
 
-    def do_email_register(self, email, password, authcode, response):
+    def do_email_register(self, email, password, authcode, number, response):
         data_valid = DataValid()
         if data_valid.email_validate(email) is not True:
             return response.json(105)
@@ -1135,20 +1150,25 @@ class v3registerView(TemplateView):
         # 验证码是否正确
         if authcode != identifyingCode:
             return response.json(121)
+
         email_qs = Device_User.objects.filter(Q(userEmail=email) | Q(username=email))
         # 是否已存在
         if email_qs.exists():
             return response.json(103)
         try:
-            users = Device_User.objects.create(
-                username=email,
-                NickName=email,
-                userEmail=email,
-                password=make_password(password),
-                userID=CommonService.getUserID(μs=False, setOTAID=True),
-                is_active=True,
-                user_isValid=True,
-            )
+            create_data = {
+                "username": email,
+                "NickName": email,
+                "userEmail": email,
+                "password": make_password(password),
+                "userID": CommonService.getUserID(μs=False, setOTAID=True),
+                "is_active": True,
+                "user_isValid": True,
+            }
+            if number:
+                create_data["region_country"] = number
+            users = Device_User.objects.create(**create_data)
+
         except Exception as e:
             errorInfo = traceback.format_exc()
             print(errorInfo)
@@ -1782,10 +1802,6 @@ class v3LoginView(TemplateView):
         if oauth_qs.exists():
             auth_type = oauth_qs[0].authType
 
-        region_id = 0
-        user_region_qs = UserRegionModel.objects.filter(user_id=userID)
-        if user_region_qs.exists():
-            region_id = user_region_qs[0].region_id
 
         if tko.code == 0:
             now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
@@ -1809,7 +1825,6 @@ class v3LoginView(TemplateView):
             # res['fingerprint_key'] = CommonService.encode_data(content=users['fingerprint_key'], start=2)
             res['authType'] = auth_type
             res['subscribe_email'] = users['subscribe_email'] if users['subscribe_email'] is not None else ''
-            res['regionID'] = region_id
             return response.json(0, res)
         else:
             return response.json(tko.code)
@@ -2833,12 +2848,12 @@ class generatePictureCodeView(TemplateView):
         kumo_font = ImageFont.truetype(path, 40, encoding="unic")  # 设置字体
         print("字体可以")
         valid_code_str = ''
-        for i in range(5):
+        for i in range(6):
             random_num = str(random.randint(0, 9))
             random_low_alpha = chr(random.randint(97, 122))
             random_high_alpha = chr(random.randint(65, 90))
             random_char = random.choice([random_num, random_low_alpha, random_high_alpha])
-            draw.text((i * 50 + 20, -3), random_char, 'white', kumo_font)
+            draw.text((i * 40 + 20, -3), random_char, 'white', kumo_font)
 
             # 保存验证码字符串
             valid_code_str += random_char
@@ -2923,6 +2938,7 @@ class Image_Code_RegisterView(TemplateView):
         response = ResponseObject(lang)
         valid_code = request_dict.get('id_v_code', None)
         unique = request_dict.get('unique', None)
+        number = request_dict.get('number', None)
         if unique:
             delete_local_account(unique)
         if not all([userEmail, password, lang, imageCodeId, valid_code]):
@@ -2999,6 +3015,8 @@ class Image_Code_RegisterView(TemplateView):
             "is_active": True,
             "user_isValid": True,
         }
+        if number:
+            create_data["region_country"] = number
         users = Device_User.objects.create(**create_data)
         return self.do_login(email_qs, response)
 
@@ -3253,10 +3271,6 @@ class v3LoginByCodeView(View):
         if oauth_qs.exists():
             auth_type = oauth_qs[0].authType
 
-        region_id = 0
-        user_region_qs = UserRegionModel.objects.filter(user_id=userID)
-        if user_region_qs.exists():
-            region_id = user_region_qs[0].region_id
 
         if tko.code == 0:
             now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
@@ -3277,7 +3291,6 @@ class v3LoginByCodeView(View):
             res['userEmail'] = users['userEmail'] if users['userEmail'] is not None else ''
             res['phone'] = users['phone'] if users['phone'] is not None else ''
             res['authType'] = auth_type
-            res['region_id'] = region_id
             return response.json(0, res)
         else:
             return response.json(tko.code)
@@ -3508,11 +3521,6 @@ class AppleAuthLogin(View):
             auth_type = oauth_qs[0].authType
         res['authType'] = auth_type
 
-        region_id = 0
-        user_region_qs = UserRegionModel.objects.filter(user_id=userID)
-        if user_region_qs.exists():
-            region_id = user_region_qs[0].region_id
-        res['region_id'] = region_id
         user_qs.update(last_login=now_time, online=True)
         return response.json(0, res)
 

+ 0 - 61
Controller/UserRegionController.py

@@ -1,61 +0,0 @@
-#!/usr/bin/env python3
-# -*- coding: utf-8 -*-
-import time
-
-from django.views import View
-
-from Model.models import Device_User, UserRegionModel
-from Object.ResponseObject import ResponseObject
-from Object.TokenObject import TokenObject
-
-
-class UserRegionView(View):
-
-    def get(self, request, *args, **kwargs):
-        request.encoding = 'utf-8'
-        operation = kwargs.get('operation', None)
-        request_dict = request.GET
-        return self.validate(request_dict, operation)
-
-    def post(self, request, *args, **kwargs):
-        request.encoding = 'utf-8'
-        operation = kwargs.get('operation', None)
-        request_dict = request.POST
-        return self.validate(request_dict, operation)
-
-    def validate(self, request_dict, operation):
-        token = TokenObject(request_dict.get('token', None))
-
-        response = ResponseObject()
-
-        if token.code != 0:
-            return response.json(token.code)
-
-        if operation == 'init':
-            return self.do_init(token.userID, request_dict, response)
-        else:
-            return response.json(404)
-
-    def do_init(self, userID, request_dict, response):
-        user_qs = Device_User.objects.filter(userID=userID)
-        if not user_qs.exists():
-            return response.json(309)
-
-        region_id = request_dict.get('country_number', None)
-
-        if region_id:
-            user_region_qs = UserRegionModel.objects.filter(user__userID=userID)
-            now_time = int(time.time())
-            if not user_region_qs.exists():
-                user_region = UserRegionModel(user_id=userID, region_id=region_id, add_time=now_time, update_time=now_time)
-                user_region.save()
-            else:
-                update = {
-                    'region_id': region_id,
-                    'update_time': now_time
-                }
-
-                user_region_qs.update(**update)
-            return response.json(0)
-        else:
-            return response.json(444)

+ 163 - 0
Controller/VPGController.py

@@ -0,0 +1,163 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import time
+
+from django.views import View
+
+from Model.models import RegionModel, CompanyModel, VPGModel, UIDModel
+from Object.uidManageResponseObject import uidManageResponseObject
+from Object.TokenObject import TokenObject
+from Service.ModelService import ModelService
+
+
+class VPGView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = request.GET
+        return self.validate(request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation', None)
+        request_dict = request.POST
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+        token = TokenObject(request_dict.get('token', None))
+        response = uidManageResponseObject()
+
+        if token.code != 0:
+            return response.json(token.code)
+
+        if operation == 'add':
+            return self.do_add(token.userID, request_dict, response)
+        elif operation == 'update':
+            return self.do_update(token.userID, request_dict, response)
+        elif operation == 'delete':
+            return self.do_delete(token.userID, request_dict, response)
+        elif operation == 'list':
+            return self.do_list(token.userID, request_dict, response)
+        else:
+            return response.json(404)
+
+    def do_add(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        name = request_dict.get('vpg', None)
+        region_id = request_dict.get('region_id', None)
+        company_id = request_dict.get('company_id', None)
+
+        if name and region_id and company_id:
+            region_qs = RegionModel.objects.filter(id=region_id)
+            if not region_qs.exists():
+                return response.json(374)
+
+            company_qs = CompanyModel.objects.filter(secret=company_id)
+            if not company_qs.exists():
+                return response.json(373)
+
+            company = company_qs[0]
+            now_time = int(time.time())
+            vpgModel = VPGModel(name=name, region_id=region_id, company_id=company.id, add_time=now_time, update_time=now_time)
+            vpgModel.save()
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def do_update(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        id = request_dict.get('id', None)
+        name = request_dict.get('vpg', None)
+        region_id = request_dict.get('region_id', None)
+        company_id = request_dict.get('company_id', None)
+
+        if id:
+            vpg_qs = VPGModel.objects.filter(id=id)
+
+            if vpg_qs.exists():
+
+                now_time = int(time.time())
+                update = {
+                    'update_time': now_time
+                }
+
+                if name:
+                    update['name'] = name
+
+                if region_id:
+                    update['region_id'] = region_id
+
+                if company_id:
+                    update['company_id'] = company_id
+
+                vpg_qs.update(**update)
+                return response.json(0)
+            else:
+                return response.json(173)
+        else:
+            return response.json(444)
+
+    def do_delete(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        id = request_dict.get('id', None)
+        if id:
+            vpg_qs = VPGModel.objects.filter(id=id)
+
+            if vpg_qs.exists():
+                vpg_qs.delete()
+                return response.json(0)
+            else:
+                return response.json(173)
+        else:
+            return response.json(444)
+
+    def do_list(self, userID, request_dict, response):
+        # perm = ModelService.check_perm_uid_manage(userID, 0)
+        # if not perm:
+        #     return response.json(309)
+
+        company_id = request_dict.get('company_id', None)
+        region_id = request_dict.get('region_id', None)
+        page = request_dict.get('page', None)
+        line = request_dict.get('limit', None)
+
+        if page and line:
+            page = int(page)
+            line = int(line)
+
+            start = (page - 1) * line
+            end = start + line
+
+            vpg_qs = VPGModel.objects.filter()
+
+            if company_id:
+                vpg_qs.filter(company_id=company_id)
+
+            if region_id:
+                vpg_qs.filter(region_id=region_id)
+
+            count = vpg_qs.count()
+            vpg_qs = vpg_qs.values('id', 'name', 'region__name', 'region_id', 'company__name', 'add_time',
+                                   'update_time', 'company__secret')
+            vpg_qs = vpg_qs[start: end]
+            for vpg in vpg_qs:
+                vpg['uid_count'] = UIDModel.objects.filter(vpg_id=vpg['id']).count()
+
+            res = {
+                'count': count,
+                'data': list(vpg_qs),
+            }
+
+            return response.json(0, res)
+        else:
+            return response.json(444)

+ 16 - 6
Controller/VerifyCodeController.py

@@ -6,6 +6,7 @@ from Controller.CheckUserData import DataValid
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
 
 
 class VerifyCodeView(View):
@@ -22,13 +23,9 @@ class VerifyCodeView(View):
         return self.validate(request_dict, operation)
 
     def validate(self, request_dict, operation):
-        # token = TokenObject(request_dict.get('token', None))
 
         response = ResponseObject()
 
-        # if token.code != 0:
-        #     return response.json(token.code)
-
         if operation == 'forget':
             return self.verify_forget(request_dict, response)
         elif operation == 'register':
@@ -43,12 +40,18 @@ class VerifyCodeView(View):
         phone = request_dict.get('phone', None)
         authcode = request_dict.get('authcode', None)
         key = '_forgetPwdResetCode'
+
+        if authcode is None:
+            return response.json(444)
+
+        authcode = CommonService.decode_data(authcode)
+
         if email is not None:
             email = email.strip()
             return self.email_validate(key, email, authcode, response)
         elif phone is not None:
             phone = phone.strip()
-            return self.phone_validate(phone, authcode, response)
+            return self.phone_validate(key, phone, authcode, response)
         else:
             return response.json(444)
 
@@ -57,12 +60,17 @@ class VerifyCodeView(View):
         phone = request_dict.get('phone', None)
         authcode = request_dict.get('authcode', None)
         key = '_identifyingCode'
+        if authcode is None:
+            return response.json(444)
+
+        authcode = CommonService.decode_data(authcode)
+
         if email is not None:
             email = email.strip()
             return self.email_validate(key, email, authcode, response)
         elif phone is not None:
             phone = phone.strip()
-            return self.phone_validate(phone, authcode, response)
+            return self.phone_validate(key, phone, authcode, response)
         else:
             return response.json(444)
 
@@ -71,6 +79,8 @@ class VerifyCodeView(View):
         authcode = request_dict.get('authcode', None)
 
         if imageCodeId and authcode:
+
+            authcode = CommonService.decode_data(authcode)
             image_code_key = 'image_code_' + imageCodeId
             redisObj = RedisObject(db=6)
             # redis里面的验证码

+ 1 - 1
Controller/VoicePromptController.py

@@ -110,7 +110,7 @@ class VoicePromptView(View):
             auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
             bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'ansjer-static-resources')
             filename = res['filename']
-            obj = 'voice_prompt/uid/channel/'.format(uid=uid, channel=channel) + filename
+            obj = 'voice_prompt/{uid}/{channel}/'.format(uid=uid, channel=channel) + filename
             url = bucket.sign_url('GET', obj, 3600)
             res['url'] = url
             del res['filename']

+ 0 - 0
Model/__init__.py


+ 291 - 5
Model/models.py

@@ -119,6 +119,21 @@ class Role(models.Model):
             return permslist
 
 
+class RegionCountryModel(models.Model):
+    number = models.IntegerField(primary_key=True, verbose_name='唯一标识')
+    region_id = models.IntegerField(verbose_name='大洲编号')
+    name = models.CharField(max_length=50, verbose_name=u'名称')
+    cn = models.CharField(blank=True, max_length=64, verbose_name=u'中文名称')
+    en = models.CharField(blank=True, max_length=64, verbose_name=u'英文名称')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'region_country'
+        verbose_name = '地区表'
+        verbose_name_plural = verbose_name
+
+
 class Device_User(AbstractBaseUser):
     userID = models.CharField(blank=True, max_length=32, primary_key=True,
                               verbose_name=u'用户ID', unique=True)
@@ -150,6 +165,7 @@ class Device_User(AbstractBaseUser):
     fingerprint_key = models.CharField(max_length=128, default='', verbose_name=u'客户端用于解码的密钥等信息')
     is_local = models.BooleanField(blank=True, default=False, verbose_name=u'是否是本地登录用户') # False:账号登录,1:本地登录
     subscribe_email = models.SmallIntegerField(default=0, verbose_name=u'是否订阅营销邮件') # 0:未订阅,1:订阅,2:不订阅
+    region_country = models.IntegerField(blank=True, default=0, verbose_name='地区表唯一标识')
     objects = UserManager()
 
     USERNAME_FIELD = 'userID'  # 必须有一个唯一标识
@@ -240,6 +256,8 @@ class Device_Info(models.Model):
     iSNotification = models.BooleanField(blank=True, verbose_name=u'报警通知 0:关闭,1:开启)', default=False)
     isVod = models.SmallIntegerField(blank=True, default=0, verbose_name='是否支持云存')  # 是否支持云存设备
     isExist = models.SmallIntegerField(blank=True, default=1, verbose_name='是否被删除')  # 是否被删除了(需主用户交互) 1存在,0不存在,2设备被重置
+    isCameraOpenCloud =  models.SmallIntegerField(blank=True, default=1, verbose_name='是否开启云存')  # 0:不开启  1:开启
+    endpoint = models.CharField(blank=True, max_length=256, default='', verbose_name=u'iot端点')
     ###
     REQUIRED_FIELDS = []
 
@@ -404,6 +422,7 @@ class VodBucketModel(models.Model):
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
 
     mold = models.SmallIntegerField(default=0, verbose_name='存储区域类型')  # 0:国内阿里 1:国外aws
+    region_id = models.IntegerField(default=1, verbose_name='大洲编号')
 
     def __str__(self):
         return self.id
@@ -1257,15 +1276,282 @@ class ProcessInfoLogsModel(models.Model):
         verbose_name = '过程信息表'
         verbose_name_plural = verbose_name
 
+class EquipmentLogModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    user = models.CharField(blank=False, max_length=32, db_index=True, verbose_name=u'操作用户')
+    uid = models.CharField(default='', blank=True, max_length=32, verbose_name=u'设备uid')
+    equipmentid = models.CharField(blank=False, max_length=100, db_index=True, verbose_name=u'设备主键id')
+    NickName = models.CharField(blank=True, max_length=32, verbose_name=u'设备名称')
+    ip = models.CharField(max_length=100, default='', db_index=True, blank=True, verbose_name=u'访问ip地址')
+    time = models.DateTimeField(null=True, blank=True, db_index=True, verbose_name=u'访问时间')
+    operatingcontent = models.TextField(blank=True, default='', verbose_name=u'操作内容')
+    url = models.CharField(max_length=150, default='', blank=True, verbose_name=u'访问路径')
+    class Meta:
+        db_table = 'equipment_log'
+        verbose_name = '设备日志表'
+        verbose_name_plural = verbose_name
+
+
+class UserModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    username = models.CharField(unique=True, max_length=128, null=False, verbose_name='用户名')
+    password = models.CharField(max_length=128, null=False, verbose_name='密码')
+    permission = models.CharField(max_length=24, null=False, verbose_name='权限')
+    login_time = models.IntegerField(blank=True, default=0, verbose_name='登录时间')
+    online = models.SmallIntegerField(default=0, verbose_name='是否在线')
+    phone = models.CharField(max_length=11, default='', verbose_name='手机号')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+
+    class Meta:
+        verbose_name = '用户表'
+        verbose_name_plural = verbose_name
+        db_table = 'user'
+
 
-class UserRegionModel(models.Model):
+class CompanyModel(models.Model):
     id = models.AutoField(primary_key=True)
-    user = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE, verbose_name='关联用户表')
-    region_id = models.IntegerField(default=0, verbose_name='地区id')
+    name = models.CharField(max_length=64, unique=True, default='', verbose_name='企业名称')
+    mark = models.CharField(max_length=3, unique=True, default='', verbose_name='企业标志,用于序列号的后三位')
+    secret = models.CharField(max_length=10, db_index=True, default='', verbose_name='企业秘钥')
+    quantity = models.IntegerField(default=0, verbose_name='已购买的序列号的数量')
     add_time = models.IntegerField(default=0, verbose_name='添加时间')
     update_time = models.IntegerField(default=0, verbose_name='更新时间')
 
     class Meta:
-        db_table = 'user_region'
-        verbose_name = '用户地区表'
+        db_table = 'tb_company'
+        verbose_name = '企业表'
+        verbose_name_plural = verbose_name
+
+
+class RegionModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    name = models.CharField(max_length=32, default='', verbose_name='区域名称')
+
+    class Meta:
+        db_table = 'tb_region'
+        verbose_name = '区域表'
         verbose_name_plural = verbose_name
+
+
+class VPGModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    name = models.CharField(max_length=32, default='', verbose_name='群组名称')
+    region = models.ForeignKey(RegionModel, to_field='id', on_delete=models.DO_NOTHING, verbose_name='群组用于的地区')
+    company = models.ForeignKey(CompanyModel, to_field='id', on_delete=models.DO_NOTHING, verbose_name='关联企业表')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'tb_vpg'
+        verbose_name = 'vpg表'
+        verbose_name_plural = verbose_name
+
+
+class UIDModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    uid = models.CharField(max_length=20, null=False, db_index=True, unique=True, verbose_name='设备id')
+    mac = models.CharField(max_length=17, null=False, default='', verbose_name='设备id对应的mac地址')
+    uid_extra = models.TextField(default='', verbose_name='uid的额外描述')
+    status = models.SmallIntegerField(default=0, verbose_name='使用状态')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+    area = models.SmallIntegerField(default=0, verbose_name='区域')  #0:国内;1:国外
+    vpg = models.ForeignKey(VPGModel, to_field='id', default=1, on_delete=models.DO_NOTHING, verbose_name='关联VPG表的id')
+
+    class Meta:
+        ordering = ('-add_time',)
+        verbose_name = 'uid表'
+        verbose_name_plural = verbose_name
+        db_table = 'uid'
+
+
+class UserUIDModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    user = models.ForeignKey(UserModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联用户表id')
+    uid = models.ForeignKey(UIDModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联uid表id')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        verbose_name = '用户与UID的关联表'
+        verbose_name_plural = verbose_name
+        db_table = 'user_uid'
+
+
+class PermissionModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    type = models.SmallIntegerField(null=False, verbose_name='权限枚举')
+    description = models.TextField(default='', verbose_name='权限描述')
+
+    class Meta:
+        verbose_name = '权限表'
+        verbose_name_plural = verbose_name
+        db_table = 'permission'
+
+
+class LogModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    operation = models.CharField(max_length=100, default='', verbose_name='操作描述')
+    time = models.IntegerField(default=0, verbose_name='操作时间')
+    ip = models.CharField(default='', max_length=24, verbose_name='用户ip')
+    user = models.ForeignKey(UserModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联用户id')
+    content = models.TextField(default='', verbose_name='请求参数')
+    status = models.IntegerField(default=0, verbose_name='请求状态')
+    url = models.CharField(max_length=150, default='', verbose_name='请求路径')
+
+    class Meta:
+        ordering = ('-time',)
+        verbose_name = '日志表'
+        verbose_name_plural = verbose_name
+        db_table = 'log'
+
+
+class HistoryUIDModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    uid = models.CharField(max_length=20, null=False, db_index=True, verbose_name='设备id')
+    uid_extra = models.TextField(default='', verbose_name='uid的额外描述')
+    status = models.SmallIntegerField(default=0, verbose_name='使用状态')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+    area = models.SmallIntegerField(default=0, verbose_name='区域')  # 0:国内;1:国外
+
+    class Meta:
+        verbose_name = '历史UID表'
+        verbose_name_plural = verbose_name
+        db_table = 'history_uid'
+
+
+class MacModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    value = models.CharField(max_length=17, null=False, verbose_name='最新的mac地址')
+    is_active = models.BooleanField(default=True, verbose_name='当前mac地址是否可用')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        verbose_name = '最新的mac地址表'
+        verbose_name_plural = verbose_name
+        db_table = 'tb_mac'
+
+
+class OrderTaskModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    order_number = models.CharField(max_length=32, verbose_name='订单号')
+    board = models.CharField(max_length=32, verbose_name='主板')
+    plan = models.CharField(max_length=32, verbose_name='配置方案')
+    checksum = models.CharField(max_length=32, verbose_name='校验和')
+    ic_model = models.CharField(max_length=32, verbose_name='ic型号')
+    quantity = models.IntegerField(default=0, verbose_name='通知单上的生成数量')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'order_task'
+        verbose_name = '订单任务表'
+        verbose_name_plural = verbose_name
+
+
+class OrderUIDModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    uid = models.ForeignKey(UIDModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联uid表')
+    order = models.ForeignKey(OrderTaskModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联订单任务表')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'order_uid'
+        verbose_name = '订单与uid关联表'
+        verbose_name_plural = verbose_name
+
+
+class CountryModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    number = models.IntegerField(unique=True, verbose_name='区号')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+    region = models.ForeignKey(RegionModel, to_field='id', on_delete=models.DO_NOTHING, verbose_name='关联区域表')
+
+    class Meta:
+        db_table = 'tb_country'
+        verbose_name = '地区表'
+        verbose_name_plural = verbose_name
+
+
+class LanguageModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    lang = models.CharField(max_length=16, default='', verbose_name='语种')
+    lang_youdao = models.CharField(max_length=16, default='', verbose_name='有道的语种')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'tb_language'
+        verbose_name = '语言表'
+        verbose_name_plural = verbose_name
+
+
+class CountryLanguageModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    country_name = models.CharField(max_length=64, default='', verbose_name='国家名称')
+    language = models.ForeignKey(LanguageModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联语言表的id')
+    country = models.ForeignKey(CountryModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联地区表的id')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'tb_country_language'
+        verbose_name = '不同语言的地区名称表'
+        verbose_name_plural = verbose_name
+
+
+class SerialNumberModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    serial_number = models.CharField(max_length=9, db_index=True, verbose_name='序列号')
+    status = models.SmallIntegerField(default=1, verbose_name='可用状态。0:不可用,1:可用')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'tb_serial_number'
+        verbose_name = '序列号表'
+        verbose_name_plural = verbose_name
+
+
+class CompanySerialModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    company = models.ForeignKey(CompanyModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联企业表的id')
+    serial_number = models.ForeignKey(SerialNumberModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联序列号表的id')
+    status = models.SmallIntegerField(default=0, verbose_name='序列号的状态。0:未使用,1:已使用,2:已和UID关联')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'tb_company_serial'
+        verbose_name = '企业关联序列号表'
+        verbose_name_plural = verbose_name
+
+
+class UIDCompanySerialModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    uid = models.ForeignKey(UIDModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联UID表')
+    company_serial = models.ForeignKey(CompanySerialModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联【企业关联序列号表】的id')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+    update_time = models.IntegerField(default=0, verbose_name='更新时间')
+
+    class Meta:
+        db_table = 'tb_uid_company_serial'
+        verbose_name = 'UID关联【企业关联序列号】表'
+        verbose_name_plural = verbose_name
+
+
+class iotdeviceInfoModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    uid = models.CharField(blank=True, max_length=32, default='', verbose_name=u'设备uid')
+    certificateId = models.CharField(blank=True, max_length=256, default='', verbose_name=u'证书id')
+    certificatePem = models.TextField(blank=True, default='', verbose_name=u'证书项目')
+    publicKey = models.TextField(blank=True, default='', verbose_name=u'公有密钥')
+    privateKey = models.TextField(blank=True, default='', verbose_name=u'私有密钥')
+    Thingname = models.CharField(blank=True, max_length=256, default='', verbose_name=u'IoT Thing Name')
+
+    class Meta:
+        db_table = 'iot_deviceInfo'
+        verbose_name = 'iot设备信息表'
+        verbose_name_plural = verbose_name

+ 3 - 0
Model/tests.py

@@ -0,0 +1,3 @@
+from django.test import TestCase
+
+# Create your tests here.

+ 3 - 0
Model/views.py

@@ -0,0 +1,3 @@
+from django.shortcuts import render
+
+# Create your views here.

+ 367 - 0
Object/IOTCore/IotObject.py

@@ -0,0 +1,367 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import json
+from abc import ABCMeta,abstractmethod
+
+import boto3
+
+from Ansjer.config import AWS_IOT_SES_ACCESS_CHINA_REGION, AWS_IOT_SES_ACCESS_CHINA_ID, AWS_IOT_SES_ACCESS_CHINA_SECRET, \
+    AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA, AWS_IOT_SES_ACCESS_FOREIGN_ID, AWS_IOT_SES_ACCESS_FOREIGN_SECRET, \
+    AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE, AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA
+
+
+class IOTObject(metaclass=ABCMeta):
+
+    @abstractmethod
+    def create_provisioning_claim(self, templateName):
+        pass
+
+    @abstractmethod
+    def create_keys_and_certificate(self, uid):
+        pass
+
+
+class ChinaIOTClient(IOTObject):
+
+    def __init__(self):
+        self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_CHINA_REGION,
+                                   aws_access_key_id=AWS_IOT_SES_ACCESS_CHINA_ID,
+                                   aws_secret_access_key=AWS_IOT_SES_ACCESS_CHINA_SECRET)
+
+    def create_provisioning_claim(self, templateName):
+
+        result = self.client.create_provisioning_claim(templateName=templateName)
+
+        res = {
+            'certificateId': result['certificateId'],
+            'certificatePem': result['certificatePem'],
+            'publicKey': result['keyPair']['PublicKey'],
+            'privateKey': result['keyPair']['PrivateKey'],
+            'endpoint': 'a250bbr0p9u7as-ats.iot.cn-northwest-1.amazonaws.com.cn'
+        }
+        return res
+
+    def create_keys_and_certificate(self, uid):
+        result = self.client.create_keys_and_certificate(setAsActive=True)
+        res = {
+            'certificateId': result['certificateId'],
+            'certificatePem': result['certificatePem'],
+            'publicKey': result['keyPair']['PublicKey'],
+            'privateKey': result['keyPair']['PrivateKey'],
+            'endpoint': 'a250bbr0p9u7as-ats.iot.cn-northwest-1.amazonaws.com.cn'
+        }
+        # 根据证书ID注册物品和策略
+        templateBody = {
+            "Parameters": {
+                "ThingName": {
+                    "Type": "String"
+                },
+                "SerialNumber": {
+                    "Type": "String"
+                },
+                "DeviceLocation": {
+                    "Type": "String"
+                },
+                "AWS::IoT::Certificate::Id": {
+                    "Type": "String"
+                }
+            },
+            "Resources": {
+                "thing": {
+                    "Type": "AWS::IoT::Thing",
+                    "Properties": {
+                        "AttributePayload": {},
+                        "ThingGroups": [],
+                        "ThingName": {
+                            "Ref": "ThingName"
+                        },
+                    },
+                    "OverrideSettings": {
+                        "AttributePayload": "MERGE",
+                        "ThingTypeName": "REPLACE",
+                        "ThingGroups": "DO_NOTHING"
+                    }
+                },
+                "certificate": {
+                    "Type": "AWS::IoT::Certificate",
+                    "Properties": {
+                        "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
+                        "Status": "Active"
+                    }
+                },
+                "policy": {
+                    "Properties": {
+                        "PolicyName": "My_Iot_Policy"
+                    },
+                    "Type": "AWS::IoT::Policy"
+                },
+            }
+        }
+
+        templateBody = json.dumps(templateBody)
+        parameters = {"ThingName": "Ansjer_Device_" + uid,
+                      "AWS::IoT::Certificate::Id": res['certificateId']}
+        self.client.register_thing(
+            templateBody=templateBody,
+            parameters=parameters
+        )
+        return res, parameters
+
+
+class AmericaIOTClient(IOTObject):
+
+    def __init__(self):
+        self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_AMERICA,
+                                   aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
+                                   aws_secret_access_key=AWS_IOT_SES_ACCESS_FOREIGN_SECRET)
+
+    def create_provisioning_claim(self, templateName):
+
+        result = self.client.create_provisioning_claim(templateName=templateName)
+
+        res = {
+            'certificateId': result['certificateId'],
+            'certificatePem': result['certificatePem'],
+            'publicKey': result['keyPair']['PublicKey'],
+            'privateKey': result['keyPair']['PrivateKey'],
+            'endpoint': 'a2rqy12o004ad8-ats.iot.us-east-1.amazonaws.com'
+        }
+        return res
+
+    def create_keys_and_certificate(self, uid):
+        result = self.client.create_keys_and_certificate(setAsActive=True)
+        res = {
+            'certificateId': result['certificateId'],
+            'certificatePem': result['certificatePem'],
+            'publicKey': result['keyPair']['PublicKey'],
+            'privateKey': result['keyPair']['PrivateKey'],
+            'endpoint': 'a2rqy12o004ad8-ats.iot.us-east-1.amazonaws.com'
+        }
+        # 根据证书ID注册物品和策略
+        templateBody = {
+            "Parameters": {
+                "ThingName": {
+                    "Type": "String"
+                },
+                "SerialNumber": {
+                    "Type": "String"
+                },
+                "DeviceLocation": {
+                    "Type": "String"
+                },
+                "AWS::IoT::Certificate::Id": {
+                    "Type": "String"
+                }
+            },
+            "Resources": {
+                "thing": {
+                    "Type": "AWS::IoT::Thing",
+                    "Properties": {
+                        "AttributePayload": {},
+                        "ThingGroups": [],
+                        "ThingName": {
+                            "Ref": "ThingName"
+                        },
+                    },
+                    "OverrideSettings": {
+                        "AttributePayload": "MERGE",
+                        "ThingTypeName": "REPLACE",
+                        "ThingGroups": "DO_NOTHING"
+                    }
+                },
+                "certificate": {
+                    "Type": "AWS::IoT::Certificate",
+                    "Properties": {
+                        "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
+                        "Status": "Active"
+                    }
+                },
+                "policy": {
+                    "Properties": {
+                        "PolicyName": "My_Iot_Policy"
+                    },
+                    "Type": "AWS::IoT::Policy"
+                },
+            }
+        }
+
+        templateBody = json.dumps(templateBody)
+        parameters = {"ThingName": "Ansjer_Device_" + uid,
+                      "AWS::IoT::Certificate::Id": res['certificateId']}
+        self.client.register_thing(
+            templateBody=templateBody,
+            parameters=parameters
+        )
+        return res, parameters
+
+
+class AsiaIOTClient(IOTObject):
+
+    def __init__(self):
+        self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_ASIA,
+                                   aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
+                                   aws_secret_access_key=AWS_IOT_SES_ACCESS_FOREIGN_SECRET)
+
+    def create_provisioning_claim(self, templateName):
+        result = self.client.create_provisioning_claim(templateName=templateName)
+
+        res = {
+            'certificateId': result['certificateId'],
+            'certificatePem': result['certificatePem'],
+            'publicKey': result['keyPair']['PublicKey'],
+            'privateKey': result['keyPair']['PrivateKey'],
+            'endpoint': 'a2rqy12o004ad8-ats.iot.ap-southeast-1.amazonaws.com'
+        }
+        return res
+
+    def create_keys_and_certificate(self, uid):
+        result = self.client.create_keys_and_certificate(setAsActive=True)
+        res = {
+            'certificateId': result['certificateId'],
+            'certificatePem': result['certificatePem'],
+            'publicKey': result['keyPair']['PublicKey'],
+            'privateKey': result['keyPair']['PrivateKey'],
+            'endpoint': 'a2rqy12o004ad8-ats.iot.ap-southeast-1.amazonaws.com'
+        }
+        # 根据证书ID注册物品和策略
+        templateBody = {
+            "Parameters": {
+                "ThingName": {
+                    "Type": "String"
+                },
+                "SerialNumber": {
+                    "Type": "String"
+                },
+                "DeviceLocation": {
+                    "Type": "String"
+                },
+                "AWS::IoT::Certificate::Id": {
+                    "Type": "String"
+                }
+            },
+            "Resources": {
+                "thing": {
+                    "Type": "AWS::IoT::Thing",
+                    "Properties": {
+                        "AttributePayload": {},
+                        "ThingGroups": [],
+                        "ThingName": {
+                            "Ref": "ThingName"
+                        },
+                    },
+                    "OverrideSettings": {
+                        "AttributePayload": "MERGE",
+                        "ThingTypeName": "REPLACE",
+                        "ThingGroups": "DO_NOTHING"
+                    }
+                },
+                "certificate": {
+                    "Type": "AWS::IoT::Certificate",
+                    "Properties": {
+                        "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
+                        "Status": "Active"
+                    }
+                },
+                "policy": {
+                    "Properties": {
+                        "PolicyName": "My_Iot_Policy"
+                    },
+                    "Type": "AWS::IoT::Policy"
+                },
+            }
+        }
+
+        templateBody = json.dumps(templateBody)
+        parameters = {"ThingName": "Ansjer_Device_" + uid,
+                      "AWS::IoT::Certificate::Id": res['certificateId']}
+        self.client.register_thing(
+            templateBody=templateBody,
+            parameters=parameters
+        )
+        return res, parameters
+
+
+class EuropeIOTClient(IOTObject):
+
+    def __init__(self):
+        self.client = boto3.client('iot', region_name=AWS_IOT_SES_ACCESS_FOREIGN_REGION_EUROPE,
+                                   aws_access_key_id=AWS_IOT_SES_ACCESS_FOREIGN_ID,
+                                   aws_secret_access_key=AWS_IOT_SES_ACCESS_FOREIGN_SECRET)
+
+    def create_provisioning_claim(self, templateName):
+        result = self.client.create_provisioning_claim(templateName=templateName)
+
+        res = {
+            'certificateId': result['certificateId'],
+            'certificatePem': result['certificatePem'],
+            'publicKey': result['keyPair']['PublicKey'],
+            'privateKey': result['keyPair']['PrivateKey'],
+            'endpoint': 'a2rqy12o004ad8-ats.iot.eu-west-1.amazonaws.com'
+        }
+        return res
+
+    def create_keys_and_certificate(self, uid):
+        result = self.client.create_keys_and_certificate(setAsActive=True)
+        res = {
+            'certificateId': result['certificateId'],
+            'certificatePem': result['certificatePem'],
+            'publicKey': result['keyPair']['PublicKey'],
+            'privateKey': result['keyPair']['PrivateKey'],
+            'endpoint': 'a2rqy12o004ad8-ats.iot.eu-west-1.amazonaws.com'
+        }
+        # 根据证书ID注册物品和策略
+        templateBody = {
+            "Parameters": {
+                "ThingName": {
+                    "Type": "String"
+                },
+                "SerialNumber": {
+                    "Type": "String"
+                },
+                "DeviceLocation": {
+                    "Type": "String"
+                },
+                "AWS::IoT::Certificate::Id": {
+                    "Type": "String"
+                }
+            },
+            "Resources": {
+                "thing": {
+                    "Type": "AWS::IoT::Thing",
+                    "Properties": {
+                        "AttributePayload": {},
+                        "ThingGroups": [],
+                        "ThingName": {
+                            "Ref": "ThingName"
+                        },
+                    },
+                    "OverrideSettings": {
+                        "AttributePayload": "MERGE",
+                        "ThingTypeName": "REPLACE",
+                        "ThingGroups": "DO_NOTHING"
+                    }
+                },
+                "certificate": {
+                    "Type": "AWS::IoT::Certificate",
+                    "Properties": {
+                        "CertificateId": {"Ref": "AWS::IoT::Certificate::Id"},
+                        "Status": "Active"
+                    }
+                },
+                "policy": {
+                    "Properties": {
+                        "PolicyName": "My_Iot_Policy"
+                    },
+                    "Type": "AWS::IoT::Policy"
+                },
+            }
+        }
+
+        templateBody = json.dumps(templateBody)
+        parameters = {"ThingName": "Ansjer_Device_" + uid,
+                      "AWS::IoT::Certificate::Id": res['certificateId']}
+        self.client.register_thing(
+            templateBody=templateBody,
+            parameters=parameters
+        )
+        return res, parameters

+ 6 - 2
Object/ResponseObject.py

@@ -93,7 +93,9 @@ class ResponseObject(object):
             10037: 'Non device primary user cannot transfer device',
             10038: 'Non device primary user cannot transfer packages',
             10039: 'Activation code has been used',
-            10040: 'Invalid activation code'
+            10040: 'Invalid activation code',
+            10041: 'This device has purchased a domestic cloud storage package, and cannot purchase a foreign cloud storage package',
+            10042: 'The device has registered a certificate'
         }
         data_cn = {
             0: '成功',
@@ -181,7 +183,9 @@ class ResponseObject(object):
             10037: '非设备主用户无法转移设备',
             10038: '非设备主用户无法转移套餐',
             10039: '激活码已被使用过',
-            10040: '无效激活码'
+            10040: '无效激活码',
+            10041: '此设备已购买过国内云存套餐,无法购买国外云存套餐',
+            10042: '此设备已注册证书'
         }
         if self.lang == 'cn':
             msg = data_cn

+ 4 - 4
Object/TokenObject.py

@@ -43,10 +43,10 @@ class TokenObject:
             self.lang = res.get('lang', None)
             self.user = res.get('user', '')
             # 刷新登录时间
-            if self.userID:
-                print(self.user)
-                redisObj = RedisObject(db=3)
-                redisObj.set_data(key=self.userID, val=self.user, expire=300)
+            # if self.userID:
+            #     print(self.user)
+            #     redisObj = RedisObject(db=3)
+            #     redisObj.set_data(key=self.userID, val=self.user, expire=300)
 
         except jwt.ExpiredSignatureError as e:
             print('过期')

+ 113 - 0
Object/uidManageResponseObject.py

@@ -0,0 +1,113 @@
+from django.shortcuts import HttpResponse
+import simplejson as json
+
+
+class uidManageResponseObject(object):
+
+    def __init__(self, lang='cn'):
+        self.lang = lang
+
+    def data(self, code, res={}):
+        data_cn = {
+            0: '成功',
+            5: '请一分钟后再尝试',
+            8: '用户账号已存在',
+            9: '用户账号不存在',
+            10: res,
+            42: '两次输入的新密码错误',
+            43: '客户端服务器已关闭,请下载新版本使用',
+            44: '系统错误,发送邮件失败',
+            45: '系统错误,生成令牌出错!',
+            46: '系统错误,发送短信失败!',
+            47: '旧密码不正确',
+            74: '关联旧用户失败!',
+            79: '您已经申请过重置密码,请到邮箱进行确认!',
+            89: '您已经获得了验证码,请在10分钟后检查或再次确认。',
+            99: '账户或密码错误',
+            101: '手机的用户账号已经存在!',
+            102: '手机的用户账号不存在!',
+            103: '邮箱用户帐户已经存在!',
+            104: '邮箱用户帐户不存在!',
+            107: '用户名格式不符合规则!',
+            108: '邮箱格式不符合规则!',
+            110: '因为用户未激活,用户是无效用户!',
+            111: '您输入的密码不正确!',
+            120: '验证码已过期或不存在、请重新获得验证码!',
+            121: '验证码错了!',
+            138: '手机格式不符合规则!',
+            173: '数据不存在!',
+            174: '数据已存在',
+            175: 'mac地址已用完',
+            176: '数据库异常',
+            305: '令牌格式是错误的,相关参数是不存在的!',
+            307: '令牌已过期!',
+            308: '此次下载已失效',
+            309: '你没有权限访问',
+            373: '没有相应的公司',
+            374: '没有相应的地区',
+            375: 'uid不足',
+            404: 'You don not have permission to access this!',
+            444: '请确认参数的正确性!',
+            1112: '您输入的两次密码不一致!',
+            208: '只能预定当天的或者以后的!',
+        }
+        data_en = {
+            0: 'Success',
+            5: 'Please try again one minute later!',
+            8: 'User accounts already exist',
+            9: 'User accounts is not exist',
+            10: res,
+            42: 'The new password entered twice is incorrect',
+            43: 'The client server is closed. Please download the new version for use',
+            44: 'System error,send email fail!',
+            45: 'System error,generate token fail!',
+            46: 'System error, sending SMS failed!',
+            47: 'Old password is incorrect',
+            74: 'Failed to connect old users!',
+            79: 'You have applied for reset password, please go to email for confirmation!',
+            89: 'You have already obtained the verification code, please check it or get it again after 10 minutes.',
+            99: ' ERROR Incorrect account or password',
+            101: 'The user account of the mobile phone has already existed!',
+            102: 'The user account of the mobile phone does not exist!',
+            103: 'The mailbox user account has already existed!',
+            104: 'The mailbox user account does not exist!',
+            107: 'The username format does not conform to the rules!',
+            108: 'The mailbox format does not conform to the rules! ',
+            110: 'Because the user is not activated, the user is an invalid user!',
+            111: 'The password you entered is incorrect!',
+            120: 'The captcha has expired or does not exist, please obtain the captcha again!',
+            121: 'The verification code is wrong!',
+            138: 'The phone format does not conform to the rules! ',
+            173: 'Data does not exists!',
+            174: 'Data already exists',
+            175: 'MAC address has been used up',
+            176: 'Database exception',
+            305: 'The Token format is wrong and the related parameter is None!',
+            307: 'The Token has expired!',
+            308: 'This download has expired!',
+            309: 'You have no access',
+            373: 'No corresponding company',
+            374: 'Region does not exist',
+            375: 'uid不足',
+            404: 'You don not have permission to access this!',
+            444: 'Please confirm the correctness of the parameters!',
+            1112: 'The two passwords you entered do not match!',
+        }
+
+        if self.lang == 'cn':
+            msg = data_cn
+        else:
+            msg = data_en
+        try:
+            message = msg[code]
+        except Exception as e:
+            message = '系统错误,code不存在'
+        return {'result_code': code, 'reason': message, 'result': res, 'error_code': code}
+
+    def formal(self, code, res={}):
+        formal_data = self.data(code, res)
+        return json.dumps(formal_data,ensure_ascii=False)
+
+    def json(self, code, res={}):
+        result = self.formal(code, res)
+        return HttpResponse(result)

+ 55 - 0
Service/AlgorithmService.py

@@ -0,0 +1,55 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import math
+
+
+class AlgorithmBaseOn35:
+
+    letters = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+               'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
+               'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T',
+               'U', 'V', 'W', 'X', 'Y', 'Z']
+
+    len1 = len(letters)
+
+    def getLetter(self, number):
+        tmp = int(number / self.len1)
+        current = number % self.len1
+
+        if tmp >= self.len1:
+            return self.getLetter(tmp) + self.letters[current]
+        else:
+            return self.letters[tmp] + self.letters[current]
+
+    def add(self, a, b):
+        sum = a + b
+        serial_number = self.getLetter(sum)
+        return serial_number
+
+    def __findLetter(self, char):
+        for i in range(self.len1):
+            if char == self.letters[i]:
+                return i
+        return -1
+
+    def __drop0(self, text):
+        char = text[0]
+        if char == '0':
+            return self.__drop0(text[1:])
+        else:
+            return text
+
+    def to10(self, serial):
+        serial = self.__drop0(serial)
+        print(serial)
+        len1 = len(serial)
+        print(len1)
+        sum = 0
+        for char in serial:
+            tmp = self.__findLetter(char)
+            if tmp == -1:
+                return None
+            print(tmp)
+            sum += (tmp * math.pow(35, len1 - 1))
+            len1 -= 1
+        return sum

+ 81 - 0
Service/CommonService.py

@@ -324,3 +324,84 @@ class CommonService:
                 if str(e) == 'day is out of range for month':
                     now_day = now_day - 1
         return timestamps
+
+    @staticmethod
+    def updateMac(mac: str):
+        macArray = mac.split(':')
+
+        macArray[0] = int(macArray[0], 16)
+        macArray[1] = int(macArray[1], 16)
+        macArray[2] = int(macArray[2], 16)
+        first = int(macArray[5], 16)
+        second = int(macArray[4], 16)
+        three = int(macArray[3], 16)
+
+        # print(macArray)
+        # print(first)
+        # print(second)
+        # print(three)
+
+        if first == 255 and second == 255 and three == 255:
+            return None
+
+        first += 1
+
+        if first / 256 == 1:
+            second += 1
+            first = first % 256
+
+        if second / 256 == 1:
+            three += 1
+            second = second % 256
+
+        macArray[3] = three
+        macArray[4] = second
+        macArray[5] = first
+        # print(macArray)
+
+        tmp = ':'.join(map(lambda x: "%02x" % x, macArray))
+        # print(tmp)
+        return tmp.upper()
+
+    @staticmethod
+    def decode_data(content, start=1, end=4):
+        try:
+            for i in range(start, end):
+                if i == 1:
+                    content = base64.b64decode(content)
+                    content = content.decode('utf-8')
+                    content = content[1:-1]
+                if i == 2:
+                    content = base64.b64decode(content)
+                    content = content.decode('utf-8')
+                    content = content[2:-2]
+                if i == 3:
+                    content = base64.b64decode(content)
+                    content = content.decode('utf-8')
+                    content = content[3:-3]
+                    print(content)
+
+            return content
+        except Exception as e:
+            print(e)
+            return None
+
+    @staticmethod
+    def encode_data(content, start=1, end=4):
+        for i in range(start, end):
+            if i == 1:
+                content = CommonService.RandomStr(3, False) + content + CommonService.RandomStr(3, False)
+                content = base64.b64encode(str(content).encode("utf-8")).decode('utf8')
+            if i == 2:
+                content = CommonService.RandomStr(2, False) + str(content) + CommonService.RandomStr(2, False)
+                content = base64.b64encode(str(content).encode("utf-8")).decode('utf8')
+            if i == 3:
+                content = CommonService.RandomStr(1, False) + str(content) + CommonService.RandomStr(1, False)
+                content = base64.b64encode(str(content).encode("utf-8")).decode('utf8')
+        return content
+
+    @staticmethod
+    def encode_data_without_salt(content):
+        return base64.b64encode(str(content).encode("utf-8")).decode('utf8')
+
+

+ 141 - 0
Service/LogMiddleware.py

@@ -0,0 +1,141 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+import json
+import threading
+import time
+
+from django.utils.deprecation import MiddlewareMixin
+
+from Model.models import UserModel, LogModel
+from Object import TokenObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+
+
+class LogMiddleware(MiddlewareMixin):
+
+    # def process_request(self, request):
+        # if request.path == '/upload':
+        #     request.encoding = 'utf-8'
+        #     request_dict = request.POST
+        #     print(request.POST)
+        #     request.POST = request_dict
+
+    def process_response(self, request, response):
+
+        if request.path != '/favicon.ico':
+            self.start_log_thread(request, response)
+        return response
+
+    def start_log_thread(self, request, response):
+        print('start_log_thread')
+        asy = threading.Thread(target=add_log, args=(request, response))
+        asy.start()
+
+
+def add_log(request, response):
+    request.encoding = 'utf-8'
+    if request.method == 'GET':
+        request_dict = request.GET
+    elif request.method == 'POST':
+        request_dict = request.POST
+    else:
+        return
+
+    # print(response.content.decode().strip())
+    request_path = request.path.strip().strip('/')
+    print(request_path)
+    jsonObject = {}
+    if request_path == 'download' or request_path == 'uid/download':
+        if response.status_code != 200:
+            return
+    else:
+        try:
+            jsonObject = json.loads(response.content.decode().strip())
+            code = jsonObject.get('code')
+        except Exception as e:
+            print(repr(e))
+            return
+
+        if code is None or code != 0 and response.status_code != 200:
+            print('code is {code}'.format(code=code))
+            return
+
+    token = request_dict.get('token', None)
+    # print(token)
+    token = TokenObject(token)
+
+    status = response.status_code
+    # 去除密码
+    contentDict = dict(request_dict)
+    # print(contentDict)
+    password = contentDict.get('password')
+    if password:
+        contentDict.pop('password')
+
+    content = json.dumps(contentDict)
+    ip = CommonService.get_ip_address(request)
+    now_time = time.time()
+
+    if token.code == 0:
+        user_qs = UserModel.objects.filter(id=token.userID)
+    else:
+        # print(token.code)
+        username = request_dict.get('username', None)
+        if username is None:
+            print('username')
+            return
+        user_qs = UserModel.objects.filter(username=username)
+
+    if not user_qs.exists():
+        # print('exists')
+        return
+
+    user = user_qs[0]
+    operation = ''
+    # print(request_path)
+    if request_path == 'user/login':
+        operation = '登录账号'
+    elif request_path == 'user/logout':
+        operation = '退出登录'
+    elif request_path == 'user/modify':
+        operation = '修改密码'
+    elif request_path == 'upload':
+        area = request_dict.get('area', None)
+        count = jsonObject['res']['count']
+        operation = formatOperation('上传', int(count), int(area))
+    elif request_path == 'uid/allot':
+        area = request_dict.get('area', None)
+        quantity = request_dict.get('quantity', None)
+        if area and quantity:
+            operation = formatOperation('分配', int(quantity), int(area))
+    elif request_path == 'download':
+        area = request_dict.get('area', None)
+        quantity = request_dict.get('quantity', None)
+        if area and quantity:
+            operation = formatOperation('下载', int(quantity), int(area))
+    else:
+        return
+
+    log = {
+        'status': status,
+        'content': content,
+        'ip': ip,
+        'time': now_time,
+        'url': request_path,
+        'operation': operation,
+        'user': user
+    }
+
+    try:
+        LogModel.objects.create(**log)
+    except Exception as e:
+        print(repr(e))
+
+
+def formatOperation(operation, quantity, area):
+    str = '{operation}{quantity}个{area}UID'
+    if area == 0:
+        return str.format(operation=operation, quantity=quantity, area='国内')
+    else:
+        return str.format(operation=operation, quantity=quantity, area='国外')

+ 16 - 0
Service/ModelService.py

@@ -11,6 +11,22 @@ from django.db.models import Q
 
 # 针对模型封装的复用性代码
 class ModelService:
+    # UID Manage检测权限
+    @staticmethod
+    def check_perm_uid_manage(userID, permID):
+        try:
+            user_qs = UserModel.objects.filter(id=userID)
+            if user_qs.exists():
+                user = user_qs[0]
+                if int(user.permission) != 0:
+                    return False
+                else:
+                    return True
+            else:
+                return False
+        except Exception as e:
+            print(repr(e))
+
     # 获取当前用户角色名
     @staticmethod
     def getRole(rid):

+ 95 - 0
Service/OperatingLogs.py

@@ -0,0 +1,95 @@
+import json
+import threading
+import datetime
+import time
+
+from bson import utc
+
+from Model.models import EquipmentLogModel
+from Service.CommonService import CommonService
+from Service.MiscellService import MiscellService
+from Service.TemplateService import TemplateService
+
+
+def add_access_log(request, status_code):
+    # 增加多进程 异步
+    asy = threading.Thread(target=addLog, args=(request, status_code))
+    asy.start()
+
+
+def addLog(request, status_code):
+    request_path = request.path.strip().strip('/')
+    if 'equipment' in request.path:
+        global request_dict
+        try:
+            if request.method == 'GET':
+                request_dict = request.GET
+            elif request.method == 'POST':
+                request_dict = request.POST
+            # api_list = TemplateService.log_api()
+            print('status_code:', status_code)
+            api_list = [
+                'equipment/add',
+                'equipment/delete',
+                'equipment/flowUpdate',
+                'v3/equipment/add',
+                'v3/equipment/modify',
+            ]
+            # 接口中文化
+            jiekou = {
+                'equipment/add': 'v1添加设备',
+                'equipment/delete': 'v1删除设备',
+                'equipment/flowUpdate': '更新设备的版本信息',
+                'v3/equipment/add': 'v3添加设备信息',
+                'v3/equipment/modify': 'v3编辑设备信息'
+            }
+            if request_path in api_list:
+                user = MiscellService.get_access_name(request_dict=request_dict)
+                clientIP = CommonService.get_ip_address(request)
+                # now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
+                nowtime = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
+                beijing = datetime.timezone(datetime.timedelta(hours=8))
+                utc = datetime.timezone.utc  # 获取 UTC 的时区对象
+                beijing_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(beijing)  # 强制转换加上 UTC 时区。此处敲黑板,需要特别注意。
+                # content:从前端获取到的参数数据,对获取到的数据进行处理
+                content = json.dumps(request_dict)
+                d = eval(content)
+                if 'uid' not in d:
+                    d['uid'] = ''
+                if 'NickName' not in d:
+                    d['NickName'] = ''
+                if 'equipmentid' not in d:
+                    d['equipmentid'] = ''
+                if 'UID' in d:
+                    d['uid'] = d['UID']
+                if 'id' in d:
+                    d['equipmentid'] = d['id']
+                password = request_dict.get('userPwd', None)
+                if password is not None:
+                    request_dict = dict(request_dict)
+                    request_dict.pop('userPwd')
+                if user != '':
+                    user = user
+                else:
+                    print('空')
+                    user = '空'
+                # 数据拼接
+                caozuo = '用户账号为:[' + user + ']' + '在' + str(beijing_time) + '进行' + str(jiekou[request_path])
+                # + ',' + '设备uid或主键id为:' + str(d['uid']) + str(d['equipmentid'])
+                print('request_dict:', d)
+                add_data = {
+                    'user': user,
+                    'uid': d['uid'],
+                    'equipmentid': d['equipmentid'],
+                    'NickName': d['NickName'],
+                    'ip': clientIP,
+                    'time': beijing_time,
+                    'url': request.path,
+                    'operatingcontent': caozuo,
+                }
+                print('操作数据:', add_data)
+                # 设备日志添加
+                EquipmentLogModel.objects.create(**add_data)
+        except Exception as e:
+            print(repr(e))
+            pass

+ 15 - 11
Service/TemplateService.py

@@ -28,9 +28,6 @@ class TemplateService:
             'account/delUser',
             'account/setUserValid',
             'account/unsharedUserEquipment',
-            'equipment/addNewUserEquipment',
-            'equipment/delUserEquipment',
-            'equipment/modifyUserEquipment',
             'roles/addNewRole',
             'roles/delRole',
             'roles/modifyRole',
@@ -38,7 +35,6 @@ class TemplateService:
             'perms/delPerms',
             'perms/modifyPerms',
             'uploads/upgrade',
-            'equipment/OTA',
             # 'appInfo',
             'OTA/getNewVer',
             'v2/account/authcode',
@@ -53,24 +49,17 @@ class TemplateService:
             'cloudVod/findVod',
             'cloudVod/aliPayCreateOrder',
             'cloudVod/aliPayCallback',
-            'equipment/add',
             'deviceShare/queryUser',
             'deviceShare/showShareInfo',
             'deviceShare/confirm',
             'deviceShare/deleteUser',
-            'equipment/delete',
-            'equipment/query',
             'order/querylist',
             'detect/changeStatus',
             # 'notify/push',
-            'equipment/flowUpdate',
             'wechat/authsign',
             'login/oauth/authorize',
             'login/oauth/access_token',
             'login/oauth/user',
-            'v3/equipment/query',
-            'v3/equipment/add',
-            'v3/equipment/modify',
             'v2/account/login',
             'v3/account/login',
             'detect/queryInfo',
@@ -79,6 +68,21 @@ class TemplateService:
             'v3/account/changePwd',
             'v3/account/resetPwdByCode',
             'account/appFrequency',
+            'equipment/OTA',
+            'equipment/addNewUserEquipment',
+            'equipment/delUserEquipment',
+            'equipment/modifyUserEquipment',
+            'equipment/add',
+            'equipment/delete',
+            'equipment/query',
+            'equipment/flowUpdate',
+            'v3/equipment/query',
+            'v3/equipment/add',
+            'v3/equipment/modify',
+            'Cloudsum/cloudservicesum',
+            'Cloudsum/userappversion',
+            'Cloudsum/usercount',
+            'Cloudsum/usercloud',
         ]
         return apiList
 

+ 2 - 0
Service/middleware.py

@@ -7,6 +7,7 @@ from Ansjer.config import SERVER_TYPE
 
 from Object.ResponseObject import ResponseObject
 from Service.MiscellService import MiscellService
+from Service import OperatingLogs
 import django.db
 
 
@@ -87,6 +88,7 @@ class StatisticsUrlMiddleware(MiddlewareMixin):
                 # mysql
                 if SERVER_TYPE!="Ansjer.formal_settings":
                     # print('添加日志')
+                    OperatingLogs.add_access_log(request=request, status_code=response.status_code)
                     MiscellService.add_access_log(request=request, status_code=response.status_code)
                 # else:
                 #     print('不添加日志')