ソースを参照

Merge branch 'test' of 13.56.215.252:/web/rpo/AnsjerFormal into lang_test

lang 4 年 前
コミット
72fe95f566

+ 33 - 15
Ansjer/formal_settings.py

@@ -72,26 +72,44 @@ TEMPLATES = [
 WSGI_APPLICATION = 'Ansjer.formal_wsgi.application'
 
 # 服务器类型
-# DATABASE_DATA = 'Ansjer81'
-# SERVER_HOST = 'localhost'
-# DATABASES_USER = 'ansjer'
-# DATABASES_PASS = '1234'
 DATABASE_DATA = 'Ansjer81'
-# SERVER_HOST = 'azrdsinstance.clraczw4p0yj.us-west-1.rds.amazonaws.com'
 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 = ['Ansjer.database_router.DatabaseAppsRouter']
+DATABASE_APPS_MAPPING = {
+    'db1': 'default',
+    'db2': 'mysql02',
+}
+
 
 AUTH_PASSWORD_VALIDATORS = [
     {

+ 2 - 2
Ansjer/test_settings.py

@@ -78,8 +78,8 @@ SERVER_HOST = 'database-2.clraczw4p0yj.us-west-1.rds.amazonaws.com'
 DATABASES_USER = 'azrds'
 DATABASES_PASS = 'azrds.x.x'
 
-DATABASE_DATA2 = 'AnsjerPush'
-SERVER_HOST2 = 'azrdsinstance.clraczw4p0yj.us-west-1.rds.amazonaws.com'
+DATABASE_DATA2 = 'AnsjerTest'
+SERVER_HOST2 = 'ansjerpush.clraczw4p0yj.us-west-1.rds.amazonaws.com'
 DATABASES_USER2 = 'azrds'
 DATABASES_PASS2 = 'azrds.x.x'
 

+ 2 - 0
Ansjer/urls.py

@@ -233,6 +233,8 @@ urlpatterns = [
     url(r'^ios/authsign', UserController.AppleAuthLogin.as_view()),
     url(r'^appLog/(?P<operation>.*)$', AppLogController.AppLogView.as_view()),
 
+    # 本地登录接口
+    url(r'^local/(?P<operation>.*)$', UserController.LocalUserView.as_view()),
 
     # app 设备消息模板
     # 路由加参数参考

+ 1 - 1
Controller/AppLogController.py

@@ -105,7 +105,7 @@ class AppLogView(View):
                 if al_qs.exists():
                     count = al_qs.count()
                     start = (page - 1) * line
-                    al_qs = al_qs[start: (start + line)].values()
+                    al_qs = al_qs[start: (start + line)].values('id', 'user__username', 'user_id', 'uid', 'average_delay', 'status', 'filename', 'add_time')
 
                     res = []
                     auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)

+ 2 - 1
Controller/EquipmentInfo.py

@@ -84,9 +84,10 @@ class EquipmentInfo(View):
         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),
+                userID_id=userID,
                 devUid=devUid,
                 Channel=Channel,
                 eventType=eventType,

+ 4 - 0
Controller/EquipmentManager.py

@@ -694,6 +694,10 @@ def deleteInterface(request):
                 up_qs = UidPushModel.objects.filter(uid_set__uid=uid)
                 if up_qs.count() > 1:
                     UidPushModel.objects.filter(uid_set__uid=uid, userID_id=userID).delete()
+                    redisObj = RedisObject(db=6, SERVER_HOST='push.dvema.com')
+                    ykey = '{uid}_redis_qs'.format(uid=uid)
+                    if ykey:
+                        redisObj.del_data(key=ykey)
                 else:
                     up_qs.delete()
                 # b.分享获得用户假删除

+ 12 - 1
Controller/EquipmentStatus.py

@@ -12,6 +12,8 @@
 @Contact: chanjunkai@163.com
 """
 import base64
+import json
+import threading
 import urllib.parse
 import time
 import oss2
@@ -21,7 +23,9 @@ from django.views.decorators.csrf import csrf_exempt
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET
 from Model.models import Device_Info
 from Object.ETkObject import ETkObject
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
+from Service.ModelService import ModelService
 from Service.CommonService import CommonService
 
 '''
@@ -109,7 +113,13 @@ def getTZ(request):
         uid = c.decode('utf-8')
         if len(uid) == 20:
             print(uid)
-            if update:
+            redisObject = RedisObject(db=7)
+            data = redisObject.get_data(key=ip)
+
+            if data:
+                info = json.loads(data)
+                return JsonResponse(status=200, data={'code': 0, 'msg': 'success', 'data': info})
+            elif update:
                 info = CommonService.getIpIpInfo(ip=ip, lang=lang,update=True)
             else:
                 info = CommonService.getIpIpInfo(ip=ip, lang=lang,update=False)
@@ -124,6 +134,7 @@ def getTZ(request):
                 elif len(tz) == 8:
                     gmtz = tz.replace('UTC-', 'GMT-0').replace('UTC+', 'GMT+0')
                     info['gmt_offset'] = gmtz
+                redisObject.set_data(key=ip, val=json.dumps(info), expire=3600)
             except Exception as e:
                 pass
             return JsonResponse(status=200, data={'code': 0, 'msg': 'success', 'data': info})

+ 180 - 8
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
+    UserAppFrequencyModel, CountryIPModel
 from Object.AWS.SesClassObject import SesClassObject
 from Object.AliSmsObject import AliSmsObject
 from Object.RedisObject import RedisObject
@@ -173,6 +173,9 @@ class registerView(TemplateView):
         password = request_dict.get('userPwd', None)
         authCode = request_dict.get('identifyingCode', None)
         language = request_dict.get('language', None)
+        unique = request_dict.get('unique', None)
+        if unique:
+            delete_local_account(unique)
         response = ResponseObject(language)
         if username and password and authCode:
             # 过滤空格
@@ -286,7 +289,6 @@ class registerView(TemplateView):
         else:
             return response.json(109)
 
-
 # 登出
 class LogoutView(TemplateView):
     @method_decorator(csrf_exempt)
@@ -858,6 +860,9 @@ class v2registerView(TemplateView):
         password = request_dict.get('password', None)
         authcode = request_dict.get('authcode', None)
         lang = request_dict.get('lang', None)
+        unique = request_dict.get('unique', None)
+        if unique:
+            delete_local_account(unique)
         response = ResponseObject(lang)
         if not lang:
             lang = request_dict.get('language', None)
@@ -998,6 +1003,9 @@ class v3registerView(TemplateView):
         password = request_dict.get('password', None)
         authcode = request_dict.get('authcode', None)
         lang = request_dict.get('lang', None)
+        unique = request_dict.get('unique', None)
+        if unique:
+            delete_local_account(unique)
         response = ResponseObject(lang)
         # 解密
         try:
@@ -1801,24 +1809,27 @@ class InitInfoView(View):
 
     def get(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
-        return self.validation(request.GET)
+        return self.validation(request.GET, request)
 
     def post(self, request, *args, **kwargs):
         request.encoding = 'utf-8'
-        return self.validation(request.POST)
+        return self.validation(request.POST, request)
 
-    def validation(self, request_dict):
+    def validation(self, request_dict, request):
         response = ResponseObject()
         token = request_dict.get('token', None)
+        unique = request_dict.get('unique', None)
         tko = TokenObject(token)
         if tko.code == 0:
             userID = tko.userID
-            return self.init_info(request_dict, userID, response)
+            return self.init_info(request_dict, userID, response, request)
+        elif unique:
+            return self.update_country(request_dict, response, request)
         else:
             return response.json(tko.code)
 
     # 初始化设备token
-    def init_info(self, request_dict, userID, response):
+    def init_info(self, request_dict, userID, response, request):
         # 未读的系统消息
         token_val = request_dict.get('token_val', None)
         m_code = request_dict.get('m_code', None)
@@ -1867,11 +1878,56 @@ class InitInfoView(View):
                         'userID_id': userID,
                         'region': lang
                     }
-                    UserExModel.objects.create(**create_dict)
+                    user_ex_qs = UserExModel.objects.create(**create_dict)
+
+                country_ip_qs = CountryIPModel.objects.filter(user_ex_id=user_ex_qs[0].id)
+                if not country_ip_qs.exists():
+                    countryIp = CountryIPModel(
+                        ip=CommonService.get_ip_address(request),
+                        add_time=now_time,
+                        user_ex_id=user_ex_qs[0].id
+                    )
+                    countryIp.save()
+
         # 获取设备是否存在有已被删除
         res = {'usmsg': 0}  # 预留字段, 有版本app该字段去掉会报错
         return response.json(0, res)
 
+    def update_country(self, request_dict, response, request):
+        username = request_dict.get('unique', None)
+        appBundleId = request_dict.get('appBundleId', None)
+        lang = request_dict.get('lang', '')  # 语言区域
+        if username and appBundleId:
+            country = CommonService.getAddr(CommonService.get_ip_address(request))
+            user_qs = Device_User.objects.filter(username=username)
+            if user_qs.exists():
+                user = user_qs[0]
+                user_ex_qs = UserExModel.objects.filter(userID_id=user.userID)
+                now_time = int(time.time())
+                if user_ex_qs.exists():
+                    update_dict = {
+                        'updTime': now_time,
+                        'appBundleId': appBundleId,
+                        'region': lang,
+                        'country': country
+                    }
+                    user_ex_qs.update(**update_dict)
+                else:
+                    create_dict = {
+                        'addTime': now_time,
+                        'updTime': now_time,
+                        'appBundleId': appBundleId,
+                        'userID_id': user.userID,
+                        'region': lang,
+                        'country': country
+                    }
+                    UserExModel.objects.create(**create_dict)
+                return response.json(0)
+            else:
+                return response.json(104)
+        else:
+            return response.json(444)
+
 
 # 获取验证码
 class verifyAuthcode(TemplateView):
@@ -2847,6 +2903,9 @@ class Image_Code_RegisterView(TemplateView):
         # 页面输入的验证码
         response = ResponseObject(lang)
         valid_code = request_dict.get('id_v_code', None)
+        unique = request_dict.get('unique', None)
+        if unique:
+            delete_local_account(unique)
 
         if not all([userEmail, password, lang, imageCodeId, valid_code]):
             return response.json(444)
@@ -3455,3 +3514,116 @@ class AppleAuthLogin(View):
             print('---')
             print(user_qs)
             return self.do_login(user_qs, response)
+
+
+class LocalUserView(View):
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        operation = kwargs.get('operation', None)
+        return self.validate(request_dict, operation)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        operation = kwargs.get('operation', None)
+        print('start_time='+ str((time.time())))
+        ip=CommonService.get_ip_address(request)
+        print('end_time=' + str((time.time())))
+        return self.validate(request_dict, operation)
+
+    def validate(self, request_dict, operation):
+        language = request_dict.get('language', None)
+        response = ResponseObject(lang=language)
+        if operation == 'login':
+            return self.do_local_login(request_dict, response)
+        else:
+            return response.json(404)
+
+    def do_local_login(self, request_dict, response):
+        username = request_dict.get('username', None)
+        app_bundle_id = request_dict.get('app_bundle_id', None)
+
+        if username is None:
+            return response.json(444)
+
+        user_qs = Device_User.objects.filter(username=username)
+        if user_qs.exists():
+            return self.do_login(user_qs, response)
+        else:
+            # 如果用户为绑定过则创建用户并进行登录返回token
+            userID = CommonService.getUserID(μs=False, setOTAID=True)
+            nickname = 'local_{num}'.format(num=CommonService.RandomStr(6, False))
+            return self.do_register(userID, username, nickname, response, app_bundle_id)
+
+    # 登录
+    def do_login(self, user_qs, response):
+        now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
+        userID = user_qs[0].userID
+        print('userID' + userID)
+        tko = TokenObject()
+        user_list = user_qs.values("NickName", "userIconUrl", "userIconPath", "username", "userEmail", "phone")
+        res = tko.generate(data={'userID': userID, 'lang': response.lang, 'user': user_list[0]["username"]})
+        # 增加角色
+        user_qs[0].role.add(Role.objects.get(rid=1))
+        role_dict = ModelService.own_role(userID=userID)
+        res['rid'] = role_dict['rid']
+        res['roleName'] = role_dict['roleName']
+        res['permList'] = ModelService.own_permission(userID)
+        res['userID'] = userID
+        # 昵称,邮箱,电话,刷新,头像
+        userIconPath = str(user_list[0]["userIconPath"])
+        if userIconPath and userIconPath.find('static/') != -1:
+            userIconPath = userIconPath.replace('static/', '').replace('\\', '/')
+            res['userIconUrl'] = SERVER_DOMAIN + 'account/getAvatar/' + userIconPath
+        else:
+            res['userIconUrl'] = ''
+        res['NickName'] = user_list[0]["NickName"] if user_list[0]["NickName"] is not None else ''
+        res['username'] = user_list[0]["username"] if user_list[0]["username"] is not None else ''
+        res['userEmail'] = user_list[0]["userEmail"] if user_list[0]["userEmail"] is not None else ''
+        res['phone'] = user_list[0]["phone"] if user_list[0]["phone"] is not None else ''
+        print(res)
+        # 添加用户登录类型
+        oauth_qs = UserOauth2Model.objects.filter(userID__userID=userID)
+        auth_type = 0
+        if oauth_qs.exists():
+            auth_type = oauth_qs[0].authType
+        res['authType'] = auth_type
+        user_qs.update(last_login=now_time, online=True)
+        return response.json(0, res)
+
+    def do_register(self, userID, username, nickname, response, appBundleId):
+        data_valid = DataValid()
+        if data_valid.name_validate(userID) is not True:
+            return response.json(105)
+        try:
+            Device_User.objects.create(
+                username=username,
+                NickName=nickname,
+                password=make_password('123456'),
+                userID=userID,
+                is_active=True,
+                user_isValid=True,
+                is_local=True
+            )
+
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print(errorInfo)
+            return response.json(424, repr(e))
+        else:
+            user_qs = Device_User.objects.filter(Q(userID=userID))
+            print('---')
+            print(user_qs)
+            return self.do_login(user_qs, response)
+
+
+def delete_local_account(username):
+    user_qs = Device_User.objects.filter(username=username)
+    print(user_qs)
+    if user_qs.exists():
+        user = user_qs[0]
+        if user.is_local:
+            user.delete()
+            Device_Info.objects.filter(userID__userID=user.userID).delete()

+ 13 - 2
Model/models.py

@@ -1,5 +1,4 @@
 from itertools import chain
-from Service.CommonService import CommonService
 from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
 from django.db import models
 from django.utils import six, timezone
@@ -149,6 +148,7 @@ class Device_User(AbstractBaseUser):
     phone = models.CharField(max_length=16, verbose_name=u'手机号', default='', blank=True)
     fingerprint_enable = models.SmallIntegerField(default=0, verbose_name=u'是否开启了指纹登录') # 0:未开启,1:已开启
     fingerprint_key = models.CharField(max_length=128, default='', verbose_name=u'客户端用于解码的密钥等信息')
+    is_local = models.BooleanField(blank=True, default=False, verbose_name=u'是否是本地登录用户')
     objects = UserManager()
 
     USERNAME_FIELD = 'userID'  # 必须有一个唯一标识
@@ -288,7 +288,7 @@ 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_id = models.CharField(default='',  db_index=True,blank=True, max_length=32, verbose_name=u'用户ID')
+    userID_id = models.CharField(default='',  db_index=True, 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:极光推送')
@@ -751,6 +751,7 @@ class UserExModel(models.Model):
     userID = models.ForeignKey(Device_User, to_field='userID', on_delete=models.CASCADE)
     appBundleId = models.CharField(default='', max_length=32, verbose_name=u'appID')
     region = models.CharField(default='', max_length=16, verbose_name='区域语言')
+    country = models.CharField(default='', max_length=100, verbose_name='国家名称')
     addTime = models.IntegerField(verbose_name='添加时间', default=0)
     updTime = models.IntegerField(verbose_name='更新时间', default=0)
 
@@ -1012,6 +1013,16 @@ class EquipmentInfoExStatisticsModel(models.Model):
         verbose_name_plural = verbose_name
 
 
+class CountryIPModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    ip = models.CharField(default='', max_length=32, verbose_name='ip')
+    user_ex = models.ForeignKey(UserExModel, to_field='id', on_delete=models.CASCADE, verbose_name='关联用户扩展信息表id')
+    add_time = models.IntegerField(default=0, verbose_name='添加时间')
+
+    class Meta:
+        db_table = 'country_ip'
+        verbose_name = 'ip-国家统计表'
+        verbose_name_plural = verbose_name
 
 
 

+ 4 - 0
Service/CommonService.py

@@ -14,6 +14,7 @@ from Ansjer.config import BASE_DIR, UNICODE_ASCII_CHARACTER_SET
 
 # 复用性且公用较高封装代码在这
 from Controller.CheckUserData import RandomStr
+from Service.ModelService import ModelService
 
 
 class CommonService:
@@ -95,11 +96,14 @@ class CommonService:
     # 根据ip获取地址
     @staticmethod
     def getAddr(ip):
+        print('start_time=' + str(time.time()))
         base_dir = BASE_DIR
         # ip数据库
         db = IPIPDatabase(base_dir + '/DB/17monipdb.dat')
         addr = db.lookup(ip)
+        # ModelService.add_tmp_log(addr)
         ts = addr.split('\t')[0]
+        print('end_time=' + str(time.time()))
         return ts
 
     # 通过ip检索ipip指定信息 lang为CN或EN

+ 18 - 1
Service/ModelService.py

@@ -5,7 +5,6 @@ import requests
 
 from Ansjer.config import BASE_DIR
 from Model.models import *
-from Service.CommonService import CommonService
 import json
 from django.db.models import Q
 
@@ -204,6 +203,24 @@ class ModelService:
         file.flush()
         file.close()
 
+    @staticmethod
+    def add_ip_log(ip, info):
+        file_path = '/'.join((BASE_DIR, 'static/get_timezone.log'))
+        file = open(file_path, 'a+')
+        file.write(ip + "; info:" + str(info) + "; time:" + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
+        file.write('\n')
+        file.flush()
+        file.close()
+
+    @staticmethod
+    def add_tmp_log(info):
+        file_path = '/'.join((BASE_DIR, 'static/tmp_test.log'))
+        file = open(file_path, 'a+')
+        file.write("info:" + str(info))
+        file.write('\n')
+        file.flush()
+        file.close()
+
 
 def notify_alexa_delete(userID, UID):
     url = 'https://www.zositech.xyz/deviceStatus/delete'