chenjunkai 6 lat temu
rodzic
commit
2b08120d8b

+ 2 - 1
Ansjer/test/oss.py

@@ -27,7 +27,8 @@ auth = Auth(accessid, accesskey)
 bucket = Bucket(auth, host, bucket_name)
 ######################
 # 生成oss签名url
-url = bucket.sign_url('GET', 'output.m3u8', 60 * 60, params={'x-oss-process': 'hls/sign'})
+url = bucket.sign_url('GET', 'vod/video/py.m3u8', 60 * 60, params={'x-oss-process': 'hls/sign'})
+# url = bucket.sign_url('GET', 'vod/video_audio/vod22.m3u8', 60 * 60)
 url = urllib.parse.unquote(url, encoding='utf-8', errors='replace')
 print(url)
 

+ 13 - 3
Ansjer/test/osssigput.py

@@ -24,7 +24,16 @@ endpoint = 'oss-cn-shenzhen.aliyuncs.com'
 
 bucket_name = 'testrtmp'
 
-tokenss={"AccessKeyId": "STS.NJRt22iBsPQy4AhgJi8NHPLBG", "AccessKeySecret": "5e3LjYrAsQcoNM1xfAmXYVfHiUst1i2PHTkKVKGFcGte", "SecurityToken": "CAIS1AJ1q6Ft5B2yfSjIr4nnP4iGhJ1S55OSNmfZg0o8NMFkv4nppTz2IHxLf3RuAe8dvvw+nGBV7vsdlqN4S5ZDR1HCbsJxtnbdcbo4J9ivgde8yJBZolnMewHKedCSvqL7Z+H+U6mMGJOEYEzFkSle2KbzcS7YMXWuLZyOj+wuDLEQRRLqVSdaI91UKwB+yrcdLmCDGfupPwLnpWDSAUF0wFYe71ly8qOi2MaRxwPDhVnhsI8vqp/2P4KvYrscXul2WMzn2/dtJOiTknxM5gNW7rtzlOsGg3Ol3/CFKlVd+RidKJCw+9Z0fjR+e7IxFo9c3oGe8qQi4qqJzNuxkksSe7gFDwanHdj6nJGfR7jzbY1iLe2gYk6giI7fasPH1Co/em8eOQ9wfN4sF2R9ExRESEuBdvD8pQ6SPVzzE/ndgPxujMVvr1Dh7dOGIlmJU0Y3c+Dtox9VGoABZmwK4f4Cc5EwoOItvda0tGfrLPUyjZLzzGCdvj8kgNn7YRIN66Rc8foeIIy54fiavbl2UTZyRG7Lk6DD5Ba0aQx145z1VX71OV0qwfr6CtzacfW+wdCW9/f5mv2fDv1/B6V6VobI6n65qQRtgEnnvi2BkNlS7DGO1+4hKtKnvIU=", "expire": 3600, "endpoint": "oss-cn-shenzhen.aliyuncs.com", "bucket_name": "testrtmp"}
+tokenss={
+  "AccessKeyId": "STS.NJkdiiu9PMUdGaXFiSnS83WRM",
+  "AccessKeySecret": "HvrWLseaz257Nz37PYCAioVEYEKNaf8JZXYW855VNcnC",
+  "SecurityToken": "CAIS1AJ1q6Ft5B2yfSjIr4neL9PdmOZx+pePRUfpomkGYtwU3JL5rzz2IHxLf3RuAe8dvvw+nGBV7vsdlqN4S5ZDR1HCbsJxtjm5Bbo6J9ivgde8yJBZolnMewHKedCSvqL7Z+H+U6mMGJOEYEzFkSle2KbzcS7YMXWuLZyOj+wuDLEQRRLqVSdaI91UKwB+yrcdLmCDGfupPwLnpWDSAUF0wFYe71ly8qOi2MaRxwPDhVnhsI8vqp/2P4KvYrscXul2WMzn2/dtJOiTknxM5gNW7rtzlOsGg3Ol3/CFKlVd+RidKJCw+9Z0fjR+e7IxFo9c3oGe8qQi4qqJzNuxkksSe7gFDwanHdj6nJGfR7jzbY1iLe2gYk6giI7fasPH1Co/em8eOQ9wfN4sF2R9ExRESEuBdvD8pQ6SPVzzE/ndgPxujMVvr1Dh7dOGIlmJU0Y3c+Dtox9VGoABY3pOaapVaGXulEwkKgzcs1uHjyWuydn19BNRh4/VGrMUJnaUziXMDBN/3ui8trV3/UqSqlo65BZ5LEr7KawatcwC+qdbTY4DfwhUkBfDW/WSuCQGyMPjhpIjXTG5rek3YGp7+ocqB5e2truXo6aBdsD/g8xICFwLA9vAP5AuCLE=",
+  "Expiration": "2018-11-22T06:41:34Z",
+  "expire": 3600,
+  "endpoint": "oss-cn-shenzhen.aliyuncs.com",
+  "bucket_name": "testrtmp",
+  "arn": "acs:ram::1024237323330331:role/maxadmin/chanjunkai"
+}
 # 使用RAM账号的AccessKeyId和AccessKeySecret向STS申请临时token。
 
 # 使用临时token中的认证信息初始化StsAuth实例。
