Browse Source

Merge branch 'dev' of http://192.168.136.99:3000/SERVER/AnsjerServer into dev

# Conflicts:
#	Controller/IotCoreController.py
tanghongbin 4 years ago
parent
commit
4879e82acc

+ 2 - 2
Ansjer/urls.py

@@ -12,7 +12,7 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     ApplicationController, UserExController, CloudStorage, TestApi, UserBrandControllerV2, \
     ApplicationController, UserExController, CloudStorage, TestApi, UserBrandControllerV2, \
     StatisticsController, Alexa, FAQController, AppLogController, EquipmentVersionLimit, VoicePromptController, \
     StatisticsController, Alexa, FAQController, AppLogController, EquipmentVersionLimit, VoicePromptController, \
     CDKController, \
     CDKController, \
-    DeviceTypeController, CloudTest, Cloudsum, IotCoreController, OperatingLogs, ProcessInfo, UserRegionController, \
+    DeviceTypeController, CloudTest, Cloudsum, IotCoreController, OperatingLogs, ProcessInfo, RegionCountryController, \
     VerifyCodeController
     VerifyCodeController
 
 
 urlpatterns = [
 urlpatterns = [
@@ -279,7 +279,7 @@ urlpatterns = [
     url(r'^ProcessInfo/(?P<operation>.*)$', ProcessInfo.ProcessInfoView.as_view()),
     url(r'^ProcessInfo/(?P<operation>.*)$', ProcessInfo.ProcessInfoView.as_view()),
     url(r'^Cloudsum/(?P<operation>.*)$', Cloudsum.Cloudsum.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()),
     url(r'verifyCode/(?P<operation>.*$)', VerifyCodeController.VerifyCodeView.as_view()),

+ 8 - 4
Controller/IotCoreController.py

@@ -5,7 +5,7 @@ import time
 import boto3
 import boto3
 from django.views import View
 from django.views import View
 
 
-from Model.models import Device_User, UserRegionModel
+from Model.models import Device_User, Device_Info, RegionCountryModel
 from Object.IOTCore.IotObject import ChinaIOTClient, AsiaIOTClient, EuropeIOTClient, AmericaIOTClient
 from Object.IOTCore.IotObject import ChinaIOTClient, AsiaIOTClient, EuropeIOTClient, AmericaIOTClient
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
@@ -49,9 +49,13 @@ class IotCoreView(View):
             if token != time_stamp and distance > 600:
             if token != time_stamp and distance > 600:
                 return response.json(404)
                 return response.json(404)
 
 
-            user_region_qs = UserRegionModel.objects.filter(user__device_info__UID=uid)
-            if user_region_qs.exists():
-                user_region = user_region_qs[0]
+            region_country_qs = Device_Info.objects.filter(UID=uid).values('userID__region_country')
+            if not region_country_qs.exists():
+                return response.json(173)
+
+            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:
                 if user_region.region_id == 1:
                     iotClient = ChinaIOTClient()
                     iotClient = ChinaIOTClient()

+ 65 - 0
Controller/RegionCountryController.py

@@ -0,0 +1,65 @@
+#!/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(token.userID, 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].update(regionCountry = number)
+
+    def do_initRegionDate(self, request_dict, response):
+        filepath = request_dict.get('filepath')
+        fobj = open(filepath)
+        region_list = json.loads(fobj)
+
+        now_time = int(time.time())
+
+        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']
+
+                RegionCountryModel.objects.create(number=number, region_id=region_id, name=name, cn=cn, en=en, add_time=now_time, update_time=now_time)

+ 28 - 10
Controller/TestApi.py

@@ -39,7 +39,7 @@ from django.contrib.auth.hashers import make_password, check_password  # 对密
 
 
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
     SERVER_DOMAIN_SSL
     SERVER_DOMAIN_SSL
-from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket
+from Model.models import Device_Info, Order_Model, Store_Meal, VodHlsModel, OssCrdModel, UID_Bucket, StsCrdModel
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
 from Object.UidTokenObject import UidTokenObject
 from Object.UidTokenObject import UidTokenObject
@@ -99,9 +99,15 @@ class testView(View):
         elif operation == 'generateToken':
         elif operation == 'generateToken':
             userID = '158943604783713800138000'
             userID = '158943604783713800138000'
             return self.generate_token(request_dict,userID)
             return self.generate_token(request_dict,userID)
+        elif operation == 'generateUidToken':
+            userID = '158943604783713800138000'
+            return self.generate_uid_token(request_dict,userID)
         elif operation == 'test_upload_s3':
         elif operation == 'test_upload_s3':
             userID = '158943604783713800138000'
             userID = '158943604783713800138000'
             return self.test_upload_s3(request_dict)
             return self.test_upload_s3(request_dict)
+        elif operation == 'test_upload_s3_amazon_comprehend':
+            userID = '158943604783713800138000'
+            return self.test_upload_s3_amazon_comprehend(request_dict)
         else:
         else:
             return 123
             return 123
 
 
@@ -119,7 +125,7 @@ class testView(View):
         s3_client = session.client('s3')
         s3_client = session.client('s3')
 
 
         #上传
         #上传
-        # s3_client.put_object(Bucket="azvod1", Key="file/rule.txt", Body=open(r"E:\download\Shadowsocks-4.1.10.0\user-rule.txt", 'rb').read())
+        s3_client.put_object(Bucket="azvod1", Key="file/rule.txt", Body=open(r"E:\download\Shadowsocks-4.1.10.0\user-rule.txt", 'rb').read())
 
 
         #下载
         #下载
         resp = s3_client.get_object(Bucket="azvod1", Key="file/rule.txt")
         resp = s3_client.get_object(Bucket="azvod1", Key="file/rule.txt")
@@ -293,10 +299,10 @@ class testView(View):
     def do_test_get_sign_sts(self, request_dict, ip, response):
     def do_test_get_sign_sts(self, request_dict, ip, response):
         # uid = 'GZL2PEFJPLY7W6BG111A'
         # uid = 'GZL2PEFJPLY7W6BG111A'
         # channel = 2
         # channel = 2
-        uid = 'VVDHCVBYDKFMJRWA111A'
+        uid = 'M1BYBPCHNS92PBLG111A'
         channel = 1
         channel = 1
         now_time = int(time.time())
         now_time = int(time.time())
-        ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel, endTime__gte=now_time). \
+        ubqs = UID_Bucket.objects.filter(uid=uid, channel=channel). \
             values("bucket__mold", "bucket__bucket", "bucket__endpoint", "bucket__region", "endTime")
             values("bucket__mold", "bucket__bucket", "bucket__endpoint", "bucket__region", "endTime")
         if ubqs.exists():
         if ubqs.exists():
             if ubqs[0]["bucket__mold"] == 0:
             if ubqs[0]["bucket__mold"] == 0:
@@ -404,7 +410,7 @@ class testView(View):
                     ]
                     ]
                 }
                 }
                 response = boto3_sts.get_federation_token(
                 response = boto3_sts.get_federation_token(
-                    Name='{role_name}'.format(role_name=uid + '_' + channel),
+                    Name='{role_name}'.format(role_name=uid + '_' + str(channel)),
                     Policy=json.dumps(Policy),
                     Policy=json.dumps(Policy),
                     DurationSeconds=7200
                     DurationSeconds=7200
                 )
                 )
