Jelajahi Sumber

推送分库提交到正式15:52

chenshibin 4 tahun lalu
induk
melakukan
5e63fc637e

+ 80 - 0
AnsjerPush/database_router.py

@@ -0,0 +1,80 @@
+# database_router.py
+from django.conf import settings
+
+DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING
+
+
+class DatabaseAppsRouter(object):
+    """
+    A router to control all database operations on models for different
+    databases.
+DATABASE_ROUTERS DATABASE_ROUTERS
+    In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
+    will fallback to the `default` database.
+
+    Settings example:
+
+    DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
+    """
+
+    def db_for_read(self, model, **hints):
+        """"Point all read operations to the specific database."""
+        if model._meta.app_label in DATABASE_MAPPING:
+            return DATABASE_MAPPING[model._meta.app_label]
+        return None
+
+    def db_for_write(self, model, **hints):
+        """Point all write operations to the specific database."""
+        if model._meta.app_label in DATABASE_MAPPING:
+            return DATABASE_MAPPING[model._meta.app_label]
+        return None
+
+    def allow_relation(self, obj1, obj2, **hints):
+        """Allow any relation between apps that use the same database."""
+        db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
+        db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
+        if db_obj1 and db_obj2:
+            if db_obj1 == db_obj2:
+                return True
+            else:
+                return False
+        return None
+
+    def allow_syncdb(self, db, model):
+        """Make sure that apps only appear in the related database."""
+
+        if db in DATABASE_MAPPING.values():
+            return DATABASE_MAPPING.get(model._meta.app_label) == db
+        elif model._meta.app_label in DATABASE_MAPPING:
+            return False
+        return None
+
+    def allow_migrate(self, db, app_label, model=None, **hints):
+        """
+        Make sure the auth app only appears in the 'auth_db'
+        database.
+        """
+        if db in DATABASE_MAPPING.values():
+            return DATABASE_MAPPING.get(app_label) == db
+        elif app_label in DATABASE_MAPPING:
+            return False
+        return None
+
+    # for Django 1.4 - Django 1.6
+    def allow_syncdb(self, db, model):
+        """Make sure that apps only appear in the related database."""
+
+        if db in DATABASE_MAPPING.values():
+            return DATABASE_MAPPING.get(model._meta.app_label) == db
+        elif model._meta.app_label in DATABASE_MAPPING:
+            return False
+        return None
+
+    # Django 1.7 - Django 1.11
+    def allow_migrate(self, db, app_label, model_name=None, **hints):
+
+        if db in DATABASE_MAPPING.values():
+            return DATABASE_MAPPING.get(app_label) == db
+        elif app_label in DATABASE_MAPPING:
+            return False
+        return None

+ 32 - 10
AnsjerPush/formal_settings.py

@@ -58,16 +58,38 @@ SERVER_HOST = 'database-2.clraczw4p0yj.us-west-1.rds.amazonaws.com'
 DATABASES_USER = 'azrds'
 DATABASES_PASS = 'azrds.x.x'
 
-DATABASES = {'default': {
-    'ENGINE': 'django.db.backends.mysql',
-    'NAME': DATABASE_DATA,
-    'USER': DATABASES_USER,
-    'PASSWORD': DATABASES_PASS,
-    'HOST': SERVER_HOST,
-    'PORT': '3306',
-    'OPTIONS': {'charset': 'utf8mb4', 'use_unicode': True, 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},
-    'AUTOCOMMIT': True
-}}
+DATABASE_DATA2 = 'Ansjer81'
+SERVER_HOST2 = 'ansjerpush.clraczw4p0yj.us-west-1.rds.amazonaws.com'
+DATABASES_USER2 = 'azrds'
+DATABASES_PASS2 = 'azrds.x.x'
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': DATABASE_DATA,
+        'USER': DATABASES_USER,
+        'PASSWORD': DATABASES_PASS,
+        'HOST': SERVER_HOST,
+        'PORT': '3306',
+        'OPTIONS': {'charset': 'utf8mb4', 'use_unicode': True, 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},
+        'AUTOCOMMIT': True
+    },
+    'mysql02': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': DATABASE_DATA2,
+        'USER': DATABASES_USER2,
+        'PASSWORD': DATABASES_PASS2,
+        'HOST': SERVER_HOST2,
+        'PORT': '3306',
+        'OPTIONS': {'charset': 'utf8mb4', 'use_unicode': True, 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},
+        'AUTOCOMMIT': True
+    }
+}
+DATABASE_ROUTERS = ['AnsjerPush.database_router.DatabaseAppsRouter']
+DATABASE_APPS_MAPPING = {
+    'db1': 'default',
+    'db2': 'mysql02',
+}
 
 
 # Password validation

+ 39 - 15
AnsjerPush/local_settings.py

