Browse Source

最后一个稳定版
后面会针对进行小改动,小改进

chenjunkai 7 years ago
parent
commit
cf4fdb48e4

+ 4 - 34
Ansjer/config.py

@@ -21,47 +21,17 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 # 发送邮件邮箱
 # 发送邮件邮箱
 COMPANY_EMAIL = 'user_server@nsst.com'
 COMPANY_EMAIL = 'user_server@nsst.com'
 # token加密令牌,过期时间,刷新过期时间
 # token加密令牌,过期时间,刷新过期时间
-SECRET_KEY = 'c7ki2_gkg4#sjfm-u1%$s#&n#szf01f*v69rwv2qsf#-zmm@tl',
+SECRET_KEY = 'c7ki2_gkg4#sjfm-u1%$s#&n#szf01f*v69rwv2qsf#-zmm@tl'
 EXPIRATION_DELTA = datetime.timedelta(days=7)
 EXPIRATION_DELTA = datetime.timedelta(days=7)
 REFRESH_EXPIRATION_DELTA = datetime.timedelta(days=7)
 REFRESH_EXPIRATION_DELTA = datetime.timedelta(days=7)
 STATIC_URL = '/static/'
 STATIC_URL = '/static/'
 
 
-# 服务器类型
-SERVER_TYPE = 'local'
-# SERVER_TYPE = 'test'
-# SERVER_TYPE = 'formal'
-if SERVER_TYPE == 'local':
-    NGINX_RTMP_STAT = 'http://192.168.136.45:8077/stat'
-    SERVER_DOMAIN = 'http://192.168.136.45:8077'
-    DATABASE_DATA = 'Ansjer'
-    SERVER_HOST = '192.168.136.45'
-    RTMP_PUSH_URL = 'rtmp://192.168.136.45:1935/hls'
 
 
-elif SERVER_TYPE == 'test':
-    NGINX_RTMP_STAT = 'http://13.56.215.252:82/stat'
-    SERVER_DOMAIN = 'http://13.56.215.252:82'
-    DATABASE_DATA = 'AnsjerTest'
-    SERVER_HOST = 'localhost'
-    RTMP_PUSH_URL = 'http://13.56.215.252:8091/hls'
-elif SERVER_TYPE == 'formal':
-    NGINX_RTMP_STAT = 'http://13.56.215.252:81/stat'
-    SERVER_DOMAIN = 'http://13.56.215.252:81'
-    DATABASE_DATA = 'Ansjer81'
-    SERVER_HOST = 'localhost'
-    RTMP_PUSH_URL = 'http://13.56.215.252:8091/hls'
-#数据库
-DATABASES_DEFAULT={
-    'ENGINE': 'django.db.backends.mysql',
-    'NAME': DATABASE_DATA,
-    'USER': 'ansjer',
-    'PASSWORD': '1234',
-    'HOST': SERVER_HOST,
-    'PORT': '3306',
-    'OPTIONS': {'charset': 'utf8mb4', 'use_unicode': True},
-}
+
 
 
 AWS_ACCESS_ID = 'AKIAJKPU23EU5QWHFPKQ'
 AWS_ACCESS_ID = 'AKIAJKPU23EU5QWHFPKQ'
 AWS_ACCESS_SECRET = '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'
 AWS_ACCESS_SECRET = 'oYJsF4h95ITWf3bxpPf5uUTvULPrq8DhRaQQzTjf'
 AWS_ACCESS_REGION = 'us-east-1'
 AWS_ACCESS_REGION = 'us-east-1'
 AWS_BUCKET = 'ansjertest'
 AWS_BUCKET = 'ansjertest'
-
+# 设定离线时间为5分钟
+OFF_LINE_TIME_DELTA = 5

+ 27 - 0
Ansjer/file/pk-APKAINI6BNPKV54NHH7Q.pem

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEogIBAAKCAQEAjBX7IqEVIj14KE0RFVvtfq5yWzmT5myzqMwPUPk6NRKbDQ8z
+pkP8fhPYheMK3VPNlgPX2aBT98ovlc6qzZfZKhk5oNThgGr5Op7UlCRvwqucvXY5
+ekUaEG2QDMHcgEMdS8e+ymkntj+DfTN3Um175CTahrs3jI+zHWdebEl2rf9l6Qv+
+0hx/fawdEc1ZLryEHYE/WyJYDGzyDlpoW7evSNqHEZCLmCvYxCvwhAEtWEohSL2R
+Mrei6wyU6PT5hMp6gM+k8PLdnExMRsWENh7+MR+aXyiMJrGl26js/HId7RpwIBVN
+j1lofCufC/nqGCo0UcQthgmJXBY8iUcKTQCdnQIDAQABAoIBAEKfvaX1mHiFZZ09
+Me/HncdPLkImuymu7y9LhclMDxvosmdeoIDl+rL3u1XJ6oPi9Hbxcvok32qM9V65
+QNCw9G6qOpc8R9dsiQYRPicKwUCDn/MXxDRbow7HHOiEVtuFj+xXnmzj4Cg0QtQL
+4ycHvRF/WZMUfVHTkitc2zKDKfeMOQjw86bvyA9TksC1MUtHt9uvVr5OVpLSpvn3
+0se949ULAnmDSRg6HrH7QNOLsLJgxSYwc0FJHad7/zYHa/2qx20zeB1zaVKwmsYq
+I5TuwuU0fKf6JY3DogozJHoUuXxEUZZvInour51WDkhT4t//URORze3XYLXPDshf
+WmphPp0CgYEAvcm8kY/Yx8hehEktMLsJ1DZh/lhr+82j73AgPj93mZETwq0o1fWR
+g4ctZXo6cs021pE6JxKohs6sx7e6VbfqAp0r9BEG83j2rE2ZcZF9kZ6x5bb9dJv+
+qnbMtiF/eZ1WAYUFy8DrQYyrUeeIYbsV0hBP22aiJSJjRcXpUcWX1XcCgYEAvPVE
+PER6gixREgSKwRFA39teBDGxEmxCpHjmQnVG4Xcp7h6ggfP0J3TgwU4XFeQSGtVt
+7uMSgrbrF9vtybZM5j49tk3o2lfRZ0/OgDt/ZdqSKEvT8+vm4iXQQiWOQR6pYwsd
+46YPhS7P2aTZQbKJjdHk7dl7S8XcWqIZ5bATeosCgYBDkSLVH8UpuygLKJIyGySw
+rHvOtWQcTWXjxKN2Bdpqjb/fOw6ivb6EeQesbQuJ+41ebm2po3bkJ4hTwhFQmx1w
+uMwBJF65J4OKbEYIrKdrxHfJNJCfhznvLkRLQznC7kTEXbtmgtQ+jfogOrHPOW/X
+TX9guPVZCxkUqhUay6H2mQKBgGy4gkZa8FItxYekbWGg1771rSakoMmE2ONhXLso
+V1wrAEkt/hRHlVeOfDM9BzNlQrWFz/b/WAs1zBaySCMjbSOc9E0MjsnydV4IITzO
+/wJPvIDLAGz8cp/0OduVWEBHsBZ4sv3k8lEjGhyUKR0P6O1cs2fXFoYGlj7fvh7W
+LJ75AoGAcmdaaOaX3pehxW02ItIJ2CN6ZxJTmIt4v2dfYoBM7tKIM0lO9ruVf4A/
+1UxWeGmEgDjJ0ugwt0SkonedOrAcicqhkKoRb2BJyZu/kZX1jHMNbNJRdtx1gLYF
+BE2Lzx02XIqWjWHEfoMzV6rWYBIezAaagb8BwwYD+nPzrmbl2GM=
+-----END RSA PRIVATE KEY-----

BIN
Ansjer/file/表文档.doc


+ 45 - 15
Ansjer/settings.py

@@ -1,6 +1,9 @@
-# 参数配置文件,测试和正式变动比较大的丢这了
 from Ansjer.config import *
 from Ansjer.config import *
 
 
+SERVER_TYPE = 'local'
+#SERVER_TYPE = 'test'
+# SERVER_TYPE = 'formal'
+
 DEBUG = True
 DEBUG = True
 # DEBUG = False
 # DEBUG = False
 ALLOWED_HOSTS = ['*']
 ALLOWED_HOSTS = ['*']