@@ -684,17 +690,29 @@ class testView(View):
         #UserIdToken
         #UserIdToken
         tko = TokenObject()
         tko = TokenObject()
         res = tko.generate(
         res = tko.generate(
-            data={'userID': 158943594633713800138000, 'lang': 'cn', 'user': '597471180@qq.com', 'm_code': '123413243214'})
+            data={'userID': 160868920610913800138000, 'lang': 'cn', 'user': '13923452707', 'm_code': '123413243214'})
 
 
         #uidToken
         #uidToken
         # utko = UidTokenObject()
         # utko = UidTokenObject()
         # res = utko.generate(data={'uid': 'H2CMKET2LDC3ZBL4111A','channel': 1})
         # res = utko.generate(data={'uid': 'H2CMKET2LDC3ZBL4111A','channel': 1})
         return JsonResponse(status=200, data=res,safe=False)
         return JsonResponse(status=200, data=res,safe=False)
 
 
+    def generate_uid_token(self, request_dict, userID):
+        # UserIdToken
+        # tko = TokenObject()
+        # res = tko.generate(
+        #     data={'userID': 158943594633713800138000, 'lang': 'cn', 'user': '597471180@qq.com',
+        #           'm_code': '123413243214'})
+
+        utko = UidTokenObject()
+        rr = utko.generate(data={'uid':'M1BYBPCHNS92PBLG111A','channel':1})
+        return JsonResponse(status=200, data=rr, safe=False)
+
+
     def test_upload_s3(self,request_dict):
     def test_upload_s3(self,request_dict):