@@ -50,6 +50,7 @@ TEMPLATES = [
 WSGI_APPLICATION = 'AnsjerPush.wsgi.application'
 
 
+
 # Database
 # https://docs.djangoproject.com/en/2.1/ref/settings/#databases
 # formal
@@ -62,21 +63,44 @@ WSGI_APPLICATION = 'AnsjerPush.wsgi.application'
 # SERVER_HOST = '13.56.215.252'
 # DATABASES_USER = 'ansjer'
 # DATABASES_PASS = '1234'
-DATABASE_DATA = 'AnsjerLocal'
-SERVER_HOST = '192.168.136.99'
-DATABASES_USER = 'ansjer'
-DATABASES_PASS = 'ansjer.x.x'
-
-DATABASES = {'default': {
-    'ENGINE': 'django.db.backends.mysql',
-    'NAME': DATABASE_DATA,
-    'USER': DATABASES_USER,
-    'PASSWORD': DATABASES_PASS,
-    'HOST': SERVER_HOST,
-    'PORT': '3306',
-    'OPTIONS': {'charset': 'utf8mb4', 'use_unicode': True, 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},
-    'AUTOCOMMIT': True
-}}
+DATABASE_DATA = 'ansjerlocal'
+SERVER_HOST = '127.0.0.1'
+DATABASES_USER = 'root'
+DATABASES_PASS = '123456'
+
+DATABASE_DATA2 = 'asjl'
+SERVER_HOST2 = '127.0.0.1'
+DATABASES_USER2 = 'root'
+DATABASES_PASS2 = '123456'
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': DATABASE_DATA,
+        'USER': DATABASES_USER,
+        'PASSWORD': DATABASES_PASS,
+        'HOST': SERVER_HOST,
+        'PORT': '3306',
+        'OPTIONS': {'charset': 'utf8mb4', 'use_unicode': True, 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},
+        'AUTOCOMMIT': True
+    },
+    'mysql02': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': DATABASE_DATA2,
+        'USER': DATABASES_USER2,
+        'PASSWORD': DATABASES_PASS2,
+        'HOST': SERVER_HOST2,
+        'PORT': '3306',
+        'OPTIONS': {'charset': 'utf8mb4', 'use_unicode': True, 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},
+        'AUTOCOMMIT': True
+    }
+}
+DATABASE_ROUTERS = ['AnsjerPush.database_router.DatabaseAppsRouter']
+DATABASE_APPS_MAPPING = {
+    'db1': 'default',
+    'db2': 'mysql02',
+}
+
 
 
 # Password validation

+ 33 - 15
AnsjerPush/test_settings.py

@@ -50,27 +50,45 @@ TEMPLATES = [
 WSGI_APPLICATION = 'AnsjerPush.wsgi.application'
 
 
-# Database
-# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
 
-# test
+# 服务器类型
 DATABASE_DATA = 'AnsjerTest'
 SERVER_HOST = 'database-2.clraczw4p0yj.us-west-1.rds.amazonaws.com'
 DATABASES_USER = 'azrds'
 DATABASES_PASS = 'azrds.x.x'
 
-
-DATABASES = {'default': {
-    'ENGINE': 'django.db.backends.mysql',
-    'NAME': DATABASE_DATA,
-    'USER': DATABASES_USER,
-    'PASSWORD': DATABASES_PASS,
-    'HOST': SERVER_HOST,
-    'PORT': '3306',
-    'OPTIONS': {'charset': 'utf8mb4', 'use_unicode': True, 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},
-    'AUTOCOMMIT': True
-}}
-
+DATABASE_DATA2 = 'AnsjerTest'
+SERVER_HOST2 = 'ansjerpush.clraczw4p0yj.us-west-1.rds.amazonaws.com'
+DATABASES_USER2 = 'azrds'
+DATABASES_PASS2 = 'azrds.x.x'
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': DATABASE_DATA,
+        'USER': DATABASES_USER,
+        'PASSWORD': DATABASES_PASS,
+        'HOST': SERVER_HOST,
+        'PORT': '3306',
+        'OPTIONS': {'charset': 'utf8mb4', 'use_unicode': True, 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},
+        'AUTOCOMMIT': True
+    },
+    'mysql02': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': DATABASE_DATA2,
+        'USER': DATABASES_USER2,
+        'PASSWORD': DATABASES_PASS2,
+        'HOST': SERVER_HOST2,
+        'PORT': '3306',
+        'OPTIONS': {'charset': 'utf8mb4', 'use_unicode': True, 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},
+        'AUTOCOMMIT': True
+    }
+}
+DATABASE_ROUTERS = ['AnsjerPush.database_router.DatabaseAppsRouter']
+DATABASE_APPS_MAPPING = {
+    'db1': 'default',
+    'db2': 'mysql02',
+}
 
 # Password validation
 # https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators

+ 320 - 0
Controller/EquipmentInfo.py