@@ -37,9 +46,10 @@ print(auth)
 bucket = oss2.Bucket(auth, endpoint, bucket_name)
 
 # 上传一个字符串。
-bucket.delete_object('a-name.txt')
+bucket.delete_object('a-3.txt')
 exit()
 
-bucket.put_object('a-name.txt', b'hello world')
+bucket.put_object('a-3.txt', b'hello world')
+exit()
 res =bucket.get_object('object-name.txt')
 print(res.read())

+ 18 - 19
Ansjer/test/ttsqiniu.py

@@ -1,19 +1,18 @@
-import requests
-
-
-def send_simple_message():
-    res = requests.post(
-        "https://api.mailgun.net/v3/chanjunkai.janka.top/messages",
-        auth=("api", "key-808d5d958a2ab8076de3a12f742ead50"),
-        data={"from": "<mailgun@chanjunkai.janka.top>",
-              # "to": "<chanjunkai@163.com>",
-              "to": "<1758730877@qq.com>",
-              "subject": "Hello chanjunkai",
-              "text": "Congratulations chanjunkai, you just sent an email with Mailgun!  You are truly awesome!"})
-    print(res.json())
-
-send_simple_message()
-
-
-
-
+import time
+start =time.clock()
+#中间写上代码块
+def test():
+    a = 1
+    b = 2
+    c =a + b
+    if c != 3:
+        print(c)
+        return
+    else:
+        print(c)
+        return
+i = 0
+for i in range(1000000):
+    test()
+end = time.clock()
+print('Running time: %s Seconds'%(end-start))

+ 9 - 1
Ansjer/urls.py