-        aws_key = "ASIA2E67UIMD454ZXCKZ" #【你的 aws_access_key】
-        aws_secret = "4zqyp4xEc7kf+RVPxHN4pw2G6o1zPEeZjCFvsQg5" # 【你的 aws_secret_key】
-        aws_session_token = "FwoGZXIvYXdzEHUaDNFT8HDNEJnDk7sHyiLoAd7WDsGQtulT19i8BDTPPdG3O3ALMiUs1d/Am5U9ooWo+TNVvkgdI7VN2gcIFP+Ib5QH4IA8ikpYDHC0bxckkZwrBp9EmrZpHgDPEl6tOdpkyVRmquf+a4BcC1794uhpXF40dm46B+FV1Rr61tG741JResI826CZ9oIKxhLcnkT6E0KFZ4WodaRzOswjZpUoYJf5Et+mGQdoOhKTdnwe/o3rbgZ7IcI0m3w6QrFL6M5gb1I8K0uzUwIKcxnvrjPLcQU6TwH002+J51GnygMs8rGGTxaKOuyVgovTx2YpLSj79itEnpQhM64ohvmE/QUyKdTiqfyqacYXV8WkoUEMnw+UkW8QeLFJqCwf77UhWN9zP+SBuC0hhW20"
+        aws_key = "ASIA2E67UIMDTJFRF7UE" #【你的 aws_access_key】
+        aws_secret = "5u6MDvm3Fabdbc6EG9+JPJE3x07peNkrvok76Dqq" # 【你的 aws_secret_key】
+        aws_session_token = "FwoGZXIvYXdzEHQaDKQchZxanXOpNJ2UriLoARUmKF/Uf6HZMhB4Bdo1Df4BlirgpqOyXmMULjx1yvqah1+BKIV2rzEoxxaVmvjcvLjHMQamPR7QzLZYP/WgJ6biPTnfqJWy5rCVpIZtD3D2nmGWAf5RSedADILJgBQmrXumFX2jrnm6THbqfdyfT2eitKt5ZD82zvLOaHMWu7mzomzmye8Eimt28Dhj6jsLeZPxOhhHBLUi+gddHAMCQq8HmGbnsXN5OrOBvqreRAxdR/u6vuQHbVpV3b8V5nkAtTVhOCaGRcPETARB8F/jFuFRhW9tAjPZisP/SEa8vUDR32FoMNQeda4o5+7l/gUyKYlem5bIB96gywY6s4C8c1PAa3l09+5tdGNp5laAJf7vMUzMJckR2EgF"
         session = Session(aws_access_key_id=aws_key,
         session = Session(aws_access_key_id=aws_key,
                           aws_secret_access_key=aws_secret,
                           aws_secret_access_key=aws_secret,
                           aws_session_token=aws_session_token,
                           aws_session_token=aws_session_token,
@@ -707,4 +725,4 @@ class testView(View):
         file_obj = s3.Bucket(bucket).put_object(Key=upload_key, Body=upload_data)
         file_obj = s3.Bucket(bucket).put_object(Key=upload_key, Body=upload_data)
         print('--------')
         print('--------')
         print(file_obj)
         print(file_obj)
-        return JsonResponse(status=200, data=file_obj,safe=False)
+        return JsonResponse(status=200, data=file_obj, safe=False)

+ 1 - 16
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 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 Controller.CheckUserData import DataValid, date_handler, RandomStr
 from Model.models import Device_User, Role, UidPushModel, UserOauth2Model, UserExModel, Device_Info, UidSetModel, \
 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.AWS.SesClassObject import SesClassObject
 from Object.AliSmsObject import AliSmsObject
 from Object.AliSmsObject import AliSmsObject
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
@@ -1782,10 +1782,6 @@ class v3LoginView(TemplateView):
         if oauth_qs.exists():
         if oauth_qs.exists():
             auth_type = oauth_qs[0].authType
             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:
         if tko.code == 0:
             now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
             now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
@@ -1809,7 +1805,6 @@ class v3LoginView(TemplateView):
             # res['fingerprint_key'] = CommonService.encode_data(content=users['fingerprint_key'], start=2)
             # res['fingerprint_key'] = CommonService.encode_data(content=users['fingerprint_key'], start=2)
             res['authType'] = auth_type
             res['authType'] = auth_type
             res['subscribe_email'] = users['subscribe_email'] if users['subscribe_email'] is not None else ''
             res['subscribe_email'] = users['subscribe_email'] if users['subscribe_email'] is not None else ''
-            res['regionID'] = region_id
             return response.json(0, res)
             return response.json(0, res)
         else:
         else:
             return response.json(tko.code)
             return response.json(tko.code)
@@ -3253,10 +3248,6 @@ class v3LoginByCodeView(View):
         if oauth_qs.exists():
         if oauth_qs.exists():
             auth_type = oauth_qs[0].authType
             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:
         if tko.code == 0:
             now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
             now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
@@ -3277,7 +3268,6 @@ class v3LoginByCodeView(View):
             res['userEmail'] = users['userEmail'] if users['userEmail'] is not None else ''
             res['userEmail'] = users['userEmail'] if users['userEmail'] is not None else ''
             res['phone'] = users['phone'] if users['phone'] is not None else ''
             res['phone'] = users['phone'] if users['phone'] is not None else ''
             res['authType'] = auth_type
             res['authType'] = auth_type
-            res['region_id'] = region_id
             return response.json(0, res)
             return response.json(0, res)
         else:
         else:
             return response.json(tko.code)
             return response.json(tko.code)
@@ -3508,11 +3498,6 @@ class AppleAuthLogin(View):
             auth_type = oauth_qs[0].authType
             auth_type = oauth_qs[0].authType
         res['authType'] = auth_type
         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)
         user_qs.update(last_login=now_time, online=True)
         return response.json(0, res)
         return response.json(0, res)
 
 

+ 1 - 5
Controller/UserManger.py

@@ -12,7 +12,7 @@ from django.views.generic import TemplateView, View
 
 
 from Ansjer.config import BASE_DIR
 from Ansjer.config import BASE_DIR
 from Ansjer.config import SERVER_DOMAIN
 from Ansjer.config import SERVER_DOMAIN
-from Model.models import Role, Device_User, UserOauth2Model, UserExModel, UserRegionModel
+from Model.models import Role, Device_User, UserOauth2Model, UserExModel
 from Object.RedisObject import RedisObject
 from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from Object.TokenObject import TokenObject
@@ -66,10 +66,6 @@ class showUserMoreView(TemplateView):
                 roleName = ModelService.getRole(rid=v['fields']['role'][0])
                 roleName = ModelService.getRole(rid=v['fields']['role'][0])
                 sqlDict["datas"][k]['fields']['rolename'] = roleName
                 sqlDict["datas"][k]['fields']['rolename'] = roleName
         # 增加oauth2关联数据
         # 增加oauth2关联数据
-        user_region_qs = UserRegionModel.objects.filter(user_id=userID)
-        if user_region_qs.exists():
-            region_id = user_region_qs[0].region_id
-            sqlDict['datas'][0]['region_id'] = region_id
         ua_qs = UserOauth2Model.objects.filter(userID_id=userID).values_list('authType',flat=True)
         ua_qs = UserOauth2Model.objects.filter(userID_id=userID).values_list('authType',flat=True)
         sqlDict["oauth2"] = list(ua_qs)
         sqlDict["oauth2"] = list(ua_qs)
         return response.json(0, sqlDict)
         return response.json(0, sqlDict)

+ 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)