@@ -14,10 +17,9 @@ INSTALLED_APPS = [
     'django.contrib.staticfiles',
     'django.contrib.staticfiles',
     'corsheaders',
     'corsheaders',
     'imagekit',
     'imagekit',
-    'guardian',
+    # 'guardian',
     'django_global_request',
     'django_global_request',
     'Model',
     'Model',
-    'oauth2_provider'
 ]
 ]
 
 
 MIDDLEWARE = [
 MIDDLEWARE = [
@@ -36,7 +38,7 @@ MIDDLEWARE = [
 ]
 ]
 
 
 AUTHENTICATION_BACKENDS = (
 AUTHENTICATION_BACKENDS = (
-    'django.contrib.auth.backends.ModelBackend', #django default backend
+    'django.contrib.auth.backends.ModelBackend',  # django default backend
     'guardian.backends.ObjectPermissionBackend',
     'guardian.backends.ObjectPermissionBackend',
 )
 )
 
 
@@ -48,11 +50,11 @@ MEDIA_ROOT = os.path.join(BASE_DIR, 'static/Upgrate')
 MEDIA_URL = '/static/Upgrate/'
 MEDIA_URL = '/static/Upgrate/'
 ROOT_URLCONF = 'Ansjer.urls'
 ROOT_URLCONF = 'Ansjer.urls'
 LOGIN_URL = '/account/login'
 LOGIN_URL = '/account/login'
-AUTH_USER_MODEL = 'Model.Device_User' # 自定义Model
+AUTH_USER_MODEL = 'Model.Device_User'  # 自定义Model
 APPEND_SLASH = False
 APPEND_SLASH = False
 # 腾讯验证
 # 腾讯验证
 SDK_AppID = '1400052907'
 SDK_AppID = '1400052907'
-App_Key  = '7705976ca6e85fe7b86d6bc2d11f7783'
+App_Key = '7705976ca6e85fe7b86d6bc2d11f7783'
 TEMPLATES = [
 TEMPLATES = [
     {
     {
         'BACKEND': 'django.template.backends.django.DjangoTemplates',
         'BACKEND': 'django.template.backends.django.DjangoTemplates',
@@ -71,7 +73,36 @@ TEMPLATES = [
 
 
 WSGI_APPLICATION = 'Ansjer.wsgi.application'
 WSGI_APPLICATION = 'Ansjer.wsgi.application'
 
 
-DATABASES = {'default':DATABASES_DEFAULT}
+if SERVER_TYPE == 'local':
+    NGINX_RTMP_STAT = 'http://192.168.136.45:8077/stat'
+    SERVER_DOMAIN = 'http://192.168.136.45:8077'
+    DATABASE_DATA = 'Ansjer'
+    SERVER_HOST = '192.168.136.45'
+    RTMP_PUSH_URL = 'rtmp://192.168.136.45:1935/hls'
+
+elif SERVER_TYPE == 'test':
+    NGINX_RTMP_STAT = 'http://13.56.215.252:82/stat'
+    SERVER_DOMAIN = 'http://13.56.215.252:82'
+    DATABASE_DATA = 'AnsjerTest'
+    SERVER_HOST = 'localhost'
+    RTMP_PUSH_URL = 'http://13.56.215.252:8091/hls'
+elif SERVER_TYPE == 'formal':
+    NGINX_RTMP_STAT = 'http://13.56.215.252:81/stat'
+    SERVER_DOMAIN = 'http://13.56.215.252:81'
+    DATABASE_DATA = 'Ansjer81'
+    SERVER_HOST = 'localhost'
+    RTMP_PUSH_URL = 'http://13.56.215.252:8091/hls'
+
+DATABASES = {'default': {
+    'ENGINE': 'django.db.backends.mysql',
+    'NAME': DATABASE_DATA,
+    'USER': 'ansjer',
+    'PASSWORD': '1234',
+    'HOST': SERVER_HOST,
+    'PORT': '3306',
+    'OPTIONS': {'charset': 'utf8mb4', 'use_unicode': True, 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"},
+    'AUTOCOMMIT': True
+}}
 
 
 AUTH_PASSWORD_VALIDATORS = [
 AUTH_PASSWORD_VALIDATORS = [
     {
     {
@@ -95,7 +126,7 @@ USE_I18N = True
 USE_L10N = True
 USE_L10N = True
 USE_TZ = True
 USE_TZ = True
 
 
-#跨域增加忽略
+# 跨域增加忽略
 CORS_ALLOW_CREDENTIALS = True
 CORS_ALLOW_CREDENTIALS = True
 CORS_ORIGIN_ALLOW_ALL = True
 CORS_ORIGIN_ALLOW_ALL = True
 CORS_ORIGIN_WHITELIST = ('*')
 CORS_ORIGIN_WHITELIST = ('*')
@@ -149,7 +180,6 @@ EMAIL_SUBJECT_PREFIX = 'website'  # 为邮件标题的前缀,默认是'[django]'
 EMAIL_USE_TLS = True  # 开启安全链接
 EMAIL_USE_TLS = True  # 开启安全链接
 DEFAULT_FROM_EMAIL = SERVER_EMAIL = EMAIL_HOST_USER  # 设置发件人
 DEFAULT_FROM_EMAIL = SERVER_EMAIL = EMAIL_HOST_USER  # 设置发件人
 
 
-
 LOGGING = {
 LOGGING = {
     'version': 1,
     'version': 1,
     'disable_existing_loggers': True,
     'disable_existing_loggers': True,
@@ -168,14 +198,14 @@ LOGGING = {
             'include_html': True,
             'include_html': True,
         },
         },
         'default': {
         'default': {
-            'level':'ERROR',
-            'class':'logging.handlers.RotatingFileHandler',
+            'level': 'ERROR',
+            'class': 'logging.handlers.RotatingFileHandler',
             'filename': BASE_DIR + '/static/log/error.log',
             'filename': BASE_DIR + '/static/log/error.log',
-            'maxBytes': 1024*1024*5, # 5 MB
+            'maxBytes': 1024 * 1024 * 5,  # 5 MB
             'backupCount': 5,
             'backupCount': 5,
-            'formatter':'error_format',
+            'formatter': 'error_format',
         },
         },
-        'console':{
+        'console': {
             'level': 'ERROR',
             'level': 'ERROR',
             'class': 'logging.StreamHandler',
             'class': 'logging.StreamHandler',
             'formatter': 'error_format'
             'formatter': 'error_format'
@@ -183,7 +213,7 @@ LOGGING = {
     },
     },
     'loggers': {
     'loggers': {
         'django': {
         'django': {
-            'handlers': ['default','console'],
+            'handlers': ['default', 'console'],
             # 'handlers': ['mail_admins','default','console'],
             # 'handlers': ['mail_admins','default','console'],
             'level': 'ERROR',
             'level': 'ERROR',
             'propagate': False
             'propagate': False

+ 9 - 5
Ansjer/test/666.py

@@ -1,6 +1,10 @@
-regp = '^/OTA/downloads/[.\w/]+$'
-import re
+from Crypto.PublicKey import RSA
+code = 'noonekowns'
+key = RSA.generate(2048)
+encrypted_key =key.exportKey(passphrase=code, pkcs=8,protection="scryptAndAES128-CBC")
 
 
-strs = '/OTA/downloads/IPC/18E2012008A/4.1.5/V4.1.5.18E2012008A.img'
-kkp = re.match(regp, strs, flags=0)
-print(kkp)
+print(encrypted_key)
+exit()
+
+with open('/path_to_public_key/my_rsa_public.pem', 'wb') as f:
+    f.write(key.publickey().exportKey())

+ 33 - 0
Ansjer/test/cloudfront_sign_url.py

@@ -0,0 +1,33 @@
+import datetime
+
+from cryptography.hazmat.backends import default_backend
+from cryptography.hazmat.primitives import hashes
+from cryptography.hazmat.primitives import serialization
+from cryptography.hazmat.primitives.asymmetric import padding
+from botocore.signers import CloudFrontSigner
+
+
+def rsa_signer(message):
+    with open('D:/project_svn/Ansjer/test/pk-APKAINI6BNPKV54NHH7Q.pem', 'rb') as key_file:
+        private_key = serialization.load_pem_private_key(
+            key_file.read(),
+            password=None,
+            backend=default_backend()
+        )
+    signer = private_key.signer(padding.PKCS1v15(), hashes.SHA1())
+    signer.update(message)
+    return signer.finalize()
+
+
+key_id = 'APKAINI6BNPKV54NHH7Q'
+url = 'http://d3om3d8c0l14oc.cloudfront.net/L59KVYDAEPHR1T6M111A_0/*'
+
+expire_date = datetime.datetime(2018, 9, 30)
+print(expire_date)
+cloudfront_signer = CloudFrontSigner(key_id, rsa_signer)
+
+# Create a signed url that will be valid until the specfic expiry date
+# provided using a canned policy.
+signed_url = cloudfront_signer.generate_presigned_url(
+    url, date_less_than=expire_date)
+print(signed_url)

+ 71 - 0
Ansjer/test/encryDownLoad.py

@@ -0,0 +1,71 @@
+# coding=utf-8
+# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +
+#        ┏┓   ┏┓+ +
+#    ┏┛┻━━━┛┻┓ + +
+#    ┃       ┃  
+#    ┃   ━   ┃ ++ + + +
+#    ████━████ ┃+
+#    ┃       ┃ +
+#    ┃   ┻   ┃
+#    ┃       ┃ + +
+#    ┗━┓   ┏━┛
+#      ┃   ┃           
+#      ┃   ┃ + + + +
+#      ┃   ┃    Codes are far away from bugs with the animal protecting   
+#      ┃   ┃ +     神兽保佑,代码无bug  
+#      ┃   ┃
+#      ┃   ┃  +         
+#      ┃    ┗━━━┓ + +
+#      ┃        ┣┓
+#      ┃        ┏┛
+#      ┗┓┓┏━┳┓┏┛ + + + +
+#       ┃┫┫ ┃┫┫
+#       ┗┻┛ ┗┻┛+ + + +
+# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +"""
+"""
+"""
+import base64
+import hashlib
+import time
+
+def md5(text, isBackByte=False):
+    """md5加密函数"""
+    md5 = hashlib.md5()
+    if isinstance(text, bytes):
+        md5.update(text)
+    else:
+        md5.update(text.encode('utf-8'))
+
+    if isBackByte:
+        # 返回二进制的加密结果
+        return md5.digest()
+
+        # 返回十六进制的机密结果
+    return md5.hexdigest()
+
+
+def base64_encode(text, isBytes=False):
+    """进行base64编码处理"""
+    if isBytes:
+        return base64.b64encode(text)
+    return base64.b64encode(bytes(text, encoding="utf-8"))
+
+
+def get_timestamp10():
+    """获取当前时间长度为10位长度的时间戳"""
+    return int(time.time())
+
+
+secret = 'ansjer';  # 密钥--对应#st的哈希格式为 secret+url+e,e为时间戳单位s,url为请求地址  secure_link_md5 xiaozhong.com$uri$arg_e;
+# path = '/hls/5553.mp4/index.m3u8'  # 下载文件
+# path = '/L59KVYDAEPHR1T6M111A_0/555666.mp4'  # 下载文件
+path = '/5553.mp4'  # 下载文件
+# path = '/444.mp4'  # 下载文件
+# 下载到期时间,time是当前时间,300表示300秒,也就是说从现在到300秒之内文件不过期
+expire = get_timestamp10() + 3600;
+res = md5(str(secret) + str(path) + str(expire), True)
+md5 = str(base64_encode(res, True))
+md5 = md5.replace('b\'', '').replace('\'', '').replace('+', '-').replace('/', '_').replace('=', '')
+
+# print('生成代相关认证签名的地址:','http://52.8.197.107/444.mp4.m3u8?' + 'st=' + str(md5) + '&e=' + str(expire))
+print('io:','http://52.8.197.107/5553.mp4.m3u8?' + 'st=' + str(md5) + '&e=' + str(expire))

+ 24 - 0
Ansjer/test/m3u8_generate.py

@@ -0,0 +1,24 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: Ansjer
+@software: PyCharm
+@DATE: 2018/5/28 16:15
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: m3u8_generate.py
+@Contact: chanjunkai@163.com
+"""
+from m3u8_generator import PlaylistGenerator
+#pip install m3u8-generator
+playlist_entries = [
+    {
+        'name': "http://d3596w5a6euckc.cloudfront.net/vod/2N1K3LE78TYJ38CE111A_99/1234.ts?Expires=1538265600&Signature=czbcIzioBcb3K7F8v5QvKNRJ9af9022O3e9ils4bTsA2O4LSR6UxF1uLCvykHsVrdLZiYt3f5dW1Njb2qWJu1nB6N9lPUIfJTNEuD9Z3SyxEboM0Cvb34MWpFe94vdWIIas1x0bdwTGWb-yX34XJgxSMhkO9ZA5Avzvl3OALoWcoIdyvniXA5x9bgcmFu5aXXN1Fy1u4lPYQgDUGHOc-hiyZP7yY2btl0dViEjEX76n9eS067nAwAGM4zV0Ga4surZ99tyfOIsjLjRieNOzMMfYLnMXxndFRXgYUF~uVIsxOfJ5Q4QkJBakfx2Vxv4y5ZfX09ajtkGu0qfybWPs0xA__&Key-Pair-Id=APKAINI6BNPKV54NHH7Q",
+        'duration': '2',
+    }
+]
+
+playlist = PlaylistGenerator(playlist_entries).generate()
+print(playlist)

+ 113 - 0
Ansjer/test/signCookie.py

@@ -0,0 +1,113 @@
+from boto.cloudfront.distribution import Distribution
+from cryptography.hazmat.primitives.asymmetric import padding
+from cryptography.hazmat.primitives import serialization
+from cryptography.hazmat.backends import default_backend
+from cryptography.hazmat.primitives import hashes
+import base64
+import datetime
+from var_dump import var_dump
+import time
+
+
+class BetterThanBoto(Distribution):
+
+    def sign_rsa(self, message):
+        private_key = serialization.load_pem_private_key(self.keyfile, password=None,
+                                                         backend=default_backend())
+        signer = private_key.signer(padding.PKCS1v15(), hashes.SHA1())
+        message = message.encode('utf-8')
+        signer.update(message)
+        return signer.finalize()
+
+    def _sign_string(self, message, private_key_file=None, private_key_string=None):
+        if private_key_file:
+            self.keyfile = open(private_key_file, 'rb').read()
+        elif private_key_string:
+            self.keyfile = private_key_string.encode('utf-8')
+        return self.sign_rsa(message)
+
+    @staticmethod
+    def _url_base64_encode(msg):
+        """
+        Base64 encodes a string using the URL-safe characters specified by
+        Amazon.
+        """
+        msg_base64 = base64.b64encode(msg).decode('utf-8')
+        msg_base64 = msg_base64.replace('+', '-')
+        msg_base64 = msg_base64.replace('=', '_')
+        msg_base64 = msg_base64.replace('/', '~')
+        return msg_base64
+
+    def generate_signature(self, policy, private_key_file=None):
+        """
+        :param policy: no-whitespace json str (NOT encoded yet)
+        :param private_key_file: your .pem file with which to sign the policy
+        :return: encoded signature for use in cookie
+        """
+        # Distribution._create_signing_params()
+        signature = self._sign_string(policy, private_key_file)
+
+        # now base64 encode the signature & make URL safe
+        encoded_signature = self._url_base64_encode(signature)
+
+        return encoded_signature
+
+    def create_signed_cookies(self, url, private_key_file=None, keypair_id=None,
+                              expires_at=20, secure=True):
+        policy = self._custom_policy(
+            url,
+            expires_at
+        )
+
+        encoded_policy = self._url_base64_encode(policy.encode('utf-8'))
+        signature = self.generate_signature(
+            policy, private_key_file=private_key_file
+        )
+        cookies = {
+            "CloudFront-Policy": encoded_policy,
+            "CloudFront-Signature": signature,
+            "CloudFront-Key-Pair-Id": keypair_id
+        }
+        return cookies
+
+
+def sign_to_cloudfront(object_url, expires_at):
+    """ Sign URL to distribute file"""
+    cf = BetterThanBoto()
+    url = cf.create_signed_url(url=object_url,
+                               keypair_id="APKAINI6BNPKV54NHH7Q",
+                               expire_time=expires_at,
+                               private_key_file="D:/project_svn/Ansjer/test/pk-APKAINI6BNPKV54NHH7Q.pem")
+
+    return url
+
+
+def create_signed_cookies(object_url, expires_at):
+    """
+    Create a signed cookie
+    """
+    cf = BetterThanBoto()
+
+    cookies = cf.create_signed_cookies(url=object_url, keypair_id="APKAINI6BNPKV54NHH7Q", expires_at=expires_at,
+                                       private_key_file="D:/project_svn/Ansjer/test/pk-APKAINI6BNPKV54NHH7Q.pem")
+    return cookies
+
+
+expire_date = int(time.time()) + 7200
+
+object_url = 'http://d3596w5a6euckc.cloudfront.net/vod/2N1K3LE78TYJ38CE111A_99/1527152855.m3u8'
+# object_url = 'http://d3596w5a6euckc.cloudfront.net/vod/2N1K3LE78TYJ38CE111A_99/*'
+# cookie_data = create_signed_cookies(object_url, expire_date)
+# print(cookie_data)
+# exit()
+cookie_data = {'CloudFront-Policy': 'eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QzNTk2dzVhNmV1Y2tjLmNsb3VkZnJvbnQubmV0L3ZvZC8yTjFLM0xFNzhUWUozOENFMTExQV85OS8qIiwiQ29uZGl0aW9uIjp7IkRhdGVMZXNzVGhhbiI6eyJBV1M6RXBvY2hUaW1lIjoxNTI3NTA1MDA1fX19XX0_', 'CloudFront-Signature': 'IQYo7PdwXLRyEywSon6HBvuaEOLqTGH6qWAx1Fk3HrSK6N325f0oXcvpZ1eSVUv353YUrd6bKPDE9tLEOPuIitILNQt5tP593C5OIX4jc15RpUpTuEQdlVlO7~SfnxtHXIqukD20GXWIfCagneNj1~F2OD5Tn8ER2stJY1IK~v12VPXAA-cWqoKc6WyVZfzJs0SkJIfQDeDtSOkKD0fP8TOBM2i4XQzbcl9NviNrueG-bZwrCondlw6K5g4TOVS41QQplEIOwb1AzxBb8QvDXxaQ-Kcmy5ME-vpfdBqdHrgreAGZIliZyLWA3qIJ71w67YIzsnCvCMytULDE7w-d4Q__', 'CloudFront-Key-Pair-Id': 'APKAINI6BNPKV54NHH7Q'}
+
+print(cookie_data)
+import requests
+
+cookies = cookie_data
+headers = {}
+# exit()
+s = requests.Session()
+res = s.get(object_url, headers=headers, cookies=cookies)
+print(res.text)

+ 140 - 0
Ansjer/test/testa.py

@@ -0,0 +1,140 @@
+
+
+
+
+
+
+
+# -*- coding: utf-8 -*-
+import struct
+import boto3
+from boto3.session import Session
+from datetime import datetime
+import time
+from requests_aws4auth import AWS4Auth
+import requests
+import chunk
+from botocore.client import Config
+print(datetime(2015, 1, 1))
+print(time.time())
+# exit()
+aws_key = 'AKIAJYSIOA24FQANOFTA'
+aws_secret = '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'
+# aws_key = 'AKIAIK7LP7TRWPFTRWVA'
+# aws_secret = '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'
+session = Session(
+    aws_access_key_id=aws_key,
+    aws_secret_access_key=aws_secret,
+    region_name='us-east-1',
+)
+
+'''
+s3
+'''
+s3_con = boto3.client(
+    's3', aws_access_key_id=aws_key, aws_secret_access_key=aws_secret,
+    config=Config(signature_version='s3v4'), region_name='us-east-1'
+)
+url = s3_con.generate_presigned_post(
+    Key='img.jpg',
+    ExpiresIn=7200,
+    Bucket='ansjertest'
+)
+print(url)
+exit()
+url = s3_con.generate_presigned_url(
+    'put_object',
+    Params={
+        'Bucket': 'ansjertest',
+        'Key': 'img.jpg',
+        # 'ContentType': 'image/jpg'
+    },
+    ExpiresIn=3600,
+    HttpMethod='PUT'
+)
+print(url)
+exit()
+S3_client = session.client('s3')
+response = S3_client.generate_presigned_url(
+    'put_object',
+    Params={
+        'Bucket': 'ansjertest',
+        'Key': 'img.jpg',
+        # 'ContentType': 'image/jpg'
+    },
+    ExpiresIn=3600,
+    # HttpMethod='PUT'
+)
+print(response)
+
+exit()
+S3_client = session.client('s3')
+response = S3_client.generate_presigned_url(
+    'get_object',
+    Params={
+        'Bucket': 'ansjertest',
+        'Key': '2N1K3LE78TYJ38CE111A_3/2N1K3LE78TYJ38CE111A_3-1524557834.mp4'
+    },
+    ExpiresIn=3600
+)
+print(response)
+exit()
+
+kinesis_client = session.client('kinesisvideo')
+
+response = kinesis_client.get_data_endpoint(
+    StreamName='demo-stream',
+    APIName='GET_MEDIA_FOR_FRAGMENT_LIST'
+)
+endpoint = response['DataEndpoint'] + '/getMediaForFragmentList'
+print(endpoint)
+data = {
+    "Fragments": ["91343852333181432407537343081996969589651220552"],
+    "StreamName": "demo-stream"
+}
+
+auth = AWS4Auth(aws_key, aws_secret, 'us-east-1', 'kinesisvideo')
+headers = {'Content-type': 'application/json'}
+response = requests.post(endpoint, json=data, auth=auth, headers=headers)
+# test=chunk.Chunk(response.text.encode('utf8'))
+print(response.headers)
+exit()
+
+stream_bytes = response.text.encode('utf8')
+print(response.text.encode('utf8'))
+print('3333')
+exit()
+# url = "网络zip的地址"
+# path = "你本地的地址"
+#
+# req = urllib2.urlopen(url)
+# data = req.read()
+# with open(path, "wb") as zip:
+#     zip.write(data)
+# req.close()
+# ##-----------------------------------------------------------------------------------------
+
+
+exit()
+response_describe_stream = kinesis_client.describe_stream(
+    StreamName='demo-stream',
+)
+print(response_describe_stream)
+# exit()
+response = kinesis_client.get_data_endpoint(
+    StreamName='demo-stream',
+    APIName='GET_MEDIA'
+)
+print(response)
+
+# exit()
+print('-----------')
+print(response['DataEndpoint'])
+
+kinesis_video_media_client = session.client('kinesis-video-media')
+response_media = kinesis_video_media_client.get_media(
+    StreamName='demo-stream',
+    StartSelector={
+        'StartSelectorType': 'EARLIEST ',
+    }
+)

+ 60 - 0
Ansjer/test/util/mongodb.py

@@ -0,0 +1,60 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: Ansjer
+@software: PyCharm
+@DATE: 2018/6/15 14:18
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: mongodb.py
+@Contact: chanjunkai@163.com
+"""
+# !/usr/bin/python3
+import pymongo
+
+class mongodb(object):
+
+    def __init__(self):
+        myclient = pymongo.MongoClient('mongodb://localhost:27017/')
+        # myclient = pymongo.MongoClient('mongodb://192.168.136.45:27017/')
+        self.myclient = myclient
+        self.db = myclient['ansjertest']
+
+    def check_db_exist(self, database):
+        dblist = self.myclient.database_names()
+        if database in dblist:
+            return True
+        else:
+            return False
+
+    def insert_one(self, col, data):
+        column = self.db[col]
+        res = column.insert_one(data)
+        return res.inserted_id
+
+    def findAll(self, col,page,line,query):
+        collist = self.db.collection_names()
+        if col in collist:  # 判断 customers 集合是否存在
+            qs = self.db[col].find(query)
+            count = qs.count()
+            if page != 0 and line != 0:
+                qs = qs.sort("_id", -1).skip((page - 1) * 10).limit(line)
+            # print(count)
+            data = []
+            for q in qs:
+                data.append(q)
+            res_dict = {'data': data, 'count': count}
+            return res_dict
+        else:
+            print("集合不存在!")
+            return False
+
+if __name__ == '__main__':
+    mdb = mongodb()
+    col = "log_device_operation"
+    data = {"name": "111", "address": "Lowstreet 27"}
+    flag = mdb.insert_one(col=col, data=data)
+    # qs = mdb.findAll(col=col, page=1, line=100,query={'name':'Peter'})
+    # print(qs)

+ 91 - 0
Ansjer/test/util/sql.py

@@ -0,0 +1,91 @@
+'''
+@author chenjunkai
+@time 20180612
+'''
+"""
+一般 Python 用于连接 MySQL 的工具:pymysql
+"""
+import pymysql.cursors
+
+connection = pymysql.connect(host='localhost',
+                             user='root',
+                             password='1234',
+                             db='test',
+                             charset='utf8mb4',
+                             cursorclass=pymysql.cursors.DictCursor)
+
+
+# 保存评论
+def insert_comments(music_id, comments, detail, connection0):
+    with connection0.cursor() as cursor:
+        sql = "INSERT INTO `comments` (`MUSIC_ID`, `COMMENTS`, `DETAILS`) VALUES (%s, %s, %s)"
+        cursor.execute(sql, (music_id, comments, detail))
+    connection0.commit()
+
+
+# 保存音乐
+def insert_music(music_id, music_name, album_id):
+    with connection.cursor() as cursor:
+        sql = "INSERT INTO `musics` (`MUSIC_ID`, `MUSIC_NAME`, `ALBUM_ID`) VALUES (%s, %s, %s)"
+        cursor.execute(sql, (music_id, music_name, album_id))
+    connection.commit()
+
+
+# 保存专辑
+def insert_album(album_id, artist_id):
+    with connection.cursor() as cursor:
+        sql = "INSERT INTO `albums` (`ALBUM_ID`, `ARTIST_ID`) VALUES (%s, %s)"
+        cursor.execute(sql, (album_id, artist_id))
+    connection.commit()
+
+
+# 保存歌手
+def insert_artist(artist_id, artist_name):
+    with connection.cursor() as cursor:
+        sql = "INSERT INTO `artists` (`ARTIST_ID`, `ARTIST_NAME`) VALUES (%s, %s)"
+        cursor.execute(sql, (artist_id, artist_name))
+    connection.commit()
+
+
+# 获取所有歌手的 ID
+def get_all_artist():
+    with connection.cursor() as cursor:
+        sql = "SELECT `ARTIST_ID` FROM `artists` ORDER BY ARTIST_ID"
+        cursor.execute(sql, ())
+        return cursor.fetchall()
+
+
+# 获取所有专辑的 ID
+def get_all_album():
+    with connection.cursor() as cursor:
+        sql = "SELECT `ALBUM_ID` FROM `albums` ORDER BY ALBUM_ID"
+        cursor.execute(sql, ())
+        return cursor.fetchall()
+
+
+# 获取所有音乐的 ID
+def get_all_music():
+    with connection.cursor() as cursor:
+        sql = "SELECT `MUSIC_ID` FROM `musics` ORDER BY MUSIC_ID"
+        cursor.execute(sql, ())
+        return cursor.fetchall()
+
+
+# 获取前一半音乐的 ID
+def get_before_music():
+    with connection.cursor() as cursor:
+        sql = "SELECT `MUSIC_ID` FROM `musics` ORDER BY MUSIC_ID LIMIT 0, 800000"
+        cursor.execute(sql, ())
+        return cursor.fetchall()
+
+
+# 获取后一半音乐的 ID
+def get_after_music():
+    with connection.cursor() as cursor:
+        sql = "SELECT `MUSIC_ID` FROM `musics` ORDER BY MUSIC_ID LIMIT 800000, 1197429"
+        cursor.execute(sql, ())
+        return cursor.fetchall()
+
+
+def dis_connect():
+    connection.close()

+ 13 - 0
Ansjer/test/util/time.py

@@ -0,0 +1,13 @@
+
+import time, datetime
+print(datetime.datetime.now())
+def gettime():
+    for x in range(24):
+        a = datetime.datetime.now().strftime("%Y-%m-%d") + " %2d:00:00" % x
+        timeArray = time.strptime(a, "%Y-%m-%d %H:%M:%S")
+        timeStamp = int(time.mktime(timeArray))
+        print(timeStamp)
+if __name__ == "__main__":
+    gettime()
+
+

+ 10 - 6
Ansjer/urls.py

@@ -3,7 +3,7 @@ from django.conf.urls import url
 from django.urls import path
 from django.urls import path
 # from django.views.generic.base import RedirectView
 # from django.views.generic.base import RedirectView
 from Controller import FeedBackInfo, EquipmentOTA, EquipmentInfo, EquipmentSensor, StreamMedia, AdminManage, AppInfo, \
 from Controller import FeedBackInfo, EquipmentOTA, EquipmentInfo, EquipmentSensor, StreamMedia, AdminManage, AppInfo, \
-    AccessLog, Test, MealManage, DeviceMeal, HlsManage, DeviceManage, EquipmentStatus, SysManage,DeviceLog,LogAccess,EquipmentManager,LogManager,PermissionManager,OTAEquipment,BatchProcessingDatabase,shareUserPermission,UserManger, CheckUserData, OauthManage
+    AccessLog, Test, MealManage, DeviceMeal, HlsManage, DeviceManage, EquipmentStatus, SysManage,DeviceLog,LogAccess,EquipmentManager,LogManager,PermissionManager,OTAEquipment,BatchProcessingDatabase,shareUserPermission,UserManger, CheckUserData
 
 
 urlpatterns = [
 urlpatterns = [
     url(r'^admin/', admin.site.urls),
     url(r'^admin/', admin.site.urls),
@@ -123,14 +123,18 @@ urlpatterns = [
     # 上传操作文档
     # 上传操作文档
     url(r'^HelpCHM/upload$', LogManager.upload_help_chm, name=u'upload_help'),
     url(r'^HelpCHM/upload$', LogManager.upload_help_chm, name=u'upload_help'),
     url(r'^admin/userIDs$', AdminManage.getUserIds, name=u'getUserIds'),
     url(r'^admin/userIDs$', AdminManage.getUserIds, name=u'getUserIds'),
+
+
+
+
     # 统计访问日志路径
     # 统计访问日志路径
     path('access/staticPath/', AccessLog.statisticsPath),
     path('access/staticPath/', AccessLog.statisticsPath),
-    url('Test', Test.RqTest, name=u'rTest'),
-
+    # 多条件搜索用户信息admin
+    path('accounts', AdminManage.search_user_by_content),
     # 测试专用api
     # 测试专用api
-    url('Test', Test.Test.as_view(), name=u'Test'),
+    path('Test', Test.Test.as_view(), name=u'Test'),
     # 路由加参数参考
     # 路由加参数参考
     # url(r'^(?P<path>.*)/(?P<UID>.*)/lls$', Test.Test.as_view(), name=u'gg'),
     # url(r'^(?P<path>.*)/(?P<UID>.*)/lls$', Test.Test.as_view(), name=u'gg'),
-    path('oauth/login',OauthManage.OauthManage.as_view()),
-    url(r'^(?P<path>.*)$', LogManager.errorPath, name=u'error_path'),
+    # path('oauth/login',OauthManage.OauthManage.as_view()),
+    url(r'^(?P<path>.*)', LogManager.errorPath, name=u'error_path'),
 ]
 ]

+ 66 - 11
Controller/AccessLog.py

@@ -7,13 +7,17 @@ from Service.TemplateService import TemplateService
 from Model.models import Access_Log
 from Model.models import Access_Log
 import datetime
 import datetime
 from Service.ResponseService import *
 from Service.ResponseService import *
+from django.core import serializers
 
 
+import chardet
 '''
 '''
 http://192.168.136.40:8077/accesslog?operation=queryByAdmin&token=test&page=1&line=5&order=-id
 http://192.168.136.40:8077/accesslog?operation=queryByAdmin&token=test&page=1&line=5&order=-id
 http://192.168.136.40:8077/accesslog?operation=truncateByAdmin&token=test
 http://192.168.136.40:8077/accesslog?operation=truncateByAdmin&token=test
 http://192.168.136.40:8077/accesslog?operation=searchByAdmin&token=test&page=1&line=10&content={"status":20}&order=-id
 http://192.168.136.40:8077/accesslog?operation=searchByAdmin&token=test&page=1&line=10&content={"status":20}&order=-id
-
-http://192.168.136.40:8077/access/staticPath/?token=stest
+http://127.0.0.1:8000/accesslog?operation=loginUserNum&token=stest
+http://127.0.0.1:8000/accesslog/loginUserNum?token=stest
+http://127.0.0.1:8000/accesslog?operation=AllLoginArea&token=stest
+http://192.168.136.40:8077/access/staticPath?token=stest
 '''
 '''
 
 
 
 
@@ -46,6 +50,11 @@ class AccessLog(View):
                         return self.search_by_admin(request_dict=request_dict, userID=userID)
                         return self.search_by_admin(request_dict=request_dict, userID=userID)
                     elif operation == 'truncateByAdmin':
                     elif operation == 'truncateByAdmin':
                         return self.truncate_by_admin(userID=userID)
                         return self.truncate_by_admin(userID=userID)
+                    elif operation == 'loginUserNum':
+                        return self.login_user_num(userID=userID)
+                    elif operation == 'AllLoginArea':
+                        return self.getAllLoginArea(userID=userID)
+
                 return ResponseJSON(444)
                 return ResponseJSON(444)
             else:
             else:
                 return HttpResponse(tokenManager.errorCodeInfo(error_code))
                 return HttpResponse(tokenManager.errorCodeInfo(error_code))
@@ -97,9 +106,9 @@ class AccessLog(View):
                 try:
                 try:
                     content = json.loads(content)
                     content = json.loads(content)
                     search_kwargs = CommonService.get_kwargs(data=content)
                     search_kwargs = CommonService.get_kwargs(data=content)
+                    queryset = Access_Log.objects.filter(**search_kwargs).order_by(order)
                 except Exception as e:
                 except Exception as e:
                     return ResponseJSON(444)
                     return ResponseJSON(444)
-                queryset = Access_Log.objects.filter(**search_kwargs).order_by(order)
                 if starttime is not None and starttime != '' and endtime is not None and endtime != '':
                 if starttime is not None and starttime != '' and endtime is not None and endtime != '':
                     startt = datetime.datetime.fromtimestamp(int(starttime))
                     startt = datetime.datetime.fromtimestamp(int(starttime))
                     starttime = startt.strftime("%Y-%m-%d %H:%M:%S.%f")
                     starttime = startt.strftime("%Y-%m-%d %H:%M:%S.%f")
@@ -126,9 +135,56 @@ class AccessLog(View):
                 return ResponseJSON(404)
                 return ResponseJSON(404)
         else:
         else:
             return ResponseJSON(444)
             return ResponseJSON(444)
+    # 获取登录用户的ip的登录情况的接口
+    def login_user_num(self,  userID):
+            check_perm = ModelService.check_permission(userID=userID, permID=20)
+            if check_perm is True:
+                user_list = Access_Log.objects.values("user","ip").distinct().filter(url__contains='account/login').order_by('time')
+                return ResponseJSON(10,list(user_list[0]))
+                # print("是否QuerySet")
+                # print(type(user_list).__name__=='QuerySet')
+                user_list= list(user_list)
+                newuser_list="["
+                count=0
+                for q in user_list:
+                    # print(type(q))
+                    # 获取ip地址中文名称
+                    ip_addrname=CommonService.getAddr(q['ip'])
+                    # print(ip_addrname)
+                    # 拼凑为字符串类型
+                    ip_addrname='{"ip_addrname":"'+ip_addrname+'"}'
+                    # 把字符串转为字典json
+                    ip_addrname=json.loads(ip_addrname)
+                    # 字典类型合并
+                    ip_addrnameall=dict(q, **ip_addrname)
+                    # print(ip_addrnameall)
+                    str_dict = json.dumps(ip_addrnameall)
+                    newuser_list=newuser_list+str_dict+","
+                    count+=1
+                newuser_list= newuser_list[:-1]+"]"
+                # 把字符串转为字典json
+                newuser_list = json.loads(newuser_list)
+                # print(newuser_list)
+                return ResponseJSON(0,{'datas':list(newuser_list), 'count': count})
+            else:
+                return ResponseJSON(404)
+
+ # 获取所有用户登录的地区
+    def getAllLoginArea(self, userID):
+        own_permission = ModelService.check_permission(userID=userID, permID=30)
+        if own_permission is True:
+            users = Access_Log.objects.filter(operation='account/login').distinct().values_list('user', flat=True)
+            ip_dict = {}
+            for user in users:
+                qs = Access_Log.objects.values_list('ip', flat=True).filter(operation='account/login',user=user).order_by('time')
+                ip_dict[user] = qs[0]
+            return ResponseJSON(0,ip_dict)
+        else:
+            return ResponseJSON(404)
 
 
 @csrf_exempt
 @csrf_exempt
 def statisticsPath(request):
 def statisticsPath(request):
+    request.encoding = 'utf-8'
     if request.method == 'GET':
     if request.method == 'GET':
         request_dict = request.GET
         request_dict = request.GET
     if request.method == 'POST':
     if request.method == 'POST':
@@ -140,15 +196,14 @@ def statisticsPath(request):
         if error_code == 0:
         if error_code == 0:
             userID = tokenManager.accessDict.get('userID', None)
             userID = tokenManager.accessDict.get('userID', None)
             own_perm = ModelService.check_permission(userID,10)
             own_perm = ModelService.check_permission(userID,10)
-            if own_perm is True:
-                paths = TemplateService.log_api()
-                datas={}
-                for path in paths:
-                    count = Access_Log.objects.filter(operation=path).count()
-                    datas[path] = count
-                return ResponseJSON(0,{'datas':datas})
-            return ResponseJSON(444)
+            paths = TemplateService.log_api()
+            datas = {}
+            for path in paths:
+                count = Access_Log.objects.filter(operation=path).count()
+                datas[path] = count
+            return ResponseJSON(0, {'datas': datas})
         else:
         else:
             return HttpResponse(tokenManager.errorCodeInfo(error_code))
             return HttpResponse(tokenManager.errorCodeInfo(error_code))
     else:
     else:
         return ResponseJSON(311)
         return ResponseJSON(311)
+

+ 136 - 5
Controller/AdminManage.py

@@ -4,18 +4,20 @@ from django.views.generic import TemplateView
 from django.utils.decorators import method_decorator
 from django.utils.decorators import method_decorator
 from django.contrib.auth.hashers import make_password  # 对密码加密模块
 from django.contrib.auth.hashers import make_password  # 对密码加密模块
 from Service.TokenManager import JSONTokenManager
 from Service.TokenManager import JSONTokenManager
-from Model.models import Device_User, Device_Info
-from Service.CommonService import CommonService
+from Model.models import Device_Info,Role
 from Service.ModelService import ModelService
 from Service.ModelService import ModelService
+from django.utils import timezone
 import datetime
 import datetime
 from Model.models import Access_Log
 from Model.models import Access_Log
 from Service.ResponseService import *
 from Service.ResponseService import *
 from django.views.decorators.http import require_http_methods
 from django.views.decorators.http import require_http_methods
+from Ansjer.config import *
 '''
 '''
 http://13.56.215.252:8222/adminManage/manage?operation=getAllDeviceArea&token=test
 http://13.56.215.252:8222/adminManage/manage?operation=getAllDeviceArea&token=test
 http://13.56.215.252:8222/adminManage/manage?operation=getAllUserName&token=test
 http://13.56.215.252:8222/adminManage/manage?operation=getAllUserName&token=test
 http://13.56.215.252:8222/adminManage/manage?operation=getAllUID&token=test
 http://13.56.215.252:8222/adminManage/manage?operation=getAllUID&token=test
-
+http://127.0.0.1:8000/adminManage/manage?operation=getAllOnLine&token=stest
+http://127.0.0.1:8000/adminManage/manage?operation=getOnLine&token=stest
 '''
 '''
 
 
 
 
@@ -33,6 +35,7 @@ class AdminManage(TemplateView):
         return self.validation(request_dict=request.POST)
         return self.validation(request_dict=request.POST)
 
 
     def validation(self, request_dict, *args, **kwargs):
     def validation(self, request_dict, *args, **kwargs):
+
         token = request_dict.get('token', None)
         token = request_dict.get('token', None)
         if token is not None:
         if token is not None:
             tokenManager = JSONTokenManager()
             tokenManager = JSONTokenManager()
@@ -44,6 +47,10 @@ class AdminManage(TemplateView):
                 if param_flag is True:
                 if param_flag is True:
                     if operation == 'resetUserPwd':
                     if operation == 'resetUserPwd':
                         return self.resetUserPwd(request_dict=request_dict, userID=userID)
                         return self.resetUserPwd(request_dict=request_dict, userID=userID)
+                    if operation == 'getAllOnLine':
+                        return self.getAllOnLine(userID=userID)
+                    if operation == 'getOnLine':
+                        return self.getOnLine(userID=userID)
                     if operation == 'getAllUserName':
                     if operation == 'getAllUserName':
                         return self.getAllUserName(userID=userID)
                         return self.getAllUserName(userID=userID)
                     if operation == 'getStatisAccess':
                     if operation == 'getStatisAccess':
@@ -81,6 +88,7 @@ class AdminManage(TemplateView):
             return ResponseJSON(404)
             return ResponseJSON(404)
 
 
     def getAllUserName(self, userID):
     def getAllUserName(self, userID):
+        # 权限固定为30
         own_permission = ModelService.check_permission(userID=userID, permID=30)
         own_permission = ModelService.check_permission(userID=userID, permID=30)
         if own_permission is True:
         if own_permission is True:
             username_list = Device_User.objects.all().values_list('username', flat=True)
             username_list = Device_User.objects.all().values_list('username', flat=True)
@@ -90,7 +98,52 @@ class AdminManage(TemplateView):
                 return ResponseJSON(0)
                 return ResponseJSON(0)
         else:
         else:
             return ResponseJSON(404)
             return ResponseJSON(404)
-
+    #    获取全部用户的在线个数
+    def getAllOnLine(self, userID):
+        # 权限固定为30
+        own_permission = ModelService.check_permission(userID=userID, permID=30)
+        if own_permission is True:
+            allonline = Device_User.objects.all().values('online')
+            # 两个变量,分别是在线,离线
+            onlinenum = 0
+            noonlinenum=0
+            for q in allonline:
+                if q['online'] ==True:
+                    onlinenum+=1
+                else:
+                    noonlinenum+=1
+            print("在线人数:")
+            print(onlinenum)
+            return ResponseJSON(0, {"onlinenum": onlinenum, "no_onlinenum": noonlinenum})
+        else:
+            return ResponseJSON(404)
+    #    获取全部用户的在线人数
+    def getOnLine(self, userID):
+        # 权限固定为30
+        own_permission = ModelService.check_permission(userID=userID, permID=30)
+        if own_permission is True:
+            online_list = Device_User.objects.all().values('online', 'last_login')
+            # 两个变量,分别是在线,离线
+            onlinenum=0
+            noonlinenum=0
+            for q in online_list:
+                    # print(q['last_login'] )
+                    # 最后访问时间加5分种
+                    dl_time = q['last_login'] + datetime.timedelta(minutes=OFF_LINE_TIME_DELTA)
+                    # print(dl_time)
+                    # 当前时间
+                    now_time = timezone.localtime(timezone.now())
+                    # print(now_time)
+                    # 如果当前时间大于最后访问的时间
+                    if now_time < dl_time:
+                        onlinenum += 1
+                    else:
+                        noonlinenum += 1
+            print("在线人")
+            print(onlinenum)
+            return ResponseJSON(0, {"onlinenum": onlinenum,"no_onlinenum": noonlinenum})
+        else:
+            return ResponseJSON(404)
 
 
     # 获取所有设备地区
     # 获取所有设备地区
     def getAllDeviceArea(self, userID):
     def getAllDeviceArea(self, userID):
@@ -166,4 +219,82 @@ def getUserIds(request):
         else:
         else:
             return HttpResponse(tokenManager.errorCodeInfo(error_code))
             return HttpResponse(tokenManager.errorCodeInfo(error_code))
     else:
     else:
-        return ResponseJSON(311)
+        return ResponseJSON(311)
+
+@csrf_exempt
+# @require_http_methods(['GET'])
+def search_user_by_content(request):
+    if request.method == 'GET':
+        request_dict = request.GET
+    if request.method == 'POST':
+        request_dict = request.POST
+    token = request_dict.get('token', None)
+    page = request_dict.get('page', None)
+    line = request_dict.get('line', None)
+    content = request_dict.get('content', None)
+    rstime = request_dict.get('rstime', None)
+    retime = request_dict.get('retime', None)
+    if page is not None and line is not None:
+        page = int(page)
+        line = int(line)
+    else:
+        return ResponseJSON(10,'page,line is none')
+    if token is not None:
+        tokenManager = JSONTokenManager()
+        error_code = tokenManager.verify_AToken(token)
+        if error_code == 0:
+            userID = tokenManager.accessDict.get('userID', None)
+            own_perm = ModelService.check_permission(userID,30)
+            if own_perm is True:
+                check_perm = ModelService.check_permission(userID=userID, permID=20)
+                if check_perm is True:
+                    try:
+                        content = json.loads(content)
+                        search_kwargs = CommonService.get_kwargs(data=content)
+                        queryset = Device_User.objects.filter(**search_kwargs)
+                    except Exception as e:
+                        return ResponseJSON(444,repr(e))
+                    if rstime is not None and rstime != '' and retime is not None and retime != '':
+                        startt = datetime.datetime.fromtimestamp(int(rstime))
+                        rstime = startt.strftime("%Y-%m-%d %H:%M:%S.%f")
+                        endt = datetime.datetime.fromtimestamp(int(retime))
+                        retime = endt.strftime("%Y-%m-%d %H:%M:%S.%f")
+                        queryset = queryset.filter(data_joined__range=(rstime, retime))
+                    elif rstime is not None and rstime != '':
+                        startt = datetime.datetime.fromtimestamp(int(rstime))
+                        rstime = startt.strftime("%Y-%m-%d %H:%M:%S.%f")
+                        queryset = queryset.filter(data_joined__gte=rstime)
+                    elif retime is not None and retime != '':
+                        endt = datetime.datetime.fromtimestamp(int(retime))
+                        retime = endt.strftime("%Y-%m-%d %H:%M:%S.%f")
+                        queryset = queryset.filter(data_joined__lte=retime)
+                    if queryset.exists():
+                        count = queryset.count()
+                        res = queryset[(page - 1) * line:page * line]
+                        sqlDict = CommonService.query_set_to_dict(res)
+                        for k, v in enumerate(sqlDict["datas"]):
+                            if len(v['fields']['role']) > 0:
+                                role_query_set = Role.objects.get(rid=v['fields']['role'][0])
+                                sqlDict["datas"][k]['fields']['role'].append(role_query_set.roleName)
+                            for val in res:
+                                if v['pk'] == val.userID:
+                                    if sqlDict["datas"][k]['fields']['online'] is True:
+                                        dl_time = val.last_login + datetime.timedelta(minutes=5)
+                                        now_time = timezone.localtime(timezone.now())
+                                        if now_time > dl_time:
+                                            sqlDict["datas"][k]['fields']['online'] = False
+                        sqlDict['count'] = count
+                        return ResponseJSON(0, sqlDict)
+                    return ResponseJSON(0, {'datas': [], 'count': 0})
+                else:
+                    return ResponseJSON(404)
+            else:
+                return ResponseJSON(404)
+        else:
+            return HttpResponse(tokenManager.errorCodeInfo(error_code))
+    else:
+        return ResponseJSON(311)
+
+
+
+

+ 9 - 3
Controller/AppInfo.py

@@ -11,7 +11,7 @@ from Service.ResponseService import *
 '''
 '''
 http://192.168.136.45:8077/appInfo?operation=add&token=test&appBundleId=123456&appName=%E8%AF%BA%E5%9F%BA%E4%BA%9A1%E5%8F%B7&systemLanguage=US&content=dladfjklsjfdsajkdfasjkljlk&app_type=2&newAppversion=1234&bundleVersion=1234
 http://192.168.136.45:8077/appInfo?operation=add&token=test&appBundleId=123456&appName=%E8%AF%BA%E5%9F%BA%E4%BA%9A1%E5%8F%B7&systemLanguage=US&content=dladfjklsjfdsajkdfasjkljlk&app_type=2&newAppversion=1234&bundleVersion=1234
 http://192.168.136.45:8077/appInfo?operation=update&token=test&appBundleId=1234&appName=%E8%AF%BA%E5%9F%BA%E4%BA%9A3%E5%8F%B7&systemLanguage=US&content=dladfjklsjfdsajkdfasjkljlk&app_type=2&newAppversion=555&id=6
 http://192.168.136.45:8077/appInfo?operation=update&token=test&appBundleId=1234&appName=%E8%AF%BA%E5%9F%BA%E4%BA%9A3%E5%8F%B7&systemLanguage=US&content=dladfjklsjfdsajkdfasjkljlk&app_type=2&newAppversion=555&id=6
-http://192.168.136.45:8077/appInfo?operation=query&token=test&page=1&line=10
+http://127.0.0.1:8000/appInfo?operation=query&token=stest&page=1&line=10
 http://192.168.136.45:8077/appInfo?operation=delete&token=test&id=1&id=2&id=3&id=4&id=5
 http://192.168.136.45:8077/appInfo?operation=delete&token=test&id=1&id=2&id=3&id=4&id=5
 '''
 '''
 
 
@@ -78,6 +78,7 @@ class AppInfo(View):
                                         'systemLanguage': app_info.systemLanguage,
                                         'systemLanguage': app_info.systemLanguage,
                                         'content': app_info.content,
                                         'content': app_info.content,
                                         'app_type': app_info.app_type,
                                         'app_type': app_info.app_type,
+                                        'downloadLink':app_info.downloadLink,
                                         'id': app_info.id,
                                         'id': app_info.id,
                                         'bundleVersion': app_info.bundleVersion})
                                         'bundleVersion': app_info.bundleVersion})
         else:
         else:
@@ -93,6 +94,7 @@ class AppInfo(View):
             content = request_dict.get('content', None)
             content = request_dict.get('content', None)
             app_type = request_dict.get('app_type', None)
             app_type = request_dict.get('app_type', None)
             bundleVersion = request_dict.get('bundleVersion', None)
             bundleVersion = request_dict.get('bundleVersion', None)
+            downloadLink = request_dict.get('downloadLink', None)
             param_flag = CommonService.get_param_flag(
             param_flag = CommonService.get_param_flag(
                 data=[appBundleId, appName, systemLanguage, newAppversion, content, app_type, bundleVersion])
                 data=[appBundleId, appName, systemLanguage, newAppversion, content, app_type, bundleVersion])
             if param_flag is True:
             if param_flag is True:
@@ -115,6 +117,7 @@ class AppInfo(View):
                                 content=content,
                                 content=content,
                                 app_type=app_type,
                                 app_type=app_type,
                                 bundleVersion=bundleVersion,
                                 bundleVersion=bundleVersion,
+                                downloadLink=downloadLink,
                             )
                             )
                             app_Info.save()
                             app_Info.save()
                         except Exception:
                         except Exception:
@@ -133,7 +136,8 @@ class AppInfo(View):
                                                         'content': app_Info.content,
                                                         'content': app_Info.content,
                                                         'app_type': app_Info.app_type,
                                                         'app_type': app_Info.app_type,
                                                         'id': app_Info.id,
                                                         'id': app_Info.id,
-                                                        'bundleVersion': app_Info.bundleVersion,
+                                                        'downloadLink':downloadLink,
+                                                        'bundleVersion': app_Info.bundleVersion
                                                     })
                                                     })
                             else:
                             else:
                                 return ResponseJSON(500)
                                 return ResponseJSON(500)
@@ -172,8 +176,9 @@ class AppInfo(View):
             content = request_dict.get('content', None)
             content = request_dict.get('content', None)
             app_type = request_dict.get('app_type', None)
             app_type = request_dict.get('app_type', None)
             bundleVersion = request_dict.get('bundleVersion', None)
             bundleVersion = request_dict.get('bundleVersion', None)
+            downloadLink = request_dict.get('downloadLink', None)
             param_flag = CommonService.get_param_flag(
             param_flag = CommonService.get_param_flag(
-                data=[appBundleId, appName, systemLanguage, newAppversion, content, app_type, bundleVersion])
+                data=[appBundleId, appName, systemLanguage, newAppversion, content, app_type, bundleVersion,downloadLink])
             if param_flag is True:
             if param_flag is True:
                 try:
                 try:
                     app_info = App_Info.objects.get(id=id)
                     app_info = App_Info.objects.get(id=id)
@@ -190,6 +195,7 @@ class AppInfo(View):
                         app_info.content = content
                         app_info.content = content
                         app_info.app_type = app_type
                         app_info.app_type = app_type
                         app_info.bundleVersion = bundleVersion
                         app_info.bundleVersion = bundleVersion
+                        app_info.downloadLink = downloadLink
                         app_info.save()
                         app_info.save()
                         return ResponseJSON(0, {'update_id': app_info.id, 'update_time': str(app_info.update_time)})
                         return ResponseJSON(0, {'update_id': app_info.id, 'update_time': str(app_info.update_time)})
             else:
             else:

+ 3 - 3
Controller/EquipmentManager.py

@@ -39,9 +39,9 @@ def addNewUserEquipment(userID, deviceContent, bulk = False):
             else:
             else:
                 UID = deviceData.get('UID', None)
                 UID = deviceData.get('UID', None)
                 if UID != None:
                 if UID != None:
-                    is_bind = Device_Info.objects.filter(UID = UID,isShare=False)
-                    if is_bind:
-                        return ResponseFormal(175)
+                    #is_bind = Device_Info.objects.filter(UID = UID,isShare=False)
+                    #if is_bind:
+                        #return ResponseFormal(175)
                     dValid = Device_Info.objects.filter(userID = userID, UID = UID)
                     dValid = Device_Info.objects.filter(userID = userID, UID = UID)
                     if dValid:
                     if dValid:
                         return ResponseFormal(174)
                         return ResponseFormal(174)

+ 0 - 1
Controller/EquipmentOTA.py

@@ -131,7 +131,6 @@ class EquipmentOTA(View):
                 if ev.exists():
                 if ev.exists():
                     status = request_dict.get('status',None)
                     status = request_dict.get('status',None)
                     try:
                     try:
-
                         update_time = timezone.localtime(timezone.now())
                         update_time = timezone.localtime(timezone.now())
                         ev.update(status=status,update_time=update_time)
                         ev.update(status=status,update_time=update_time)
                     except Exception as e:
                     except Exception as e:

+ 0 - 1
Controller/HlsManage.py

@@ -16,7 +16,6 @@ from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
 from django.views.decorators.csrf import csrf_exempt
 from Service.TokenManager import JSONTokenManager
 from Service.TokenManager import JSONTokenManager
 from Service.ModelService import ModelService
 from Service.ModelService import ModelService
-from Service.CommonService import CommonService
 from Model.models import Device_Meal
 from Model.models import Device_Meal
 from Object.AWS.S3ClassObject import S3ClassObject
 from Object.AWS.S3ClassObject import S3ClassObject
 from Object.AWS.CloudfrontSignUrl import CloudfrontSignUrl
 from Object.AWS.CloudfrontSignUrl import CloudfrontSignUrl

+ 17 - 5
Controller/OTAEquipment.py

@@ -32,8 +32,9 @@ def getEquipmentVersion(code):
             return ResponseFormal(900)
             return ResponseFormal(900)
 
 
 
 
-def getUrl(filePath):
+def getUrl(filePath,http_host):
     urls = []
     urls = []
+    server_dm = 'http://'+http_host
     filePaths = filePath.split(',')
     filePaths = filePath.split(',')
     if len(filePaths) > 0:
     if len(filePaths) > 0:
         for path in filePaths:
         for path in filePaths:
@@ -48,7 +49,7 @@ def getUrl(filePath):
     else:
     else:
         return ''
         return ''
 
 
-def getUpdataFileUrl(code):
+def getUpdataFileUrl(code,http_host):
     try:
     try:
         equipmentValid = Equipment_Version.objects.filter(code=code,status=1).order_by('-data_joined')
         equipmentValid = Equipment_Version.objects.filter(code=code,status=1).order_by('-data_joined')
     except Exception as e:
     except Exception as e:
@@ -58,11 +59,14 @@ def getUpdataFileUrl(code):
     else:
     else:
         if equipmentValid:
         if equipmentValid:
             equipment = equipmentValid[0]
             equipment = equipmentValid[0]
-            url = getUrl(equipment.filePath)
+            file_path = equipment.filePath
+            url = getUrl(file_path,http_host)
+            https_url = getOTAHttps(file_path,http_host)
             if len(url) > 0:
             if len(url) > 0:
                 return ResponseFormal(0,{
                 return ResponseFormal(0,{
                     "urlCount": len(url),
                     "urlCount": len(url),
                     "url": url,
                     "url": url,
+                    'https_url':https_url,
                     "fileSize": equipment.fileSize,
                     "fileSize": equipment.fileSize,
                     "Description": equipment.Description,
                     "Description": equipment.Description,
                 })
                 })
@@ -71,7 +75,14 @@ def getUpdataFileUrl(code):
         else:
         else:
             return ResponseFormal(902)
             return ResponseFormal(902)
 
 
-#from django.core.files.uploadedfile import TemporaryUploadedFile
+def getOTAHttps(filePath,http_host):
+    urls = ''
+    server_dm = 'https://' + http_host
+    if filePath.find('static/Upgrade/') != -1:
+        path = filePath.replace('static/Upgrade/', '').replace('\\', '/')
+        urls = server_dm + '/OTA/downloads/' + path + '?time=' + str(time.time())
+    return urls
+
 def getDir(fileType, fileName, fileCode, fileVersion):
 def getDir(fileType, fileName, fileCode, fileVersion):
     try:
     try:
         if fileCode != None and fileVersion != None:
         if fileCode != None and fileVersion != None:
@@ -273,8 +284,9 @@ def getUpdataFileUrlInterface(request,
     else:
     else:
         return ResponseJSON(801)
         return ResponseJSON(801)
     code = request_dict.get('code', None)
     code = request_dict.get('code', None)
+    http_host = request.META.get('HTTP_HOST', None)
     if code is not None:
     if code is not None:
-        return HttpResponse(getUpdataFileUrl(code))
+        return HttpResponse(getUpdataFileUrl(code,http_host))
     else:
     else:
         return ResponseJSON(800)
         return ResponseJSON(800)
 
 

+ 77 - 42
Controller/OauthManage.py

@@ -14,13 +14,10 @@
 from django.views.generic.base import View
 from django.views.generic.base import View
 from django.utils.decorators import method_decorator
 from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
 from django.views.decorators.csrf import csrf_exempt
-# from Ansjer.settings import *
 from Service.TokenManager import *
 from Service.TokenManager import *
+from Model.models import oauth_user,Auth_Captcha
 from django.contrib import auth
 from django.contrib import auth
 from django.http import HttpResponseRedirect
 from django.http import HttpResponseRedirect
-'''
-http://192.168.136.40:8077/Test
-'''
 import json
 import json
 from Service.ResponseService import *
 from Service.ResponseService import *
 import requests
 import requests
@@ -36,7 +33,7 @@ class OauthManage(View):
     def get(self, request, *args, **kwargs):
     def get(self, request, *args, **kwargs):
 
 
         return
         return
-    # 增加
+    # 认证登录
     def post(self, request, *args, **kwargs):
     def post(self, request, *args, **kwargs):
         try:
         try:
             json_data = json.loads(request.body.decode("utf-8"))
             json_data = json.loads(request.body.decode("utf-8"))
@@ -46,46 +43,84 @@ class OauthManage(View):
         else:
         else:
             access_token = json_data.get('access_token', None)
             access_token = json_data.get('access_token', None)
             if access_token is not None:
             if access_token is not None:
-                ser = requests.get(url='http://192.168.136.40:9898/accounts/user/', data={'access_token':access_token})
-                if ser.status_code == 200:
+                try:
+                    ser = requests.get(url='http://192.168.136.45:9898/accounts/user/',
+                                       data={'access_token': access_token})
                     ser_data = json.loads(ser.content)
                     ser_data = json.loads(ser.content)
-                    print(ser_data)
-                    username = ser_data.get('username', None)
-                    if username is not None:
-                        userValid = Device_User.objects.filter(username=username)
-                        mCode = 1324
-                        userID = userValid[0].userID
-                        authtoken_Obj = AuthToken_Token.objects.filter(tokenID_id=userID)
-                        if authtoken_Obj.exists():
-                            tokenManager = JSONTokenManager()
-                            access_token = tokenManager.deToken(authtoken_Obj[0].access_token)
-                            refresh_token = tokenManager.deToken(authtoken_Obj[0].refresh_token)
+                except Exception as e:
+                    print(repr(e))
+                    return ResponseJSON(10,repr(e))
+                else:
+                    oid = ser_data['oid']
+                    if oid is not None:
+                        ou = oauth_user.objects.filter(oid=oid)
+                        # 用户存在情况查找绑定用户
+                        if ou.exists():
+                            user_qs =ou[0].userID
+                            userID = user_qs.userID
+                        #用户不存在情况新增一个用户
                         else:
                         else:
-                            access_token = False
-                            refresh_token = False
-                        if access_token is not False and refresh_token is not False:
-                            resultDict = {'result': {'access_token': access_token, 'refresh_token': refresh_token},
-                                          'error_code': 0}
-                        else:
-                            JSON = json.dumps({'userID': userID, 'mCode': mCode}, ensure_ascii=False)
-                            tokenManager = JSONTokenManager()
-                            tokenJSON = tokenManager.generate_AToken(JSON=JSON,
-                                                                     iCode=tokenManager.getSalt(strLen=8))
-                            resultDict = json.loads(tokenJSON)
-                        error_code = resultDict.get('error_code', None)
-                        if error_code != None and error_code == 0:
-                            result = resultDict.get('result', None)
-                            if result != None:
-                                import datetime
-                                now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
-                                userValid.update(last_login=now_time, online=True, machine_code=mCode)
-                                role_dict = ModelService.own_role(userID=userID)
-                                result['rid'] = role_dict['rid']
-                                result['roleName'] = role_dict['roleName']
-                                result['permList'] = ModelService.own_permission(userID)
-                                result['username'] = username
-                                return ResponseJSON(0, result)
+                            oid = ser_data['oid']
+                            username = ser_data['username']
+                            password = ser_data['password']
+                            email = ser_data['email']
+                            try:
+                                CaptchaRecord = Auth_Captcha()
+                                CaptchaRecord.authcaptca = '1234'
+                                CaptchaRecord.username = username
+                                CaptchaRecord.sendtype = 'register'
+                                CaptchaRecord.save()
+                            except Exception as e:
+                                return ResponseJSON(10,repr(e))
+                            try:
+                                UserData = Device_User(username=username, userEmail=email, password=password,
+                                                       userID=CommonService.getUserID(μs=False, setOTAID=True),
+                                                       is_active=True, user_isValid=True)
+                                UserData.save()
+                            except Exception as e:
+                                errorInfo = traceback.format_exc()
+                                print('Create User Error: %s' % errorInfo)
+                                return ResponseJSON(424,'Create User Error:' + repr(e))
+                            else:
+                                ourValid = oauth_user.objects.create(oid=oid, userID=UserData)
+                                if ourValid:
+                                    userID = UserData.userID
+                        if userID:
+                            userValid = Device_User.objects.filter(userID=userID)
+                            if userValid.exists():
+                                authtoken_Obj = AuthToken_Token.objects.filter(tokenID_id=userID)
+                                if authtoken_Obj.exists():
+                                    tokenManager = JSONTokenManager()
+                                    access_token = tokenManager.deToken(authtoken_Obj[0].access_token)
+                                    refresh_token = tokenManager.deToken(authtoken_Obj[0].refresh_token)
+                                else:
+                                    access_token = False
+                                    refresh_token = False
+                                if access_token is not False and refresh_token is not False:
+                                    resultDict = {
+                                        'result': {'access_token': access_token, 'refresh_token': refresh_token},
+                                        'error_code': 0}
+                                else:
+                                    JSON = json.dumps({'userID': userID, 'mCode': ''}, ensure_ascii=False)
+                                    tokenManager = JSONTokenManager()
+                                    tokenJSON = tokenManager.generate_AToken(JSON=JSON,
+                                                                             iCode=tokenManager.getSalt(strLen=8))
+                                    resultDict = json.loads(tokenJSON)
+                                error_code = resultDict.get('error_code', None)
+                                if error_code != None and error_code == 0:
+                                    result = resultDict.get('result', None)
+                                    if result != None:
+                                        import datetime
+                                        now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
+                                        userValid.update(last_login=now_time, online=True)
+                                        role_dict = ModelService.own_role(userID=userID)
+                                        result['rid'] = role_dict['rid']
+                                        result['roleName'] = role_dict['roleName']
+                                        result['permList'] = ModelService.own_permission(userID)
+                                        result['username'] = userValid[0].username
+                                        return ResponseJSON(0, result)
 
 
+        return ResponseJSON(10)
     # 修改 资源改变
     # 修改 资源改变
     def put(self, request):
     def put(self, request):
         return ResponseJSON(404)
         return ResponseJSON(404)

+ 3 - 2
Controller/StreamMedia.py

@@ -4,15 +4,16 @@ from django.views.decorators.csrf import csrf_exempt
 from Service.TokenManager import JSONTokenManager
 from Service.TokenManager import JSONTokenManager
 from Service.ModelService import ModelService
 from Service.ModelService import ModelService
 from Model.models import Equipment_Stream
 from Model.models import Equipment_Stream
-from Service.CommonService import CommonService
 from Object.AWS.S3ClassObject import S3ClassObject
 from Object.AWS.S3ClassObject import S3ClassObject
 from Object.AWS.ElasticTranscoder import ElasticTranscoder
 from Object.AWS.ElasticTranscoder import ElasticTranscoder
 import traceback, xmltodict, requests, re, subprocess
 import traceback, xmltodict, requests, re, subprocess
 from ffmpy import FFmpeg
 from ffmpy import FFmpeg
 import time
 import time
 from Object.AWS.CloudfrontSignCookie import BetterThanBoto
 from Object.AWS.CloudfrontSignCookie import BetterThanBoto
-from Ansjer.config import *
+from Ansjer.settings import NGINX_RTMP_STAT,RTMP_PUSH_URL
 from Service.ResponseService import *
 from Service.ResponseService import *
+from Ansjer.config import BASE_DIR
+import os
 
 
 '''
 '''
 移动端=>
 移动端=>

+ 2 - 84
Controller/Test.py

@@ -29,13 +29,6 @@ from django.middleware.csrf import get_token
 from django.http import JsonResponse
 from django.http import JsonResponse
 from ratelimit.decorators import ratelimit
 from ratelimit.decorators import ratelimit
 
 
-
-@ratelimit(key='ip', rate='1/m')
-def RqTest(request):
-    was_limited = getattr(request,'limited', False)
-    var_dump(was_limited)
-    return ResponseJSON(0)
-
 class Test(View):
 class Test(View):
     '''
     '''
     limit=10:指定返回记录的数量
     limit=10:指定返回记录的数量
@@ -52,88 +45,13 @@ class Test(View):
     @ratelimit(key='ip', rate='1/m')
     @ratelimit(key='ip', rate='1/m')
     # 查询
     # 查询
     def get(self, request, *args, **kwargs):
     def get(self, request, *args, **kwargs):
-        was_limited = getattr(request, 'limited', False)
-        var_dump(was_limited)
         return ResponseJSON(0)
         return ResponseJSON(0)
-        post_data = {
-            'code': request.GET.get('code', None),
-            'client_id': 'co',
-            'client_secret': 'co',
-            'grant_type': 'authorization_code',
-            'redirect_uri': 'http://192.168.136.40:8077/Test/',
-        }
-        res = requests.post(url='http://192.168.136.40:9898/o/token/', data=post_data)
-        print(res.content)
-
-        if res.status_code == 200:
-            json_data = json.loads(res.content)
-            access_token= json_data.get('access_token',None)
-            print(access_token)
-            if access_token is not None:
-                get_data = {
-                    'access_token':access_token
-                }
-                ser = requests.get(url='http://192.168.136.40:9898/accounts/user/',data=get_data)
-                if ser.status_code == 200:
-                    ser_data = json.loads(ser.content)
-                    print(ser_data)
-                    username =ser_data.get('username',None)
-                    if username is not None:
-                        userValid = Device_User.objects.filter(username=username)
-                        mCode=1324
-                        userID=userValid[0].userID
-                        authtoken_Obj = AuthToken_Token.objects.filter(tokenID_id=userID)
-                        if authtoken_Obj.exists():
-                            tokenManager = JSONTokenManager()
-                            access_token = tokenManager.deToken(authtoken_Obj[0].access_token)
-                            refresh_token = tokenManager.deToken(authtoken_Obj[0].refresh_token)
-                        else:
-                            access_token = False
-                            refresh_token = False
-                        if access_token is not False and refresh_token is not False:
-                            resultDict = {'result': {'access_token': access_token, 'refresh_token': refresh_token},
-                                          'error_code': 0}
-                        else:
-                            JSON = json.dumps({'userID': userID, 'mCode': mCode}, ensure_ascii=False)
-                            tokenManager = JSONTokenManager()
-                            tokenJSON = tokenManager.generate_AToken(JSON=JSON, iCode=tokenManager.getSalt(strLen=8))
-                            resultDict = json.loads(tokenJSON)
-                        error_code = resultDict.get('error_code', None)
-                        if error_code != None and error_code == 0:
-                            result = resultDict.get('result', None)
-                            if result != None:
-                                import datetime
-                                now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
-                                userValid.update(last_login=now_time, online=True, machine_code=mCode)
-                                role_dict = ModelService.own_role(userID=userID)
-                                result['rid'] = role_dict['rid']
-                                result['roleName'] = role_dict['roleName']
-                                result['permList'] = ModelService.own_permission(userID)
-                                result['username'] = username
-                                # response = HttpResponseRedirect('http://192.168.136.39:8020/ansjer/html/main.html?access_token={}&refresh_token={}&rid={}&roleName={}&permList={}'.format(result['access_token'],result['refresh_token'],result['rid'],result['roleName'],result['permList']))
-                                response = HttpResponseRedirect('http://192.168.136.39:8020/ansjer/html/main.html')
-                                response.set_cookie('username', username, 7200)
-                                response.set_cookie('access_token', result['access_token'], 7200)
-                                response.set_cookie('refresh_token', result['refresh_token'], 7200)
-                                response.set_cookie('rid', result['rid'], 7200)
-                                response.set_cookie('roleName', result['roleName'], 7200)
-                                response.set_cookie('permList', result['permList'], 7200)
-                                return response
-
-                                response = HttpResponse(ResponseFormal(0, result, language='cn'))
-                                response.set_cookie('username', username, 7200)
-                                return response
-                    return ResponseJSON(0, ser_data)
 
 
     # 增加
     # 增加
     def post(self, request, *args, **kwargs):
     def post(self, request, *args, **kwargs):
-        json_data = json.loads(request.body.decode("utf-8"))
-        '''
-        token = get_token(request)
-        return JsonResponse({'token': token})        
-        '''
 
 
-        return ResponseJSON(0, {'test': json_data})
+
+        return ResponseJSON(0, {'test': 123})
 
 
     # 修改 资源改变
     # 修改 资源改变
     def put(self, request):
     def put(self, request):

+ 11 - 8
Controller/UserManger.py

@@ -29,6 +29,7 @@ http://13.56.215.252:82/account/authcode?userEmail=123456&language=en&mid=1234
 http://13.56.215.252:82/account/register?userName=123456&language=en&mid=1234&userEmail=userEmail&userPwd=1234&identifyingCode=1234324
 http://13.56.215.252:82/account/register?userName=123456&language=en&mid=1234&userEmail=userEmail&userPwd=1234&identifyingCode=1234324
 '''
 '''
 class getAuthCodeView(TemplateView):
 class getAuthCodeView(TemplateView):
+
     @method_decorator(csrf_exempt)
     @method_decorator(csrf_exempt)
     def dispatch(self, *args, **kwargs):
     def dispatch(self, *args, **kwargs):
         return super(getAuthCodeView, self).dispatch(*args, **kwargs)
         return super(getAuthCodeView, self).dispatch(*args, **kwargs)
@@ -511,14 +512,16 @@ class ForgetPwdView(TemplateView):
     def ForgetPwd(self, userName):
     def ForgetPwd(self, userName):
         dataValid = DataValid()
         dataValid = DataValid()
         if dataValid.mobile_validate(userName):
         if dataValid.mobile_validate(userName):
-            User = Device_User.objects.filter(username = userName)
+            User = Device_User.objects.filter(username= userName)
             if User:
             if User:
-
-                send_status = MiscellService.ses_send_email_handle(data={
-                    'useremail':User[0].userEmail,
-                    'username':userName,
-                    'type':'forget',
-                })
+                try:
+                    send_status = MiscellService.ses_send_email_handle(data={
+                        'useremail': User[0].userEmail,
+                        'username': userName,
+                        'type': 'forget',
+                    })
+                except Exception as e:
+                    return ResponseJSON(10,repr(e))
                 if send_status == 'has_send':
                 if send_status == 'has_send':
                     return ResponseFormal(1004)
                     return ResponseFormal(1004)
                 if send_status is True:
                 if send_status is True:
@@ -900,7 +903,7 @@ def showAllUserPC(userID,line,page):
                     for val in device_user_res:
                     for val in device_user_res:
                         if v['pk'] == val.userID:
                         if v['pk'] == val.userID:
                             if sqlDict["datas"][k]['fields']['online'] is True:
                             if sqlDict["datas"][k]['fields']['online'] is True:
-                                dl_time = val.last_login + datetime.timedelta(minutes=30)
+                                dl_time = val.last_login + datetime.timedelta(minutes=5)
                                 now_time = timezone.localtime(timezone.now())
                                 now_time = timezone.localtime(timezone.now())
                                 if now_time > dl_time:
                                 if now_time > dl_time:
                                     sqlDict["datas"][k]['fields']['online'] = False
                                     sqlDict["datas"][k]['fields']['online'] = False

+ 22 - 2
Model/models.py

@@ -156,7 +156,7 @@ class Device_User(AbstractBaseUser):
 
 
     username = models.CharField(max_length=40, verbose_name=u'用户名', unique = True)
     username = models.CharField(max_length=40, verbose_name=u'用户名', unique = True)
     password = models.CharField(max_length=128, verbose_name=u'密码')
     password = models.CharField(max_length=128, verbose_name=u'密码')
-    userEmail = models.EmailField(max_length = 64, verbose_name=u'邮箱', unique = True, default='AnonymousUser@qq.com')
+    userEmail = models.EmailField(max_length = 64, verbose_name=u'邮箱', unique = True, null=True, blank=True)
     # 实际的路径就是 MEDIA_ROOT/Image/filename,所以可用upload_to来指定文件存放的前缀路径
     # 实际的路径就是 MEDIA_ROOT/Image/filename,所以可用upload_to来指定文件存放的前缀路径
     userIconPath = ProcessedImageField(blank=True, upload_to='User/Images/', default='static/User/default.png',
     userIconPath = ProcessedImageField(blank=True, upload_to='User/Images/', default='static/User/default.png',
                         verbose_name=u'头像',
                         verbose_name=u'头像',
@@ -592,6 +592,7 @@ class Equipment_Version(models.Model):
 
 
 
 
 class App_Info(models.Model):
 class App_Info(models.Model):
+    
     id = models.AutoField(primary_key=True,verbose_name=u'自增标记ID')
     id = models.AutoField(primary_key=True,verbose_name=u'自增标记ID')
     appBundleId = models.CharField(blank=True, max_length=32, verbose_name=u'appID')
     appBundleId = models.CharField(blank=True, max_length=32, verbose_name=u'appID')
     appName = models.CharField(blank=True, max_length=32, verbose_name=u'app名称')
     appName = models.CharField(blank=True, max_length=32, verbose_name=u'app名称')
@@ -602,6 +603,8 @@ class App_Info(models.Model):
     app_type = models.IntegerField(null=True, blank=True, verbose_name=u'app类型')
     app_type = models.IntegerField(null=True, blank=True, verbose_name=u'app类型')
     add_time = models.DateTimeField(blank=True,null=True, verbose_name=u'加入时间', auto_now_add=True)
     add_time = models.DateTimeField(blank=True,null=True, verbose_name=u'加入时间', auto_now_add=True)
     update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)
     update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)
+    downloadLink = models.TextField(blank=True, null=True, verbose_name='升级')
+
 
 
     def __str__(self):
     def __str__(self):
         return self.id
         return self.id
@@ -610,4 +613,21 @@ class App_Info(models.Model):
         db_table = 'app_info'
         db_table = 'app_info'
         verbose_name = u'app信息表'
         verbose_name = u'app信息表'
         verbose_name_plural=verbose_name
         verbose_name_plural=verbose_name
-        ordering = ('id',)
+        ordering = ('id',)
+
+
+'''
+class oauth_user(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name=u'自增标记ID')
+    oid = models.CharField(max_length=36,unique=True,null=True,blank=True)
+    userID = models.OneToOneField("Device_User",verbose_name="用户表userID",to_field='userID',on_delete=models.CASCADE)
+    
+    def __str__(self):
+        return self.oid
+
+    class Meta:
+        db_table = 'oauth_user'
+        verbose_name = u'认证用户关联表'
+        verbose_name_plural=verbose_name
+        ordering = ('id',)
+'''

+ 18 - 10
Object/mongodb.py

@@ -15,20 +15,28 @@
 import pymongo
 import pymongo
 import math
 import math
 import platform
 import platform
-
+from Ansjer.settings import SERVER_TYPE
+# SERVER_TYPE = 'local'
 
 
 class mongodb(object):
 class mongodb(object):
 
 
     def __init__(self):
     def __init__(self):
-        sysstr = platform.system()
-        if (sysstr == "Windows"):
-            myclient = pymongo.MongoClient('mongodb://192.168.136.45:27017/')
-        elif (sysstr == "Linux"):
-            print("Call Linux tasks")
-            myclient = pymongo.MongoClient()
-        self.myclient = myclient
-        self.db = myclient['ansjer']
-        # self.db = myclient['test_ansjer']
+        # sysstr = platform.system()
+        # if (sysstr == "Windows"):
+        #     myclient = pymongo.MongoClient('mongodb://192.168.136.45:27017/')
+        # elif (sysstr == "Linux"):
+        #     print("Call Linux tasks")
+        #     myclient = pymongo.MongoClient()
+        if SERVER_TYPE == 'local':
+            self.myclient = pymongo.MongoClient('mongodb://192.168.136.45:27017/')
+            self.db =  self.myclient['ansjer']
+        elif SERVER_TYPE == 'test':
+            self.myclient = pymongo.MongoClient()
+            self.db =  self.myclient['test_ansjer']
+        elif SERVER_TYPE == 'formal':
+            self.myclient = pymongo.MongoClient()
+            self.db = self.myclient['ansjer']
+
 
 
     def check_db_exist(self, database):
     def check_db_exist(self, database):
         dblist = self.myclient.database_names()
         dblist = self.myclient.database_names()

+ 2 - 2
Service/CommonService.py

@@ -5,9 +5,9 @@ from pyipip import IPIPDatabase
 import redis,time,base64
 import redis,time,base64
 from pathlib import Path
 from pathlib import Path
 from django.utils import timezone
 from django.utils import timezone
-from Ansjer.config import *
+from Ansjer.settings import SERVER_HOST
 from django_global_request.middleware import get_request
 from django_global_request.middleware import get_request
-
+from Ansjer.config import BASE_DIR
 
 
 # 复用性且公用较高封装代码在这
 # 复用性且公用较高封装代码在这
 class CommonService:
 class CommonService:

+ 3 - 1
Service/MiscellService.py

@@ -1,5 +1,6 @@
 from Object.AWS.SesClassObject import SesClassObject
 from Object.AWS.SesClassObject import SesClassObject
-from Ansjer.config import *
+from Ansjer.settings import SERVER_DOMAIN
+from Ansjer.config import SECRET_KEY
 from Service.CommonService import CommonService
 from Service.CommonService import CommonService
 import time, traceback
 import time, traceback
 from Controller.CheckUserData import getRandom, TokenLink
 from Controller.CheckUserData import getRandom, TokenLink
@@ -20,6 +21,7 @@ class MiscellService():
     @staticmethod
     @staticmethod
     def ses_send_email_handle(data={}):
     def ses_send_email_handle(data={}):
         if data['type'] == 'forget':
         if data['type'] == 'forget':
+            print(SECRET_KEY)
             tokenConfirm = TokenLink(SECRET_KEY)
             tokenConfirm = TokenLink(SECRET_KEY)
             redis_key = 'reset_pwd_key' + str(data['useremail'])
             redis_key = 'reset_pwd_key' + str(data['useremail'])
             has_send = CommonService.get_redis_data(key=redis_key)
             has_send = CommonService.get_redis_data(key=redis_key)

+ 0 - 1
Service/ResponseService.py

@@ -21,7 +21,6 @@ def ResponseData(code, res={},*args, **kwargs):
             if dn.exists():
             if dn.exists():
                 if dn[0]['language']:
                 if dn[0]['language']:
                     LANGUAGE = dn[0]['language']
                     LANGUAGE = dn[0]['language']
-    # print(__file__)
     data_en = {
     data_en = {
         0: 'Success',
         0: 'Success',
         4: 'Operation failed',
         4: 'Operation failed',

+ 0 - 0
requirements.txts