@@ -11,7 +11,7 @@ from Controller import FeedBackInfo, EquipmentOTA, EquipmentInfo, EquipmentSenso
 urlpatterns = [
     url(r'^account/authcode$', UserController.authCodeView.as_view()),
     url(r'^account/register$', UserController.registerView.as_view()),
-    url(r'^account/login$', UserController.LoginView.as_view()),
+    url(r'^account/login$', UserController.v2LoginView.as_view()),
     url(r'^account/logout$', UserController.LogoutView.as_view(), name='logout_user'),
     url(r'^account/changePwd$', UserController.ChangePwdView.as_view(), name='change_password'),
     url(r'^account/forget$', UserController.ForgetPwdView.as_view(), name='forget_password'),
@@ -121,6 +121,14 @@ urlpatterns = [
     url(r'^OTA/uploadsPack$', OTAEquipment.uploadOTAInterfaceView.as_view()),
     url(r'^OTA/downloadsPack/(?P<fullPath>[0-9\w/.\-]+)', OTAEquipment.downloadOTAInterface),
 
+
+    # v2接口
+    #h获取验证码
+    url(r'^v2/account/authcode$', UserController.v2authCodeView.as_view()),
+    url(r'^v2/account/register$', UserController.v2registerView.as_view()),
+    url(r'^v2/account/forgetCode$', UserController.v2forgetPwdCodeView.as_view()),
+    url(r'^v2/account/resetPwdByCode$', UserController.v2resetPwdByCodeView.as_view()),
+
     # 测试专用api
     path('Test', Test.Test.as_view()),
     # 路由加参数参考

+ 458 - 6
Controller/UserController.py

@@ -34,6 +34,8 @@ from Service.CommonService import CommonService
 from Service.MiscellService import MiscellService
 from Service.ModelService import ModelService
 from Service.TemplateService import TemplateService
+from Object.AliSmsObject import AliSmsObject
+from django.db.models import Q
 
 
 # 获取验证码
@@ -191,7 +193,7 @@ class registerView(TemplateView):
                     if emailValid.exists():
                         return response.json(103)
                 else:
-                    userEmail=username
+                    userEmail = username
                 if username:
                     nameValid = Device_User.objects.filter(username=username)
                     if nameValid.exists():
@@ -344,7 +346,7 @@ class LoginView(TemplateView):
 
     def LoginUpdate(self, userValid, mcode, response):
         userID = userValid[0].userID
-        print('userID'+userID)
+        print('userID' + userID)
         tko = TokenObject()
         res = tko.generate(data={'userID': userID, 'lang': response.lang, 'mcode': mcode})
         if tko.code == 0:
@@ -471,7 +473,7 @@ class ForgetPwdView(TemplateView):
         was_limited = getattr(request, 'limited', False)
         if was_limited is True:
             return response.json(5)
-        return self.ValidationError(userName,response)
+        return self.ValidationError(userName, response)
 
     def ValidationError(self, userName, response):
 
@@ -510,7 +512,7 @@ class ForgetPwdView(TemplateView):
                     ses = SesClassObject()
                     send_res = ses.send_email(send_address_list=[email], subject=send_data['title'], body=send_body)
                     if send_res is True:
-                        if redisObj.set_data(key=userID + '_email_reset_pwd',val=reset_pwd,expire=3600):
+                        if redisObj.set_data(key=userID + '_email_reset_pwd', val=reset_pwd, expire=3600):
                             return response.json(0)
                         else:
                             return response.json(10, '存储验证失败')
@@ -560,7 +562,8 @@ class EmailResetPwdView(TemplateView):
                         redisObj.del_data(key=userID + '_email_reset_pwd')
                         is_update = user_qs.update(password=make_password(reset_pwd))
                         if is_update:
-                            return HttpResponseRedirect("http://www.dvema.com/web/html/paw_update_success.html?code=" + reset_pwd)
+                            return HttpResponseRedirect(
+                                "http://www.dvema.com/web/html/paw_update_success.html?code=" + reset_pwd)
                         else:
                             return response.json(10)
                     else:
@@ -603,4 +606,453 @@ class refreshTokenView(TemplateView):
             else:
                 return response.json(code)
         else:
-            return response.json(444, 'token')
+            return response.json(444, 'token')
+
+
+# 获取验证码
+class v2authCodeView(TemplateView):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(v2authCodeView, self).dispatch(*args, **kwargs)
+
+    @ratelimit(key='ip', rate='2/m')
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        lang = request.POST.get('lang', None)
+        response = ResponseObject(lang)
+        was_limited = getattr(request, 'limited', False)
+        if was_limited is True:
+            return response.json(5)
+        request_dict = request.POST
+        return self.ValidationError(request_dict, response)
+
+    @ratelimit(key='ip', rate='2/m')
+    def get(self, request, *args, **kwargs):
+        # Device_User.objects.filter(userEmail='chanjunkai@163.com').delete()
+        request.encoding = 'utf-8'
+        lang = request.GET.get('lang', None)
+        response = ResponseObject(lang)
+        was_limited = getattr(request, 'limited', False)
+        if was_limited is True:
+            return response.json(5)
+        request_dict = request.GET
+        return self.ValidationError(request_dict, response)
+
+    def ValidationError(self, request_dict, response):
+        email = request_dict.get('email', None)
+        phone = request_dict.get('phone', None)
+        if email is not None:
+            email = email.strip()
+            return self.emailCode(email, response)
+        elif phone is not None:
+            phone = phone.strip()
+            return self.phoneCode(phone, response)
+        else:
+            return response.json(444)
+
+    def emailCode(self, email, response):
+        dataValid = DataValid()
+        # 邮箱匹配
+        if dataValid.email_validate(email) is False:
+            return response.json(107)
+        reds = RedisObject()
+        identifyingCode = reds.get_data(key=email + '_identifyingCode')
+        # 是否以获取邮箱验证码
+        if identifyingCode is True:
+            return response.json(89)
+        user_qs = Device_User.objects.filter(username=email)
+        email_qs = Device_User.objects.filter(userEmail=email)
+        # 邮箱用户是否已存在
+        if user_qs.exists():
+            return response.json(103)
+        elif email_qs.exists():
+            return response.json(103)
+        # 生成随机6位数
+        identifyingCode = RandomStr(6, True)
+        # 设置随机数缓存生命周期
+        if reds.set_data(key=email + '_identifyingCode', val=identifyingCode, expire=AuthCode_Expire) is not True:
+            return response.json(10, '生成缓存系统错误')
+        send_data = TemplateService.email_message(type='register_code', language=response.lang)
+        ses = SesClassObject()
+        # 发送邮件
+        send_res = ses.send_email(
+            send_address_list=[email],
+            subject=send_data['title'],
+            body=send_data['body'].replace("{username}", email).replace("{captcha}",
+                                                                        str(identifyingCode))
+        )
+        if send_res is not True:
+            return response.json(44)
+        reds.set_data(key=email + '_registerCode', val=identifyingCode, expire=AuthCode_Expire)
+        return response.json(0, {'identifyingCode': identifyingCode})
+
+    def phoneCode(self, phone, response):
+        dataValid = DataValid()
+        if dataValid.mobile_validate(phone) is not True:
+            return response.json(107)
+        reds = RedisObject()
+        identifyingCode = reds.get_data(key=phone + '_identifyingCode')
+        if identifyingCode:
+            return response.json(90)
+        user_qs = Device_User.objects.filter(username=phone)
+        phone_qs = Device_User.objects.filter(phone=phone)
+        if user_qs.exists() or phone_qs.exists():
+            return response.json(101)
+        identifyingCode = RandomStr(6, True)
+        if reds.set_data(key=phone + '_identifyingCode', val=identifyingCode, expire=300) is not True:
+            return response.json(10, '生成缓存系统错误')
+        # 发送手机验证码
+        aliSms = AliSmsObject()
+        res = aliSms.send_code_sms(phone=phone, code=identifyingCode, sign_name='Ansjer',
+                                   temp_msg='SMS_151600991')
+        if res["Code"] == "OK":
+            return response.json(0)
+            # return response.json(0, {'identifyingCode': identifyingCode})
+        else:
+            return response.json(10, res["Message"])
+
+
+# 验证码注册
+class v2registerView(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(v2registerView, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        return self.validates(request_dict)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validates(request_dict)
+
+    def validates(self, request_dict):
+        phone = request_dict.get('phone', None)
+        email = request_dict.get('email', None)
+
+        password = request_dict.get('password', None)
+        authcode = request_dict.get('authcode', None)
+        lang = request_dict.get('lang', None)
+        response = ResponseObject(lang)
+        if password is None:
+            return response.json(444, 'password')
+        if authcode is None:
+            return response.json(444, 'identifyingCode')
+        if phone is not None:
+            return self.do_phone_register(phone, password, authcode, response)
+        elif email is not None:
+            return self.do_email_register(email, password, authcode, response)
+        else:
+            return response.json(444, 'phone or email')
+
+    def do_phone_register(self, phone, password, authcode, response):
+        data_valid = DataValid()
+        if data_valid.mobile_validate(phone) is not True:
+            return response.json(100)
+        if data_valid.password_validate(password) is not True:
+            return response.json(109)
+        reds = RedisObject()
+        identifyingCode = reds.get_data(key=phone + '_identifyingCode')
+        # 判断验证码是否过期
+        if identifyingCode is False:
+            return response.json(120)
+        # 验证码是否正确
+        if authcode != identifyingCode:
+            return response.json(121)
+        phone_qs = Device_User.objects.filter(Q(phone=phone) | Q(username=phone))
+        # 是否已存在
+        if phone_qs.exists():
+            return response.json(101)
+        try:
+            users = Device_User.objects.create(
+                phone=phone,
+                password=password,
+                userID=CommonService.getUserID(μs=False, setOTAID=True),
+                is_active=True,
+                user_isValid=True,
+            )
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print(errorInfo)
+            return response.json(424, repr(e))
+        else:
+            if not reds.del_data(key=phone + '_identifyingCode'):
+                return response.json(10, '删除缓存验证码错误')
+            return response.json(0, {
+                "user": {
+                    "userID": users.userID,
+                    "username": users.username,
+                    "userEmail": users.userEmail,
+                    "phone": users.phone,
+                    "NickName": users.NickName,
+                    "userIconUrl": str(users.userIconUrl),
+                    "is_superuser": users.is_superuser,
+                    "is_active": users.is_active,
+                    "data_joined": date_handler(users.data_joined),
+                    "last_login": date_handler(users.last_login),
+                }
+            })
+
+    def do_email_register(self, email, password, authcode, response):
+        data_valid = DataValid()
+        if data_valid.email_validate(email) is not True:
+            return response.json(105)
+        if data_valid.password_validate(password) is not True:
+            return response.json(109)
+        reds = RedisObject()
+        identifyingCode = reds.get_data(key=email + '_identifyingCode')
+        # 判断验证码是否过期
+        if identifyingCode is False:
+            return response.json(120)
+        # 验证码是否正确
+        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(
+                userEmail=email,
+                password=password,
+                userID=CommonService.getUserID(μs=False, setOTAID=True),
+                is_active=True,
+                user_isValid=True,
+            )
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print(errorInfo)
+            return response.json(424, repr(e))
+        else:
+            if not reds.del_data(key=email + '_identifyingCode'):
+                return response.json(10, '删除缓存验证码错误')
+            return response.json(0, {
+                "user": {
+                    "userID": users.userID,
+                    "username": users.username,
+                    "userEmail": users.userEmail,
+                    "NickName": users.NickName,
+                    "userIconUrl": str(users.userIconUrl),
+                    "is_superuser": users.is_superuser,
+                    "is_active": users.is_active,
+                    "data_joined": date_handler(users.data_joined),
+                    "last_login": date_handler(users.last_login),
+                }
+            })
+
+
+# 忘记密码获取验证码v2
+class v2forgetPwdCodeView(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(v2forgetPwdCodeView, self).dispatch(*args, **kwargs)
+
+    @ratelimit(key='ip', rate='1/m')
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        lang = request_dict.get('lang')
+        response = ResponseObject(lang)
+        was_limited = getattr(request, 'limited', False)
+        if was_limited is True:
+            return response.json(5)
+        return self.ValidationError(request_dict, response)
+
+    @ratelimit(key='ip', rate='1/m')
+    def post(self, request):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        lang = request_dict.get('lang')
+        response = ResponseObject(lang)
+        was_limited = getattr(request, 'limited', False)
+        if was_limited is True:
+            return response.json(5)
+        return self.ValidationError(request_dict, response)
+
+    def ValidationError(self, request_dict, response):
+        phone = request_dict.get('phone', None)
+        # email = request_dict.get('email', None)
+        if phone is not None:
+            phone = phone.strip()
+            return self.do_phone_pwd_forget(phone, response)
+        else:
+            return response.json(444, 'phone')
+
+    def do_phone_pwd_forget(self, phone, response):
+        data_valid = DataValid()
+        if data_valid.mobile_validate(phone) is not True:
+            return response.json(100)
+        user_qs = Device_User.objects.filter(Q(phone=phone) | Q(username=phone))
+        if not user_qs.exists():
+            return response.json(102)
+        reds = RedisObject()
+        resetCode = reds.get_data(key=phone + '_forgetPwdResetCode')
+        if resetCode is True:
+            return response.json(90)
+        resetCode = RandomStr(6, True)
+        if not reds.set_data(key=phone + '_forgetPwdResetCode', val=resetCode, expire=300):
+            return response.json(10, '生成缓存错误')
+        aliSms = AliSmsObject()
+        res = aliSms.send_code_sms(phone=phone, code=resetCode, sign_name='Ansjer',
+                                   temp_msg='SMS_151675019')
+        if res["Code"] == "OK":
+            return response.json(0, {'forgetPwdResetCode': resetCode})
+        else:
+            return response.json(10, res["Message"])
+
+
+# 忘记密码v2
+class v2resetPwdByCodeView(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(v2resetPwdByCodeView, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        lang = request_dict.get('lang')
+        response = ResponseObject(lang)
+        was_limited = getattr(request, 'limited', False)
+        if was_limited is True:
+            return response.json(5)
+        return self.ValidationError(request_dict, response)
+
+    def post(self, request):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        lang = request_dict.get('lang')
+        response = ResponseObject(lang)
+        was_limited = getattr(request, 'limited', False)
+        if was_limited is True:
+            return response.json(5)
+        return self.ValidationError(request_dict, response)
+
+    def ValidationError(self, request_dict, response):
+        phone = request_dict.get('phone', None)
+        password = request_dict.get('password', None)
+        authcode = request_dict.get('authcode', None)
+        if phone is not None and password is not None and authcode is not None:
+            phone = phone.strip()
+            authcode = authcode.strip()
+            password = password.strip()
+            return self.do_phone_pwd_reset(phone, authcode, password, response)
+        else:
+            return response.json(444, 'phone,password,authcode')
+
+    def do_phone_pwd_reset(self, phone, authcode,password, response):
+        data_valid = DataValid()
+        if data_valid.mobile_validate(phone) is not True:
+            return response.json(100)
+        if data_valid.password_validate(password) is not True:
+            return response.json(109)
+        user_qs = Device_User.objects.filter(Q(phone=phone) | Q(username=phone))
+        if not user_qs.exists():
+            return response.json(102)
+        reds = RedisObject()
+        resetCode = reds.get_data(key=phone + '_forgetPwdResetCode')
+        if resetCode is True:
+            return response.json(90)
+        if authcode != resetCode:
+            return response.json(121)
+        if not reds.set_data(key=phone + '_forgetPwdResetCode', val=resetCode, expire=300):
+            return response.json(10, '生成缓存错误')
+        user_qs.update(password=make_password(password))
+        if not reds.del_data(phone + '_forgetPwdResetCode'):
+            return response.json(10,'删除缓存失败')
+        return response.json(0)
+
+
+
+# 登录
+class v2LoginView(TemplateView):
+    @method_decorator(csrf_exempt)  # @csrf_exempt
+    def dispatch(self, *args, **kwargs):
+        return super(v2LoginView, self).dispatch(*args, **kwargs)
+
+    @ratelimit(key='ip', rate='5/m')
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        language = request_dict.get('language', 'en')
+        response = ResponseObject(language)
+        was_limited = getattr(request, 'limited', False)
+        if was_limited is True:
+            return response.json(5)
+        return self.validates(request_dict, response)
+
+    @ratelimit(key='ip', rate='5/m')
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        language = request_dict.get('language', 'en')
+        response = ResponseObject(language)
+        was_limited = getattr(request, 'limited', False)
+        if was_limited is True:
+            return response.json(5)
+        return self.validates(request_dict, response)
+
+    def validates(self, request_dict, response):
+        username = request_dict.get('userName', None)
+        password = request_dict.get('userPwd', None)
+        # mcode = request_dict.get('mobileMechanicalCode', '')
+        if username is not None and password is not None:
+            username = username.strip()
+            password = password.strip()
+            data_valid = DataValid()
+            if data_valid.email_validate(username):
+                return self.do_email_login(username,password,response)
+            elif data_valid.mobile_validate(username):
+                return self.do_phone_login(username,password,response)
+            elif data_valid.name_validate(username):
+                return self.do_name_login(username,password,response)
+            else:
+                return response.json(107)
+        else:
+            return response.json(444, 'username,password')
+
+    def do_email_login(self,email,password,response):
+        user_qs = Device_User.objects.filter(Q(username=email)|Q(userEmail=email))
+        if not user_qs.exists():
+            return response.json(104)
+        if not user_qs[0].user_isValid or not user_qs[0].is_active:
+            return response.json(110)
+        return self.valid_login(user_qs,password,response)
+
+    def do_phone_login(self,phone,password,response):
+        user_qs = Device_User.objects.filter(Q(phone=phone)|Q(username=phone))
+        if not user_qs.exists():
+            return response.json(104)
+        if not user_qs[0].user_isValid or not user_qs[0].is_active:
+            return response.json(110)
+        return self.valid_login(user_qs,password,response)
+
+    def do_name_login(self,username,password,response):
+        user_qs = Device_User.objects.filter(username=username)
+        if not user_qs.exists():
+            return response.json(104)
+        if not user_qs[0].user_isValid or not user_qs[0].is_active:
+            return response.json(110)
+        return self.valid_login(user_qs,password,response)
+
+    def valid_login(self,user_qs,password,response):
+        if not check_password(password, user_qs[0].password):
+            return response.json(111)
+        userID = user_qs[0].userID
+        print('userID' + userID)
+        tko = TokenObject()
+        res = tko.generate(data={'userID': userID, 'lang': response.lang})
+        if tko.code == 0:
+            now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
+            user_qs.update(last_login=now_time, online=True,language=response.lang)
+            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
+            print(res)
+            return response.json(0, res)
+        else:
+            return response.json(tko.code)

+ 5 - 3
Model/models.py

@@ -157,7 +157,7 @@ class Device_User(AbstractBaseUser):
                               verbose_name=u'用户ID', unique=True, default=CommonService.getUserID(getUser=True))
     role = models.ManyToManyField(to='Role', blank=True, verbose_name=u'用户角色', db_table='user_role')
 
-    username = models.CharField(max_length=40, verbose_name=u'用户名', unique = True)
+    username = models.CharField(max_length=40, verbose_name=u'用户名', unique = True, null=True,blank=True)
     password = models.CharField(max_length=128, verbose_name=u'密码')
     userEmail = models.EmailField(max_length = 64, verbose_name=u'邮箱', unique = True, null=True, blank=True)
     # 实际的路径就是 MEDIA_ROOT/Image/filename,所以可用upload_to来指定文件存放的前缀路径
@@ -177,11 +177,13 @@ class Device_User(AbstractBaseUser):
     machine_code = models.CharField(blank=True, max_length=128, default='', verbose_name=u'机械码')
 
     language = models.CharField(blank=True, null=True, max_length=16, default='', verbose_name=u'语言地区')
+    # 手机注册增加字段
+    phone = models.CharField(max_length=16, verbose_name=u'手机号', unique=True, null=True, blank=True)
 
     objects = UserManager()
 
-    USERNAME_FIELD = 'username' # 必须有一个唯一标识
-    REQUIRED_FIELDS = ['userID', 'is_superuser'] # 创建superuser时的必须字段
+    USERNAME_FIELD = 'userID' # 必须有一个唯一标识
+    REQUIRED_FIELDS = ['is_superuser'] # 创建superuser时的必须字段
 
     class Meta:
         ordering = ('-data_joined', )

+ 81 - 0
Object/AliSmsObject.py

@@ -0,0 +1,81 @@
+# -*- coding: utf-8 -*-
+import uuid
+
+from aliyunsdkcore.client import AcsClient
+from aliyunsdkcore.profile import region_provider
+from aliyunsdkdysmsapi.request.v20170525 import SendSmsRequest
+import json
+"""
+短信业务调用接口示例,版本号:v20170525
+Created on 2017-06-12
+"""
+
+
+class AliSmsObject(object):
+
+    def __init__(self):
+        # 注意:不要更改
+        REGION = "cn-hangzhou"
+        PRODUCT_NAME = "Dysmsapi"
+        DOMAIN = "dysmsapi.aliyuncs.com"
+        aliSms = {
+            'ACCESS_KEY_ID': 'LTAIPiOHysNJaC6u',
+            'ACCESS_KEY_SECRET': 'PxdYOwoZFkgVeD7vtwoNEBb0n7bA6f',
+        }
+        self.ACCESS_KEY_ID = 'LTAIPiOHysNJaC6u'
+        self.ACCESS_KEY_SECRET = 'PxdYOwoZFkgVeD7vtwoNEBb0n7bA6f'
+        self.acs_client = AcsClient(aliSms['ACCESS_KEY_ID'], aliSms['ACCESS_KEY_SECRET'], REGION)
+        region_provider.add_endpoint(PRODUCT_NAME, REGION, DOMAIN)
+
+    def do_send_sms(self, business_id, phone_numbers, sign_name, template_code, template_param=None):
+        smsRequest = SendSmsRequest.SendSmsRequest()
+        # 申请的短信模板编码,必填
+        smsRequest.set_TemplateCode(template_code)
+
+        # 短信模板变量参数
+        if template_param is not None:
+            smsRequest.set_TemplateParam(template_param)
+
+        # 设置业务请求流水号,必填。
+        smsRequest.set_OutId(business_id)
+
+        # 短信签名
+        smsRequest.set_SignName(sign_name)
+
+        # 数据提交方式
+        # smsRequest.set_method(MT.POST)
+
+        # 数据提交格式
+        # smsRequest.set_accept_format(FT.JSON)
+
+        # 短信发送的号码列表,必填。
+        smsRequest.set_PhoneNumbers(phone_numbers)
+
+        # 调用短信发送接口,返回json
+        smsResponse = self.acs_client.do_action_with_exception(smsRequest)
+
+        # TODO 业务处理
+
+        return smsResponse
+
+    # 发送验证码
+    def send_code_sms(self, phone, code, sign_name,temp_msg):
+        __business_id = uuid.uuid1()
+        # print(__business_id)
+        # params = "{\"code\":\"{"+str(code)+"}\"}"
+        params = "{\"code\":\"" + str(code) + "\"}"
+        # params = u'{"name":"wqb","code":"12345678","address":"bz","phone":"13000000000"}'
+        # 签名
+        # sign_name = 'Ansjer'
+        # 模板信息
+        # temp_msg = 'SMS_151600991'
+        res = self.do_send_sms(__business_id, phone, sign_name, temp_msg, params)
+        # print(send_sms(__business_id, "13119657713", "云通信测试", "SMS_5250008", params))
+        res_json = json.loads(res.decode('utf-8'))
+        print(res_json)
+        # {"Message":"OK","RequestId":"985FA027-C887-4186-A8F5-B6B8F3D123DB","BizId":"973407842937195533^0","Code":"OK"}
+        # code = isv.BUSINESS_LIMIT_CONTROL 一分钟只能发一次
+        return res_json
+#
+# aliSms = AliSmsObject()
+# aliSms.send_sign_in_sms(phone=13119657713,code=123456)

+ 55 - 0
Object/QSmsObject.py

@@ -0,0 +1,55 @@
+#!/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/20 15:36
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: SmsObject.py
+@Contact: chanjunkai@163.com
+"""
+# 腾讯发送短信
+from Ansjer.config import TX_PHONE_APP_KEY, TX_PHONE_APP_ID
+from qcloudsms_py import SmsSingleSender
+
+TX_PHONE_APP_ID = '1400052907'
+TX_PHONE_APP_KEY = '7705976ca6e85fe7b86d6bc2d11f7783'
+
+
+class QSmsObject(object):
+
+    def __init__(self, phone, msg):
+        self.appid = TX_PHONE_APP_ID
+        self.appkey = TX_PHONE_APP_KEY
+        self.msg = msg
+        self.phone = phone
+
+    def sms(self):
+        try:
+            sender = SmsSingleSender(self.appid, self.appkey)
+            res = sender.send(0, "86", self.phone, self.msg)
+        except Exception as e:
+            print(repr(e))
+            return False
+        else:
+            print(res)
+            return res
+
+    def test(self):
+        message = "{authCode}为您的注册验证码,请于1分钟内填写。如非本人操作,请忽略本短信。".format(authCode=1234)
+        qsm = QSmsObject(phone='13119657713', msg=message)
+        qres = qsm.sms()
+        qcode = qres.get('result', None)
+        if qcode == 0:
+            return
+        else:
+            return
+
+
+message = "{authCode}为您的注册验证码,请于2分钟内填写。如非本人操作,请忽略本短信。".format(authCode=str(123456))
+
+qsm = QSmsObject(phone='13119657713', msg=message)
+qsm.sms()

+ 6 - 0
Object/ResponseObject.py

@@ -24,10 +24,13 @@ class ResponseObject(object):
             48: 'System object error!',
             60: 'The app info has already exist',
             89: 'Already send the code, please check it or get it again after 10m',
+            90: 'please check code or get it again after 5m',
+            100: 'Phone format error!',
             101: 'Phone already existed!',
             102: 'Phone doesn\'t exist!',
             103: 'Mail already existed!',
             104: 'Mail doesn\'t exist!',
+            105: 'Email format error!',
             106: 'Create User Error',
             107: 'The username not conform to the rules!',
             109: 'The password not conform to the rules!',
@@ -111,10 +114,13 @@ class ResponseObject(object):
             48: '系统对象错误',
             60: 'APP信息已经存在',
             89: '已发验证码,请检测或10分钟后重新获取。',
+            90: '请检测或5分钟后重新获取。',
+            100: '手机格式错误!',
             101: '手机已存在!',
             102: '手机不存在!',
             103: '邮箱已存在!',
             104: '邮箱不存在!',
+            105: '邮箱格式错误!',
             106: '创建用户错误',
             107: '用户名格式不符合!',
             109: '密码格式不符合!',