+ 1 - 1
Controller/VoicePromptController.py

@@ -110,7 +110,7 @@ class VoicePromptView(View):
             auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
             auth = oss2.Auth(OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET)
             bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'ansjer-static-resources')
             bucket = oss2.Bucket(auth, 'oss-cn-shenzhen.aliyuncs.com', 'ansjer-static-resources')
             filename = res['filename']
             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)
             url = bucket.sign_url('GET', obj, 3600)
             res['url'] = url
             res['url'] = url
             del res['filename']
             del res['filename']

+ 16 - 12
Model/models.py

@@ -119,6 +119,21 @@ class Role(models.Model):
             return permslist
             return permslist
 
 
 
 
+class RegionCountryModel(models.Model):
+    number = models.IntegerField(primary_key=True, verbose_name='唯一标识')
+    region_id = models.IntegerField(unique=True, verbose_name='大洲编号')
+    name = models.CharField(unique=True, 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):
 class Device_User(AbstractBaseUser):
     userID = models.CharField(blank=True, max_length=32, primary_key=True,
     userID = models.CharField(blank=True, max_length=32, primary_key=True,
                               verbose_name=u'用户ID', unique=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'客户端用于解码的密钥等信息')
     fingerprint_key = models.CharField(max_length=128, default='', verbose_name=u'客户端用于解码的密钥等信息')
     is_local = models.BooleanField(blank=True, default=False, verbose_name=u'是否是本地登录用户') # False:账号登录,1:本地登录
     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:不订阅
     subscribe_email = models.SmallIntegerField(default=0, verbose_name=u'是否订阅营销邮件') # 0:未订阅,1:订阅,2:不订阅
+    region_country = models.IntegerField(blank=True, default=0, verbose_name='地区表唯一标识')
     objects = UserManager()
     objects = UserManager()
 
 
     USERNAME_FIELD = 'userID'  # 必须有一个唯一标识
     USERNAME_FIELD = 'userID'  # 必须有一个唯一标识
@@ -1258,15 +1274,3 @@ class ProcessInfoLogsModel(models.Model):
         verbose_name = '过程信息表'
         verbose_name = '过程信息表'
         verbose_name_plural = verbose_name
         verbose_name_plural = verbose_name
 
 
-
-class UserRegionModel(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')
-    add_time = models.IntegerField(default=0, verbose_name='添加时间')
-    update_time = models.IntegerField(default=0, verbose_name='更新时间')
-
-    class Meta:
-        db_table = 'user_region'
-        verbose_name = '用户地区表'
-        verbose_name_plural = verbose_name