@@ -0,0 +1,320 @@
+import json
+import time
+import traceback
+import requests
+
+import oss2
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from django.views.generic import TemplateView
+from django.views.generic.base import View
+
+from AnsjerPush.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET
+from AnsjerPush.config import SERVER_DOMAIN
+from Model.models import Device_Info, VodHlsModel, Equipment_Info
+from Model.models import Device_User
+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://192.168.136.45:8077/equipment/info?token=test&operation=add&devUid=2N1K3LE78TYJ38CE111A&Channel=0&eventType=1&eventTime=1234567890&operation=add&alarm=21342134&receiveTime=1234567891234567
+http://test.dvema.com/equipment/info?token=test&operation=query&page=1&line=10
+http://192.168.136.45:8077/equipment/info?token=test&operation=delete&devUid=UKPAH63V23U4ZHEB111A&id=5&id=6&id=7
+http://192.168.136.40:8077/equipment/info?token=test&operation=update&devUid=UKPAH63V23U4ZHEB111A&id=3&id=4
+http://192.168.136.45:8077/equipment/info?token=test&operation=queryByAdmin&page=1&line=10&userID_id=151547867345163613800138001
+http://192.168.136.45:8077/equipment/info?token=test&operation=deleteByAdmin&id=5&id=6&id=7
+
+'''
+
+
+class EquipmentInfo(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(EquipmentInfo, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.GET)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.POST)
+
+    def validation(self, request_dict, *args, **kwargs):
+        token = request_dict.get('token', None)
+        response = ResponseObject()
+        tko = TokenObject(token)
+        if tko.code != 0:
+            return response.json(tko.code)
+        userID = tko.userID
+        operation = request_dict.get('operation', None)
+        if not userID:
+            return response.json(309)
+        if operation == 'query':
+            return self.query_info(request_dict, userID, response)
+        elif operation == 'add':
+            return self.add_info(request_dict, userID, response)
+        elif operation == 'update':
+            return self.update_info(request_dict, userID, response)
+        elif operation == 'delete':
+            return self.delete_info(request_dict, userID, response)
+        elif operation == 'findByTime':
+            return self.findByTime_info(request_dict, userID, response)
+        if operation == 'queryByAdmin':
+            return self.query_all_info(request_dict, userID, response)
+        if operation == 'deleteByAdmin':
+            return self.delete_by_admin(request_dict, userID, response)
+        if operation == 'delete_ByApi':
+            return self.delete_api(request_dict, userID, response)
+        else:
+            return response.json(444, {"parm": "operation"})
+
+    def add_info(self, request_dict, userID, response):
+        devUid = request_dict.get('devUid', None)
+        Channel = request_dict.get('Channel', None)
+        eventType = request_dict.get('eventType', None)
+        eventTime = request_dict.get('eventTime', None)
+        receiveTime = request_dict.get('receiveTime', None)
+        alarm = request_dict.get('alarm', None)
+        if not devUid or not Channel or not eventType or not eventTime or not alarm or not receiveTime:
+            return response.json(444, 'devUid, Channel, eventType, eventTime, alarm, receiveTime')
+        own_device = ModelService.check_own_device(userID, UID=devUid)
+        if own_device is not True:
+            return response.json(14)
+        device_info = Device_Info.objects.filter(UID=devUid, userID_id=userID)
+        if not device_info.exists():
+            return response.json(14)
+        try:
+            nowTime = int(time.time())
+            equipment_info = Equipment_Info(
+                userID=Device_User.objects.get(userID=userID),
+                devUid=devUid,
+                Channel=Channel,
+                eventType=eventType,
+                receiveTime=receiveTime,
+                eventTime=eventTime,
+                devNickName=device_info[0].NickName,
+                addTime=nowTime,
+                alarm=alarm)
+            equipment_info.save()
+        except Exception:
+            errorInfo = traceback.format_exc()
+            print(errorInfo)
+            return response.json(500, errorInfo)
+        else:
+            if equipment_info.id:
+                return response.json(0, {'infoID': equipment_info.id,
+                                         'devUid': devUid,
+                                         'Channel': Channel,
+                                         'alarm': alarm,
+                                         'eventType': eventType,
+                                         'eventTime': eventTime,
+                                         'receiveTime': receiveTime,
+                                         'devNickName': equipment_info.devNickName})
+            else:
+                return response.json(500)
+
+    def query_info(self, request_dict, userID, response):
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        if not page or not line:
+            return response.json(444, 'page,line')
+        qs = Equipment_Info.objects.filter(userID_id=userID)
+        uid = request_dict.get('uid', None)
+        if uid:
+            qs = qs.filter(devUid=uid)
+            dvqs = Device_Info.objects.filter(UID=uid).values('Type', 'NickName')
+            uid_type_dict = {uid: {'type': dvqs[0]['Type'], 'NickName': dvqs[0]['NickName']}}
+        else:
+            dvqs = Device_Info.objects.filter(userID_id=userID).values('UID', 'Type', 'NickName')
+            uid_type_dict = {}
+            for dv in dvqs:
+                uid_type_dict[dv['UID']] = {'type': dv['Type'], 'NickName': dv['NickName']}
+        if not qs.exists():
+            return response.json(0, {'datas': [], 'count': 0})
+        count = qs.count()
+        res = qs[(page - 1) * line:page * line]
+        send_json = CommonService.qs_to_dict(res)
+        res = []
+        for p in send_json['datas']:
+            p['fields']['viewAccont'] = ''
+            p['fields']['viewPwd'] = ''
+            devUid = p['fields']['devUid']
+            if devUid in uid_type_dict.keys():
+                p['fields']['uid_type'] = uid_type_dict[devUid]['type']
+                p['fields']['devNickName'] = uid_type_dict[devUid]['NickName']
+            else:
+                p['uid_type'] = ''
+            res.append(p)
+        return response.json(0, {'datas': res, 'count': count})
+
+
+    def update_info(self, request_dict, userID, response):
+        is_update_all = request_dict.get('is_update_all', 0)
+        eventType = request_dict.get('eventType', None)
+        if int(is_update_all) == 1:
+            try:
+                eq = Equipment_Info.objects.filter(userID_id=userID)
+                if eventType:
+                    eq = eq.filter(eventType=int(eventType))
+                is_update = eq.update(status=1)
+                return response.json(0, {'update_count': is_update})
+            except Exception as e:
+                print(repr(e))
+            return response.json(0, {'update_success': 'all'})
+        else:
+            id_list = request_dict.getlist('id[]', None)
+            if id_list is None or len(id_list) < 1:
+                id_list = request_dict.getlist('id', None)
+            param_flag = CommonService.get_param_flag(data=[id_list])
+            if param_flag is True:
+                count = 0
+                for id in id_list:
+                    try:
+                        eq = Equipment_Info.objects.filter(id=int(id))
+                        if eq.exists():
+                            own_dev = ModelService.check_own_device(userID, eq[0].devUid)
+                            if own_dev is True:
+                                count += 1
+                                eq.update(status=1)
+                    except Exception as e:
+                        print(repr(e))
+                return response.json(0, {'update_success': count})
+            else:
+                return response.json(444)
+
+    def delete_info(self, request_dict, userID, response):
+        id_list = request_dict.getlist('id[]', None)
+        if id_list is None or len(id_list) < 1:
+            id_list = request_dict.getlist('id', None)
+        param_flag = CommonService.get_param_flag(data=[id_list])
+        if param_flag is True:
+            try:
+                for id in id_list:
+                    eq = Equipment_Info.objects.filter(id=id)
+                    if eq.exists():
+                        own_dev = ModelService.check_own_device(userID, eq[0].devUid)
+                        if own_dev is True:
+                            eq.delete()
+            except Exception as e:
+                errorInfo = traceback.format_exc()
+                print(errorInfo)
+                return response.json(424, repr(e))
+            else:
+                return response.json(0)
+        else:
+            return response.json(444)
+
+    def findByTime_info(self, request_dict, userID, response):
+        startTime = request_dict.get('startTime')
+        endTime = request_dict.get('endTime')
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        if not startTime or not endTime or not page or not line:
+            return response.json(444, 'startTime, endTime, page, line')
+        uid_list = Device_Info.objects.filter(userID_id=userID).values_list('UID', flat=True)
+        if not len(uid_list):
+            return response.json(0, {'datas': [], 'count': 0})
+        qs = Equipment_Info.objects.filter(userID_id=userID,
+                                           eventTime__range=(startTime, endTime)).order_by('-id')
+        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)
+
+    # 管理员查询指定用户的推送信息接口
+    def query_all_info(self, request_dict, userID, response):
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        username = request_dict.get('username', None)
+        uid = request_dict.get('uid', None)
+        devNickName = request_dict.get('devNickName', None)
+        Channel = request_dict.get('Channel', None)
+        if not page or not line:
+            return response.json(444, 'page,line')
+        check_perm = ModelService.check_perm(userID=userID, permID=30)
+        if not check_perm:
+            return response.json(404)
+
+        if not username and not uid and not devNickName and not Channel:
+            qs = Equipment_Info.objects.all().order_by('-id')
+        elif username:
+            user = Device_User.objects.filter(username=username)
+            users = CommonService.qs_to_dict(user)
+            # 从字典类型中找到对应的pk值,即是userID
+            user_id = users.get('datas')[0].get('pk')
+            if not user.exists():
+                return response.json(104)
+
+            uid_list = Device_Info.objects.filter(userID_id=user_id).values_list('UID', flat=True)
+            if not len(uid_list):
+                return response.json(0, {'datas': [], 'count': 0})
+            qs = Equipment_Info.objects.filter(userID_id=user_id).order_by('-id')
+        elif uid:
+            qs = Equipment_Info.objects.filter(devUid=uid).order_by('-id')
+        elif devNickName:
+            qs = Equipment_Info.objects.filter(devNickName=devNickName).order_by('-id')
+        elif Channel:
+            qs = Equipment_Info.objects.filter(Channel=Channel).order_by('-id')
+        if not qs.exists():
+            return response.json(0, {'datas': [], 'count': 0})
+        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)
+
+    # 管理员的删除推送信息的接口
+    def delete_by_admin(self, request_dict, userID, response):
+        id_list = request_dict.getlist('id', None)
+        if not len(id_list):
+            return response.json(444, 'id is None or not list')
+        check_perm = ModelService.check_perm(userID=userID, permID=10)
+        if check_perm is True:
+            try:
+                is_delete = Equipment_Info.objects.filter(id__in=id_list).delete()
+            except Exception as e:
+                errorInfo = traceback.format_exc()
+                print(errorInfo)
+                return response.json(424, {'details': repr(e)})
+            else:
+                return response.json(0, {'delete_count': is_delete[0]})
+        else:
+            return response.json(404)
+
+
+    def delete_api(self, request_dict, userID, response):
+        equipment_info = request_dict.get('equipment_info', None)
+        content = json.loads(equipment_info)
+        search_kwargs = CommonService.get_kwargs(data=content)
+        # qs = Equipment_Info.objects.filter(**search_kwargs)
+        ei_qs = Equipment_Info.objects.filter(**search_kwargs)
+        ei_qs.delete()
+        ei_count = ei_qs.count()
+        while (ei_count > 1000):
+            ei_qs[0:1000].delete()
+'''
+use information_schema;
+select concat(round(sum(data_length/1024/1024),2),'MB') as data from tables where table_schema='Ansjer81';
+'''
+# 按季度删除访问日志
+def deleteExpireEquipmentInfo(request):
+    response = ResponseObject()
+    i = int(request.GET.get('i', 5))
+
+    import time
+    nowTime = int(time.time())
+    for i in range(i):
+        ei = Equipment_Info.objects.filter(addTime__lte=str(nowTime - 3600 * 24 * 7))[0:10000]
+        id_list = ei.values_list("id", flat=True)
+        print(id_list)
+        Equipment_Info.objects.filter(id__in=list(id_list)).delete()
+    return response.json(0)
+
+

+ 79 - 9
Model/models.py

@@ -75,7 +75,7 @@ class Permissions(models.Model):
         verbose_name = u'role permission'
         verbose_name_plural = verbose_name
         unique_together = (('permName'),)
-
+        app_label = "db1"
     def natural_key(self):
         return (self.permName)
 
@@ -94,6 +94,7 @@ class Role(models.Model):
         db_table = 'role'
         verbose_name = u'用户角色'
         verbose_name_plural = verbose_name
+        app_label = "db1"
 
     def __str__(self):
         return self.roleName
@@ -158,6 +159,7 @@ class Device_User(AbstractBaseUser):
         verbose_name = u'用户信息'
         db_table = 'device_user'
         get_latest_by = 'last_login'
+        app_label = "db1"
 
     def __str__(self):
         return self.username
@@ -257,6 +259,7 @@ class Device_Info(models.Model):
         ordering = ('-data_joined',)
         verbose_name = u'用户设备信息表'
         verbose_name_plural = verbose_name
+        app_label = "db1"
 
 
 class Equipment_Info(models.Model):
@@ -269,12 +272,8 @@ class Equipment_Info(models.Model):
     alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
     eventTime = models.CharField(blank=True, default='', max_length=16, verbose_name=u'设备报警时间')
     receiveTime = models.CharField(blank=True, default='', max_length=16, verbose_name=u'接收到报警时间')
-    userID = models.ForeignKey(Device_User, null=True, blank=True, to_field='userID', on_delete=models.CASCADE)
+    userID_id =  models.CharField(default='', blank=True, max_length=32, verbose_name=u'用户ID')
     is_st = models.SmallIntegerField(default=0, verbose_name='是否截图')  # 0 否,1 是图,2,视频
-    # message_id = models.CharField(max_length=32, default='', verbose_name='第三方推送服务器返回的id')
-    # push_type = models.SmallIntegerField(default=0, verbose_name='第三方推送服务器标志。0:APNS推送,1:谷歌推送,2:极光推送')
-    # push_server_status = models.IntegerField(default=200, verbose_name='是否成功推送到第三方服务器。200:成功,other:失败')
-    # push_device_status = models.SmallIntegerField(default=-1, verbose_name='是否成功推送到目标设备。0:失败,1:成功')
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
 
     def __str__(self):
@@ -285,13 +284,15 @@ class Equipment_Info(models.Model):
         verbose_name = u'设备信息推送表'
         verbose_name_plural = verbose_name
         ordering = ('-id',)
+        app_label = "db2"
 
 
 # 系统发送信息新到用户
 class SysMsgModel(models.Model):
+    #更新
     id = models.AutoField(primary_key=True, verbose_name='自增id')
-    userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE)  # 用户信息
-    msg = models.TextField(blank=True, default='', verbose_name=u'发送内容')
+    userID_id =  models.CharField(default='', blank=True, max_length=32, verbose_name=u'用户ID')
+    msg = models.TextField(blank=True, default='', verbose_name=u'消息发送内容')
     status = models.SmallIntegerField(verbose_name='是否已读', default=0)  # 0:否,1:是
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
@@ -303,6 +304,7 @@ class SysMsgModel(models.Model):
         verbose_name = '系统消息'
         verbose_name_plural = verbose_name
         ordering = ('-id',)
+        app_label = "db2"
 
 # 设备推送重构
 # 设备配置表,新
@@ -345,6 +347,7 @@ class UidSetModel(models.Model):
         verbose_name = u'设备配置表'
         verbose_name_plural = verbose_name
         ordering = ('id',)
+        app_label = "db1"
 
 
 # 设备关联用户推送
@@ -367,6 +370,7 @@ class UidPushModel(models.Model):
         verbose_name = '设备绑定'
         verbose_name_plural = verbose_name
         ordering = ('-id',)
+        app_label = "db1"
 
 
 class UID_Preview(models.Model):
@@ -380,4 +384,70 @@ class UID_Preview(models.Model):
         db_table = 'uid_preview'
         verbose_name = '设备预览图'
         verbose_name_plural = verbose_name
-        ordering = ('id',)
+        ordering = ('id',)
+        app_label = "db1"
+
+class Access_Log(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    user = models.CharField(max_length=100, default='', db_index=True, blank=True, verbose_name=u'用户')
+    operation = models.CharField(max_length=100, db_index=True, default='', blank=True, verbose_name=u'操作')
+    ip = models.CharField(max_length=100, default='', db_index=True, blank=True, verbose_name=u'访问ip地址')
+    url = models.CharField(max_length=150, default='', blank=True, verbose_name=u'访问路径')
+    status = models.IntegerField(default=0, blank=True, verbose_name=u'状态')
+    time = models.DateTimeField(null=True, blank=True, db_index=True, verbose_name=u'访问时间')
+    content = models.TextField(blank=True, default='', verbose_name=u'参数内容')
+
+    class Meta:
+        db_table = 'access_log'
+        verbose_name = u'访问日志表'
+        verbose_name_plural = verbose_name
+        app_label = "db1"
+
+# 存储通表
+class VodBucketModel(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='主键')
+    bucket = models.CharField(max_length=30, verbose_name='设备UID')
+    storeDay = models.IntegerField(default=0, verbose_name='存储生命周期(天)')
+    content = models.TextField(verbose_name='描述', default='')
+    endpoint = models.CharField(max_length=125, default='', verbose_name='存储节点')
+    area = models.CharField(max_length=16, default='', verbose_name='区域')
+    region = models.CharField(max_length=16, default='', verbose_name='regionID')
+
+    addTime = models.IntegerField(verbose_name='添加时间', default=0)
+    updTime = models.IntegerField(verbose_name='更新时间', default=0)
+
+    mold = models.SmallIntegerField(default=0, verbose_name='存储区域类型')  # 0:国内阿里 1:国外aws
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'vod_bucket'
+        verbose_name = u'存储通信息'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "db1"
+
+
+class VodHlsModel(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='回放列表主键')
+    uid = models.CharField(max_length=20, verbose_name='设备UID')
+    channel = models.SmallIntegerField(default=0, verbose_name='通道')
+    time = models.IntegerField(verbose_name='播放列表名字时间戳', default=0, db_index=True)
+    endTime = models.IntegerField(verbose_name='删除时间', default=0)
+    sec = models.IntegerField(verbose_name='秒数', default=0)
+    bucket = models.ForeignKey(VodBucketModel, blank=True, to_field='id', on_delete=models.CASCADE, default=1,
+                               verbose_name='存储空间')
+    fg = models.SmallIntegerField(default=0,verbose_name='时间片段数') # 0为阿里云存储方案 >0为亚马逊方案
+
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'vod_hls'
+        verbose_name = u'云存回放信息表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+        app_label = "db1"
+

+ 126 - 0
Object/TokenObject.py

@@ -0,0 +1,126 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerOA
+@software: PyCharm
+@DATE: 2018/8/13 15:36
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: TokenObject.py
+@Contact: chanjunkai@163.com
+"""
+from AnsjerPush.config import OAUTH_ACCESS_TOKEN_SECRET, OAUTH_REFRESH_TOKEN_SECRET, OAUTH_ACCESS_TOKEN_TIME, \
+    OAUTH_REFRESH_TOKEN_TIME
+import jwt, time
+from Object.RedisObject import RedisObject
+
+
+class TokenObject:
+
+    def __init__(self, token=None):
+        if token == 'local':
+            token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySUQiOiIxNTg0MzUxODk2MjgyMTM4MDAxMzgwMDAiLCJsYW5nIjoiZW4iLCJ1c2VyIjoiMTM2ODAzMTc1OTYiLCJtX2NvZGUiOiIxMjM0MTMyNDMyMTQiLCJleHAiOjE1ODcyNzcwNjB9.c0LV_XyxwbzUlYqMJqx7vw9f19Jv-0kGnUHuu_go-mo'
+        if token == 'test':
+            token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiMTM4MDAxMzgwMDEiLCJleHAiOjE1Njk5OTg4OTYsInVzZXJJRCI6IjE1MTU2NDI2MjMzNzkzOTUxMzgwMDEzODAwMSIsImxhbmciOiJlbiIsIm1fY29kZSI6IjEyMzQxMzI0MzIxNCJ9.VAQtT9AbCCfXcrNj9DL5cvVasMDoI7AP8ptgU1GoMu8'
+        self.token = token
+        self.lang = None
+        self.userID = None
+        self.user = ''
+        self.code = 0
+        # 令牌校验
+        self.valid()
+
+    def valid(self):
+        if self.token is None:
+            self.code = 309
+            return
+        try:
+            res = jwt.decode(self.token, OAUTH_ACCESS_TOKEN_SECRET, algorithms='HS256')
+            # print(res)
+            self.userID = res.get('userID', None)
+            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)
+
+        except jwt.ExpiredSignatureError as e:
+            print('过期')
+            print(repr(e))
+            self.code = 309
+            return
+        except Exception as e:
+            self.code = 309
+            return
+        else:
+            if not self.userID:
+                self.code = 309
+                return
+            else:
+                if self.userID:
+                    self.code = 0
+                    return res
+                else:
+                    self.code = 309
+                    return
+    # token加密
+    def generate(self, data={}):
+        try:
+            access_expire = int(OAUTH_ACCESS_TOKEN_TIME.total_seconds())
+            refresh_expire = int(OAUTH_REFRESH_TOKEN_TIME.total_seconds())
+            now_stamp = int(time.time())
+            access_data = data
+            refresh_data = data
+            access_data['exp'] = access_expire + now_stamp
+            refresh_data['exp'] = refresh_expire + now_stamp
+            access_token = jwt.encode(access_data,
+                                      OAUTH_ACCESS_TOKEN_SECRET,
+                                      algorithm='HS256')
+            refresh_token = jwt.encode(
+                refresh_data,
+                OAUTH_REFRESH_TOKEN_SECRET,
+                algorithm='HS256')
+            res = {
+                'access_token': access_token.decode('utf-8'),
+                'access_expire': access_expire,
+                'refresh_expire': refresh_expire,
+                'refresh_token': refresh_token.decode('utf-8'),
+            }
+        except Exception as e:
+            self.code = 309
+            print(repr(e))
+        else:
+            self.code = 0
+            return res
+
+    def refresh(self):
+        if not self.token:
+            self.code = 309
+            return
+        try:
+            res = jwt.decode(self.token, OAUTH_REFRESH_TOKEN_SECRET, algorithms='HS256')
+        except jwt.ExpiredSignatureError as e:
+            print('过期')
+            print(repr(e))
+            self.code = 309
+        except Exception as e:
+            self.code = 309
+            print(repr(e))
+        else:
+            self.code = 0
+            userID = res.get('userID', '')
+            user = res.get('user', '')
+            lang = self.lang
+            refreshRes = self.generate(data={'userID': userID, 'lang': lang, 'user': user})
+            return refreshRes
+
+# import jwt
+#
+#
+# token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySUQiOiIxNTMzODg0NDE4NTE5MTM4MDAxMzgwMDAiLCJleHAiOjE1NTU1NTEwNjUsInVzZXIiOiIxMTFAcXEuY29tIiwibGFuZyI6ImVuIn0.waPlfIBucSA7rFfnsxOKIVJ_cL6xiP33cAiz1IDoteY'
+# res = jwt.decode(token, 'a+jbgnw%@1%zy^=@dn62%', algorithms='HS256')
+# print(res)

+ 195 - 0
Service/ModelService.py

@@ -0,0 +1,195 @@
+import logging
+import time
+
+import requests
+
+from AnsjerPush.config import BASE_DIR
+from Model.models import *
+from Service.CommonService import CommonService
+import json
+from django.db.models import Q
+
+
+# 针对模型封装的复用性代码
+class ModelService:
+    # 获取当前用户角色名
+    @staticmethod
+    def getRole(rid):
+        return Role.objects.get(rid=rid).roleName
+
+    # 获取用户所有权限
+    @staticmethod
+    def own_permission(userID):
+        permission = Device_User.objects.get(userID=userID).role.values_list('permission', flat=True)
+        if permission:
+            return list(permission)
+        return []
+
+    # 获取用户角色相关
+    @staticmethod
+    def own_role(userID):
+        try:
+            role_qs = Device_User.objects.get(userID=userID).role.values('rid', 'roleName')
+            if role_qs.exists():
+                return {'rid': role_qs[0]['rid'], 'roleName': role_qs[0]['roleName']}
+        except Exception as e:
+            pass
+        return {'rid': '', 'roleName': ''}
+
+    # 检测权限有无
+    @staticmethod
+    def check_perm(userID, permID):
+        try:
+            perm_list = Device_User.objects.get(userID=userID).role.values_list('permission', flat=True)
+            if perm_list:
+                if permID in perm_list:
+                    return True
+        except Exception as e:
+            return False
+        return False
+
+    # 根据设备主键ID判断是否拥有该设备
+    @staticmethod
+    def check_user_own_device(userID, deviceID):
+        try:
+            dvqs = Device_Info.objects.filter(userID_id=userID).values_list('id', flat=True)
+            if dvqs:
+                if deviceID in dvqs:
+                    return True
+        except Exception as e:
+            return False
+        return False
+
+    # 根据设设备唯一名称UID判断是否拥有该设备
+    @staticmethod
+    def check_own_device(userID, UID):
+        dvqs = Device_Info.objects.filter(userID_id=userID, UID=UID)
+        if dvqs.exists():
+            return True
+        return False
+
+    # 根据userID获取用户名
+    @staticmethod
+    def get_user_name(userID):
+        try:
+            if userID:
+                device_user = Device_User.objects.get(userID=userID)
+                return device_user.username
+            else:
+                return ''
+        except Exception as e:
+            return ''
+
+    @staticmethod
+    def get_user_mark(userID):
+        if userID:
+            qs = Device_User.objects.filter(userID=userID).values('username', 'userEmail', 'phone')
+            if qs[0]['username']:
+                return qs[0]['username']
+            elif qs[0]['userEmail']:
+                return qs[0]['userEmail']
+            elif qs[0]['phone']:
+                return qs[0]['phone']
+            else:
+                return ''
+        else:
+            return ''
+
+    # 根据username获取userID
+    @staticmethod
+    def get_userID_byname(username):
+        try:
+            device_user = Device_User.objects.get(Q(username=username) | Q(userEmail=username) | Q(phone=username))
+        except Exception as e:
+            return None
+        else:
+            return device_user.userID
+
+    # 访问日志添加
+    @staticmethod
+    def addAccessLog(data):
+        try:
+            access_log = Access_Log.objects.create(**data)
+        except Exception as e:
+            return False
+        else:
+            return True
+
+    # 访问日志批量添加
+    @staticmethod
+    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(Access_Log(**data))
+                Access_Log.objects.bulk_create(querysetlist)
+            else:
+                return
+        except Exception as e:
+            print('ggga')
+            print(repr(e))
+            return False
+        else:
+            return True
+
+
+    # 通过用户名获取userIDLIST
+    @staticmethod
+    def get_user_list_by_username(username):
+        userID_list = Device_User.objects.filter(Q(username=username) | Q(userEmail=username) | Q(phone=username)). \
+            values_list('userID', flat=True)
+        return userID_list
+
+    @staticmethod
+    def del_eq_info(userID, uid):
+        notify_alexa_delete(userID, uid)
+        ei_qs = Equipment_Info.objects.filter(userID_id=userID, devUid=uid)
+        ei_qs.delete()
+        # ei_count = ei_qs.count()
+        # while (ei_count > 1000):
+        #     ei_qs[0:1000].delete()
+
+        # 根据设备主键ID判断是否拥有该设备
+
+    # 获取绑定用户设备列表
+    @staticmethod
+    def get_uid_list(userID):
+        uid_list = Device_Info.objects.filter(userID_id=userID).values_list('UID', flat=True)
+        return list(uid_list)
+
+    @staticmethod
+    def notify_alexa_add(uid, userID, nickname):
+        url = 'https://www.zositech.xyz/deviceStatus/addOrUpdate'
+        data = {
+            'UID': uid,
+            'userID': userID,
+            'uid_nick': nickname
+        }
+        try:
+            requests.post(url, data=data, timeout=5)
+        except Exception as e:
+            print(repr(e))
+
+    @staticmethod
+    def add_log(ip, userID, operation):
+        file_path = '/'.join((BASE_DIR, 'static/delete_device.log'))
+        file = open(file_path, 'a+')
+        file.write(ip + "; username:" + userID + "; time:" + time.strftime(
+                "%Y-%m-%d %H:%M:%S", time.localtime()) + "; " + operation)
+        file.write('\n')
+        file.flush()
+        file.close()
+
+
+def notify_alexa_delete(userID, UID):
+    url = 'https://www.zositech.xyz/deviceStatus/delete'
+    data = {
+        'userID': userID,
+        'UID': UID
+    }
+    try:
+        requests.post(url=url, data=data, timeout=5)
+    except Exception as e:
+        print(repr(e))