Quellcode durchsuchen

新版本提交

chenjunkai vor 7 Jahren
Commit
f723046983
100 geänderte Dateien mit 11402 neuen und 0 gelöschten Zeilen
  1. 27 0
      .idea/AnsjerFormal.iml
  2. 7 0
      .idea/misc.xml
  3. 8 0
      .idea/modules.xml
  4. 816 0
      .idea/workspace.xml
  5. 0 0
      Ansjer/__init__.py
  6. BIN
      Ansjer/__pycache__/__init__.cpython-36.pyc
  7. BIN
      Ansjer/__pycache__/config.cpython-36.pyc
  8. BIN
      Ansjer/__pycache__/settings.cpython-36.pyc
  9. BIN
      Ansjer/__pycache__/urls.cpython-36.pyc
  10. BIN
      Ansjer/__pycache__/wsgi.cpython-36.pyc
  11. 66 0
      Ansjer/config.py
  12. 184 0
      Ansjer/file/log type .txt
  13. 19 0
      Ansjer/file/requirements.txt
  14. 69 0
      Ansjer/file/后台管理系统说明.txt
  15. BIN
      Ansjer/file/表文档.doc
  16. 216 0
      Ansjer/settings.py
  17. BIN
      Ansjer/test/__pycache__/ffmpy.cpython-36.pyc
  18. 155 0
      Ansjer/test/util/email_log.py
  19. 71 0
      Ansjer/test/util/encryDownLoad.py
  20. 60 0
      Ansjer/test/util/mongodb.py
  21. 91 0
      Ansjer/test/util/sql.py
  22. 13 0
      Ansjer/test/util/time.py
  23. 57 0
      Ansjer/test/util/util_jk.py
  24. 5 0
      Ansjer/test/util/var_dump.py
  25. 124 0
      Ansjer/urls.py
  26. 16 0
      Ansjer/wsgi.py
  27. 170 0
      Controller/AccessLog.py
  28. 303 0
      Controller/AdminManage.py
  29. 220 0
      Controller/AppInfo.py
  30. 446 0
      Controller/BatchProcessingDatabase.py
  31. 365 0
      Controller/CheckUserData.py
  32. 113 0
      Controller/DeviceLog.py
  33. 177 0
      Controller/DeviceManage.py
  34. 339 0
      Controller/DeviceMeal.py
  35. 53 0
      Controller/DownloadController.py
  36. 249 0
      Controller/EquipmentInfo.py
  37. 389 0
      Controller/EquipmentManager.py
  38. 148 0
      Controller/EquipmentOTA.py
  39. 218 0
      Controller/EquipmentSensor.py
  40. 89 0
      Controller/EquipmentStatus.py
  41. 196 0
      Controller/FeedBackInfo.py
  42. 242 0
      Controller/HlsManage.py
  43. 64 0
      Controller/LogAccess.py
  44. 226 0
      Controller/LogManager.py
  45. 203 0
      Controller/MealManage.py
  46. 540 0
      Controller/OTAEquipment.py
  47. 286 0
      Controller/OauthManage.py
  48. 788 0
      Controller/PermissionManager.py
  49. 632 0
      Controller/StreamMedia.py
  50. 56 0
      Controller/SysManage.py
  51. 77 0
      Controller/Test.py
  52. 562 0
      Controller/UserController.py
  53. 469 0
      Controller/UserManger.py
  54. BIN
      Controller/__pycache__/AccessLog.cpython-36.pyc
  55. BIN
      Controller/__pycache__/AccessLog.cpython-36.pyc.2410490088496
  56. BIN
      Controller/__pycache__/AdminManage.cpython-36.pyc
  57. BIN
      Controller/__pycache__/AppInfo.cpython-36.pyc
  58. BIN
      Controller/__pycache__/BatchProcessingDatabase.cpython-36.pyc
  59. BIN
      Controller/__pycache__/CheckUserData.cpython-36.pyc
  60. BIN
      Controller/__pycache__/DeviceLog.cpython-36.pyc
  61. BIN
      Controller/__pycache__/DeviceManage.cpython-36.pyc
  62. BIN
      Controller/__pycache__/DeviceMeal.cpython-36.pyc
  63. BIN
      Controller/__pycache__/EquipmentInfo.cpython-36.pyc
  64. BIN
      Controller/__pycache__/EquipmentManager.cpython-36.pyc
  65. BIN
      Controller/__pycache__/EquipmentOTA.cpython-36.pyc
  66. BIN
      Controller/__pycache__/EquipmentSensor.cpython-36.pyc
  67. BIN
      Controller/__pycache__/EquipmentStatus.cpython-36.pyc
  68. BIN
      Controller/__pycache__/FeedBackInfo.cpython-36.pyc
  69. BIN
      Controller/__pycache__/HlsManage.cpython-36.pyc
  70. BIN
      Controller/__pycache__/LogAccess.cpython-36.pyc
  71. BIN
      Controller/__pycache__/LogManager.cpython-36.pyc
  72. BIN
      Controller/__pycache__/MealManage.cpython-36.pyc
  73. BIN
      Controller/__pycache__/OTAEquipment.cpython-36.pyc
  74. BIN
      Controller/__pycache__/OauthManage.cpython-36.pyc
  75. BIN
      Controller/__pycache__/PermissionManager.cpython-36.pyc
  76. BIN
      Controller/__pycache__/StreamMedia.cpython-36.pyc
  77. BIN
      Controller/__pycache__/SysManage.cpython-36.pyc
  78. BIN
      Controller/__pycache__/Test.cpython-36.pyc
  79. BIN
      Controller/__pycache__/UserController.cpython-36.pyc
  80. BIN
      Controller/__pycache__/UserManger.cpython-36.pyc
  81. BIN
      Controller/__pycache__/shareUserPermission.cpython-36.pyc
  82. 403 0
      Controller/shareUserPermission.py
  83. BIN
      DB/17monipdb.dat
  84. 5 0
      DB/data.json
  85. 2 0
      DB/data.sql
  86. 0 0
      Model/__init__.py
  87. BIN
      Model/__pycache__/__init__.cpython-36.pyc
  88. BIN
      Model/__pycache__/admin.cpython-36.pyc
  89. BIN
      Model/__pycache__/models.cpython-36.pyc
  90. 5 0
      Model/admin.py
  91. 4 0
      Model/apps.py
  92. 399 0
      Model/migrations/0001_initial.py
  93. 0 0
      Model/migrations/__init__.py
  94. BIN
      Model/migrations/__pycache__/0001_initial.cpython-36.pyc
  95. BIN
      Model/migrations/__pycache__/__init__.cpython-36.pyc
  96. 581 0
      Model/models.py
  97. 105 0
      Object/AWS/CloudfrontSignCookie.py
  98. 43 0
      Object/AWS/CloudfrontSignUrl.py
  99. 46 0
      Object/AWS/ElasticTranscoder.py
  100. 185 0
      Object/AWS/S3ClassObject.py

+ 27 - 0
.idea/AnsjerFormal.iml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="PYTHON_MODULE" version="4">
+  <component name="FacetManager">
+    <facet type="django" name="Django">
+      <configuration>
+        <option name="rootFolder" value="$MODULE_DIR$" />
+        <option name="settingsModule" value="Ansjer/settings.py" />
+        <option name="manageScript" value="$MODULE_DIR$/manage.py" />
+        <option name="environment" value="&lt;map/&gt;" />
+        <option name="doNotUseTestRunner" value="false" />
+        <option name="trackFilePattern" value="migrations" />
+      </configuration>
+    </facet>
+  </component>
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$" />
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+  <component name="TemplatesService">
+    <option name="TEMPLATE_CONFIGURATION" value="Django" />
+  </component>
+  <component name="TestRunnerService">
+    <option name="projectConfiguration" value="py.test" />
+    <option name="PROJECT_TEST_RUNNER" value="py.test" />
+  </component>
+</module>

+ 7 - 0
.idea/misc.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="JavaScriptSettings">
+    <option name="languageLevel" value="ES6" />
+  </component>
+  <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.6" project-jdk-type="Python SDK" />
+</project>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/AnsjerFormal.iml" filepath="$PROJECT_DIR$/.idea/AnsjerFormal.iml" />
+    </modules>
+  </component>
+</project>

+ 816 - 0
.idea/workspace.xml

@@ -0,0 +1,816 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ChangeListManager">
+    <list default="true" id="f832eaab-acfa-4d84-99b0-aa8cb529c6e4" name="Default" comment="" />
+    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+    <option name="TRACKING_ENABLED" value="true" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="CoverageDataManager">
+    <SUITE FILE_PATH="coverage/AnsjerFormal$var_dump.coverage" NAME="var_dump Coverage Results" MODIFIED="1536715899098" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/Ansjer/test/util" />
+  </component>
+  <component name="FileEditorManager">
+    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
+      <file leaf-file-name="UserController.py" pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/Controller/UserController.py">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="320">
+              <caret line="553" column="28" selection-start-line="553" selection-start-column="28" selection-end-line="553" selection-end-column="28" />
+              <folding>
+                <element signature="e#311#342#0" expanded="true" />
+                <element signature="e#3045#3912#0" />
+                <element signature="e#7208#11275#0" />
+                <element signature="e#11235#14641#0" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="CommonService.py" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/Service/CommonService.py">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="198">
+              <caret line="11" lean-forward="true" selection-start-line="11" selection-end-line="11" />
+              <folding>
+                <element signature="e#24#49#0" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="config.py" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/Ansjer/config.py">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="169">
+              <caret line="32" column="52" lean-forward="true" selection-start-line="32" selection-start-column="52" selection-end-line="32" selection-end-column="52" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="settings.py" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/Ansjer/settings.py">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="72">
+              <caret line="4" column="20" lean-forward="true" selection-start-line="4" selection-start-column="20" selection-end-line="4" selection-end-column="20" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="TokenObject.py" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/Object/TokenObject.py">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="186">
+              <caret line="44" column="8" selection-start-line="44" selection-start-column="8" selection-end-line="44" selection-end-column="8" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="urls.py" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/Ansjer/urls.py">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="252">
+              <caret line="12" column="26" selection-start-line="12" selection-start-column="26" selection-end-line="12" selection-end-column="26" />
+              <folding>
+                <element signature="e#0#32#0" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="ResponseObject.py" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/Object/ResponseObject.py">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="-7">
+              <caret line="179" column="28" selection-start-line="179" selection-start-column="18" selection-end-line="179" selection-end-column="28" />
+              <folding>
+                <element signature="e#0#41#0" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="SesClassObject.py" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/Object/AWS/SesClassObject.py">
+          <provider selected="true" editor-type-id="text-editor">
+            <state>
+              <caret column="89" selection-start-column="89" selection-end-column="89" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="models.py" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/Model/models.py">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="440">
+              <caret line="161" column="13" selection-start-line="161" selection-start-column="4" selection-end-line="161" selection-end-column="13" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file leaf-file-name="RedisObject.py" pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/Object/RedisObject.py">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="295">
+              <caret line="51" selection-start-line="51" selection-end-line="51" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+    </leaf>
+  </component>
+  <component name="FileTemplateManagerImpl">
+    <option name="RECENT_TEMPLATES">
+      <list>
+        <option value="Python Script" />
+      </list>
+    </option>
+  </component>
+  <component name="FindInProjectRecents">
+    <findStrings>
+      <find>response.j</find>
+      <find>request.POST</find>
+      <find>request</find>
+      <find>request.GET</find>
+      <find>userEmail</find>
+      <find>check_password</find>
+      <find>reds</find>
+      <find>delete</find>
+      <find>del_data</find>
+    </findStrings>
+    <replaceStrings>
+      <replace>request_dict</replace>
+    </replaceStrings>
+  </component>
+  <component name="IdeDocumentHistory">
+    <option name="CHANGED_PATHS">
+      <list>
+        <option value="$PROJECT_DIR$/Controller/OTAEquipment.py" />
+        <option value="$PROJECT_DIR$/Object/TokenObject1.py" />
+        <option value="$PROJECT_DIR$/Controller/AccountController.py" />
+        <option value="$PROJECT_DIR$/Object/AWS/SesClassObject.py" />
+        <option value="$PROJECT_DIR$/Service/TemplateService.py" />
+        <option value="$PROJECT_DIR$/Ansjer/test/util/var_dump.py" />
+        <option value="$PROJECT_DIR$/Object/TokenObject.py" />
+        <option value="$PROJECT_DIR$/Ansjer/config.py" />
+        <option value="$PROJECT_DIR$/Ansjer/urls.py" />
+        <option value="$PROJECT_DIR$/Object/RedisObject.py" />
+        <option value="$PROJECT_DIR$/Service/CommonService.py" />
+        <option value="$PROJECT_DIR$/Ansjer/settings.py" />
+        <option value="$PROJECT_DIR$/Controller/UserController.py" />
+      </list>
+    </option>
+  </component>
+  <component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
+  <component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
+  <component name="JsGulpfileManager">
+    <detection-done>true</detection-done>
+    <sorting>DEFINITION_ORDER</sorting>
+  </component>
+  <component name="NodePackageJsonFileManager">
+    <packageJsonPaths />
+  </component>
+  <component name="ProjectFrameBounds" extendedState="6">
+    <option name="x" value="-7" />
+    <option name="width" value="814" />
+    <option name="height" value="877" />
+  </component>
+  <component name="ProjectView">
+    <navigator proportions="" version="1">
+      <foldersAlwaysOnTop value="true" />
+    </navigator>
+    <panes>
+      <pane id="Scope" />
+      <pane id="ProjectPane">
+        <subPane>
+          <expand>
+            <path>
+              <item name="AnsjerFormal" type="b2602c69:ProjectViewProjectNode" />
+              <item name="AnsjerFormal" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="AnsjerFormal" type="b2602c69:ProjectViewProjectNode" />
+              <item name="AnsjerFormal" type="462c0819:PsiDirectoryNode" />
+              <item name="Ansjer" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="AnsjerFormal" type="b2602c69:ProjectViewProjectNode" />
+              <item name="AnsjerFormal" type="462c0819:PsiDirectoryNode" />
+              <item name="Ansjer" type="462c0819:PsiDirectoryNode" />
+              <item name="test" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="AnsjerFormal" type="b2602c69:ProjectViewProjectNode" />
+              <item name="AnsjerFormal" type="462c0819:PsiDirectoryNode" />
+              <item name="Ansjer" type="462c0819:PsiDirectoryNode" />
+              <item name="test" type="462c0819:PsiDirectoryNode" />
+              <item name="util" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="AnsjerFormal" type="b2602c69:ProjectViewProjectNode" />
+              <item name="AnsjerFormal" type="462c0819:PsiDirectoryNode" />
+              <item name="Controller" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="AnsjerFormal" type="b2602c69:ProjectViewProjectNode" />
+              <item name="AnsjerFormal" type="462c0819:PsiDirectoryNode" />
+              <item name="Model" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="AnsjerFormal" type="b2602c69:ProjectViewProjectNode" />
+              <item name="AnsjerFormal" type="462c0819:PsiDirectoryNode" />
+              <item name="Object" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="AnsjerFormal" type="b2602c69:ProjectViewProjectNode" />
+              <item name="AnsjerFormal" type="462c0819:PsiDirectoryNode" />
+              <item name="Object" type="462c0819:PsiDirectoryNode" />
+              <item name="AWS" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="AnsjerFormal" type="b2602c69:ProjectViewProjectNode" />
+              <item name="AnsjerFormal" type="462c0819:PsiDirectoryNode" />
+              <item name="Service" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="AnsjerFormal" type="b2602c69:ProjectViewProjectNode" />
+              <item name="AnsjerFormal" type="462c0819:PsiDirectoryNode" />
+              <item name="static" type="462c0819:PsiDirectoryNode" />
+            </path>
+          </expand>
+          <select />
+        </subPane>
+      </pane>
+    </panes>
+  </component>
+  <component name="PropertiesComponent">
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$" />
+    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
+    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
+    <property name="settings.editor.selected.configurable" value="configurable.group.appearance" />
+  </component>
+  <component name="RecentsManager">
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="D:\13.56.215.252\AnsjerFormal\Object" />
+    </key>
+  </component>
+  <component name="RunDashboard">
+    <option name="ruleStates">
+      <list>
+        <RuleState>
+          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
+        </RuleState>
+        <RuleState>
+          <option name="name" value="StatusDashboardGroupingRule" />
+        </RuleState>
+      </list>
+    </option>
+  </component>
+  <component name="RunManager" selected="Django server.AnsjerFormal">
+    <configuration name="var_dump" type="PythonConfigurationType" factoryName="Python" temporary="true">
+      <module name="AnsjerFormal" />
+      <option name="INTERPRETER_OPTIONS" value="" />
+      <option name="PARENT_ENVS" value="true" />
+      <envs>
+        <env name="PYTHONUNBUFFERED" value="1" />
+      </envs>
+      <option name="SDK_HOME" value="" />
+      <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/Ansjer/test/util" />
+      <option name="IS_MODULE_SDK" value="true" />
+      <option name="ADD_CONTENT_ROOTS" value="true" />
+      <option name="ADD_SOURCE_ROOTS" value="true" />
+      <EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
+      <option name="SCRIPT_NAME" value="$PROJECT_DIR$/Ansjer/test/util/var_dump.py" />
+      <option name="PARAMETERS" value="" />
+      <option name="SHOW_COMMAND_LINE" value="false" />
+      <option name="EMULATE_TERMINAL" value="false" />
+      <option name="MODULE_MODE" value="false" />
+    </configuration>
+    <configuration name="AnsjerFormal" type="Python.DjangoServer" factoryName="Django server">
+      <module name="AnsjerFormal" />
+      <option name="INTERPRETER_OPTIONS" value="" />
+      <option name="PARENT_ENVS" value="true" />
+      <envs>
+        <env name="PYTHONUNBUFFERED" value="1" />
+        <env name="DJANGO_SETTINGS_MODULE" value="Ansjer.settings" />
+      </envs>
+      <option name="SDK_HOME" value="C:\ProgramData\Anaconda3\python.exe" />
+      <option name="WORKING_DIRECTORY" value="" />
+      <option name="IS_MODULE_SDK" value="false" />
+      <option name="ADD_CONTENT_ROOTS" value="true" />
+      <option name="ADD_SOURCE_ROOTS" value="true" />
+      <option name="launchJavascriptDebuger" value="false" />
+      <option name="port" value="1356" />
+      <option name="host" value="192.168.136.40" />
+      <option name="additionalOptions" value="" />
+      <option name="browserUrl" value="" />
+      <option name="runTestServer" value="false" />
+      <option name="runNoReload" value="false" />
+      <option name="useCustomRunCommand" value="false" />
+      <option name="customRunCommand" value="" />
+    </configuration>
+    <list>
+      <item itemvalue="Django server.AnsjerFormal" />
+      <item itemvalue="Python.var_dump" />
+    </list>
+    <recent_temporary>
+      <list>
+        <item itemvalue="Python.var_dump" />
+      </list>
+    </recent_temporary>
+  </component>
+  <component name="SvnConfiguration">
+    <configuration />
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="f832eaab-acfa-4d84-99b0-aa8cb529c6e4" name="Default" comment="" />
+      <created>1536649215311</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1536649215311</updated>
+    </task>
+    <servers />
+  </component>
+  <component name="ToolWindowManager">
+    <frame x="-8" y="-8" width="1616" height="886" extended-state="6" />
+    <editor active="true" />
+    <layout>
+      <window_info anchor="bottom" id="TODO" order="7" sideWeight="0.49485862" weight="0.32440946" />
+      <window_info anchor="bottom" id="Event Log" order="9" sideWeight="0.4730077" side_tool="true" weight="0.1849315" />
+      <window_info anchor="bottom" id="Database Changes" order="16" show_stripe_button="false" />
+      <window_info anchor="bottom" id="Version Control" order="13" show_stripe_button="false" sideWeight="0.49485862" weight="0.2109589" />
+      <window_info anchor="bottom" id="Python Console" order="12" sideWeight="0.49485862" weight="0.16692914" />
+      <window_info anchor="bottom" id="Run" order="3" sideWeight="0.52699226" visible="true" weight="0.1630137" />
+      <window_info anchor="right" id="Mongo Explorer" order="8" />
+      <window_info anchor="bottom" id="Terminal" order="11" sideWeight="0.55205655" weight="0.5284327" />
+      <window_info active="true" content_ui="combo" id="Project" order="0" sideWeight="0.493007" visible="true" weight="0.20951156" />
+      <window_info anchor="bottom" id="Docker" order="14" show_stripe_button="false" />
+      <window_info anchor="right" id="Database" order="7" weight="0.2689243" />
+      <window_info anchor="right" id="SciView" order="6" weight="0.32969153" />
+      <window_info anchor="bottom" id="Structure" order="8" sideWeight="0.39138818" side_tool="true" weight="0.2" />
+      <window_info id="Favorites" order="1" sideWeight="0.506993" side_tool="true" weight="0.17771883" />
+      <window_info anchor="bottom" id="Debug" order="4" sideWeight="0.48716304" weight="0.2109589" />
+      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
+      <window_info anchor="right" id="Data View" order="5" weight="0.2583213" />
+      <window_info anchor="right" id="Commander" order="0" weight="0.4" />
+      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
+      <window_info anchor="right" id="R Graphics" order="4" />
+      <window_info anchor="right" id="R Packages" order="3" />
+      <window_info anchor="bottom" id="Find" order="2" weight="0.32891247" />
+      <window_info anchor="bottom" id="TeamCity" order="10" sideWeight="0.4969088" weight="0.32911393" />
+      <window_info anchor="bottom" id="Inspection" order="6" weight="0.4" />
+      <window_info anchor="bottom" id="Cvs" order="5" weight="0.25" />
+      <window_info anchor="bottom" id="Message" order="1" />
+      <window_info anchor="bottom" id="Messages" order="0" weight="0.32996634" />
+      <window_info anchor="bottom" id="Concurrent Activities Diagram" order="15" weight="0.3260274" />
+    </layout>
+    <layout-to-restore>
+      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
+      <window_info anchor="right" id="Mongo Explorer" order="8" />
+      <window_info anchor="bottom" id="Docker" order="13" show_stripe_button="false" />
+      <window_info anchor="bottom" id="Version Control" order="12" show_stripe_button="false" sideWeight="0.49485862" weight="0.2109589" />
+      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
+      <window_info anchor="bottom" id="Cvs" order="5" weight="0.25" />
+      <window_info active="true" content_ui="combo" id="Project" order="0" sideWeight="0.493007" visible="true" weight="0.20954907" />
+      <window_info anchor="bottom" id="Structure" order="8" sideWeight="0.39138818" side_tool="true" weight="0.2" />
+      <window_info anchor="right" id="Commander" order="0" weight="0.4" />
+      <window_info anchor="bottom" id="TODO" order="7" sideWeight="0.49485862" weight="0.32440946" />
+      <window_info anchor="bottom" id="Database Changes" order="16" show_stripe_button="false" />
+      <window_info anchor="right" id="R Graphics" order="4" />
+      <window_info anchor="bottom" id="Run" order="3" sideWeight="0.52699226" weight="0.3509015" />
+      <window_info anchor="right" id="Data View" order="5" weight="0.2583213" />
+      <window_info anchor="bottom" id="Python Console" order="11" sideWeight="0.49485862" weight="0.16692914" />
+      <window_info anchor="bottom" id="Message" order="1" />
+      <window_info anchor="bottom" id="Debug" order="4" sideWeight="0.48716304" weight="0.2109589" />
+      <window_info anchor="bottom" id="TeamCity" order="10" sideWeight="0.4969088" weight="0.32911393" />
+      <window_info anchor="right" id="Database" order="7" weight="0.2689243" />
+      <window_info anchor="bottom" id="Terminal" order="14" sideWeight="0.55205655" weight="0.530137" />
+      <window_info anchor="bottom" id="Event Log" order="9" sideWeight="0.4730077" side_tool="true" weight="0.1849315" />
+      <window_info anchor="bottom" id="Inspection" order="6" weight="0.4" />
+      <window_info anchor="right" id="SciView" order="6" weight="0.32969153" />
+      <window_info anchor="right" id="R Packages" order="3" />
+      <window_info anchor="bottom" id="Find" order="2" weight="0.32891247" />
+      <window_info anchor="bottom" id="Messages" order="0" weight="0.32996634" />
+      <window_info anchor="bottom" id="Concurrent Activities Diagram" order="15" weight="0.3260274" />
+      <window_info id="Favorites" order="1" sideWeight="0.506993" side_tool="true" weight="0.17771883" />
+    </layout-to-restore>
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="1" />
+  </component>
+  <component name="VcsContentAnnotationSettings">
+    <option name="myLimit" value="2678400000" />
+  </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager>
+      <option name="time" value="5" />
+    </breakpoint-manager>
+  </component>
+  <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/Controller/OTAEquipment.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1494">
+          <caret line="83" column="31" selection-start-line="83" selection-start-column="31" selection-end-line="83" selection-end-column="31" />
+          <folding>
+            <element signature="e#0#22#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/TokenObject.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="396">
+          <caret line="24" column="22" selection-start-line="24" selection-start-column="22" selection-end-line="24" selection-end-column="22" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/PermissionManager.py">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/UserManger.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="486">
+          <caret line="338" selection-start-line="338" selection-end-line="338" />
+          <folding>
+            <element signature="e#849#2831#0" />
+            <element signature="e#2970#8040#0" />
+            <element signature="e#8082#9236#0" />
+            <element signature="e#9287#11727#0" />
+            <element signature="e#11783#13513#0" />
+            <element signature="e#13555#14381#0" />
+            <element signature="e#14436#15381#0" />
+            <element signature="e#15418#19382#0" />
+            <element signature="e#19424#19455#0" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/ResponseObject.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="3492">
+          <caret line="194" column="29" lean-forward="true" selection-start-line="194" selection-start-column="29" selection-end-line="194" selection-end-column="29" />
+          <folding>
+            <element signature="e#0#41#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Model/models.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="2718">
+          <caret line="161" column="13" selection-start-line="161" selection-start-column="4" selection-end-line="161" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/AWS/SesClassObject.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state>
+          <caret column="89" selection-start-column="89" selection-end-column="89" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Service/TemplateService.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state>
+          <folding>
+            <element signature="e#392#1974#0" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/RedisObject.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="378">
+          <caret line="22" column="8" selection-start-line="22" selection-start-column="8" selection-end-line="22" selection-end-column="8" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/UserController.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="2142">
+          <caret line="119" column="7" selection-start-line="119" selection-start-column="7" selection-end-line="119" selection-end-column="7" />
+          <folding>
+            <element signature="e#311#342#0" expanded="true" />
+            <element signature="e#3045#3912#0" />
+            <element signature="e#7208#11275#0" />
+            <element signature="e#11235#14641#0" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/OTAEquipment.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1206">
+          <caret line="83" column="31" selection-start-line="83" selection-start-column="31" selection-end-line="83" selection-end-column="31" />
+          <folding>
+            <element signature="e#0#22#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/TokenObject.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="396">
+          <caret line="24" column="22" selection-start-line="24" selection-start-column="22" selection-end-line="24" selection-end-column="22" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/PermissionManager.py">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/UserManger.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="486">
+          <caret line="338" selection-start-line="338" selection-end-line="338" />
+          <folding>
+            <element signature="e#849#2831#0" />
+            <element signature="e#2970#8040#0" />
+            <element signature="e#8082#9236#0" />
+            <element signature="e#9287#11727#0" />
+            <element signature="e#11783#13513#0" />
+            <element signature="e#13555#14381#0" />
+            <element signature="e#14436#15381#0" />
+            <element signature="e#15418#19382#0" />
+            <element signature="e#19424#19455#0" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/ResponseObject.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="3474">
+          <caret line="194" column="29" lean-forward="true" selection-start-line="194" selection-start-column="29" selection-end-line="194" selection-end-column="29" />
+          <folding>
+            <element signature="e#0#41#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Model/models.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="2718">
+          <caret line="161" column="13" selection-start-line="161" selection-start-column="4" selection-end-line="161" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/AWS/SesClassObject.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state>
+          <caret column="89" selection-start-column="89" selection-end-column="89" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Service/TemplateService.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state>
+          <folding>
+            <element signature="e#392#1974#0" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/RedisObject.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="378">
+          <caret line="22" column="8" selection-start-line="22" selection-start-column="8" selection-end-line="22" selection-end-column="8" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/UserController.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1710">
+          <caret line="119" column="7" selection-start-line="119" selection-start-column="7" selection-end-line="119" selection-end-column="7" />
+          <folding>
+            <element signature="e#311#342#0" expanded="true" />
+            <element signature="e#3045#3912#0" />
+            <element signature="e#7208#11275#0" />
+            <element signature="e#11235#14641#0" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/AccessLog.py">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/DeviceManage.py">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/OTAEquipment.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1494">
+          <caret line="83" column="31" lean-forward="true" selection-start-line="83" selection-start-column="31" selection-end-line="83" selection-end-column="31" />
+          <folding>
+            <element signature="e#0#22#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/TokenObject.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="396">
+          <caret line="24" column="22" selection-start-line="24" selection-start-column="22" selection-end-line="24" selection-end-column="22" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/PermissionManager.py">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/UserManger.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="486">
+          <caret line="338" selection-start-line="338" selection-end-line="338" />
+          <folding>
+            <element signature="e#849#2831#0" />
+            <element signature="e#2970#8040#0" />
+            <element signature="e#8082#9236#0" />
+            <element signature="e#9287#11727#0" />
+            <element signature="e#11783#13513#0" />
+            <element signature="e#13555#14381#0" />
+            <element signature="e#14436#15381#0" />
+            <element signature="e#15418#19382#0" />
+            <element signature="e#19424#19455#0" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/UserController.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="234">
+          <caret line="13" lean-forward="true" selection-start-line="13" selection-end-line="13" />
+          <folding>
+            <element signature="e#311#342#0" expanded="true" />
+            <element signature="e#3045#3912#0" />
+            <element signature="e#7208#11275#0" />
+            <element signature="e#11235#14641#0" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/AccessLog.py">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/DeviceManage.py">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/TokenObject2.py" />
+    <entry file="file://$PROJECT_DIR$/Controller/OTAEquipment.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1494">
+          <caret line="83" column="31" selection-start-line="83" selection-start-column="31" selection-end-line="83" selection-end-column="31" />
+          <folding>
+            <element signature="e#0#22#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/TokenObject1.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="587">
+          <caret line="41" lean-forward="true" selection-start-line="41" selection-end-line="50" selection-end-column="19" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/PermissionManager.py">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/AccountController.py" />
+    <entry file="file://$PROJECT_DIR$/Service/TemplateService.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="7992">
+          <caret line="411" column="29" selection-start-line="411" selection-start-column="29" selection-end-line="411" selection-end-column="29" />
+          <folding>
+            <element signature="e#392#1974#0" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Ansjer/test/util/var_dump.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="72">
+          <caret line="4" column="12" lean-forward="true" selection-start-line="4" selection-start-column="12" selection-end-line="4" selection-end-column="12" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/UserManger.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="234">
+          <caret line="191" lean-forward="true" selection-start-line="191" selection-end-line="191" />
+          <folding>
+            <element signature="e#849#2831#0" />
+            <element signature="e#2970#8040#0" />
+            <element signature="e#8082#9236#0" />
+            <element signature="e#9287#11727#0" />
+            <element signature="e#11783#13513#0" />
+            <element signature="e#13555#14381#0" />
+            <element signature="e#14436#15381#0" />
+            <element signature="e#15418#19382#0" />
+            <element signature="e#19424#19455#0" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/CheckUserData.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-207">
+          <caret line="102" column="8" selection-start-line="102" selection-start-column="8" selection-end-line="102" selection-end-column="8" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Service/MiscellService.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="216">
+          <caret line="28" column="34" selection-start-line="28" selection-start-column="34" selection-end-line="28" selection-end-column="34" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/TokenObject.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="186">
+          <caret line="44" column="8" selection-start-line="44" selection-start-column="8" selection-end-line="44" selection-end-column="8" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Ansjer/config.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="169">
+          <caret line="32" column="52" lean-forward="true" selection-start-line="32" selection-start-column="52" selection-end-line="32" selection-end-column="52" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Ansjer/urls.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="252">
+          <caret line="12" column="26" selection-start-line="12" selection-start-column="26" selection-end-line="12" selection-end-column="26" />
+          <folding>
+            <element signature="e#0#32#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/AWS/SesClassObject.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state>
+          <caret column="89" selection-start-column="89" selection-end-column="89" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Model/models.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="440">
+          <caret line="161" column="13" selection-start-line="161" selection-start-column="4" selection-end-line="161" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/RedisObject.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="295">
+          <caret line="51" selection-start-line="51" selection-end-line="51" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Object/ResponseObject.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="-7">
+          <caret line="179" column="28" selection-start-line="179" selection-start-column="18" selection-end-line="179" selection-end-column="28" />
+          <folding>
+            <element signature="e#0#41#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Service/CommonService.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="198">
+          <caret line="11" lean-forward="true" selection-start-line="11" selection-end-line="11" />
+          <folding>
+            <element signature="e#24#49#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Ansjer/settings.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="72">
+          <caret line="4" column="20" lean-forward="true" selection-start-line="4" selection-start-column="20" selection-end-line="4" selection-end-column="20" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/Controller/UserController.py">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="320">
+          <caret line="553" column="28" selection-start-line="553" selection-start-column="28" selection-end-line="553" selection-end-column="28" />
+          <folding>
+            <element signature="e#311#342#0" expanded="true" />
+            <element signature="e#3045#3912#0" />
+            <element signature="e#7208#11275#0" />
+            <element signature="e#11235#14641#0" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+  </component>
+</project>

+ 0 - 0
Ansjer/__init__.py


BIN
Ansjer/__pycache__/__init__.cpython-36.pyc


BIN
Ansjer/__pycache__/config.cpython-36.pyc


BIN
Ansjer/__pycache__/settings.cpython-36.pyc


BIN
Ansjer/__pycache__/urls.cpython-36.pyc


BIN
Ansjer/__pycache__/wsgi.cpython-36.pyc


+ 66 - 0
Ansjer/config.py

@@ -0,0 +1,66 @@
+#!/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/7/2 14:06
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: Conf.py
+@Contact: chanjunkai@163.com
+"""
+#主要静态变量配置文件
+import datetime
+from Ansjer.settings import SERVER_TYPE
+
+
+# 发送邮件邮箱
+COMPANY_EMAIL = 'user_server@nsst.com'
+AWS_ACCESS_ID = 'AKIAJKPU23EU5QWHFPKQ'
+AWS_ACCESS_SECRET = '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'
+AWS_ACCESS_REGION = 'us-east-1'
+AWS_BUCKET = 'ansjertest'
+# 设定离线时间为5分钟
+OFF_LINE_TIME_DELTA = 5
+
+# token的secret
+OAUTH_ACCESS_TOKEN_SECRET = 'a+jbgnw%@1%zy^=@dn62%'
+OAUTH_REFRESH_TOKEN_SECRET = 'r+jbgnw%@1%zy^=@dn62%'
+# access_token超时
+# OAUTH_ACCESS_TOKEN_TIME = datetime.timedelta(hours=1)
+OAUTH_ACCESS_TOKEN_TIME = datetime.timedelta(days=3)
+# refresh_token超时
+OAUTH_REFRESH_TOKEN_TIME = datetime.timedelta(days=3)
+# 腾讯验证,短信发送
+TX_PHONE_APP_ID = '1400052907'
+TX_PHONE_APP_KEY= '7705976ca6e85fe7b86d6bc2d11f7783'
+
+#验证码超时时间
+AuthCode_Expire = 600
+
+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'
+    DOMAIN_OAUTH_URI = 'http://192.168.136.45:7088/'
+    DOMAIN_RESOURCE_URI = 'http://192.168.136.45:8077/'
+elif SERVER_TYPE == 'test':
+    NGINX_RTMP_STAT = 'http://13.56.215.252:82/stat'
+    SERVER_DOMAIN = 'https://www.dvema.com:8222'
+    DATABASE_DATA = 'AnsjerTest'
+    SERVER_HOST = 'localhost'
+    RTMP_PUSH_URL = 'http://13.56.215.252:8091/hls'
+    DOMAIN_OAUTH_URI = 'https://www.dvema.com:8022/'
+    DOMAIN_RESOURCE_URI = 'https://www.dvema.com:8222/'
+elif SERVER_TYPE == 'formal':
+    NGINX_RTMP_STAT = 'http://13.56.215.252:81/stat'
+    SERVER_DOMAIN = 'https://www.dvema.com:8111'
+    DATABASE_DATA = 'Ansjer81'
+    SERVER_HOST = 'localhost'
+    RTMP_PUSH_URL = 'http://13.56.215.252:8091/hls'
+    DOMAIN_OAUTH_URI = 'https://www.dvema.com:8011/'
+    DOMAIN_RESOURCE_URI = 'https://www.dvema.com:8111/'

+ 184 - 0
Ansjer/file/log type .txt

@@ -0,0 +1,184 @@
+typedef enum _log_type
+{
+	//系统控制(Control)
+	LOG_TYPE_SYSTEM_CTRL		= 0x00010000,
+	LOG_TYPE_BOOT,							//系统开机
+	LOG_TYPE_SHUTDOWN,						//系统关机
+	LOG_TYPE_REBOOT,						//系统重启
+	LOG_TYPE_FORMAT_SUCC,					//格式化磁盘成功
+	LOG_TYPE_FORMAT_FAIL,					//格式化磁盘失败
+	LOG_TYPE_UPGRADE_SUCC,					//升级成功
+	LOG_TYPE_UPGRADE_FAIL,					//升级失败
+	LOG_TYPE_CLEAR_ALARM,					//清除报警
+	LOG_TYPE_OPEN_ALARM,					//开启报警
+	LOG_TYPE_MANUAL_START,					//开启手动录像
+	LOG_TYPE_MANUAL_STOP,					//停止手动录像
+	LOG_TYPE_PTZ_ENTER,						//开始云台控制
+	LOG_TYPE_PTZ_CTRL,						//云台操作
+	LOG_TYPE_PTZ_EXIT,						//结束云台控制
+	LOG_TYPE_AUDIO_CH_CHANGE,				//改变现场音频通道
+	LOG_TYPE_VOLUME_ADJUST,					//调节音量
+	LOG_TYPE_MUTE_ENABLE,					//开启静音
+	LOG_TYPE_MUTE_DISENABLE,				//关闭静音
+	LOG_TYPE_DWELL_ENABLE,					//开启轮循
+	LOG_TYPE_DWELL_DISENABLE,				//关闭轮循
+	LOG_TYPE_LOG_IN,						//登录
+	LOG_TYPE_LOG_OFF,						//登出
+	LOG_TYPE_CHANGE_TIME,					//修改系统时间
+	LOG_TYPE_MANUAL_SNAP_SUCC,               //手动抓图成功
+	LOG_TYPE_MANUAL_SNAP_FAIL,               //手动抓图失败
+
+	//系统配置(Setup)
+	LOG_TYPE_CONFIG			= 0x00020000,
+	LOG_TYPE_CHGE_VIDEO_FORMAT,				//改变视频制式
+	LOG_TYPE_CHGE_VGA_RESOLUTION,			//改变显示器分辨率
+	LOG_TYPE_CHGE_LANGUAGE,					//调整语言
+	LOG_TYPE_CHGE_NET_USER_NUM,				//调整网络用户数目
+	LOG_TYPE_CHGE_TIME_ZONE,				//调整时区
+	LOG_TYPE_NTP_MANUAL,					//手动网络校时
+	LOG_TYPE_NTP_ON,						//开启自动网络校时
+	LOG_TYPE_NTP_OFF,						//关闭自动网络校时
+	LOG_TYPE_CHGE_NTP_SERVER,				//修改网络时间服务器地址
+	LOG_TYPE_CHGE_DST,						//调整夏令时设置
+	LOG_TYPE_PASSWD_ON,						//开启操作密码
+	LOG_TYPE_PASSWD_OFF,					//关闭操作密码
+
+	LOG_TYPE_CHGE_CAM_NAME,					//调整通道名称
+	LOG_TYPE_MODIFY_COLOR,					//调整图像色彩
+	LOG_TYPE_CHGE_HOST_MONITOR,				//调整主监视器画面设置
+	LOG_TYPE_CHGE_SPOT,						//调整辅助输出画面设置
+	LOG_TYPE_CHGE_OSD,						//调整字符叠加设置
+
+	LOG_TYPE_CHGE_LOCAL_ENCODE,				//调整录像流编码参数
+	LOG_TYPE_CHGE_REC_VIDEO_SWITCH,			//调整录像开关设置
+	LOG_TYPE_CHGE_REC_AUDIO_SWITCH,			//调整录制音频开关设置
+	LOG_TYPE_CHGE_REC_REDU_SWITCH,			//调整冗余录像开关设置
+	LOG_TYPE_CHGE_REC_PRE_TIME,				//调整景前录像时间
+	LOG_TYPE_CHGE_REC_POST_TIME,			//调整景后录像时间
+	LOG_TYPE_CHGE_REC_HOLD_TIME,			//调整录像数据过期时间
+
+	LOG_TYPE_CHGE_SCH_SCHEDULE,				//调整定时录像计划
+	LOG_TYPE_CHGE_SCH_MOTION,				//调整移动侦测录像计划
+	LOG_TYPE_CHGE_SCH_ALARM,				//调整报警录像计划
+
+	LOG_TYPE_CHGE_SENSOR_SWITCH,			//调整报警输入开关设置
+	LOG_TYPE_CHGE_SENSOR_TYPE,				//调整报警输入设备类型
+	LOG_TYPE_CHGE_SENSOR_TRIGGER,			//调整报警输入处理方式设置
+	LOG_TYPE_CHGE_SENSOR_SCH,				//调整报警输入侦测计划
+
+	LOG_TYPE_CHGE_MOTION_SWITCH,			//调整移动侦测开关设置
+	LOG_TYPE_CHGE_MOTION_SENS,				//调整移动侦测灵敏度
+	LOG_TYPE_CHGE_MOTION_AREA,				//调整移动侦测区域设置
+	LOG_TYPE_CHGE_MOTION_TRIGGER,			//调整移动侦测处理方式
+	LOG_TYPE_CHGE_MOTION_SCH,				//调整移动侦测计划
+
+	LOG_TYPE_CHGE_VL_TRIGGER,				//调整视频丢失处理方式设置
+
+	LOG_TYPE_CHGE_RELAY_SWITCH,				//调整报警输出开关设置
+	LOG_TYPE_CHGE_RELAY_SCH,				//调整报警输出计划
+
+	LOG_TYPE_BUZZER_ON,						//开启声音报警设备
+	LOG_TYPE_BUZZER_OFF,					//关闭声音报警设备
+	LOG_TYPE_CHGE_BUZZER_SCH,				//调整声音报警计划
+
+	LOG_TYPE_CHGE_HTTP_PORT,				//修改HTTP服务器端口
+	LOG_TYPE_CHGE_SER_PORT,					//修改网络服务器端口
+	LOG_TYPE_CHGE_IP,						//设置网络地址
+	LOG_TYPE_DHCP_SUCC,						//自动获取网络地址成功
+	LOG_TYPE_DHCP_FAIL,						//自动获取网络地址失败
+	LOG_TYPE_CHGE_PPPOE,					//设置PPPoE
+	LOG_TYPE_CHGE_DDNS,						//设置DDNS
+	LOG_TYPE_NET_STREAM_CFG,				//调整网络流编码设置
+
+	LOG_TYPE_CHGE_SERIAL,					//调整云台串口设置
+	LOG_TYPE_PRESET_MODIFY,					//调整预置点
+	LOG_TYPE_CRUISE_MODIFY,					//调整巡航线
+	LOG_TYPE_TRACK_MODIFY,					//调整轨迹
+
+	LOG_TYPE_USER_ADD,						//增加用户
+	LOG_TYPE_USER_MODIFY,					//调整用户权限
+	LOG_TYPE_USER_DELETE,					//删除用户
+	LOG_TYPE_CHANGE_PASSWD,					//修改用户密码
+
+	LOG_TYPE_LOAD_DEFAULT,					//恢复默认配置
+	LOG_TYPE_IMPORT_CONFIG,					//导入配置
+	LOG_TYPE_EXPORT_CONFIG,					//导出配置
+
+	LOG_TYPE_CHGE_IMAGE_MASK,				//图像遮挡
+	LOG_TYPE_RECYCLE_REC_ON,				//开启循环录像
+	LOG_TYPE_RECYCLE_REC_OFF,				//关闭循环录像
+	LOG_TYPE_CHGE_DISK_ALARM,				//调整磁盘报警空间
+
+	LOG_TYPE_CHGE_SEND_EMAIL,				//设置Email 发送人信息
+	LOG_TYPE_CHGE_RECV_EMAIL,				//设置Email 接收人信息
+	LOG_TYPE_CHGE_SNAP_SETTING,             //调整抓图配置
+
+	//yqf add 2017.12.22
+	LOG_TYPE_CHGE_SCH_PIR,					//调整人体红外感应录像计划
+	LOG_TYPE_CHGE_PIR_SWITCH,				//调整人体红外感应开关设置
+	LOG_TYPE_CHGE_PIR_TRIGGER,				//调整人体红外感应处理方式
+	LOG_TYPE_CHGE_PIR_SCH,					//调整人体红外感应计划
+
+	//录像回放(Playback)
+	LOG_TYPE_PLAYBACK		= 0x00040000,
+	LOG_TYPE_PLAYBACK_PLAY,					//播放
+	LOG_TYPE_PLAYBACK_PAUSE,				//暂停
+	LOG_TYPE_PLAYBACK_RESUME,				//恢复播放
+	LOG_TYPE_PLAYBACK_FF,					//快进
+	LOG_TYPE_PLAYBACK_REW,					//快退
+	LOG_TYPE_PLAYBACK_STOP,					//停止
+	LOG_TYPE_PLAYBACK_NEXT_SECTION,			//下一段
+	LOG_TYPE_PLAYBACK_PREV_SECTION,			//上一段
+
+	//数据备份(Backup)
+	LOG_TYPE_BACKUP			= 0x00080000,
+	LOG_TYPE_BACKUP_START,					//开始备份
+	LOG_TYPE_BACKUP_COMPLETE,				//备份完成
+	LOG_TYPE_BACKUP_CANCEL,					//放弃备份
+	LOG_TYPE_BACKUP_FAIL,					//备份失败
+
+	//录像检索(Search)
+	LOG_TYPE_SEARCH			= 0x00100000,
+	LOG_TYPE_SEARCH_TIME,					//按时间检索
+	LOG_TYPE_SEARCH_EVENT,					//按事件检索
+	LOG_TYPE_SEARCH_FILE_MAN,				//文件管理
+	LOG_TYPE_DELETE_FILE,					//删除文件
+	LOG_TYPE_LOCK_FILE,						//锁定文件
+	LOG_TYPE_UNLOCK_FILE,					//解锁文件
+	LOG_TYPE_DELETE_PICTURE,                //删除图片
+	LOG_TYPE_LOCK_PICTURE,                  //锁定图片
+	LOG_TYPE_UNLOCK_PICTURE,                //解锁图片
+
+
+	//查看信息(View information)
+	LOG_TYPE_VIEW_INFO		= 0x00200000,
+	LOG_TYPE_VIEW_SYSTEM,					//查看系统信息
+	LOG_TYPE_VIEW_EVENT,					//查看事件
+	LOG_TYPE_VIEW_LOG,						//查看日志
+	LOG_TYPE_VIEW_NETWORK,					//查看网络状态
+	LOG_TYPE_VIEW_ONLINE_USER,				//查看在线用户
+	LOG_TYPE_VIEW_EXPORT_LOG,				//导出日志
+	LOG_TYPE_VIEW_EXPORT_EVENT,				//导出事件
+
+	//异常信息(Error)
+	LOG_TYPE_ERROR_INFO		= 0x00400000,
+	LOG_TYPE_IP_CONFLICT,					//网络地址冲突
+	LOG_TYPE_NETWORK_ERR,					//网络异常
+	LOG_TYPE_DDNS_ERR,						//DDNS错误
+	LOG_TYPE_DISK_IO_ERR,					//磁盘读写错误
+	LOG_TYPE_UNKNOWN_OFF,					//异常断电
+	LOG_TYPE_UNKNOWN_ERR,					//未知错误
+	LOG_TYPE_ERR_9A9A9A9A,
+	LOG_TYPE_ERR_9A000001,
+	LOG_TYPE_ERR_9A000002,
+	LOG_TYE_DISK_WARNING,                  //磁盘衰减报警
+	LOG_TYE_DISK_DISCONNECT,                  //磁盘掉线报警
+	//LOG_TYE_DISK_NOTFIND,					//开机无硬盘
+
+    LOG_TYPE_EVENT            = 0x00800000,   //事件信息
+    LOG_TYPE_EVENT_MOTION     = 0x00800001,
+    LOG_TYPE_EVENT_SENSOR     = 0x00800002,
+    LOG_TYPE_EVENT_VIDEO_LOSS = 0x00800004,
+    LOG_TYPE_EVENT_COVER      = 0x00800008,
+    LOG_TYPE_EVENT_PIR		  = 0x00800010,   //yqf add 2017.12.26
+}LOG_TYPE;

+ 19 - 0
Ansjer/file/requirements.txt

@@ -0,0 +1,19 @@
+Django > 2.0
+django-cors-headers
+django-imagekit
+django-guardian
+django-rest-framework
+simplejson
+djangorestframework-jwt
+South
+qcloudsms_py==0.1.1
+itsdangerous
+openpyxl
+xlrd
+mysqlclient
+boto3
+requests_aws4auth
+ffmpy
+xmltodict
+var_dump
+django-middleware-global-request

+ 69 - 0
Ansjer/file/后台管理系统说明.txt

@@ -0,0 +1,69 @@
+一.修改记录
+创建时间: 2017/10/25 版本: 1.0
+
+二.项目说明
+	1.架构概述
+		1).现有模块 :  用户模块(包括用户设备共享模块)  设备信息模块 OTA模块 Token验证模块
+		2).整体说明 :                                  OTA模块
+		                                                 ↗ 
+														 
+			用户注册 -> 用户登录  -> Token验证模块 
+
+				 ↓		          ↓                     ↘
+			 用户模块       用户模块             设备信息模块
+		3).各个模块明细说明
+			1. 用户模块: 
+				用户信息处理模块:用户基本操作
+					用户注册:包括获取验证码,然后通过验证注册用户
+					用户登录:返回Token信息给后续验证用户安全性
+					用户信息完善:修改完善用户个人信息
+					用户修改密码:修改用户密码
+					用户重置密码:重置密码(使用邮箱进行重置)
+					显示用户信息:显示本用户当前信息
+					显示所有用户信息:只有管理员与超级管理员可以调用,显示所有的用户信息
+					用户启用、禁用:只有管理员与超级管理员可以调用,启用、禁用设备用户
+				
+				用户设备共享模块:共享用户设备
+					搜索用户:通过用户的信息搜索用户自身另外的账号
+					共享用户设备:主用户把设备共享给搜索到用户(可以共享一台设备,也可以全部等设备)
+					取消用户设备:主用户取消之前共享给其他账号的设备(可以取消共享一台设备,也可以全部等设备)
+					
+			2.Token验证模块:
+				token获取:在登录时调用获取Token
+				token验证:解密access token,验证有效期,如果有效可以继续访问接口,无效返回错误信息
+				token更新:解密refresh token,验证有效性,如果有效并且没有过期就更新access token,然后返回access token,或者返回错误信息
+				token错误信息:通过上面三个接口返回的错误码,解析出来token错误信息,并返回提示用户
+				
+			3.设备信息模块
+				添加设备信息:添加新设备信息
+				查询设备信息:查询本账户名下所有设备信息
+				修改设备信息:修改本账户名下的相应设备信息
+				删除设备信息:删除本账户名下相应设备信息
+				显示所有用户设备信息:只有管理员与超级管理员可以调用,显示所有的用户名下所有设备信息
+			
+			4.OTA模块
+				升级文件上传:上传升级文件(根据文件名称保存到相应的文件夹下)
+				添加版本信息:把上传的升级文件信息更新到数据库表里面
+				获取最新版本信息:通过输入要查询的设备信息,返回查询到该设备最新版本
+				获取最新版本url链接:通过输入要查询的设备信息,返回查询到该设备升级文件的下载链接
+				下载升级文件:通过获取的url下载升级文件
+
+			5.批量处理模块
+				设备信息批量导入:2种内容格式txt格式, 2种调用Excel文件导入方式
+				
+			6.权限模块
+				模型设计:用户、角色、权限,用户 → 多对多 ← 角色, 用户 → 多对多 ← 权限,角色 → 多对多 ← 权限
+			7.日志模块
+			    中间件middle入口进行统计入库,利用nginx自带module进行统计(更精确)
+			8.APP版本信息模块
+			    对应app版本更新,检测版本详细信息
+			9.语言包模块
+			    所有响应信息增加中英适配
+			10.
+
+
+django常用命令
+python3 mangage.py makemigrations
+python3 manage.py migrate --fake
+python3 manage.py sqlmigrate
+python3 manage.py runserver 0.0.0.0:8222

BIN
Ansjer/file/表文档.doc


+ 216 - 0
Ansjer/settings.py

@@ -0,0 +1,216 @@
+import os
+
+# SERVER_TYPE = 'local'
+SERVER_TYPE = 'test'
+# SERVER_TYPE = 'formal'
+# 根目录
+
+SECRET_KEY = 'c7ki2_gkg4#sjfm-u1%$s#&n#szf01f*v69rwv2qsf#-zmm@tl'
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+DEBUG = True
+# DEBUG = False
+ALLOWED_HOSTS = ['*']
+
+INSTALLED_APPS = [
+    'django.contrib.admin',
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.messages',
+    'django.contrib.staticfiles',
+    'corsheaders',
+    'imagekit',
+    'Model',
+]
+
+MIDDLEWARE = [
+    'corsheaders.middleware.CorsMiddleware',
+    'Service.middleware.StatisticsUrlMiddleware',
+    'django.middleware.security.SecurityMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.middleware.common.CommonMiddleware',
+    # 'django.middleware.csrf.CsrfViewMiddleware',
+    'corsheaders.middleware.CorsPostCsrfMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.contrib.messages.middleware.MessageMiddleware',
+    'django.middleware.clickjacking.XFrameOptionsMiddleware',
+    'django.middleware.security.SecurityMiddleware',
+    'django_global_request.middleware.GlobalRequestMiddleware',
+]
+
+AUTHENTICATION_BACKENDS = (
+    'django.contrib.auth.backends.ModelBackend',  # django default backend
+    'guardian.backends.ObjectPermissionBackend',
+)
+
+ADDR_URL = []
+ANONYMOUS_USER_ID = -1  # 支持匿名用户
+
+STATIC_URL = '/static/'
+
+# 上传路径根目录
+MEDIA_ROOT = os.path.join(BASE_DIR, 'static/Upgrate')
+# 在浏览器上访问该上传文件的url的前缀
+MEDIA_URL = '/static/Upgrate/'
+ROOT_URLCONF = 'Ansjer.urls'
+LOGIN_URL = '/account/login'
+AUTH_USER_MODEL = 'Model.Device_User'  # 自定义Model
+APPEND_SLASH = False
+
+TEMPLATES = [
+    {
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
+        'DIRS': [BASE_DIR + '/static/templates', ],
+        'APP_DIRS': True,
+        'OPTIONS': {
+            'context_processors': [
+                'django.template.context_processors.debug',
+                'django.template.context_processors.request',
+                'django.contrib.auth.context_processors.auth',
+                'django.contrib.messages.context_processors.messages',
+            ],
+        },
+    },
+]
+
+WSGI_APPLICATION = 'Ansjer.wsgi.application'
+
+# 服务器类型
+if SERVER_TYPE == 'local':
+    DATABASE_DATA = 'Ansjer'
+    SERVER_HOST = '192.168.136.45'
+elif SERVER_TYPE == 'test':
+    NGINX_RTMP_STAT = 'http://13.56.215.252:82/stat'
+    DATABASE_DATA = 'AnsjerTest'
+    SERVER_HOST = 'localhost'
+elif SERVER_TYPE == 'formal':
+    DATABASE_DATA = 'Ansjer81'
+    SERVER_HOST = 'localhost'
+
+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 = [
+    {
+        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
+    },
+    {
+        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
+    },
+    {
+        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
+    },
+    {
+        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
+    },
+]
+
+LANGUAGE_CODE = 'en-us'
+TIME_ZONE = 'Asia/Shanghai'
+# TIME_ZONE = 'UTC'
+USE_I18N = True
+USE_L10N = True
+USE_TZ = True
+
+# 跨域增加忽略
+CORS_ALLOW_CREDENTIALS = True
+CORS_ORIGIN_ALLOW_ALL = True
+CORS_ORIGIN_WHITELIST = ('*')
+
+CORS_ALLOW_METHODS = (
+    'DELETE',
+    'GET',
+    'OPTIONS',
+    'PATCH',
+    'POST',
+    'PUT',
+    'VIEW',
+)
+
+CORS_ALLOW_HEADERS = (
+    'XMLHttpRequest',
+    'X_FILENAME',
+    'accept',
+    'accept-encoding',
+    'authorization',
+    'content-type',
+    'dnt',
+    'origin',
+    'user-agent',
+    'x-csrftoken',
+    'x-requested-with',
+    'Pragma',
+)
+
+#########################################
+'''
+增加错误信息推送到管理员邮箱
+'''
+# 管理员邮箱
+ADMINS = (
+    ('admin', 'chanjunkai@163.com'),
+    ('admin', '1379072853@qq.com'),
+)
+
+# 非空链接,却发生404错误,发送通知MANAGERS
+SEND_BROKEN_LINK_EMAILS = True
+MANAGERS = ADMINS
+
+# Email设置
+EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
+EMAIL_HOST = 'smtp.163.com'  # QQ邮箱SMTP服务器(邮箱需要开通SMTP服务)
+EMAIL_PORT = 25  # QQ邮箱SMTP服务端口
+EMAIL_HOST_USER = 'chanjunkai@163.com'  # 我的邮箱帐号
+EMAIL_HOST_PASSWORD = 'cjk1234'  # 授权码
+EMAIL_SUBJECT_PREFIX = 'website'  # 为邮件标题的前缀,默认是'[django]'
+EMAIL_USE_TLS = True  # 开启安全链接
+DEFAULT_FROM_EMAIL = SERVER_EMAIL = EMAIL_HOST_USER  # 设置发件人
+
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': True,
+    'formatters': {
+        'error_format': {
+            # 'format': '{"asctime":"%(asctime)s","thread":"%(threadName)s:%(thread)d","errorline":"%(lineno)d","errorlevel":"%(levelname)s","errorcontent":"%(message)s"}'
+            'format': '%(asctime)s %(threadName)s %(thread)d %(lineno)d %(levelname)s %(message)s'
+        },
+    },
+    'filters': {
+    },
+    'handlers': {
+        'mail_admins': {
+            'level': 'ERROR',
+            'class': 'django.utils.log.AdminEmailHandler',
+            'include_html': True,
+        },
+        'default': {
+            'level': 'ERROR',
+            'class': 'logging.handlers.RotatingFileHandler',
+            'filename': BASE_DIR + '/static/log/error.log',
+            'maxBytes': 1024 * 1024 * 5,  # 5 MB
+            'backupCount': 5,
+            'formatter': 'error_format',
+        },
+        'console': {
+            'level': 'ERROR',
+            'class': 'logging.StreamHandler',
+            'formatter': 'error_format'
+        },
+    },
+    'loggers': {
+        'django': {
+            'handlers': ['default', 'console'],
+            # 'handlers': ['mail_admins','default','console'],
+            'level': 'ERROR',
+            'propagate': False
+        },
+    }
+}

BIN
Ansjer/test/__pycache__/ffmpy.cpython-36.pyc


+ 155 - 0
Ansjer/test/util/email_log.py

@@ -0,0 +1,155 @@
+# coding=utf-8
+# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +
+#        ┏┓   ┏┓+ +
+#    ┏┛┻━━━┛┻┓ + +
+#    ┃       ┃  
+#    ┃   ━   ┃ ++ + + +
+#    ████━████ ┃+
+#    ┃       ┃ +
+#    ┃   ┻   ┃
+#    ┃       ┃ + +
+#    ┗━┓   ┏━┛
+#      ┃   ┃           
+#      ┃   ┃ + + + +
+#      ┃   ┃    Codes are far away from bugs with the animal protecting   
+#      ┃   ┃ +     神兽保佑,代码无bug  
+#      ┃   ┃
+#      ┃   ┃  +         
+#      ┃    ┗━━━┓ + +
+#      ┃        ┣┓
+#      ┃        ┏┛
+#      ┗┓┓┏━┳┓┏┛ + + + +
+#       ┃┫┫ ┃┫┫
+#       ┗┻┛ ┗┻┛+ + + +
+# + + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + ++ + + +"""
+"""
+"""
+import base64
+import hashlib
+import time
+
+import datetime
+
+
+def getTimeDict(times):
+    time_dict = []
+    t = 0
+    for x in range(24):
+        if x < 10:
+            x = '0' + str(x)
+        else:
+            x = str(x)
+        # a = times.strftime("%Y-%m-%d") + " " + x
+        a = times.strftime("%Y%m%d") + x
+        time_dict.append(a)
+        t += 1
+    return time_dict
+
+
+def md5s(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())
+
+
+def get_sign_url_content(to_tt):
+    # url = '13.56.141.156:81'
+    # url = '35.176.238.187:81'
+    url = '111.230.145.16:81'
+    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 = '/Relay' + to_tt + '.txt'  # 下载文件
+    # path = '/444.mp4'  # 下载文件
+    # 下载到期时间,time是当前时间,300表示300秒,也就是说从现在到300秒之内文件不过期
+    expire = get_timestamp10() + 3600;
+    res = md5s(str(secret) + str(path) + str(expire), True)
+    md5_str = str(base64_encode(res, True))
+    md5_str = md5_str.replace('b\'', '').replace('\'', '').replace('+', '-').replace('/', '_').replace('=', '')
+    sig_uri = 'http://' + url + path + '?' + 'st=' + str(md5_str) + '&e=' + str(expire)
+    # print(sig_uri)
+    return {
+        'url' : sig_uri,
+        'time' :to_tt
+    }
+
+
+to_date = datetime.datetime.now() - datetime.timedelta(days=1)
+to_list = getTimeDict(to_date)
+
+HTML_DATA = ''
+# sign_uri_list = []
+for tt in to_list:
+    su = get_sign_url_content(to_tt=tt)
+    HTML_DATA +='<p><span><a href="{{url}}" target="_Blank">{{time}}<a></span></p>'.replace("{{time}}",su['time']).replace("{{url}}",su['url'])
+    # sign_uri_list.append(su)
+# print(sign_uri_list)
+# print(HTML_DATA)
+print(type(HTML_DATA))
+from boto3.session import Session
+import traceback
+
+AWS_ACCESS_ID = 'AKIAJKPU23EU5QWHFPKQ'
+AWS_ACCESS_SECRET = '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'
+AWS_ACCESS_REGION = 'us-east-1'
+COMPANY_EMAIL = 'user_server@nsst.com'
+session = Session(
+    aws_access_key_id=AWS_ACCESS_ID,
+    aws_secret_access_key=AWS_ACCESS_SECRET,
+    region_name=AWS_ACCESS_REGION,
+)
+conn = session.client('ses')
+
+try:
+    response = conn.send_email(
+        # 发送人
+        Source=COMPANY_EMAIL,
+        Destination={
+            # 收件人
+            'ToAddresses': [COMPANY_EMAIL]
+            # 'ToAddresses': ['1758730877@qq.com']
+        },
+        Message={
+            # 标题
+            'Subject': {
+                # 'Data': '英国P2P日志文件',
+                'Data': '中国P2P日志文件',
+                # 'Data': '美国P2P日志文件',
+                'Charset': 'utf-8'
+            },
+            'Body': {
+                'Html': {
+                    'Charset': 'UTF-8',
+                    'Data': HTML_DATA,
+                },
+            }
+        },
+    )
+except Exception as e:
+    errorInfo = traceback.format_exc()
+    print(errorInfo)
+else:
+    print('yes')
+

+ 71 - 0
Ansjer/test/util/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))

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

+ 57 - 0
Ansjer/test/util/util_jk.py

@@ -0,0 +1,57 @@
+#!/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/14 14:46
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: util_jk.py
+@Contact: chanjunkai@163.com
+"""
+'''---------------------------------------------------'''
+# 简化for语句
+def getFor():
+    data = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
+    ss = [z for z in data if not data['a'] == 1]
+    print(ss)
+
+'''---------------------------------------------------'''
+# lamdba
+def getLamdba():
+    b = lambda a,y: a + 1+y
+    print(b(a=1,y=2))
+
+'''-----------判断系统版本------------------------'''
+def UsePlatform():
+    import platform
+    sysstr = platform.system()
+    if (sysstr == "Windows"):
+        print("Call Windows tasks")
+    elif (sysstr == "Linux"):
+        print("Call Linux tasks")
+    else:
+        print("Other System tasks")
+
+def access_redis_database(data={}):
+    return
+    POOL = redis.ConnectionPool(host='localhost', port=6379)
+    CONN = redis.Redis(connection_pool=POOL)
+    CONN.rpush('data_list', trans_dict_str(type=1, data=data))
+    data_list_len = CONN.llen('data_list')
+    print('--------------')
+    print(data_list_len)
+    print('!!!!!!!!!!!!!')
+    if data_list_len > 1000:
+        query_set_list = []
+        data_list = CONN.lrange('data_list', 0, data_list_len)
+        for i in range(data_list_len):
+            data_dict = trans_dict_str(type=2, data=data_list[i])
+            query_set_list.append(Access_Log(**data_dict))
+        # 批量插入
+        if len(query_set_list):
+            Access_Log.objects.bulk_create(query_set_list)
+            CONN.delete('data_list')
+    return

+ 5 - 0
Ansjer/test/util/var_dump.py

@@ -0,0 +1,5 @@
+sss = None
+if sss:
+    print(1)
+else:
+    print(2)

+ 124 - 0
Ansjer/urls.py

@@ -0,0 +1,124 @@
+from django.contrib import admin
+from django.conf.urls import url
+from django.urls import path,re_path
+from Controller import FeedBackInfo, EquipmentOTA, EquipmentInfo, EquipmentSensor, StreamMedia, AdminManage, AppInfo, \
+    AccessLog, Test, MealManage, DeviceMeal, HlsManage, DeviceManage, EquipmentStatus, SysManage,DeviceLog,LogAccess,EquipmentManager,LogManager,PermissionManager,OTAEquipment,shareUserPermission,UserManger, CheckUserData, OauthManage,UserController
+
+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/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'),
+    url(r'^accounts/email-re-pwd/$', UserController.EmailResetPwdView.as_view()),
+
+    ###
+    url(r'^admin/', admin.site.urls),
+    url(r'^favicon.ico$', UserManger.success, name=u'favicon.ico'),
+    url(r'^account/showUserMore$', UserManger.showUserMoreView.as_view()),
+    url(r'^account/perfectUserInfo$', UserManger.perfectUserInfoView.as_view()),
+    url(r'^account/getAvatar/(?P<filePath>.*)$', UserManger.getAvatarView.as_view()),
+    url(r'^account/delUser$', UserManger.delUserInterface),
+    url(r'^account/setUserValid$', UserManger.setUserValidView.as_view()),
+    url(r'^account/showAllUser$', UserManger.showAllUserInterface),
+    url(r'^account/help$', LogManager.HelpView.as_view()),
+    url(r'^account/searchUser$', shareUserPermission.searchUserView.as_view()),
+    url(r'^account/shareUserEquipment$', shareUserPermission.shareUserEquipmentView.as_view()),
+    url(r'^account/unsharedUserEquipment$', shareUserPermission.unsharedUserEquipmentView.as_view()),
+
+    url(r'^response/success$', UserManger.success),
+    # http://13.56.215.252:82/equipment/queryUserEquipment?token=test
+    url(r'^equipment/queryUserEquipment$', EquipmentManager.queryUserEquipmentInterface),
+    url(r'^equipment/addNewUserEquipment$', EquipmentManager.addNewUserEquipmentInterface,
+        name='add_New_User_Equipment'),
+    url(r'^equipment/delUserEquipment$', EquipmentManager.delUserEquipmentInterface),
+    url(r'^equipment/modifyUserEquipment$', EquipmentManager.modifyUserEquipmentInterface,
+        name='modify_User_Equipment'),
+    url(r'^equipment/showAllUserEquipment$', EquipmentManager.showAllUserEquipmentInterface,
+        name='show_All_User_Equipment'),
+    url(r'^equipment/findEquipmentInfo$', EquipmentManager.findEquipmentInfoInterface),
+
+    url(r'^OTA/uploads$', OTAEquipment.getUploadFiletoDirView.as_view()),
+    url(r'^OTA/download$', OTAEquipment.downloadUpdataFileUrl),
+    url(r'^OTA/downloads/(\w+)/(\w+[\w+]*.+[^_w]*.\w+)$', OTAEquipment.downloadUpdataFileUrlInterface),
+    url(r'^OTA/getEquipmentVersion$', OTAEquipment.getEquipmentVersionInterface),
+    url(r'^OTA/getUpdataFileUrl$', OTAEquipment.getUpdataFileUrlInterface),
+    url(r'^OTA/addNewEquipmentVersion$', OTAEquipment.addNewEquipmentVersionInterface),
+    url(r'^OTA/showAllEquipmentVersion$', OTAEquipment.showAllEquipmentVersionInterface),
+
+    url(r'^roles/addNewRole$', PermissionManager.addNewRoleView.as_view()),
+    url(r'^roles/queryRole$', PermissionManager.queryRoleView.as_view()),
+    url(r'^roles/delRole$', PermissionManager.delRoleView.as_view()),
+    url(r'^roles/modifyRole$', PermissionManager.modifyRoleView.as_view()),
+    url(r'^perms/addNewPerms$', PermissionManager.addNewPermsView.as_view()),
+    url(r'^perms/delPerms$', PermissionManager.delPermsView.as_view()),
+    url(r'^perms/queryPerms$', PermissionManager.queryPermsView.as_view()),
+    url(r'^perms/modifyPerms$', PermissionManager.modifyPermsView.as_view()),
+    url(r'^permsManager/queryRolePerms$', PermissionManager.queryRolePermsView.as_view()),
+
+    url(r'^uploads/upgrade$', OTAEquipment.getUploadFiletoDirView.as_view()),
+    url(r'^upgrade/download/(\w+.[^_w]*\w+.\w+)$', CheckUserData.download_file),
+    url(r'^downloads/upgrade/(\w+)/(\w+.[^_w]*\w+.\w+)$', OTAEquipment.downloadUpdataFileUrlInterface),
+    url(r'^getOTAurl/getUpdataFileUrl$', OTAEquipment.getUpdataFileUrlInterface),
+
+    #  流处理
+    url(r'^media/stream', StreamMedia.StreamMedia.as_view()),
+    url(r'^media/auth_stream', StreamMedia.Auth_Stream),
+    url(r'^media/send_video_s3', StreamMedia.send_video_s3),
+    url(r'^media/auth_live', StreamMedia.Auth_Live),
+    # 传感器
+    url(r'^equipment/sensor', EquipmentSensor.EquipmentSensor.as_view()),
+    # 设备推送信息
+    url(r'^equipment/info', EquipmentInfo.EquipmentInfo.as_view()),
+    # 管理员专属view
+    url(r'^adminManage/manage', AdminManage.AdminManage.as_view()),
+    # OTA重构类
+    url(r'^equipment/OTA', EquipmentOTA.EquipmentOTA.as_view()),
+    # 用户反馈信息
+    url(r'^feedbackInfo', FeedBackInfo.FeedBackInfo.as_view()),
+    # app版本信息
+    url(r'^appInfo', AppInfo.AppInfo.as_view()),
+    # 访问日志new
+    url(r'^accesslog', AccessLog.AccessLog.as_view()),
+    # 套餐信息管理
+    url(r'^meal/manage', MealManage.MealManage.as_view()),
+    # 设备套餐绑定
+    url(r'^device/meal$', DeviceMeal.DeviceMeal.as_view()),
+    # hls put_object签名url
+    url(r'^HlsManage$', HlsManage.HlsManage.as_view()),
+    # 设备管理
+    url(r'^device/manage$', DeviceManage.DeviceManage.as_view()),
+    # 设备在线
+    url(r'^device/online$', EquipmentStatus.EquipmentOnline),
+    # 设备离线
+    url(r'^device/offline$', EquipmentStatus.EquipmentOffline),
+    # 设备离线
+    url(r'^device/updateIP$', EquipmentStatus.updateIP),
+    # 系统ctr
+    url(r'^sys/updateLog', SysManage.updateLog),
+    # 设备日志
+    url(r'^devices/(\w+)/logs$', DeviceLog.DeviceLog),
+    url(r'^devices/(\w+)$', DeviceManage.Devices),
+    # 访问日志 mongodb版
+    url(r'^LogAccess$', LogAccess.LogAccess),
+    # 上传操作文档
+    url(r'^HelpCHM/upload$', LogManager.upload_help_chm),
+    url(r'^admin/userIDs$', AdminManage.getUserIds),
+    # 统计访问日志路径
+    path('access/staticPath/', AccessLog.statisticsPath),
+    # 多条件搜索用户信息admin
+    path('accounts', AdminManage.search_user_by_content),
+    # 测试专用api
+    path('Test', Test.Test.as_view()),
+    # 路由加参数参考
+    # url(r'^(?P<path>.*)/(?P<UID>.*)/lls$', Test.Test.as_view(), name=u'gg'),
+    # 认证服务器登陆成功,访问一次关联,并获取用户信息
+    path('oauth/relate/',OauthManage.OauthRelateView.as_view()),
+    # 认证服务去
+    path('resource/auth/',OauthManage.OauthResUserView.as_view()),
+    path('resource/forgetauth/',OauthManage.OauthForgetView.as_view()),
+    # 认证服务修改密码关联旧数据
+    path('account/setPwd/', OauthManage.ModifyRSPwdView.as_view()),
+    re_path('(?P<path>.*)', LogManager.errorPath),
+]

+ 16 - 0
Ansjer/wsgi.py

@@ -0,0 +1,16 @@
+"""
+WSGI config for Ansjer project.
+
+It exposes the WSGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/dev/howto/deployment/wsgi/
+"""
+
+import os
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Ansjer.settings")
+
+application = get_wsgi_application()

+ 170 - 0
Controller/AccessLog.py

@@ -0,0 +1,170 @@
+import datetime
+import simplejson as json
+
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from django.views.generic.base import View
+from ratelimit.decorators import ratelimit
+
+from Model.models import Access_Log
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+from Service.ModelService import ModelService
+from Service.TemplateService import TemplateService
+
+'''
+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=searchByAdmin&token=test&page=1&line=10&content={"status":20}&order=-id
+
+http://192.168.136.40:8077/accesslog/staticPath/?token=stest
+'''
+
+
+class AccessLog(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(AccessLog, self).dispatch(*args, **kwargs)
+
+    def get(self, request):
+        response = ResponseObject()
+        request.encoding = 'utf-8'
+        return self.validation(request.GET, response)
+
+    def post(self, request):
+        response = ResponseObject()
+        request.encoding = 'utf-8'
+        return self.validation(request.POST, response)
+
+    def validation(self, request_dict, response):
+        token = request_dict.get('token', None)
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                operation = request_dict.get('operation', None)
+                if userID is not None and operation is not None:
+                    if operation == 'queryByAdmin':
+                        return self.query_by_admin(request_dict, userID, response)
+                    elif operation == 'searchByAdmin':
+                        return self.search_by_admin(request_dict, userID, response)
+                    elif operation == 'truncateByAdmin':
+                        return self.truncate_by_admin(userID, response)
+                return response.json(444, 'token,operation')
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(311)
+
+    def query_by_admin(self, request_dict, userID, response):
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        order = request_dict.get('order', '-id')
+        if order == '':
+            order = '-id'
+        param_flag = CommonService.get_param_flag(data=[page, line])
+        if param_flag is True:
+            check_perm = ModelService.check_permission(userID=userID, permID=30)
+            if check_perm is True:
+                access_log_queryset = Access_Log.objects.all().order_by(order)
+                if access_log_queryset.exists():
+                    count = access_log_queryset.count()
+                    res = access_log_queryset[(page - 1) * line:page * line]
+                    send_json = CommonService.qs_to_dict(res)
+                    send_json['count'] = count
+                    return response.json(0, send_json)
+                return response.json(0, {'datas': [], 'count': 0})
+            else:
+                return response.json(404)
+        else:
+            return response.json(444)
+
+    # 清空日志表
+    def truncate_by_admin(self, userID, response, ):
+        check_perm = ModelService.check_permission(userID=userID, permID=10)
+        if check_perm is True:
+            from django.db import connection
+            cursor = connection.cursor()
+            cursor.execute("TRUNCATE TABLE `access_log`")
+        return response.json(0)
+
+    # 搜索日志(多条件)
+    def search_by_admin(self, request_dict, userID, response):
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        order = request_dict.get('order', '-id')
+        content = request_dict.get('content', None)
+        starttime = request_dict.get('starttime', None)
+        endtime = request_dict.get('endtime', None)
+        if page is not None and line is not None:
+            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 = Access_Log.objects.filter(**search_kwargs).order_by(order)
+                except Exception as e:
+                    return response.json(444)
+                if starttime is not None and starttime != '' and endtime is not None and endtime != '':
+                    startt = datetime.datetime.fromtimestamp(int(starttime))
+                    starttime = startt.strftime("%Y-%m-%d %H:%M:%S.%f")
+                    endt = datetime.datetime.fromtimestamp(int(endtime))
+                    endtime = endt.strftime("%Y-%m-%d %H:%M:%S.%f")
+                    queryset = queryset.filter(time__range=(starttime, endtime))
+                elif starttime is not None and starttime != '':
+                    startt = datetime.datetime.fromtimestamp(int(starttime))
+                    starttime = startt.strftime("%Y-%m-%d %H:%M:%S.%f")
+                    queryset = queryset.filter(time__gte=starttime)
+                elif endtime is not None and endtime != '':
+                    endt = datetime.datetime.fromtimestamp(int(endtime))
+                    endtime = endt.strftime("%Y-%m-%d %H:%M:%S.%f")
+                    queryset = queryset.filter(time__lte=endtime)
+                if queryset.exists():
+                    count = queryset.count()
+                    res = queryset[(page - 1) * line:page * line]
+                    send_json = CommonService.qs_to_dict(res)
+                    send_json['count'] = count
+                    return response.json(0, send_json)
+                return response.json(0, {'datas': [], 'count': 0})
+            else:
+                return response.json(404)
+        else:
+            return response.json(444, 'page,line')
+
+
+@ratelimit(key='ip', rate='3/m')
+def statisticsPath(request):
+    request.encoding = 'utf-8'
+    if request.method == 'GET':
+        request_dict = request.GET
+    if request.method == 'POST':
+        request_dict = request.POST
+    token = request_dict.get('token', None)
+    response = ResponseObject()
+    was_limited = getattr(request, 'limited', False)
+    # 限制同一个ip该接口一分钟不能访问超过两次
+    if was_limited is True:
+        return response.json(5)
+    if token is not None:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            userID = tko.userID()
+            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 response.json(0, {'datas': datas})
+            else:
+                return response.json(404)
+        else:
+            return response.json(tko.code)
+    else:
+        return response.json(444, 'token')

+ 303 - 0
Controller/AdminManage.py

@@ -0,0 +1,303 @@
+# -*- coding: utf-8 -*-
+from django.views.decorators.csrf import csrf_exempt
+from django.views.generic import TemplateView
+from django.utils.decorators import method_decorator
+from django.contrib.auth.hashers import make_password  # 对密码加密模块
+from Model.models import Device_Info,Role
+from Service.ModelService import ModelService
+from django.utils import timezone
+from Model.models import Access_Log,Device_User
+from django.views.decorators.http import require_http_methods
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Ansjer.config import OFF_LINE_TIME_DELTA
+import datetime,simplejson as json
+from Service.CommonService import CommonService
+'''
+http://192.168.136.40:8077/adminManage/manage?operation=getAllDeviceArea&token=debug
+http://192.168.136.40:8077/adminManage/manage?operation=getAllUserName&token=debug
+http://192.168.136.40:8077/adminManage/manage?operation=getAllUID&token=debug
+
+http://127.0.0.1:8000/adminManage/manage?operation=getAllOnLine&token=stest
+http://127.0.0.1:8000/adminManage/manage?operation=getOnLine&token=stest
+'''
+
+
+class AdminManage(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(AdminManage, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.GET)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.POST)
+
+    def validation(self, request_dict, *args, **kwargs):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                operation = request_dict.get('operation', None)
+                if userID is not None and operation is not None:
+                    if operation == 'resetUserPwd':
+                        return self.resetUserPwd(request_dict=request_dict, userID=userID)
+                    if operation == 'getAllOnLine':
+                        return self.getAllOnLine(userID,response)
+                    if operation == 'getOnLine':
+                        return self.getOnLine(userID,response)
+                    if operation == 'getAllUserName':
+                        return self.getAllUserName(userID,response)
+                    if operation == 'getStatisAccess':
+                        return self.getStatisAccess(userID,request_dict,response)
+                    if operation == 'getAllUID':
+                        return self.getAllUID(userID,response)
+                    if operation == 'getAllDeviceArea':
+                        return self.getAllDeviceArea(userID,response)
+                else:
+                    return response.json(444,'operation')
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(311)
+
+    def resetUserPwd(self, request_dict, userID,response):
+        own_permission = ModelService.check_permission(userID=userID, permID=50)
+        if own_permission:
+            duserID = request_dict.get('duserID', None)
+            userPwd = request_dict.get('userPwd', None)
+            if duserID:
+                UserValid = Device_User.objects.filter(userID=duserID)
+                if UserValid:
+                    if userPwd is None:
+                        userPwd = '123456'
+                    is_update = UserValid.update(password=make_password(userPwd))
+                    if is_update:
+                        return response.json(0)
+                    else:
+                        return response.json(106)
+            else:
+                return response.json(444,'duserID')
+        else:
+            return response.json(404)
+
+    def getAllUserName(self, userID,response):
+        # 权限固定为30
+        own_permission = ModelService.check_permission(userID=userID, permID=30)
+        if own_permission is True:
+            username_list = Device_User.objects.all().values_list('username', flat=True)
+            if username_list:
+                return response.json(0,{'username_list': list(username_list)})
+            else:
+                return response.json(0)
+        else:
+            return response.json(404)
+    #    获取全部用户的在线个数
+    def getAllOnLine(self, userID,response):
+        # 权限固定为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 response.json(0, {"onlinenum": onlinenum, "no_onlinenum": noonlinenum})
+        else:
+            return response.json(404)
+    #    获取全部用户的在线人数
+    def getOnLine(self, userID,response):
+        # 权限固定为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 response.json(0, {"onlinenum": onlinenum,"no_onlinenum": noonlinenum})
+        else:
+            return response.json(404)
+
+    # 获取所有设备地区
+    def getAllDeviceArea(self, userID,response):
+        own_permission = ModelService.check_permission(userID=userID, permID=30)
+        if own_permission is True:
+            qs = Device_Info.objects.all().values('area','UID')
+            uid_area_dict = {}
+            for q in qs:
+                if q['UID'] and q['area']:
+                    uid_area_dict[q['UID']]=q['area']
+            if len(uid_area_dict):
+                area_dict = {}
+
+                for k,v in uid_area_dict.items():
+                    if v in area_dict:
+                        area_dict[v] += 1
+                    else:
+                        area_dict[v] = 1
+                return response.json(0,{'area':area_dict})
+            else:
+                return response.json(0)
+        else:
+            return response.json(404)
+
+    '''
+    统计一天访问量
+    http://192.168.136.45:8077/adminManage/manage?token=test&operation=getStatisAccess&timestamp=1528773308
+    '''
+    def getStatisAccess(self,userID,request_dict,response):
+        own_permission = ModelService.check_permission(userID=userID, permID=30)
+        if own_permission is True:
+            time_stamp = int(request_dict.get('timestamp', None))
+            times = datetime.datetime.fromtimestamp(time_stamp)
+            time_dict = CommonService.getTimeDict(times)
+            res = {}
+            for k, v in time_dict.items():
+                start_date = time_dict[k]
+                end_date = time_dict[k] + datetime.timedelta(hours=1)
+                count = Access_Log.objects.filter(time__range=(start_date, end_date)).count()
+                if count:
+                    res[k] = count
+                else:
+                    res[k] = 0
+            return response.json(0, {'count': res})
+        else:
+            return response.json(404)
+
+    def getAllUID(self,userID,response):
+        own_permission = ModelService.check_permission(userID=userID, permID=30)
+        if own_permission is True:
+            uid_list = Device_Info.objects.all().values_list('UID', flat=True)
+            if uid_list:
+                return response.json(0, {'count': len(uid_list),'uid_list':list(uid_list)})
+        else:
+            return response.json(404)
+
+@require_http_methods(["GET"])
+def getUserIds(request):
+    token = request.GET.get('token', None)
+    response = ResponseObject()
+    if token is not None:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            userID = tko.userID()
+            own_perm = ModelService.check_permission(userID,30)
+            if own_perm is True:
+                # userID_list = Device_User.objects.all().values_list('userID', flat=True)
+                dn = Device_User.objects.all().values('userID', 'username')
+                return response.json(0,{"datas":list(dn)})
+            else:
+                return response.json(404)
+        else:
+            return response.json(tko.code)
+    else:
+        return response.json(311)
+
+@csrf_exempt
+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)
+    response = ResponseObject()
+    if page is not None and line is not None:
+        page = int(page)
+        line = int(line)
+    else:
+        return response.json(10,'page,line is none')
+    if token is not None:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            userID = tko.userID()
+            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 response.json(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.qs_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 response.json(0, sqlDict)
+                    return response.json(0, {'datas': [], 'count': 0})
+                else:
+                    return response.json(404)
+            else:
+                return response.json(404)
+        else:
+            return response.json(tko.code)
+    else:
+        return response.json(311)
+
+
+
+

+ 220 - 0
Controller/AppInfo.py

@@ -0,0 +1,220 @@
+from django.views.generic.base import View
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from Service.CommonService import CommonService
+from Service.ModelService import ModelService
+from Model.models import App_Info
+import traceback
+from Object.TokenObject import TokenObject
+from Object.ResponseObject import ResponseObject
+'''
+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://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
+'''
+
+
+class AppInfo(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(AppInfo, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.GET)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.POST)
+
+    def validation(self, request_dict, *args, **kwargs):
+        operation = request_dict.get('operation', None)
+        response = ResponseObject()
+        if operation is not None:
+            if operation == 'getAppNewVersion':
+                return self.getAppNewVersion(request_dict,response)
+            else:
+                token = request_dict.get('token', None)
+                if token is not None:
+                    tko = TokenObject(token)
+                    tko.valid()
+                    response.lang = tko.lang
+                    if tko.code == 0:
+                        userID = tko.userID()
+                        if userID is not None:
+                            if operation == 'query':
+                                return self.query(request_dict, userID,response)
+                            elif operation == 'add':
+                                return self.add(request_dict, userID,response)
+                            elif operation == 'update':
+                                return self.update(request_dict, userID,response)
+                            elif operation == 'delete':
+                                return self.delete(request_dict, userID,response)
+                        return response.json(444,'userID')
+                    else:
+                        return response.json(tko.code)
+                else:
+                    return response.json(311)
+        else:
+            return response.json(444,'operation')
+
+    def getAppNewVersion(self, request_dict,response):
+        appBundleId = request_dict.get('appBundleId', None)
+        app_type = request_dict.get('app_type', None)
+        if appBundleId is not None and app_type is not None:
+            try:
+                app_info = App_Info.objects.get(appBundleId=appBundleId, app_type=app_type)
+            except Exception:
+                errorInfo = traceback.format_exc()
+                print(errorInfo)
+                return response.json(424, {'details': errorInfo})
+            else:
+                return response.json(0, {'appBundleId': app_info.appBundleId,
+                                        'appName': app_info.appName,
+                                        'newAppversion': app_info.newAppversion,
+                                        'systemLanguage': app_info.systemLanguage,
+                                        'content': app_info.content,
+                                        'app_type': app_info.app_type,
+                                        'downloadLink':app_info.downloadLink,
+                                        'id': app_info.id,
+                                        'bundleVersion': app_info.bundleVersion})
+        else:
+            return response.json(444,'app_type,appBundleId')
+
+    def add(self, request_dict, userID,response):
+        own_perm = ModelService.check_permission(userID=userID, permID=40)
+        if own_perm is True:
+            appBundleId = request_dict.get('appBundleId', None)
+            appName = request_dict.get('appName', None)
+            systemLanguage = request_dict.get('systemLanguage', None)
+            newAppversion = request_dict.get('newAppversion', None)
+            content = request_dict.get('content', None)
+            app_type = request_dict.get('app_type', None)
+            bundleVersion = request_dict.get('bundleVersion', None)
+            downloadLink = request_dict.get('downloadLink', None)
+            param_flag = CommonService.get_param_flag(
+                data=[appBundleId, appName, systemLanguage, newAppversion, content, app_type, bundleVersion])
+            if param_flag is True:
+                try:
+                    has_app_info = App_Info.objects.filter(appBundleId=appBundleId)
+                except Exception:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, {'details': errorInfo})
+                else:
+                    if has_app_info.exists():
+                        return response.json(60)
+                    else:
+                        try:
+                            app_Info = App_Info(
+                                appBundleId=appBundleId,
+                                appName=appName,
+                                newAppversion=newAppversion,
+                                systemLanguage=systemLanguage,
+                                content=content,
+                                app_type=app_type,
+                                bundleVersion=bundleVersion,
+                                downloadLink=downloadLink,
+                            )
+                            app_Info.save()
+                        except Exception:
+                            errorInfo = traceback.format_exc()
+                            print(errorInfo)
+                            return response.json(500, {'details': errorInfo})
+                        else:
+                            app_Info.save()
+                            if app_Info.id:
+                                return response.json(0,
+                                                    {
+                                                        'appBundleId': app_Info.appBundleId,
+                                                        'appName': app_Info.appName,
+                                                        'newAppversion': app_Info.newAppversion,
+                                                        'systemLanguage': app_Info.systemLanguage,
+                                                        'content': app_Info.content,
+                                                        'app_type': app_Info.app_type,
+                                                        'id': app_Info.id,
+                                                        'downloadLink':downloadLink,
+                                                        'bundleVersion': app_Info.bundleVersion
+                                                    })
+                            else:
+                                return response.json(500)
+            return response.json(444)
+        else:
+            return response.json(404)
+
+    def query(self, request_dict, userID,response):
+        own_perm = ModelService.check_permission(userID=userID, permID=30)
+        if own_perm is True:
+            page = int(request_dict.get('page', None))
+            line = int(request_dict.get('line', None))
+            if page is not None and line is not None:
+                queryset = App_Info.objects.all()
+                if queryset.exists():
+                    count = queryset.count()
+                    res = queryset[(page - 1) * line:page * line]
+                    send_json = CommonService.qs_to_dict(res)
+                    send_json['count'] = count
+                    return response.json(0, send_json)
+                return response.json(0)
+            else:
+                return response.json(444,'page,line')
+        else:
+            return response.json(404)
+
+    def update(self, request_dict, userID, response):
+        own_perm = ModelService.check_permission(userID=userID, permID=30)
+        if own_perm is True:
+            id = request_dict.get('id', None)
+            appBundleId = request_dict.get('appBundleId', None)
+            appName = request_dict.get('appName', None)
+            systemLanguage = request_dict.get('systemLanguage', None)
+            newAppversion = request_dict.get('newAppversion', None)
+            content = request_dict.get('content', None)
+            app_type = request_dict.get('app_type', None)
+            bundleVersion = request_dict.get('bundleVersion', None)
+            downloadLink = request_dict.get('downloadLink', None)
+            param_flag = CommonService.get_param_flag(
+                data=[appBundleId, appName, systemLanguage, newAppversion, content, app_type, bundleVersion,downloadLink])
+            if param_flag is True:
+                try:
+                    app_info = App_Info.objects.get(id=id)
+                except Exception:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, {'details': errorInfo})
+                else:
+                    if app_info.id:
+                        app_info.appBundleId = appBundleId
+                        app_info.appName = appName
+                        app_info.systemLanguage = systemLanguage
+                        app_info.newAppversion = newAppversion
+                        app_info.content = content
+                        app_info.app_type = app_type
+                        app_info.bundleVersion = bundleVersion
+                        app_info.downloadLink = downloadLink
+                        app_info.save()
+                        return response.json(0, {'update_id': app_info.id, 'update_time': str(app_info.update_time)})
+            else:
+                return response.json(444)
+        else:
+            return response.json(404)
+
+    def delete(self, request_dict, userID,response):
+        own_perm = ModelService.check_permission(userID=userID, permID=10)
+        if own_perm is True:
+            id_list = request_dict.getlist('id', None)
+            if id_list :
+                try:
+                    for id in id_list:
+                        App_Info.objects.filter(id=id).delete()
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, {'details': repr(e)})
+                else:
+                    return response.json(0)
+            else:
+                return response.json(444,'id must list')
+        else:
+            return response.json(404)

+ 446 - 0
Controller/BatchProcessingDatabase.py

@@ -0,0 +1,446 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+import traceback
+from Ansjer.settings import *
+from django.views.generic.base import View
+from django.views.decorators.csrf import csrf_exempt
+from openpyxl import load_workbook
+from openpyxl.compat import range
+import xlrd
+from Service.ResponseService import *
+from Service.CommonService import CommonService
+from Model.models import Device_Info, Device_User
+
+class batchAddEquipmentView(View):
+    @csrf_exempt
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        fileType = request.POST.get('fileType', None)
+        fileName = request.FILES.get('fileName', None)
+
+        if fileName != None and fileType != None:
+            return self.batchAddEquipment(fileType, fileName)
+        else:
+            return ResponseJSON(800)
+
+    @csrf_exempt
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+
+        fileType = request.GET.get('fileType', None)
+        fileName = request.FILES.get('fileName', None)
+
+        if fileName != None and fileType != None:
+            return self.batchAddEquipment(fileType, fileName)
+        else:
+            return ResponseJSON(800)
+
+        #return HttpResponse(self.batchAddEquipmentfromTXTDict('D://1.txt'))
+        #return HttpResponse(self.batchAddEquipmentfromExecl2('D:/2.xlsx'))
+
+    def batchAddEquipment(self, fileType, fileName):
+        filename = fileName.name
+        filename = filename.replace(' ', '+')
+
+        try:
+            filePath = '/'.join((BASE_DIR, "static/SysFile", fileType)).replace('\\', '/') + '/'
+
+            if not os.path.exists(filePath):
+                os.makedirs(filePath)
+                fullPath = filePath + filename
+                if os.path.exists(fullPath):
+                    os.remove(fullPath)
+                destination = open(fullPath, 'wb+')
+                for chunk in fileName.chunks():
+                    destination.write(chunk)
+                destination.close()
+            else:
+                fullPath = filePath + filename
+                if os.path.exists(fullPath):
+                    os.remove(fullPath)
+                destination = open(fullPath, 'wb+')
+                for chunk in fileName.chunks():
+                    destination.write(chunk)
+                destination.close()
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('上传文件错误: %s' % errorInfo)
+            return ResponseJSON(700, {
+                'details': repr(e)
+            })
+
+        if fileType == 'TXT':
+            response = HttpResponse(self.batchAddEquipmentfromTXT(fullPath))
+            return response
+        elif fileType == 'Excel':
+            response = HttpResponse(self.batchAddEquipmentfromExecl(fullPath))
+            return response
+
+    def batchAddEquipmentfromExecl(self, filePath):
+        if not os.path.isfile(filePath):
+            return ResponseJSON(701)
+        else:
+            try:
+                xlsData = xlrd.open_workbook(filename = filePath)
+            except Exception as e:
+                errorInfo = traceback.format_exc()
+                print('Open the Excel file error: %s' % errorInfo)
+                return ResponseJSON(702, {
+                    'details': repr(e)
+                })
+            else:
+                sheetsCount = len(xlsData.sheets())
+                table = xlsData.sheets()[0]  # 打开第一张表
+                nrows = table.nrows  # 获取表的行数
+
+                eInfo = []
+                error_list = []
+                error_msg = {}
+                errorCount = addCount = 0
+
+                for index in range(nrows):  # 循环逐行添加
+                    eInfo = table.row_values(index)
+
+                    try:
+                        User = Device_User.objects.filter(userID = eInfo[0])
+                    except Exception as e:
+                        errorCount += 1
+                        errorInfo = traceback.format_exc()
+                        print('error message: %s' % errorInfo)
+
+                        errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
+                        error_list.append(errorDict)
+
+                        continue
+
+                    if not User:
+                        errorCount += 1
+                        errorDict = {'UID': eInfo[2], 'error_msg': u'error message: The UserID {0} does not exist!'.format(eInfo[0])}
+                        error_list.append(errorDict)
+
+                        continue
+                    try:
+                        tupleInfo = Device_Info.objects.get_or_create(userID_id=eInfo[0],
+                                                                      NickName=eInfo[1],
+                                                                      UID=eInfo[2], SID=eInfo[3],
+                                                                      View_Account=eInfo[4],
+                                                                      View_Password=eInfo[5],
+                                                                      AudioFormat=eInfo[6],
+                                                                      EventNotification=eInfo[7],
+                                                                      ChannelIndex=eInfo[8],
+                                                                      Online=eInfo[9],
+                                                                      mMonitorIndex=eInfo[10],
+                                                                      Type=eInfo[11],
+                                                                      DebugMode=eInfo[12],
+                                                                      NotificationMode=eInfo[13],
+                                                                      qvgaLevel=eInfo[14],
+                                                                      defaults={'id': CommonService.getUserID(getUser=False)})
+                    except Exception as e:
+                        errorCount += 1
+                        errorInfo = traceback.format_exc()
+                        print('error message: %s' % errorInfo)
+
+                        errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
+                        error_list.append(errorDict)
+
+                        continue
+                    else:
+                        if tupleInfo[1] == True:
+                            addCount += 1
+                        else:
+                            errorCount += 1
+
+                if len(error_list) > 0:
+                    error_msg['error'] = error_list
+
+                xlsData.release_resources()
+                if xlsData:
+                    del xlsData
+
+                resultDict = { "result_code": 0, "reason": u'Success'}
+                if errorCount > 0:
+                    if len(error_msg) > 0:
+                        if sheetsCount > 1:
+                            resultDict.update({
+                                "result": {'appending': addCount, 'errorCount': errorCount, 'error_msg': error_msg,
+                                           'sheetsCount': 'The Execl contains {0} tables!'.format(sheetsCount)},
+                                 "error_code": 704
+                            })
+                        else:
+                            resultDict.update({
+                                "result": {'appending': addCount, 'errorCount': errorCount, 'error_msg': error_msg},
+                                 "error_code": 705
+                            })
+
+                        errorJSON = json.dumps(resultDict, ensure_ascii=False)
+                        return errorJSON
+                    else:
+                        if sheetsCount > 1:
+                            resultDict.update({
+                                "result": {'appending': addCount, 'appended': errorCount,
+                                    'sheetsCount': 'The Execl contains {0} tables!'.format(sheetsCount)},
+                                "error_code": 704,
+                            })
+                        else:
+                            resultDict.update({
+                                "result": {'appending': addCount, 'appended': errorCount},
+                                "error_code": 705,
+                            })
+
+                        errorJSON = json.dumps(resultDict, ensure_ascii=False)
+                        return errorJSON
+                else:
+                    if sheetsCount > 1:
+                        resultDict.update({
+                            "result": {'appending': addCount,
+                                       'sheetsCount': 'The Execl contains {0} tables!'.format(sheetsCount)},
+                            "error_code": 704,
+                        })
+                    else:
+                        resultDict.update({
+                            "result": {'appending': addCount},
+                            "error_code": 0,
+                        })
+                    JSON = json.dumps(resultDict, ensure_ascii=False)
+                    return JSON
+
+    def batchAddEquipmentfromExecl2(self, filePath):
+        '''
+
+        :param filePath:
+        :return:
+        :remarks: 不支持旧版xls
+        '''
+        #filePath = 'D:/2.xlsx'
+        try:
+            wb = load_workbook(filename = filePath)
+            ws = wb.get_sheet_names()
+            ws = wb.get_sheet_by_name(ws[0])
+            rows = ws.iter_rows()
+            #cols = ws.iter_cols()
+            #rows = ws.rows  # 行数
+            #columns = ws.columns  # 列数
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('error message: %s' % errorInfo)
+            return ResponseFormal(702,repr(e))
+        error_list = []
+        error_msg = {}
+        equipmentlists = []
+        errorCount = addCount = 0
+        for row in rows:
+            eInfo = []
+            for cell in row:
+                #print(cell.coordinate, cell.value)
+                if cell.value == None:
+                    cell.value = ''
+                eInfo.append(cell.value)
+
+            try:
+                User = Device_User.objects.filter(userID = eInfo[0])
+            except Exception as e:
+                errorCount += 1
+                errorInfo = traceback.format_exc()
+                print('error message: %s' % errorInfo)
+
+                errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
+                error_list.append(errorDict)
+
+                continue
+
+            if not User:
+                errorCount += 1
+                errorDict = {'UID': eInfo[2],
+                             'error_msg': u'error message: The UserID {0} does not exist!'.format(eInfo[0])}
+                error_list.append(errorDict)
+                continue
+
+            eqValid = Device_Info.objects.filter(userID_id = eInfo[0], UID=eInfo[2])
+            if eqValid:
+                errorCount += 1
+                errorDict = {'UID': eInfo[2], 'error_msg': u'The UID has already existed!'}
+                error_list.append(errorDict)
+                continue
+
+            equipment = Device_Info(id=CommonService.getUserID(getUser=False), userID_id=eInfo[0],
+                                    NickName=eInfo[1], UID=eInfo[2], SID=eInfo[3],
+                                    View_Account=eInfo[4], View_Password=eInfo[5],
+                                    AudioFormat=eInfo[6], EventNotification=eInfo[7],
+                                    ChannelIndex=eInfo[8], Online=eInfo[9], mMonitorIndex=eInfo[10],
+                                    Type=eInfo[11], DebugMode=eInfo[12], NotificationMode=eInfo[13],
+                                    qvgaLevel=eInfo[14], )
+            equipmentlists.append(equipment)
+
+        try:
+            elists = Device_Info.objects.bulk_create(equipmentlists)
+        except Exception as e:
+            errorCount += 1
+            errorInfo = traceback.format_exc()
+            print('error message: %s' % errorInfo)
+
+            errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
+            error_list.append(errorDict)
+        else:
+            if len(equipmentlists) != len(elists):
+                addCount += len(elists)
+                errorCount += (len(equipmentlists) - len(elists))
+            else:
+                addCount += len(elists)
+
+        if len(error_list) > 0:
+            error_msg['error'] = error_list
+
+        if errorCount == 0:
+            return ResponseFormal(0, {
+                'appending': addCount
+            })
+        else:
+            return ResponseFormal(0, {
+                'appending': addCount,
+                'errorCount': errorCount,
+                'error_msg': error_msg,
+            })
+
+    def batchAddEquipmentfromTXT(self, filePath):
+        '''
+        txt文件批量导入数据库,通过list方式
+        :param filePath:
+        :return:
+        '''
+        if os.path.isfile(filePath):
+            file = open(filePath, encoding='utf-8')
+            eInfo = []
+            error_list = []
+            error_msg = errorDict = {}
+            errorCount = addCount = 0
+
+            for line in file:
+                eInfo = line.split(';')
+                for index in range(len(eInfo)):
+                    if index > 5:
+                        eInfo[index] = int(eInfo[index])
+                    else:
+                        continue
+
+                dUser = Device_User.objects.filter(userID = eInfo[0])
+                if not dUser:
+                    errorCount += 1
+                    errorDict = {"userID": eInfo[0], "error_msg'": u"The userID_id is no exist!"}
+                    error_list.append(errorDict)
+
+                    continue
+
+                try:
+                    tupleInfo = Device_Info.objects.get_or_create(userID_id=eInfo[0], NickName=eInfo[1],
+                                                      UID=eInfo[2], SID=eInfo[3], View_Account=eInfo[4],
+                                                      View_Password=eInfo[5], AudioFormat=eInfo[6],
+                                                      EventNotification=eInfo[7], ChannelIndex=eInfo[8],
+                                                      Online=eInfo[9], mMonitorIndex=eInfo[10],
+                                                      Type=eInfo[11], DebugMode=eInfo[12],
+                                                      NotificationMode=eInfo[13], qvgaLevel=eInfo[14],
+                                                      defaults={'id': CommonService.getUserID(getUser=False)})
+                except Exception as e:
+                    errorCount += 1
+                    errorInfo = traceback.format_exc()
+                    print('error message: %s' % errorInfo)
+
+                    errorDict = {'UID': eInfo[2], 'error_msg': u'error message: {0}'.format(repr(e))}
+                    error_list.append(errorDict)
+
+                    continue
+                else:
+                    if tupleInfo[1] == True:
+                        addCount += 1
+                    else:
+                        errorDict = {'UID': eInfo[2], 'error_msg': u'The UID is existed!'}
+                        error_list.append(errorDict)
+                        errorCount += 1
+
+            file.close()
+
+            if len(error_list) > 0:
+                error_msg['error'] = error_list
+
+            if errorCount > 0:
+                if len(error_msg) > 0:
+                    return ResponseFormal(0, {
+                        'appending': addCount,
+                        'errorCount': errorCount,
+                        'error_msg': error_msg,
+                    })
+                else:
+                    return ResponseFormal(0, {'appending': addCount,'appended': errorCount,})
+            else:
+                return ResponseFormal(0,{'appending': addCount})
+        else:
+            return ResponseFormal(701)
+
+    def batchAddEquipmentfromTXTDict(self, filePath):
+        if os.path.isfile(filePath):
+            file = open(filePath, encoding='utf-8')
+
+            error_list = []
+            error_msg = {}
+            errorCount = addCount = 0
+            equipmentList = []
+            equipmentDict = {}
+
+            try:
+                for line in file:
+                    equipmentStr = eval(line)
+                    if isinstance(eval(equipmentStr), dict):
+                        equipmentDict.update(eval(equipmentStr))
+                    else:
+                        return ResponseFormal(706)
+                    UID = equipmentDict.get('UID', None)
+                    userID_id = equipmentDict.get('userID_id', None)
+
+                    dUser = Device_User.objects.filter(userID = userID_id)
+                    if dUser:
+                        if UID != None and userID_id != None:
+                            dInfo = Device_Info.objects.filter(userID_id = userID_id, UID = UID)
+                            if dInfo:
+                                errorCount += 1
+                                continue
+                            else:
+                                equipment = Device_Info(id = CommonService.getUserID(getUser=False), **equipmentDict)
+                                equipmentList.append(equipment)
+                        else:
+                            errorCount += 1
+                            errorDict = {'userID_id': userID_id, 'error_msg': u'The userID_id is None or UID is None!'}
+                            error_list.append(errorDict)
+
+                            continue
+
+                    else:
+                        errorCount += 1
+                        errorDict = {'userID_id': userID_id, 'error_msg': u'The userID_id is no exist!'}
+                        error_list.append(errorDict)
+
+                        continue
+
+                file.close()
+                sss = Device_Info.objects.bulk_create(equipmentList)
+                print(type(sss), sss)
+
+            except Exception as e:
+                errorInfo = traceback.format_exc()
+                print('The error Info: %s' % errorInfo)
+                return ResponseFormal(707,{'details':repr(e)})
+            else:
+                if len(error_list) > 0:
+                    error_msg['error'] = error_list
+
+                if errorCount > 0:
+                    if error_msg != None:
+                        return ResponseFormal(0, {'errorCount': errorCount,
+                                    'error': error_msg,
+                                    'appending': len(equipmentList)})
+                    else:
+                        return ResponseFormal(0, { 'errorCount': errorCount,
+                                    'appending': len(equipmentList)})
+                else:
+                    return ResponseFormal(0,{'appending':len(equipmentList)})
+        else:
+            return ResponseFormal(701)

+ 365 - 0
Controller/CheckUserData.py

@@ -0,0 +1,365 @@
+# -*- coding: utf-8 -*-
+
+from random import Random # 用于生成随机码
+from wsgiref.util import FileWrapper
+from django.utils.timezone import utc
+from django.views.decorators.csrf import csrf_exempt
+from django.views.generic import TemplateView
+from django.utils.decorators import method_decorator
+from django.contrib.auth.hashers import make_password
+from itsdangerous import URLSafeTimedSerializer as utsr # itsdangerous序列化
+import re, base64, json, traceback, random, string
+from qcloudsms_py.httpclient import HTTPError
+from qcloudsms_py import SmsSingleSender
+from qcloudsms_py import SmsVoiceVerifyCodeSender, SmsVoicePromptSender
+from Model.models import Auth_Captcha,Device_User
+from Ansjer.settings import BASE_DIR
+from Object.ResponseObject import ResponseObject
+import datetime,os
+from Ansjer.config import TX_PHONE_APP_KEY,TX_PHONE_APP_ID
+from django.http import HttpResponse
+
+
+#生成随机字符串
+def RandomStr(randomlength = 8, number = False):
+    str = ''
+    if number == False:
+        characterSet = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsT' \
+                   'tUuVvWwXxYyZz0123456789'
+    else:
+        characterSet = '0123456789'
+
+    length = len(characterSet) - 1
+
+    random = Random()
+    for index in range(randomlength):
+        str += characterSet[random.randint(0, length)]
+
+    return str
+
+class MobiletoResetPwdView(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(MobiletoResetPwdView, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+
+        userName = request.POST.get('userName', None)
+        authCode = request.POST.get('identifyingCode', None)
+        newPwd = request.POST.get('newPwd', None)
+
+        return self.ValidationError(userName, newPwd, authCode)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        userName = request.GET.get('userName', None)
+        authCode = request.GET.get('identifyingCode', None)
+        newPwd = request.GET.get('newPwd', None)
+
+        return self.ValidationError(userName, newPwd, authCode)
+
+    def ValidationError(self, userName, newPwd, authCode):
+        response = ResponseObject()
+        if userName != None and authCode != None and newPwd != None:
+            return self.MobiletoResetPwd(userName, authCode, newPwd, response)
+        else:
+            return response.json(800)
+    def MobiletoResetPwd(self, userName, authCode, newPwd,response):
+        UserValid = Device_User.objects.filter(username = userName).order_by('-data_joined')
+        if UserValid:
+            Users = Auth_Captcha.objects.filter(username = userName).order_by('-sendtime')
+
+            if Users:
+                for User in Users:
+                    if User.authcaptca == authCode and User.sendtype == 'forget':
+                        now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
+                        timeValid = (now_time - User.sendtime).total_seconds()
+
+                        if timeValid < 300:
+                            is_flag = UserValid.update(password=make_password(newPwd))
+                            if is_flag:
+                                return (0)
+                            else:
+                                return response.json(405)
+                        else:
+                            return response.json(120)
+        else:
+            return response.json(102)
+
+def date_handler(obj):
+    return obj.isoformat()
+
+
+class TokenLink:
+    '''
+    1. security_key就是settings.py中设置的SECRET_KEY
+    2. generate_validate_token函数通过URLSafeTimedSerializer
+    在用户注册时生成一个令牌。用户名在令牌中被编了码。生成令牌之后,
+    会将带有token的验证链接发送到注册邮箱。
+    3.在confirm_validate_token函数中,只要令牌没过期,
+    那它就会返回一个用户名,过期时间为3600秒
+    '''
+    def __init__(self, security_key):
+        self.security_key = security_key
+        self.salt = base64.encodestring(security_key.encode())
+
+    def generate_validate_token(self, token):
+        serializer = utsr(self.security_key)
+        return serializer.dumps(token, self.salt)
+
+    def confirm_validate_token(self, token, expiration=3600):
+        serializer = utsr(self.security_key)
+        return serializer.loads(token, salt=self.salt, max_age=expiration)
+
+    def remove_validate_token(self, token):
+        serializer = utsr(self.security_key)
+        return serializer.loads(token, salt=self.salt)
+
+
+class getRandom:
+    def __init__(self):
+        self.__seed = '1234567890abcdefghijklmnopqrstuvwxyzABCDEFGH' \
+               'IJKLMNOPQRSTUVWXYZ!@#$%^&*()_+=-'
+    def getSalt (self, strlen = 8):
+        sa = []
+        for index in range (strlen):
+            sa.append(random.choice(self.__seed))
+        salt = ''.join(sa)
+        return salt
+    def getSaltStr(self, strlen = 8):
+        salt = ''.join(random.sample(string.ascii_letters + string.digits, strlen))
+        return salt
+
+class ModifyPwdView(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(ModifyPwdView, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        userEmail = request.POST.get('userEmail', None)
+        oldPwd = request.POST.get('oldPwd', None)
+        newPwd = request.POST.get('newPwd', None)
+
+        return self.ValidationError(userEmail, oldPwd, newPwd)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+        userEmail = request.GET.get('userEmail', None)
+        oldPwd = request.GET.get('oldPwd', None)
+        newPwd = request.GET.get('newPwd', None)
+
+        return self.ValidationError(userEmail, oldPwd, newPwd)
+
+    def ValidationError(self, userEmail, oldPwd, newPwd):
+        response = ResponseObject()
+        dataValid = DataValid()
+        if dataValid.password_validate(newPwd):
+            if oldPwd != newPwd:
+                return response.json(118)
+            try:
+                User = Device_User.objects.get(userEmail = userEmail)
+                User.userPwd = make_password(newPwd)
+                User.save()
+            except Exception as e:
+                errorInfo = traceback.format_exc()
+                print('更新密码到数据库: %s' % errorInfo)
+                return response.json(501,{'msg':repr(e)})
+            else:
+                return response.json(0)
+        else:
+            return response.json(109)
+
+
+class DataValid:
+
+    def __init__(self):
+        # 用户名正则
+        # self.re_name = re.compile(r'^[A-Za-z0-9\u4e00-\u9fa5\.\_]{1,16}$')
+        self.re_name = re.compile(r'^[A-Za-z0-9\u4e00-\u9fa5\.\_\-\@]{4,40}$')
+        # 密码强度正则
+        self.re_password = re.compile(r'^\w{1,16}$')
+        # 手机号码正则
+        self.re_mobile = re.compile(r'^\d{1,16}$')
+        # 邮箱地址正则
+        self.re_email = re.compile(r'^[A-Za-z0-9\u4e00-\u9fa5\.\_\-]+@[A-Za-z0-9_-]+(\.[A-Za-z0-9_-]+)+$')
+
+    def name_validate(self, value):
+        if self.re_name.match(value):
+            return True
+        else:
+            return False
+
+    def password_validate(self, value):
+        if self.re_password.match(value):
+            return True
+        else:
+            return False
+
+    def email_validate(self, value):
+        if self.re_email.match(value):
+            return True
+        else:
+            return False
+
+    def mobile_validate(self, value):
+        if self.re_mobile.match(value):
+            return True
+        else:
+            return False
+
+def sms(phoneNumbers, sendModel, msg, sendType = 'register', template_id = 7839):
+    appid = TX_PHONE_APP_ID
+    appkey = TX_PHONE_APP_KEY
+
+    print(phoneNumbers, msg, sendModel, template_id)
+    ssender = SmsSingleSender(appid, appkey)
+    response = ResponseObject()
+    try:
+        if sendType == 'register':
+            result = ssender.send(0, "86", phoneNumbers, u"{authCode}为您的注册验证码,请于2分钟内填写。"
+                                               u"如非本人操作,请忽略本短信。".format(authCode=msg), "", "")
+        elif sendType == 'forget':
+            result = ssender.send(0, "86", phoneNumbers, u"{userPwd}为您的账号新密码,请登录账号后,修改为"
+                                                                u"用户自定义密码.".format(userPwd=msg), "", "")
+    except HTTPError as e:
+        errorInfo = traceback.format_exc()
+        print('发送手机验证码出现网络错误: %s' % errorInfo)
+        return response.json(1022,{'msg':repr(e)})
+
+    except Exception as e:
+        errorInfo = traceback.format_exc()
+        print('发送手机短信验证码错误: %s' % errorInfo)
+        return response.json(1021)
+    else:
+        resultCode = result.get('result', None)
+        if resultCode == 0:
+            JSON = json.dumps(result, ensure_ascii=False)
+            return JSON
+        else:
+            errorJSON = json.dumps(result, ensure_ascii=False)
+            return errorJSON
+
+class QCloudSms(object):
+    def __init__(self, nationcode, msg, template_id):
+        self.appid = TX_PHONE_APP_ID
+        self.appkey = TX_PHONE_APP_KEY
+        self.msg = msg # 验证码msg
+        self.nationcode = nationcode # 国家码
+        self.template_id = template_id # 模板ID
+
+    def sms(self, mobiles, model, type = 'register'):
+        response = ResponseObject()
+        ssender = SmsSingleSender(self.appid, self.appkey)
+        try:
+            if type == 'register':
+                result = ssender.send(0, "86", mobiles, u"{authCode}为您的注册验证码,请于2分钟内填写。"
+                                                             u"如非本人操作,请忽略本短信。".format(authCode= self.msg), "", "")
+            elif type == 'forget':
+                result = ssender.send(0, "86", mobiles, u"{userPwd}为您的账号新密码,请登录账号后,修改为"
+                                                             u"用户自定义密码.".format(userPwd = self.msg), "", "")
+        except HTTPError as e:
+            errorInfo = traceback.format_exc()
+            print('发送手机短信验证码出现网络错误: %s' % errorInfo)
+            return response.json(1022,repr(e))
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('发送手机验证码错误: %s' % errorInfo)
+            return response.formal(1021,repr(e))
+        else:
+            resultCode = result.get('result', None)
+            if resultCode == 0:
+                JSON = json.dumps(result, ensure_ascii=False)
+                return JSON
+            else:
+                errorJSON = json.dumps(result, ensure_ascii=False)
+                return errorJSON
+
+    def voice(self, mobiles, model, type = 'register'):
+        # 语音验证码请求
+        response = ResponseObject()
+        vvcsender = SmsVoiceVerifyCodeSender(appid = self.appid, appkey = self.appkey)
+        try:
+            result = vvcsender.send(nation_code=self.nationcode, phone_number = \
+                mobiles, playtimes = 2, msg = self.msg, ext = '')
+        except HTTPError as e:
+            errorInfo = traceback.format_exc()
+            print('发送手机验证码出现网络错误: %s' % errorInfo)
+            return response.formal(1022,repr(e))
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('发送手机语音验证码错误: %s' % errorInfo)
+            return response.formal(1023,repr(e))
+        else:
+            resultCode = result.get('result', None)
+            if resultCode == 0:
+                JSON = json.dumps(result, ensure_ascii=False)
+                return JSON
+            else:
+                errorJSON = json.dumps(result, ensure_ascii=False)
+                return errorJSON
+
+        # 发送语音通知
+        vpsender = SmsVoicePromptSender(appid=self.appid, appkey=self.appkey)
+        # note: msg内容,首先需要申请内容模板,通过后才可以发送
+        try:
+            result = vpsender.send(nation_code=self.nationcode, phone_number = \
+                mobiles, playtimes = 2, msg = self.msg, ext= '')
+        except HTTPError as e:
+            errorInfo = traceback.format_exc()
+            print('发送手机验证码出现网络错误: %s' % errorInfo)
+            return ResponseFormal(1022,repr(e))
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('发送手机语音验证码错误: %s' % errorInfo)
+            return ResponseFormal(1023,repr(e))
+        else:
+            resultCode = result.get('result', None)
+            if resultCode == 0:
+                JSON = json.dumps(result, ensure_ascii=False)
+                return JSON
+            else:
+                errorJSON = json.dumps(result, ensure_ascii=False)
+                return errorJSON
+
+@csrf_exempt
+def download_file(request, Upgradename, *callback_args, **callback_kwargs):
+    """
+    下载单个文件
+    :param request:
+    :param Upgradename:
+    :param callback_args:
+    :param callback_kwargs:
+    :return:
+    """
+    print(Upgradename)
+    print(callback_args, callback_kwargs)
+    for value in callback_args:
+        print("other args:", value)
+    # 打印dict类型的不定长参数 args
+    for key in callback_kwargs:
+        print("dictargs:" + key + ":" + bytes(callback_kwargs[key]))
+    print(request.body)
+    file_name = os.path.join(BASE_DIR, "static/Upgrade/DVR/").replace('\\', '/') + Upgradename
+    response = ResponseObject()
+    if os.path.isfile(file_name):
+        try:
+            print(file_name)
+            JSON = response.formal(0)
+            wrapper = FileWrapper(open(file_name, 'rb'))
+            response = HttpResponse(wrapper, content_type="application/octet-stream")
+            response['Content-Length'] = os.path.getsize(file_name)
+            response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(file_name)
+            response['Content-Error'] = JSON
+            return response
+        except Exception as e:
+            errorJSON = response.formal(10,'Wrong reason:' + repr(e))
+            response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
+            response['Content-Error'] = errorJSON
+            return response
+    else:
+        errorJSON = response.formal(907)
+        response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
+        response['Content-Error'] = errorJSON
+        return response

+ 113 - 0
Controller/DeviceLog.py

@@ -0,0 +1,113 @@
+#!/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 16:47
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: DeviceLog.py
+@Contact: chanjunkai@163.com
+"""
+import datetime
+
+import simplejson as json
+from django.views.decorators.csrf import csrf_exempt
+
+from Model.models import Device_Info
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Object.mongodb import mongodb
+from Service.CommonService import CommonService
+from Service.DeviceOperation import DeviceOperation
+from Service.ModelService import ModelService
+
+'''
+curl http://192.168.136.45:8077/devices/C2887N9EBS87ZAT1111A/logs -d "deviceData={\"UID\":\"C2887N9EBS87ZAT1111A\",\"type\":\"0x10014\",\"UserIP\":\"127.0.0.1\",\"time\":1529474865,\"name\":\"admin\"}"
+http://192.168.136.40:8077/devices/2N1K3LE78TYJ38CE111A/logs?type=All&starttime=1529462169&endtime=1529462169
+'''
+
+
+@csrf_exempt
+def DeviceLog(request, uid):
+    # 存储设备日志
+    response = ResponseObject()
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        deviceData = request.POST.get('deviceData', None)
+        device_info = Device_Info.objects.filter(UID=uid)
+        if device_info.exists():
+            try:
+                data = json.loads(deviceData)
+                mdb = mongodb()
+                data['et'] = datetime.datetime.utcnow()
+                col = "log_device_operation"
+                mdb.insert_one(col=col, data=data)
+                return response.json(0)
+            except Exception as e:
+                print(repr(e))
+                return response.json(48,repr(e))
+        else:
+            return response.json(13)
+    # 查找设备日志
+    if request.method == 'GET':
+        request.encoding = 'utf-8'
+        token = request.GET.get('token', None)
+        page = request.GET.get('page', None)
+        line = request.GET.get('line', None)
+        type = request.GET.get('type', None)
+        search_class = request.GET.get('class', None)
+        starttime = request.GET.get('starttime', None)
+        endtime = request.GET.get('endtime', None)
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if page is None and line is None:
+                    page = 1
+                    line = 10000
+                param_flag = CommonService.get_param_flag(data=[userID, page, line, uid])
+                own_dev = ModelService.check_own_device(userID=userID, UID=uid)
+                own_per = ModelService.check_permission(userID=userID, permID=30)
+                if own_dev is True or own_per is True:
+                    if param_flag is True:
+                        query = {'uid': uid}
+                        if search_class == 'All' or type == 'All':
+                            pass
+                        else:
+                            try:
+                                class_data= DeviceOperation.getODla(search_class=search_class)
+                                query['type'] = {'$gte': class_data[0], '$lte': class_data[1]}
+                            except Exception as e:
+                                if type is not None:
+                                    query['type'] = type
+                        if starttime is not None and starttime != '' and endtime is not None and endtime != '':
+                            query['time'] = {'$gte': int(starttime), '$lte': int(endtime)}
+                        elif starttime is not None and starttime != '':
+                            query['time'] = {'$gte': int(starttime)}
+                        elif endtime is not None and endtime != '':
+                            query['time'] = {'$lte': int(endtime)}
+                        print('___________query____________')
+                        print(query)
+                        print('___________query____________')
+                        mdb = mongodb()
+                        col = "log_device_operation"
+                        qs = mdb.findAll(col=col, page=int(page), line=int(line), query=query)
+                        if qs is not False:
+                            data_list = []
+                            for i in qs['data']:
+                                i['type'] = DeviceOperation.getOperation(type=i['type'])
+                                data_list.append(i)
+                            qs['data'] = data_list
+                        return response.json(0,qs)
+                else:
+                    return response.json(404)
+                return response.json(444)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(311)

+ 177 - 0
Controller/DeviceManage.py

@@ -0,0 +1,177 @@
+#!/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/1 10:20
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: DeviceManage.py
+@Contact: chanjunkai@163.com
+"""
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from django.views.generic.base import View
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from Service.ModelService import ModelService
+from Service.CommonService import CommonService
+from Model.models import Device_Info
+import traceback,datetime
+from django.utils import timezone
+'''
+http://192.168.136.40:8077/device/manage?operation=query&token=test&page=1&line=10
+http://192.168.136.40:8077/device/manage?operation=delete&id=1&id=2
+http://192.168.136.45:8077/device/manage?operation=findByUser&token=test&username=13800138001&page=1&line=10
+-----------------------
+
+'''
+
+
+class DeviceManage(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(DeviceManage, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.GET)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.POST)
+
+    def validation(self, request_dict, *args, **kwargs):
+        operation = request_dict.get('operation', None)
+        response = ResponseObject()
+        if operation is not None:
+            token = request_dict.get('token', None)
+            if token is not None:
+                tko = TokenObject(token)
+                tko.valid()
+                response.lang = tko.lang
+                if tko.code == 0:
+                    userID = tko.userID()
+                    if userID is not None:
+                        if operation == 'query':
+                            return self.query(request_dict, userID, response)
+                        elif operation == 'findByUser':
+                            return self.findByUser(request_dict, userID,response)
+                        elif operation == 'delete':
+                            return self.delete(request_dict, userID, response)
+                    return response.json(444,'operation')
+                else:
+                    return response.json(tko.code)
+            else:
+                return response.json(311)
+        else:
+            return response.json(444)
+
+    def query(self, request_dict, userID, response):
+        own_perm = ModelService.check_permission(userID=userID, permID=30)
+        if own_perm is True:
+            page = int(request_dict.get('page', None))
+            line = int(request_dict.get('line', None))
+            if page is not None and line is not None:
+                queryset = Device_Info.objects.all()
+                if queryset.exists():
+                    count = queryset.count()
+                    res = queryset[(page - 1) * line:page * line]
+                    send_dict = CommonService.qs_to_dict(res)
+                    for k, v in enumerate(send_dict["datas"]):
+                        for val in res:
+                            if v['pk'] == val.id:
+                                if send_dict["datas"][k]['fields']['Online'] is True:
+                                    dl_time = val.update_time+datetime.timedelta(minutes=60)
+                                    now_time = timezone.localtime(timezone.now())
+                                    if now_time > dl_time:
+                                        pass
+                                        # send_dict["datas"][k]['fields']['Online'] = False
+                                username= ModelService.get_user_name(send_dict["datas"][k]['fields']['userID'])
+                                send_dict["datas"][k]['fields']['username']=username
+                                primary= ModelService.get_user_name(send_dict["datas"][k]['fields']['primaryUserID'])
+                                send_dict["datas"][k]['fields']['primaryusername']=primary
+                    send_dict['count'] = count
+                    return response.json(0, send_dict)
+                return response.json(0,{'count':0})
+            else:
+                return response.json(444,'page,line')
+        else:
+            return response.json(404)
+
+    def delete(self, request_dict, userID, response):
+        own_perm = ModelService.check_permission(userID=userID, permID=10)
+        if own_perm is True:
+            id_list = request_dict.getlist('id', None)
+            if id_list:
+                try:
+                    for id in id_list:
+                        Device_Info.objects.filter(id=id).delete()
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, {'details': repr(e)})
+                else:
+                    return response.json(0)
+            else:
+                return response.json(444,'id must list')
+        else:
+            return response.json(404)
+
+    def findByUser(self, request_dict, userID, response):
+        own_perm = ModelService.check_permission(userID=userID, permID=30)
+        if own_perm is True:
+            page = int(request_dict.get('page', None))
+            line = int(request_dict.get('line', None))
+            username = request_dict.get('username', None)
+            param_flag = CommonService.get_param_flag(data=[page, line, username])
+            if param_flag is True:
+                userID_id= ModelService.get_userID_byname(username=username)
+                print(userID_id)
+                queryset = Device_Info.objects.filter(userID_id=userID_id)
+                if queryset.exists():
+                    count = queryset.count()
+                    res = queryset[(page - 1) * line:page * line]
+                    send_dict = CommonService.qs_to_dict(res)
+                    for k, v in enumerate(send_dict["datas"]):
+                        for val in res:
+                            if v['pk'] == val.id:
+                                if send_dict["datas"][k]['fields']['Online'] is True:
+                                    dl_time = val.update_time + datetime.timedelta(minutes=1)
+                                    now_time = timezone.localtime(timezone.now())
+                                    if now_time > dl_time:
+                                        send_dict["datas"][k]['fields']['Online'] = False
+                                send_dict["datas"][k]['fields']['username']=username
+                                primary= ModelService.get_user_name(send_dict["datas"][k]['fields']['primaryUserID'])
+                                send_dict["datas"][k]['fields']['primaryusername']=primary
+                    send_dict['count'] = count
+                    return response.json(0, send_dict)
+                return response.json(0,{'count':0})
+            else:
+                return response.json(444)
+        else:
+            return response.json(404)
+
+
+@csrf_exempt
+def Devices(request, UID):
+    # 获取指定用户指定设备详细信息
+    if request.method == 'GET':
+        request.encoding = 'utf-8'
+        token = request.GET.get('token', None)
+        response = ResponseObject()
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                res = Device_Info.objects.filter(userID_id=userID,UID=UID)
+                send_dict = CommonService.qs_to_dict(res)
+                return response.json(0, send_dict)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(311)

+ 339 - 0
Controller/DeviceMeal.py

@@ -0,0 +1,339 @@
+#!/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/30 14:13
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: DeviceMeal.py
+@Contact: chanjunkai@163.com
+"""
+from django.views.generic.base import View
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from Service.ModelService import ModelService
+from Service.CommonService import CommonService
+from Model.models import Device_Meal, Store_Meal
+import traceback, datetime
+from django.utils import timezone
+from Object.TokenObject import TokenObject
+from Object.ResponseObject import ResponseObject
+
+'''
+http://192.168.136.40:8077/device/meal?operation=add&token=test&uid=UKPAH63V23U4ZHEB111A&channel=1&rank=2&days=1
+http://192.168.136.40:8077/device/meal?operation=query&token=test&page=1&line=10
+http://192.168.136.40:8077/device/meal?operation=delete&token=test&id=1&id=2&id=3&id=4&id=5
+http://192.168.136.45:8077/device/meal?operation=update&token=test&status=1&uid=UKPAH63V23U4ZHEB111A&channel=2&rank=2&days=1&id=6
+用户:
+http://13.56.215.252:82/device/meal?operation=querybyuser&token=test&uid=L59KVYDAEPHR1T6M111A&channel=0
+http://13.56.215.252:82/device/meal?operation=addbyuser&token=test&uid=L59KVYDAEPHR1T6M111A&channel=11&rank=2
+http://13.56.215.252:82/device/meal?operation=updatebyuser&token=test&status=1&uid=L59KVYDAEPHR1T6M111A&channel=0&rank=2
+http://13.56.215.252:82/device/meal?operation=updatestatusbyuser&token=test&status=1&uid=L59KVYDAEPHR1T6M111A&channel=0
+'''
+
+
+class DeviceMeal(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(DeviceMeal, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.GET)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.POST)
+
+    def validation(self, request_dict, *args, **kwargs):
+        response = ResponseObject()
+        operation = request_dict.get('operation', None)
+        if operation is not None:
+            token = request_dict.get('token', None)
+            if token is not None:
+                tko = TokenObject(token)
+                tko.valid()
+                response.lang = tko.lang
+                if tko.code == 0:
+                    userID = tko.userID()
+                    if userID is not None:
+                        if operation == 'query':
+                            return self.query(request_dict, userID, response)
+                        elif operation == 'add':
+                            return self.add(request_dict, userID, response)
+                        elif operation == 'update':
+                            return self.update(request_dict, userID, response)
+                        elif operation == 'delete':
+                            return self.delete(request_dict, userID, response)
+                        # 用户付费成功调用
+                        elif operation == 'addbyuser':
+                            return self.addbyuser(request_dict, userID, response)
+                        elif operation == 'querybyuser':
+                            return self.querybyuser(request_dict, userID, response)
+                        elif operation == 'updatebyuser':
+                            return self.updatebyuser(request_dict, userID, response)
+                        elif operation == 'updatestatusbyuser':
+                            return self.updatestatusbyuser(request_dict, userID, response)
+                    return response.json(444, 'userID,operation')
+                else:
+                    return response.json(tko.code)
+            else:
+                return response.json(311)
+        else:
+            return response.json(444, 'operation')
+
+    def add(self, request_dict, userID,response):
+        own_perm = ModelService.check_permission(userID=userID, permID=40)
+        if own_perm is True:
+            uid = request_dict.get('uid', None)
+            channel = request_dict.get('channel', None)
+            rank = request_dict.get('rank', None)
+            param_flag = CommonService.get_param_flag(data=[uid, channel, rank])
+            if param_flag is True:
+                is_exist = Device_Meal.objects.filter(uid=uid, channel=channel)
+                if is_exist.exists():
+                    return response.json(54)
+                else:
+                    try:
+                        store_meal = Store_Meal.objects.get(id=rank)
+                        days = store_meal.day
+                        end_time = datetime.timedelta(days=int(days)) + datetime.datetime.now()
+                        print(end_time)
+                        device_meal = Device_Meal(
+                            status=1,
+                            uid=uid,
+                            channel=channel,
+                            end_time=end_time,
+                            rank=store_meal,
+                        )
+                        device_meal.save()
+                    except Exception as e:
+                        return response.json(500, {'details': repr(e)})
+                    else:
+                        if device_meal.id:
+                            return response.json(0, {'id': device_meal.id,
+                                                    'status': device_meal.status,
+                                                    'uid': device_meal.uid,
+                                                    'rank': rank,
+                                                    'channel': device_meal.channel,
+                                                    'add_time': str(device_meal.add_time),
+                                                    'update_time': str(device_meal.update_time),
+                                                    'end_time': str(device_meal.end_time)})
+            return response.json(444)
+        else:
+            return response.json(404)
+
+    def query(self, request_dict, userID,response):
+        own_perm = ModelService.check_permission(userID=userID, permID=30)
+        if own_perm is True:
+            page = int(request_dict.get('page', None))
+            line = int(request_dict.get('line', None))
+            param_flag = CommonService.get_param_flag(data=[page, line])
+            if param_flag is True:
+                queryset = Device_Meal.objects.all()
+                if queryset.exists():
+                    count = queryset.count()
+                    res = queryset[(page - 1) * line:page * line]
+                    send_dict = CommonService.qs_to_dict(res)
+                    for k, v in enumerate(send_dict["datas"]):
+                        for val in res:
+                            if v['pk'] == val.id:
+                                title = Store_Meal.objects.get(id=v['fields']['rank']).title
+                                send_dict["datas"][k]['fields']['title'] = title
+                    send_dict['count'] = count
+                    return response.json(0, send_dict)
+                return response.json(0)
+            else:
+                return response.json(444)
+        else:
+            return response.json(404)
+
+    def update(self, request_dict, userID,response):
+        own_perm = ModelService.check_permission(userID=userID, permID=30)
+        if own_perm is True:
+            id = request_dict.get('id', None)
+            status = request_dict.get('status', None)
+            uid = request_dict.get('uid', None)
+            channel = request_dict.get('channel', None)
+            rank = request_dict.get('rank', None)
+            param_flag = CommonService.get_param_flag(data=[status, uid, channel, rank, id])
+            if param_flag is True:
+                try:
+                    store_meal = Store_Meal.objects.get(id=rank)
+                    device_meal = Device_Meal.objects.get(id=id)
+                    days = store_meal.day
+                    now_time = timezone.localtime(timezone.now())
+                    if now_time > device_meal.end_time:
+                        end_time = now_time + datetime.timedelta(days=int(days))
+                    else:
+                        end_time = device_meal.end_time + datetime.timedelta(days=int(days))
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, {'details': repr(e)})
+                else:
+                    if device_meal.id:
+                        device_meal.status = status
+                        device_meal.uid = uid
+                        device_meal.channel = channel
+                        device_meal.end_time = end_time
+                        device_meal.rank = store_meal
+                        device_meal.save()
+                        return response.json(0, {'update_id': device_meal.id,
+                                                'update_time': str(now_time),
+                                                'end_time': str(end_time)})
+            else:
+                return response.json(444)
+        else:
+            return response.json(404)
+
+    def delete(self, request_dict, userID,response):
+        own_perm = ModelService.check_permission(userID=userID, permID=10)
+        if own_perm is True:
+            id_list = request_dict.getlist('id', None)
+            param_flag = CommonService.get_param_flag(data=[id_list])
+            if param_flag is True:
+                try:
+                    for id in id_list:
+                        Device_Meal.objects.filter(id=id).delete()
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, {'details': repr(e)})
+                else:
+                    return response.json(0)
+            else:
+                return response.json(444)
+        else:
+            return response.json(404)
+
+    def addbyuser(self, request_dict, userID, response):
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        rank = request_dict.get('rank', None)
+        param_flag = CommonService.get_param_flag(data=[uid, channel, rank])
+        if param_flag is True:
+            own_dev = ModelService.check_own_device(userID=userID, UID=uid)
+            if own_dev is True:
+                is_exist = Device_Meal.objects.filter(uid=uid, channel=channel)
+                if is_exist.exists():
+                    return response.json(54)
+                else:
+                    try:
+                        store_meal = Store_Meal.objects.get(id=rank)
+                        days = store_meal.day
+                        end_time = datetime.timedelta(days=int(days)) + datetime.datetime.now()
+                        print(end_time)
+                        device_meal = Device_Meal(
+                            status=1,
+                            uid=uid,
+                            channel=channel,
+                            end_time=end_time,
+                            rank=store_meal,
+                        )
+                        device_meal.save()
+                    except Exception as e:
+                        return response.json(500, {'details': repr(e)})
+                    else:
+                        if device_meal.id:
+                            return response.json(0,
+                                                {
+                                                    'id': device_meal.id,
+                                                    'status': device_meal.status,
+                                                    'uid': device_meal.uid,
+                                                    'rank': rank,
+                                                    'channel': device_meal.channel,
+                                                    'add_time': str(device_meal.add_time),
+                                                    'update_time': str(device_meal.update_time),
+                                                    'end_time': str(device_meal.end_time),
+                                                })
+            else:
+                return response.json(14)
+        return response.json(444)
+
+    # 查询设备是否开通
+    def querybyuser(self, request_dict, userID,response):
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        param_flag = CommonService.get_param_flag(data=[uid, channel])
+        if param_flag is True:
+            own_dev = ModelService.check_own_device(userID=userID, UID=uid)
+            if own_dev is True:
+                queryset = Device_Meal.objects.filter(uid=uid, channel=channel)
+                if queryset.exists():
+                    send_dict = CommonService.qs_to_dict(queryset)
+                    for k, v in enumerate(send_dict["datas"]):
+                        for val in queryset:
+                            if v['pk'] == val.id:
+                                title = Store_Meal.objects.get(id=v['fields']['rank']).title
+                                send_dict["datas"][k]['fields']['title'] = title
+                    return response.json(0, send_dict)
+                return response.json(0)
+            else:
+                return response.json(14)
+        else:
+            return response.json(444)
+
+    def updatebyuser(self, request_dict, userID,response):
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        rank = request_dict.get('rank', None)
+        param_flag = CommonService.get_param_flag(data=[uid, channel, rank])
+        if param_flag is True:
+            own_dev = ModelService.check_own_device(userID=userID, UID=uid)
+            if own_dev is True:
+                try:
+                    store_meal = Store_Meal.objects.get(id=rank)
+                    device_meal = Device_Meal.objects.get(uid=uid, channel=channel)
+                    days = store_meal.day
+                    now_time = timezone.localtime(timezone.now())
+                    if now_time > device_meal.end_time:
+                        end_time = now_time + datetime.timedelta(days=int(days))
+                    else:
+                        end_time = device_meal.end_time + datetime.timedelta(days=int(days))
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, {'details': repr(e)})
+                else:
+                    if device_meal.id:
+                        device_meal.uid = uid
+                        device_meal.channel = channel
+                        device_meal.end_time = end_time
+                        device_meal.rank = store_meal
+                        device_meal.save()
+                        return response.json(0, {'update_id': device_meal.id,
+                                                'update_time': str(now_time),
+                                                'end_time': str(end_time)})
+            else:
+                return response.json(14)
+        else:
+            return response.json(444)
+
+    def updatestatusbyuser(self, request_dict, userID,response):
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        status = request_dict.get('status', None)
+        if uid is not None and channel is not None:
+            own_dev = ModelService.check_own_device(userID=userID, UID=uid)
+            if own_dev is True:
+                try:
+                    device_meal = Device_Meal.objects.get(uid=uid, channel=channel)
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, {'details': repr(e)})
+                else:
+                    if device_meal.id:
+                        device_meal.status = status
+                        device_meal.save()
+                        now_time = timezone.localtime(timezone.now())
+                        return response.json(0, {'update_id': device_meal.id,
+                                                'update_time': str(now_time)})
+            else:
+                return response.json(14)
+        else:
+            return response.json(444)

+ 53 - 0
Controller/DownloadController.py

@@ -0,0 +1,53 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnserjRS
+@software: PyCharm
+@DATE: 2018/8/21 17:48
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: DownloadController.py
+@Contact: chanjunkai@163.com
+"""
+from django.views.decorators.csrf import csrf_exempt
+from Service.CommonService import CommonService
+from Object.ResponseObject import ResponseObject
+from ratelimit.decorators import ratelimit
+from django.views.generic import TemplateView
+from django.utils.decorators import method_decorator
+from Object.TokenObject import TokenObject
+import json
+
+
+class SignOtaUrl(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(SignOtaUrl, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = json.loads(request.body.decode('utf-8'))
+        return self.validation(request_dict, *args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.validation(request_dict, *args, **kwargs)
+
+    def validation(self, request_dict, *args, **kwargs):
+        token = request_dict.get('token', None)
+        response = ResponseObject()
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            code = tko.code
+            response.lang = tko.lang
+            if code == 0:
+                oid = tko.oid
+                return response.json(0,{'url':''})
+            else:
+                return response.json(code)
+        else:
+            return response.json(444, 'token')

+ 249 - 0
Controller/EquipmentInfo.py

@@ -0,0 +1,249 @@
+from django.views.generic.base import View
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from Service.ModelService import ModelService
+from Service.CommonService import CommonService
+from Model.models import Equipment_Info, Device_Info
+import traceback
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+'''
+http://192.168.136.45:8077/equipment/info?token=test&devUid=2N1K3LE78TYJ38CE111A&Channel=0&eventType=1&eventTime=1234567890&operation=add&alarm=21342134&receiveTime=1234567891234567
+http://192.168.136.45:8077/equipment/info?token=test&operation=query&page=1&line=10
+http://192.168.136.45:8077/equipment/info?token=test&operation=delete&devUid=UKPAH63V23U4ZHEB111A&id=5&id=6&id=7
+http://192.168.136.40:8077/equipment/info?token=test&operation=update&devUid=UKPAH63V23U4ZHEB111A&id=3&id=4
+http://192.168.136.45:8077/equipment/info?token=test&operation=queryByAdmin&page=1&line=10&userID_id=151547867345163613800138001
+http://192.168.136.45:8077/equipment/info?token=test&operation=deleteByAdmin&id=5&id=6&id=7
+
+'''
+
+
+class EquipmentInfo(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(EquipmentInfo, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.GET)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.POST)
+
+    def validation(self, request_dict, *args, **kwargs):
+        token = request_dict.get('token', None)
+        response = ResponseObject()
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            from var_dump import var_dump
+            var_dump(tko.lang)
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                operation = request_dict.get('operation', None)
+                if userID is not None and operation is not None:
+                    if operation == 'query':
+                        return self.query_info(request_dict, userID, response)
+                    elif operation == 'add':
+                        return self.add_info(request_dict, userID, response)
+                    elif operation == 'update':
+                        return self.update_info(request_dict, userID, response)
+                    elif operation == 'delete':
+                        return self.delete_info(request_dict, userID, response)
+                    elif operation == 'findByTime':
+                        return self.findByTime_info(request_dict, userID, response)
+                    if operation == 'queryByAdmin':
+                        return self.query_all_info(request_dict, userID, response)
+                    if operation == 'deleteByAdmin':
+                        return self.delete_by_admin(request_dict, userID, response)
+                return response.json(444,'operation')
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(311)
+
+    def add_info(self, request_dict, userID,response):
+        devUid = request_dict.get('devUid', None)
+        Channel = request_dict.get('Channel', None)
+        eventType = request_dict.get('eventType', None)
+        eventTime = request_dict.get('eventTime', None)
+        receiveTime = request_dict.get('receiveTime', None)
+        alarm = request_dict.get('alarm', None)
+        param_flag = CommonService.get_param_flag(data=[devUid, Channel, eventType, eventTime, alarm, receiveTime])
+        if param_flag is True:
+            own_device = ModelService.check_own_device(userID, UID=devUid)
+            if own_device is True:
+                try:
+                    device_info = Device_Info.objects.filter(UID=devUid,userID_id=userID)
+                except Exception:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, errorInfo)
+                else:
+                    if device_info.exists():
+                        try:
+                            equipment_info = Equipment_Info(
+                                userID=userID,
+                                devUid=devUid,
+                                Channel=Channel,
+                                eventType=eventType,
+                                receiveTime=receiveTime,
+                                eventTime=eventTime,
+                                viewPwd=device_info[0].View_Password,
+                                devNickName=device_info[0].NickName,
+                                viewAccont=device_info[0].View_Account,
+                                alarm=alarm
+                            )
+                            equipment_info.save()
+                        except Exception:
+                            errorInfo = traceback.format_exc()
+                            print(errorInfo)
+                            return response.json(500, errorInfo)
+                        else:
+                            if equipment_info.id:
+                                return response.json(0, {'infoID': equipment_info.id,
+                                                        'devUid': devUid,
+                                                        'Channel': Channel,
+                                                        'alarm': alarm,
+                                                        'eventType': eventType,
+                                                        'eventTime': eventTime,
+                                                        'receiveTime': receiveTime,
+                                                        'viewPwd': equipment_info.viewPwd,
+                                                        'devNickName': equipment_info.devNickName,
+                                                        'viewAccont': equipment_info.viewAccont})
+                            else:
+                                return response.json(500)
+                    else:
+                        return response.json(14)
+            else:
+                return response.json(14)
+        return response.json(444)
+
+    def query_info(self, request_dict, userID,response):
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        param_flag = CommonService.get_param_flag(data=[page, line])
+        if param_flag is True:
+            equipment_info_queryset = Equipment_Info.objects.filter(userID_id=userID)
+            if equipment_info_queryset.exists():
+                equipment_info_count = equipment_info_queryset.count()
+                equipment_info_res = equipment_info_queryset[(page - 1) * line:page * line]
+                send_json = CommonService.query_set_to_dict(equipment_info_res)
+                send_json['count'] = equipment_info_count
+                return response.json(0, send_json)
+            else:
+                uid_list = Device_Info.objects.filter(userID_id=userID).values_list('UID', flat=True)
+                devNickName_list = Device_Info.objects.filter(userID_id=userID).values_list('NickName', flat=True)
+                if len(uid_list) and len(devNickName_list):
+                    Equipment_Info.objects.filter(devUid__in=uid_list, devNickName__in=devNickName_list).update(
+                        userID=userID)
+                return response.json(0, {'datas': [], 'count': 0})
+        else:
+            return response.json(444)
+
+    def update_info(self, request_dict, userID, response):
+        id_list = request_dict.getlist('id[]', None)
+        if id_list is None or len(id_list) < 1:
+            id_list = request_dict.getlist('id', None)
+        param_flag = CommonService.get_param_flag(data=[id_list])
+        if param_flag is True:
+            count = 0
+            for id in id_list:
+                eq = Equipment_Info.objects.filter(id=id)
+                if eq.exists():
+                    own_dev = ModelService.check_own_device(userID, eq[0].devUid)
+                    if own_dev is True:
+                        count += 1
+                        eq.update(status=1)
+            return response.json(0,{'update_success': count})
+        else:
+            return response.json(444)
+
+    def delete_info(self, request_dict, userID, response):
+        id_list = request_dict.getlist('id[]', None)
+        if id_list is None or len(id_list) < 1:
+            id_list = request_dict.getlist('id', None)
+        param_flag = CommonService.get_param_flag(data=[id_list])
+        if param_flag is True:
+            try:
+                for id in id_list:
+                    eq = Equipment_Info.objects.filter(id=id)
+                    if eq.exists():
+                        own_dev = ModelService.check_own_device(userID, eq[0].devUid)
+                        if own_dev is True:
+                            eq.delete()
+            except Exception as e:
+                errorInfo = traceback.format_exc()
+                print(errorInfo)
+                return response.json(424,repr(e))
+            else:
+                return response.json(0)
+        else:
+            return response.json(444)
+
+    def findByTime_info(self, request_dict, userID,response):
+        startTime = request_dict.get('startTime')
+        endTime = request_dict.get('endTime')
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        param_flag = CommonService.get_param_flag(data=[startTime, endTime, page, line])
+        if param_flag is True:
+            uid_list = Device_Info.objects.filter(userID_id=userID).values_list('UID', flat=True)
+            if len(uid_list):
+                equipment_info_queryset = Equipment_Info.objects.filter(userID_id=userID,
+                                                                        eventTime__range=(startTime, endTime)).order_by(
+                    '-id')
+                if equipment_info_queryset.exists():
+                    equipment_info_count = equipment_info_queryset.count()
+                    equipment_info_res = equipment_info_queryset[(page - 1) * line:page * line]
+                    send_json = CommonService.qs_to_dict(equipment_info_res)
+                    send_json['count'] = equipment_info_count
+                    return response.json(0,send_json)
+            return response.json(0,{'datas': [], 'count': 0})
+        else:
+            return response.json(444)
+
+    def query_all_info(self, request_dict, userID,response):
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        userID_id = request_dict.get('userID_id', None)
+        param_flag = CommonService.get_param_flag(data=[page, line])
+        if param_flag is True:
+            check_perm = ModelService.check_permission(userID=userID, permID=30)
+            if check_perm is True:
+                uid_list = Device_Info.objects.filter(userID_id=userID_id).values_list('UID', flat=True)
+                if len(uid_list):
+                    equipment_info_queryset = Equipment_Info.objects.filter(userID_id=userID_id).order_by(
+                        '-id')
+                    if equipment_info_queryset.exists():
+                        equipment_info_count = equipment_info_queryset.count()
+                        equipment_info_res = equipment_info_queryset[(page - 1) * line:page * line]
+                        send_json = CommonService.qs_to_dict(equipment_info_res)
+                        send_json['count'] = equipment_info_count
+                        return response.json(0,send_json)
+                return response.json(0,{'datas': [], 'count': 0})
+            else:
+                return response.json(404)
+        else:
+            return response.json(444)
+
+    def delete_by_admin(self, request_dict, userID,response):
+        id_list = request_dict.getlist('id', None)
+        param_flag = CommonService.get_param_flag(data=[id_list])
+        if param_flag is True:
+            check_perm = ModelService.check_permission(userID=userID, permID=10)
+            if check_perm is True:
+                try:
+                    is_delete = Equipment_Info.objects.filter(id__in=id_list).delete()
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424,{'details': repr(e)})
+                else:
+                    return response.json(0,{'delete_count': is_delete[0]})
+            else:
+                return response.json(404)
+        else:
+            return response.json(444)

+ 389 - 0
Controller/EquipmentManager.py

@@ -0,0 +1,389 @@
+from django.views.decorators.csrf import csrf_exempt
+from django.core import serializers
+import traceback
+from Service.ModelService import ModelService
+from Model.models import Device_User, Device_Info
+from Service.CommonService import CommonService
+import simplejson as json
+from Object.TokenObject import TokenObject
+from Object.ResponseObject import ResponseObject
+
+
+def addNewUserEquipment(userID, deviceContent, response):
+    userIDValid = Device_User.objects.filter(userID=userID)
+    if userIDValid:
+        try:
+            try:
+                deviceData = json.loads(deviceContent)
+            except Exception as e:
+                return response.json(803, repr(e))
+            else:
+                UID = deviceData.get('UID', None)
+                if UID != None:
+                    is_bind = Device_Info.objects.filter(UID=UID, isShare=False)
+                    if is_bind:
+                        return response.json(175)
+                    dValid = Device_Info.objects.filter(userID=userID, UID=UID)
+                    if dValid:
+                        return response.json(174)
+                    else:
+                        if 'NickName' in deviceData:
+                            nValid = Device_Info.objects.filter(userID=userID, NickName=deviceData['NickName'])
+                            if nValid.exists():
+                                return response.json(179)
+                        userDevice = Device_Info(id=CommonService.getUserID(getUser=False), userID_id=userID,
+                                                 **deviceData)
+                        userDevice.save()
+                else:
+                    return response.json(806)
+
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('添加设备错误: %s ' % errorInfo)
+            return response.json(178, repr(e))
+        else:
+            sqlJSON = serializers.serialize('json', [userDevice])
+            sqlList = json.loads(sqlJSON)
+            sqlDict = dict(zip(["datas"], [sqlList]))
+            return response.json(0, sqlDict)
+    else:
+        return response.json(113)
+
+
+def delUserEquipment(userID, id, response):
+    try:
+        deviceValid = Device_Info.objects.filter(userID_id=userID, id=id)
+    except Exception as e:
+        errorInfo = traceback.format_exc()
+        print('查询数据库错误: %s' % errorInfo)
+        return response.json(500, repr(e))
+    else:
+        if deviceValid:
+            try:
+                Device_Info.objects.filter(userID_id=userID, id=id).delete()
+            except Exception as e:
+                errorInfo = traceback.format_exc()
+                print('删除数据库记录错误: %s' % errorInfo)
+                return response.json(176, repr(e))
+            else:
+                return response.json(0)
+        else:
+            UserValid = Device_User.objects.filter(userID=userID)
+            if UserValid.exists():
+                return response.json(172)
+            else:
+                return response.json(113)
+
+
+def modifyUserEquipment(userID, deviceContent, id, response):
+    try:
+        deviceValid = Device_Info.objects.filter(userID_id=userID, id=id)
+    except Exception as e:
+        errorInfo = traceback.format_exc()
+        print('查询数据库错误: %s' % errorInfo)
+        return response.json(500, repr(e))
+    else:
+        if deviceValid:
+            deviceData = json.loads(deviceContent)
+            try:
+                userDevice = Device_Info.objects.filter(userID_id=userID, id=id).update(**deviceData)
+            except Exception as e:
+                errorInfo = traceback.format_exc()
+                print('修改设备信息错误: %s ' % errorInfo)
+                return response.json(177, repr(e))
+            else:
+                qs = Device_Info.objects.filter(userID_id=userID, id=id)
+                res = CommonService.qs_to_dict(qs)
+                return response.json(0, res)
+        else:
+            UserValid = Device_User.objects.filter(userID=userID)
+            if UserValid.exists():
+                return response.json(172)
+            else:
+                return response.json(113)
+
+
+def showAllUserEquipment(userID, response):
+    try:
+        userValid = Device_User.objects.filter(userID=userID).order_by('-data_joined')
+    except Exception as e:
+        errorInfo = traceback.format_exc()
+        print('查询数据库错误: %s' % errorInfo)
+        return response.json(500, repr(e))
+
+    else:
+        if userValid.exists():
+            # own_permission = ModelService.check_permission(userID=userID,permID=30)
+            if userValid[0].is_superuser != 100 and userValid[0].is_superuser != 1:
+                return response.json(604)
+            else:
+                qs = Device_Info.objects.all()
+                res = CommonService.qs_to_dict(qs)
+                return response.json(0, res)
+        else:
+            return response.json(113)
+
+
+def showAllUserEquipmentPC(userID, fieldDict, response):
+    try:
+        user_valid = Device_User.objects.filter(userID=userID).order_by('-data_joined')
+    except Exception as e:
+        errorInfo = traceback.format_exc()
+        print('查询数据库错误: %s' % errorInfo)
+        return response.json(500, repr(e))
+    else:
+        if user_valid:
+            own_permission = ModelService.check_permission(userID=userID, permID=30)
+            if own_permission:
+                page = int(fieldDict['page'])
+                line = int(fieldDict['line'])
+                device_info_query_set = Device_Info.objects.all()
+                device_info_count = device_info_query_set.count()
+                device_info_res = device_info_query_set[(page - 1) * line:page * line]
+                sqlDict = CommonService.qs_to_dict(query_set=device_info_res)
+                sqlDict['count'] = device_info_count
+                return response.json(0, sqlDict)
+            else:
+                return response.json(604)
+        else:
+            return response.json(113)
+
+
+def findEquipmentInfo(content, type, fieldDict):
+    if type == 1:
+        Device_Info_QuerySet = Device_Info.objects.all()
+    if type == 2:
+        searchCondition = content
+        kwargs = CommonService.get_kwargs(data=searchCondition)
+        Device_Info_QuerySet = Device_Info.objects.filter(**kwargs)
+    page = int(fieldDict['page'])
+    line = int(fieldDict['line'])
+    device_info_count = Device_Info_QuerySet.count()
+    res = Device_Info_QuerySet[(page - 1) * line:page * line]
+    send_dict = CommonService.qs_to_dict(query_set=res)
+    for k, v in enumerate(send_dict["datas"]):
+        for val in res:
+            if v['pk'] == val.id:
+                username = ModelService.get_user_name(send_dict["datas"][k]['fields']['userID'])
+                send_dict["datas"][k]['fields']['username'] = username
+                primary = ModelService.get_user_name(send_dict["datas"][k]['fields']['primaryUserID'])
+                send_dict["datas"][k]['fields']['primaryusername'] = primary
+    send_dict['count'] = device_info_count
+    return send_dict
+
+
+@csrf_exempt
+def queryUserEquipmentInterface(request, *callback_args,
+                                **callback_kwargs):
+    '''
+    查询用户设备
+    :param request:
+    :param callback_args:
+    :param callback_kwargs:
+    :return:
+    '''
+    response = ResponseObject()
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        token = request.POST.get('token', None)
+    elif request.method == 'GET':
+        request.encoding = 'gb2312'
+        token = request.GET.get('token', None)
+    else:
+        return response.json(801)
+    if token is not None:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            userID = tko.userID()
+            if userID is not None:
+                try:
+                    deviceValid = Device_Info.objects.filter(userID_id=userID)
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print('查询数据库错误: %s' % errorInfo)
+                    return response.json(500, repr(e))
+                else:
+                    if deviceValid.exists():
+                        res = CommonService.qs_to_dict(deviceValid)
+                        return response.json(0, res)
+                    else:
+                        UserValid = Device_User.objects.filter(userID=userID)
+                        if UserValid.exists():
+                            return response.json(172)
+                        else:
+                            return response.json(113)
+            else:
+                return response.json(310)
+        else:
+            return response.json(tko.code)
+    else:
+        return response.json(800)
+
+
+@csrf_exempt
+def addNewUserEquipmentInterface(request, *callback_args,
+                                 **callback_kwargs):
+    response = ResponseObject()
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+    elif request.method == 'GET':
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+    else:
+        return response.json(801)
+    token = request_dict.get('token', None)
+    deviceContent = request_dict.get('content', None)
+    if token is not None and deviceContent is not None:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            userID = tko.userID()
+            if userID is not None:
+                return addNewUserEquipment(userID, deviceContent, response)
+            else:
+                return response.json(310)
+        else:
+            return response.json(tko.code)
+    else:
+        return response.json(444, 'token,content')
+
+
+@csrf_exempt
+def delUserEquipmentInterface(request, *callback_args,
+                              **callback_kwargs):
+    '''
+    删除用户设备
+    :param request:
+    :param callback_args: 表示任何多个无名参数,tuple类型
+    :param callback_kwargs: 表示关键字参数,dict类型
+    :return:
+    '''
+    response = ResponseObject()
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+    elif request.method == 'GET':
+        request.encoding = 'gb2312'
+        request_dict = request.GET
+    else:
+        return response.json(801)
+    token = request_dict.get('token', None)
+    id = request_dict.get('id', None)
+    if token is not None and id is not None:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            userID = tko.userID()
+            if userID is not None:
+                return delUserEquipment(userID, id, response)
+            else:
+                return response.json(310)
+        else:
+            return response.json(tko.code)
+    else:
+        return response.json(800)
+
+
+@csrf_exempt
+def modifyUserEquipmentInterface(request, *callback_args,
+                                 **callback_kwargs):
+    '''
+    修改用户设备
+    :param request:
+    :param callback_args:
+    :param callback_kwargs:
+    :return:
+    '''
+    response = ResponseObject()
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+    elif request.method == 'GET':
+        request.encoding = 'gb2312'
+        request_dict = request.GET
+    token = request_dict.get('token', None)
+    deviceContent = request_dict.get('content', None)
+    id = request_dict.get('id', None)
+    if token is not None and deviceContent is not None and id is not None:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            userID = tko.userID()
+            if userID is not None:
+                return modifyUserEquipment(userID, deviceContent, id, response)
+            else:
+                return response.json(310)
+        else:
+            return response.json(tko.code)
+    else:
+        return response.json(444, 'token,content,id')
+
+
+@csrf_exempt
+def showAllUserEquipmentInterface(request, *callback_args, **callback_kwargs):
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        fieldDict = request.POST
+    if request.method == 'GET':
+        request.encoding = 'utf-8'
+        fieldDict = request.GET
+    token = request.POST.get('token', None)
+    type = request.POST.get('type', None)
+    response = ResponseObject()
+    if token != None:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            userID = tko.userID()
+            if userID:
+                if type == 'PC':
+                    return showAllUserEquipmentPC(userID, fieldDict, response)
+                else:
+                    return showAllUserEquipment(userID, response)
+            else:
+                return response.json(310)
+        else:
+            return response.json(tko.code)
+    else:
+        return response.json(800)
+
+
+@csrf_exempt
+def findEquipmentInfoInterface(request, *callback_args, **callback_kwargs):
+    if request.method == 'GET':
+        request.encoding = 'gb2312'
+        fieldDict = request.GET
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        fieldDict = request.POST
+    deviceContent = fieldDict.get('content', None)
+    token = fieldDict.get('token', None)
+    response = ResponseObject()
+
+    if token != None:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            if deviceContent:
+                try:
+                    deviceContent = json.loads(deviceContent)
+                except Exception as e:
+                    print(repr(e))
+                    return response.json(10,repr(e))
+                else:
+                    resultDict = findEquipmentInfo(content=deviceContent, type=2, fieldDict=fieldDict)
+            else:
+                resultDict = findEquipmentInfo(content='', type=1, fieldDict=fieldDict)
+            return response.json(0, resultDict)
+        else:
+            return response.json(tko.code)
+    else:
+        return response.json(444,'token')

+ 148 - 0
Controller/EquipmentOTA.py

@@ -0,0 +1,148 @@
+from django.views.generic.base import View
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from Service.ModelService import ModelService
+from Service.CommonService import CommonService
+from Model.models import Equipment_Version
+from django.utils import timezone
+import os,simplejson as json
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Ansjer.settings import BASE_DIR
+
+'''
+http://192.168.136.45:8077/equipment/OTA?token=test&operation=query&page=1&line=10
+http://192.168.136.45:8077/equipment/OTA?token=test&operation=find&page=1&line=10&content={}
+http://192.168.136.40:8077/equipment/OTA?eid=138001524641441203480138000&token=test&operation=delete
+http://192.168.136.40:8077/equipment/OTA?eid=138001524641441203480138000&token=test&operation=update&status=1
+'''
+
+
+class EquipmentOTA(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(EquipmentOTA, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.GET)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.POST)
+
+    def validation(self, request_dict, *args, **kwargs):
+        token = request_dict.get('token', None)
+        response = ResponseObject()
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID is not None:
+                    operation = request_dict.get('operation', None)
+                    if operation is not None:
+                        if operation == 'delete':
+                            return self.delete(request_dict, userID, response)
+                        elif operation == 'query':
+                            return self.query(request_dict, userID, response)
+                        elif operation == 'find':
+                            return self.find(request_dict, userID, response)
+                        elif operation == 'update':
+                            return self.update(request_dict, userID, response)
+                    return response.json(444, 'operation')
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(311)
+
+    def delete(self, request_dict, userID,response):
+        eid = request_dict.get('eid', None)
+        param_flag = CommonService.get_param_flag(data=[eid])
+        if param_flag is True:
+            own_permission = ModelService.check_permission(userID=userID, permID=230)
+            if own_permission is True:
+                ev = Equipment_Version.objects.filter(eid=eid)
+                if ev.exists():
+                    try:
+                        has_ev = Equipment_Version.objects.filter(filePath=ev[0].filePath)
+                        if has_ev.exists():
+                            pass
+                        else:
+                            filepath = os.path.join(BASE_DIR, ev[0].filePath)
+                            os.remove(filepath)
+                    except Exception as e:
+                        pass
+                    ev.delete()
+                    return response.json(0)
+            else:
+                return response.json(404)
+        return response.json(444)
+
+    def query(self, request_dict, userID,response):
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        param_flag = CommonService.get_param_flag(data=[page, line])
+        if param_flag is True:
+            own_permission = ModelService.check_permission(userID=userID, permID=240)
+            if own_permission is True:
+                equipment_version_queryset = Equipment_Version.objects.all().order_by('-data_joined')
+                if equipment_version_queryset.exists():
+                    count = equipment_version_queryset.count()
+                    res = equipment_version_queryset[(page - 1) * line:page * line]
+                    send_json = CommonService.qs_to_dict(res)
+                    send_json['count'] = count
+                    return response.json(0, send_json)
+                return response.json(0)
+            else:
+                return response.json(404)
+        else:
+            return response.json(444)
+
+    def find(self, request_dict, userID,response):
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        content = request_dict.get('content', None)
+        param_flag = CommonService.get_param_flag(data=[page, line, content])
+        if param_flag is True:
+            own_permission = ModelService.check_permission(userID=userID, permID=250)
+            if own_permission is True:
+                content = json.loads(content)
+                search_kwargs = CommonService.get_kwargs(data=content)
+                equipment_version_queryset = Equipment_Version.objects.filter(**search_kwargs)
+                if equipment_version_queryset.exists():
+                    count = equipment_version_queryset.count()
+                    res = equipment_version_queryset[(page - 1) * line:page * line]
+                    send_json = CommonService.qs_to_dict(res)
+                    send_json['count'] = count
+                    return response.json(0, send_json)
+                else:
+                    return response.json(0)
+            else:
+                return response.json(404)
+        else:
+            return response.json(444)
+
+    def update(self, request_dict, userID,response):
+        eid = request_dict.get('eid', None)
+        param_flag = CommonService.get_param_flag(data=[eid])
+        if param_flag is True:
+            own_permission = ModelService.check_permission(userID=userID, permID=230)
+            if own_permission is True:
+                ev = Equipment_Version.objects.filter(eid=eid)
+                if ev.exists():
+                    status = request_dict.get('status', None)
+                    try:
+                        update_time = timezone.localtime(timezone.now())
+                        ev.update(status=status, update_time=update_time)
+                    except Exception as e:
+                        print(repr(e))
+                        pass
+                    return response.json(0, {'update_time': str(update_time)})
+            else:
+                return response.json(404)
+        return response.json(444)
+

+ 218 - 0
Controller/EquipmentSensor.py

@@ -0,0 +1,218 @@
+from django.views.generic.base import View
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from Service.ModelService import ModelService
+from Service.CommonService import CommonService
+from Model.models import Device_Info, Equipment_Sensor
+import traceback
+from Object.TokenObject import TokenObject
+from Object.ResponseObject import ResponseObject
+'''
+增加,关联设备传感器:
+params:{
+    did:设备主键did
+    name:传感器名称
+    status:设备状态值
+    type:设备类型
+    token:令牌
+    operation:add
+}
+http://192.168.136.40:8077/equipment/sensor?token=test&name=1&status=1&did=138001380001515727362917767&type=1&operation=add
+删除设备关联的传感器:
+params:{
+    id:传感器主键id
+    token:令牌
+    operation:delete
+     did:设备主键did
+}
+http://192.168.136.40:8077/equipment/sensor?token=test&id=2&id=3&operation=delete&did=did
+改,状态名称:
+params:{
+    id:传感器主键id
+    token:令牌
+    status:状态值
+    operation:update
+    name:name
+    did:设备主键did
+}
+http://192.168.136.40:8077/equipment/sensor?token=test&id=19&did=138001380001515727362917767&status=1&name=555&operation=update
+查找当前指定用户所有传感器
+params:{
+    token:令牌
+    operation:query
+    did:设备主键did
+}
+http://192.168.136.40:8077/equipment/sensor?token=test&operation=query&did=138001380001515727362917767
+后台
+查找所有传感器信息
+http://192.168.136.40:8077/equipment/sensor?token=test&page=1&line=5&operation=queryall
+'''
+
+
+class EquipmentSensor(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(EquipmentSensor, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.GET)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.POST)
+
+    def validation(self, request_dict, *args, **kwargs):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID is not None:
+                    operation = request_dict.get('operation', None)
+                    if operation == 'add':
+                        return self.add_sensor(request_dict, userID,response)
+                    elif operation == 'delete':
+                        return self.delete_sensor(request_dict, userID,response)
+                    elif operation == 'update':
+                        return self.update_sensor(request_dict, userID,response)
+                    elif operation == 'query':
+                        return self.query_sensor(request_dict, userID,response)
+                    elif operation == 'queryall':
+                        return self.admin_query_all_sensor(request_dict, userID,response)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(311)
+
+
+    def add_sensor(self, request_dict,userID,response):
+        # 设备PK
+        did = request_dict.get('did', None)
+        name = request_dict.get('name', None)
+        status = request_dict.get('status', None)
+        type = request_dict.get('type', None)
+        if did is not None and name is not None and status is not None and type is not None:
+            is_user = ModelService.check_user_own_device(userID=userID,deviceID=did)
+            if is_user is True:
+                try:
+                    device_info = Device_Info.objects.get(id=did)
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print('database error: %s' % errorInfo)
+                    return response.json(424)
+                else:
+                    if device_info:
+                        equipment_sensor = Equipment_Sensor(name=name, status=status, type=type, uid=device_info.UID)
+                        equipment_sensor.save()
+                        if equipment_sensor.id:
+                            return response.json(0,
+                                                                             {'id': equipment_sensor.id,
+                                                                                       'status': equipment_sensor.status,
+                                                                                       'name': equipment_sensor.name,
+                                                                                       'type': equipment_sensor.type})
+                        else:
+                            return response.json(4)
+            else:
+                return response.json(14)
+        return response.json(444)
+
+    def delete_sensor(self, request_dict,userID,response):
+        # deletelist
+        did = request_dict.get('did',None)
+        id_list = request_dict.getlist('id', None)
+        if len(id_list)>0 and id_list is not None and did is not None:
+            is_user = ModelService.check_user_own_device(userID=userID, deviceID=did)
+            is_superadmin = ModelService.check_permission(userID=userID, permID=10)
+            if is_user is True or is_superadmin is True:
+                try:
+                    device_info = Device_Info.objects.get(id=did)
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print('database error: %s' % errorInfo)
+                    return response.json(424)
+                else:
+                    if device_info:
+                        for id in id_list:
+                            Equipment_Sensor.objects.filter(id=id, uid=device_info.UID).delete()
+                        return response.json(0)
+            else:
+                return response.json(14)
+        return response.json(444)
+
+    def update_sensor(self,request_dict,userID,response):
+        id = request_dict.get('id', None)
+        did = request_dict.get('did',None)
+        status = request_dict.get('status', None)
+        name = request_dict.get('name', None)
+        if id is not None and status is not None:
+            is_user = ModelService.check_user_own_device(userID=userID, deviceID=did)
+            is_superadmin = ModelService.check_permission(userID=userID, permID=50)
+            if is_user is True or is_superadmin is True:
+                try:
+                    device_info = Device_Info.objects.get(id=did)
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print('database error: %s' % errorInfo)
+                    return response.json(424)
+                else:
+                    is_update = Equipment_Sensor.objects.filter(id=id, uid=device_info.UID).update(status=status,
+                                                                                                  name=name)
+                    if is_update:
+                        return response.json(0, {'id': id, 'status': status,
+                                                                                           'name': name})
+                return response.json(4)
+            else:
+                return response.json(14)
+        else:
+            return response.json(444)
+
+
+    def query_sensor(self,request_dict,userID,response):
+        did = request_dict.get('did', None)
+        if did is not None:
+            is_user = ModelService.check_user_own_device(userID=userID, deviceID=did)
+            is_superadmin = ModelService.check_permission(userID=userID,permID=30)
+            if is_user is True or is_superadmin is True:
+                try:
+                    device_info = Device_Info.objects.get(id=did)
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print('database error: %s' % errorInfo)
+                    return response.json(424)
+                else:
+                    equipment_sensor_queryset = Equipment_Sensor.objects.filter(uid=device_info.UID)
+                    if equipment_sensor_queryset.exists():
+                        send_json = CommonService.qs_to_dict(equipment_sensor_queryset)
+                        return response.json(0, send_json)
+                    else:
+                        return response.json(0, {})
+            return response.json(14)
+        else:
+            return response.json(444)
+
+    def admin_query_all_sensor(self,request_dict,userID,response):
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        if userID is not None:
+            is_own = ModelService.check_permission(userID=userID, permID=30)
+            if is_own is True:
+                equipment_sensor_queryset = Equipment_Sensor.objects.all()
+                if equipment_sensor_queryset.exists():
+                    equipment_stream_count = equipment_sensor_queryset.count()
+                    equipment_stream_res = equipment_sensor_queryset[(page - 1) * line:page * line]
+                    send_json = CommonService.qs_to_dict(equipment_stream_res)
+                    send_json['count'] = equipment_stream_count
+                    return response.json(0, send_json)
+                else:
+                    return response.json(0, {})
+            return response.json(604)
+        else:
+            return response.json(444)
+
+

+ 89 - 0
Controller/EquipmentStatus.py

@@ -0,0 +1,89 @@
+#!/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/7 9:27
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: EquipmentStat.py
+@Contact: chanjunkai@163.com
+"""
+from django.views.decorators.csrf import csrf_exempt
+from Model.models import Device_Info
+from django.utils import timezone
+from Service.CommonService import CommonService
+from Object.TokenObject import TokenObject
+from Object.ResponseObject import ResponseObject
+'''
+http://192.168.136.45:8077/device/online?UID=C2887N9EBS87ZAT1111A
+http://192.168.136.45:8077/device/offline?UID=C2887N9EBS87ZAT1111A
+http://192.168.136.45:8077/device/updateIP?UID=C2887N9EBS87ZAT1111A?ip=190.9.194.216
+'''
+
+
+@csrf_exempt
+def EquipmentOnline(request):
+    response = ResponseObject()
+    if request.method == 'GET':
+        request.encoding = 'utf-8'
+        UID = request.GET.get('UID', None)
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        UID = request.POST.get('UID', None)
+    device_info = Device_Info.objects.filter(UID=UID)
+    if device_info.exists():
+        try:
+            now_time = timezone.localtime(timezone.now())
+            device_info.update(Online=True, update_time=now_time)
+        except Exception as e:
+            print(repr(e))
+        return response.json(0)
+    else:
+        return response.json(13)
+
+
+@csrf_exempt
+def EquipmentOffline(request):
+    response = ResponseObject()
+    if request.method == 'GET':
+        request.encoding = 'utf-8'
+        UID = request.GET.get('UID', None)
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        UID = request.POST.get('UID', None)
+    device_info = Device_Info.objects.filter(UID=UID)
+    if device_info.exists():
+        try:
+            device_info.update(Online=False)
+        except Exception as e:
+            print(repr(e))
+        return response.json(0)
+    else:
+        return response.json(13)
+
+
+@csrf_exempt
+def updateIP(request):
+    response = ResponseObject()
+    if request.method == 'GET':
+        request.encoding = 'utf-8'
+        UID = request.GET.get('UID', None)
+        ip = request.GET.get('ip', None)
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        UID = request.POST.get('UID', None)
+        ip = request.POST.get('ip', None)
+    device_info = Device_Info.objects.filter(UID=UID)
+    if device_info.exists():
+        area = ''
+        try:
+            area = CommonService.getAddr(ip=ip)
+            device_info.update(ip=ip, area=area)
+        except Exception as e:
+            print(repr(e))
+        return response.json(0,{'area': area})
+    else:
+        return response.json(13)

+ 196 - 0
Controller/FeedBackInfo.py

@@ -0,0 +1,196 @@
+from django.views.generic.base import View
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from Service.ModelService import ModelService
+from Model.models import Feedback_Info
+from django.utils import timezone
+import traceback
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+'''
+http://192.168.136.45:8077/feedbackInfo?operation=add&token=test&content=12341234
+http://192.168.136.45:8077/feedbackInfo?operation=query&token=test&page=1&line=10
+http://192.168.136.45:8077/feedbackInfo?operation=update&token=test&id=1&content=gggggggggggggggg
+http://192.168.136.45:8077/feedbackInfo?operation=delete&token=test&id=11&id=13&id=14
+
+http://192.168.136.40:8077/feedbackInfo?operation=queryAll&token=test&page=1&line=5
+http://192.168.136.45:8077/feedbackInfo?operation=deleteByAdmin&token=test&id=11&id=13&id=14
+http://192.168.136.45:8077/feedbackInfo?operation=deleteByAdmin&token=test&id=11&id=13&id=14
+http://192.168.136.45:8077/feedbackInfo?operation=updateByAdmin&token=test&id=1&status=1
+'''
+
+
+class FeedBackInfo(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(FeedBackInfo, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.GET)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.POST)
+
+    def validation(self, request_dict, *args, **kwargs):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                operation = request_dict.get('operation', None)
+                if userID is not None:
+                    if operation == 'query':
+                        return self.query_info(request_dict, userID,response)
+                    elif operation == 'add':
+                        return self.add_info(request_dict, userID,response)
+                    elif operation == 'update':
+                        return self.update_info(request_dict, userID,response)
+                    elif operation == 'delete':
+                        return self.delete_info(request_dict, userID,response)
+                    elif operation == 'queryAll':
+                        return self.query_all_info(request_dict, userID,response)
+                    elif operation == 'deleteByAdmin':
+                        return self.delete_by_admin(request_dict, userID,response)
+                    elif operation == 'updateByAdmin':
+                        return self.update_by_admin(request_dict, userID,response)
+                    else:
+                        return response.json(444,'444')
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(311)
+
+    def add_info(self, request_dict, userID,response):
+        content = request_dict.get('content', None)
+        param_flag = CommonService.get_param_flag(data=[content])
+        if param_flag is True:
+            try:
+                feedback_info = Feedback_Info(
+                    userID=userID,
+                    content=content,
+                )
+                feedback_info.save()
+            except Exception:
+                errorInfo = traceback.format_exc()
+                print(errorInfo)
+                return response.json(424, {'details': errorInfo})
+            else:
+                print(type(feedback_info.add_time))
+                return response.json(0,{'id':feedback_info.id})
+        return response.json(444)
+
+    def query_info(self, request_dict, userID,response):
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        param_flag = CommonService.get_param_flag(data=[page, line])
+        if param_flag is True:
+            feedback_info_queryset = Feedback_Info.objects.filter(userID=userID).order_by('-id')
+            if feedback_info_queryset.exists():
+                count = feedback_info_queryset.count()
+                res = feedback_info_queryset[(page - 1) * line:page * line]
+                send_json = CommonService.qs_to_dict(res)
+                send_json['count'] = count
+                return response.json(0, send_json)
+            return response.json(0, {'datas': [], 'count': 0})
+        else:
+            return response.json(444)
+
+    def update_info(self, request_dict, userID,response):
+        content = request_dict.get('content', None)
+        id = request_dict.get('id',None)
+
+        param_flag = CommonService.get_param_flag(data=[id, content])
+        if param_flag is True:
+            try:
+                feedback_info = Feedback_Info.objects.get(userID=userID, id=id)
+                feedback_info.content = content
+                feedback_info.save()
+            except Exception as e:
+                return response.json(302, {'details': repr(e)})
+            else:
+                now_time = timezone.localtime(timezone.now())
+                return response.json(0, {'update_success': 1,
+                                                                                   'update_time': str(now_time)})
+        else:
+            return response.json(444)
+
+    def delete_info(self, request_dict, userID,response):
+        id_list = request_dict.getlist('id',None)
+        param_flag = CommonService.get_param_flag(data=[id_list])
+        if param_flag is True:
+            is_delete = Feedback_Info.objects.filter(id__in=id_list, userID=userID).delete()
+            return response.json(0,{'delete_count':is_delete[0]})
+        else:
+            return response.json(444)
+
+    def query_all_info(self, request_dict, userID,response):
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        order = request_dict.get('order','-id')
+        status = request_dict.get('status',None)
+        if order == '':
+            order ='-id'
+        param_flag = CommonService.get_param_flag(data=[page, line])
+        if param_flag is True:
+            check_perm = ModelService.check_permission(userID=userID,permID=30)
+            if check_perm is True:
+                if status is not None:
+                    feedback_info_queryset = Feedback_Info.objects.filter(status=status).order_by(order)
+                else:
+                    feedback_info_queryset = Feedback_Info.objects.all().order_by(order)
+                if feedback_info_queryset.exists():
+                    count = feedback_info_queryset.count()
+                    res = feedback_info_queryset[(page - 1) * line:page * line]
+                    send_json = CommonService.qs_to_dict(res)
+                    for k, v in enumerate(send_json["datas"]):
+                        username = ModelService.get_user_name(userID=send_json["datas"][k]['fields']['userID'])
+                        send_json["datas"][k]['fields']['username']=username
+                    send_json['count'] = count
+                    return response.json(0, send_json)
+                return response.json(0, {'datas': [], 'count': 0})
+            else:
+                return response.json(404)
+        else:
+            return response.json(444)
+
+    def delete_by_admin(self, request_dict, userID,response):
+        id_list = request_dict.getlist('id', None)
+        param_flag = CommonService.get_param_flag(data=[id_list])
+        if param_flag is True:
+            check_perm = ModelService.check_permission(userID=userID, permID=10)
+            if check_perm is True:
+                is_delete = Feedback_Info.objects.filter(id__in=id_list).delete()
+                return response.json(0, {'delete_count': is_delete[0]})
+            else:
+                return response.json(404)
+        else:
+            return response.json(444)
+
+    def update_by_admin(self, request_dict, userID,response):
+        id = request_dict.get('id',None)
+        status = request_dict.get('status',None)
+        param_flag = CommonService.get_param_flag(data=[id, status])
+        if param_flag is True:
+            check_perm = ModelService.check_permission(userID=userID, permID=50)
+            if check_perm is True:
+                try:
+                    feedback_info = Feedback_Info.objects.get(id=id)
+                    feedback_info.status = status
+                    feedback_info.save()
+                except Exception as e:
+                    return response.json(302, {'details': repr(e)})
+                else:
+                    now_time = timezone.localtime(timezone.now())
+                    return response.json(0, {'update_id': feedback_info.id,'update_time':str(now_time)})
+            else:
+                return response.json(404)
+        else:
+            return response.json(444)

+ 242 - 0
Controller/HlsManage.py

@@ -0,0 +1,242 @@
+#!/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/30 17:53
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: HlsManage.py
+@Contact: chanjunkai@163.com
+"""
+from django.views.generic.base import View
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from Service.ModelService import ModelService
+from Model.models import Device_Meal
+from Object.AWS.S3ClassObject import S3ClassObject
+from Object.AWS.CloudfrontSignUrl import CloudfrontSignUrl
+from Object.encryHlsVodUrl import getSignUrl
+from Object.m3u8generate import PlaylistGenerator
+from Object.TokenObject import TokenObject
+from Object.ResponseObject import ResponseObject
+from django.http import HttpResponse
+'''
+设备端
+http://13.56.215.252:82/HlsManager?operation=signPutObj&key=555666.mp4&uid=L59KVYDAEPHR1T6M111A&channel=0
+http://13.56.215.252:82/HlsManager?operation=signPostObj&key=ppp.mp4&uid=L59KVYDAEPHR1T6M111A&channel=0
+移动端
+http://13.56.215.252:82/HlsManager?operation=getHlsVod&uid=L59KVYDAEPHR1T6M111A&channel=0&token=test&key=234234234.ts
+http://13.56.215.252:82/HlsManager?operation=getAllTs&uid=L59KVYDAEPHR1T6M111A&channel=0&token=test
+http://13.56.215.252:82/HlsManager?operation=getVodUrl&uid=L59KVYDAEPHR1T6M111A&channel=0&token=test&key=121212.mp4
+'''
+
+
+class HlsManage(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(HlsManage, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.GET)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.POST)
+
+    def validation(self, request_dict, *args, **kwargs):
+        response = ResponseObject()
+        operation = request_dict.get('operation', None)
+        if operation == 'signPutObj':
+            return self.sign_put_obj(request_dict,response)
+        elif operation == 'signPostObj':
+            return self.sign_post_obj(request_dict,response)
+        elif operation == 'getHlsVod':
+            return self.get_hls_vod(request_dict,response)
+        elif operation == 'getAllTs':
+            return self.get_all_ts(request_dict,response)
+        elif operation == 'getVodUrl':
+            return self.get_vod_url(request_dict,response)
+        else:
+            return response.json(444, 'operation')
+
+    def sign_put_obj(self, request_dict,response):
+        key = request_dict.get('key', None)
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        if key is not None and uid is not None and channel is not None:
+            device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
+            if device_meal_queryset.exists():
+                path = uid + '_' + channel + '/' + key
+                meal_id = device_meal_queryset[0].rank_id
+                bucket_meal={
+                    1:'ansjer.meal.1',# 7
+                    2:'ansjer.meal.2',# 30
+                    # 3:'ansjer.meal.3',
+                }
+                s3 = S3ClassObject()
+                sign_url = s3.sign_put_object(key=path, bucket_meal=bucket_meal[meal_id])
+                if sign_url is not False:
+                    return (0, {'url': sign_url})
+                else:
+                    return response.json(48)
+            else:
+                return response.json(444)
+        else:
+            return response.json(444,'key, uid, channel')
+
+    def sign_post_obj(self, request_dict,response):
+        key = request_dict.get('key', None)
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        if key is not None and uid is not None and channel is not None:
+            device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
+            if device_meal_queryset.exists():
+                path = uid + '_' + channel + '/' + key
+                meal_id = device_meal_queryset[0].rank_id
+                bucket_meal = {
+                    1: 'ansjer.meal.1',  # 7
+                    2: 'ansjer.meal.2',  # 30
+                    # 3:'ansjer.meal.3',
+                }
+                s3 = S3ClassObject()
+                data = s3.sign_post_object(key=path, bucket_meal=bucket_meal[meal_id])
+                if data is not False:
+                    return response.json(0, {'url': data})
+                else:
+                    return response.json(48)
+            else:
+                return response.json(444)
+        else:
+            return response.json(444,'key, uid, channel')
+
+    def get_all_ts(self, request_dict,response):
+        token = request_dict.get('token', None)
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID is not None:
+                    uid = request_dict.get('uid', None)
+                    channel = request_dict.get('channel', None)
+                    if uid is not None and channel is not None:
+                        own_permission = ModelService.check_permission(userID=userID, permID=30)
+                        own_device = ModelService.check_own_device(userID=userID, UID=uid)
+                        if own_permission is True or own_device is True:
+                            device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
+                            if device_meal_queryset.exists():
+                                meal_id = device_meal_queryset[0].rank_id
+                                bucket_meal = {
+                                    1: 'ansjer.meal.1',  # 7
+                                    2: 'ansjer.meal.2',  # 30
+                                }
+                                s3 = S3ClassObject()
+                                data = s3.get_prefix_obj(prefix=uid + '_' + channel + '/', bucket=bucket_meal[meal_id])
+                                # return response.json(0, {'files': data,'bk':bucket_meal[meal_id]})
+                                return response.json(0, {'files': data})
+                            else:
+                                return response.json(444)
+                        else:
+                            return response.json(404)
+                    else:
+                        return response.json(444,'uid,channel')
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(311)
+
+    def get_hls_vod(self, request_dict,response):
+        token = request_dict.get('token', None)
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                
+                if userID is not None:
+                    key = request_dict.get('key', None)
+                    uid = request_dict.get('uid', None)
+                    channel = request_dict.get('channel', None)
+                    own_device = ModelService.check_own_device(userID=userID, UID=uid)
+                    if own_device is True:
+                        device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
+                        if device_meal_queryset.exists():
+                            meal_id = device_meal_queryset[0].rank_id
+                            cf_domain = {
+                                1: 'http://d3om3d8c0l14oc.cloudfront.net/',
+                                2: 'http://d4neaolnu8h83.cloudfront.net/',
+                            }
+                            url = cf_domain[meal_id] + uid + '_' + channel + '/' + key
+                            sign_url = CloudfrontSignUrl(url=url)
+                            playlist_entries = [
+                                {
+                                    'name': sign_url,
+                                    'duration': '60',
+                                }
+                            ]
+                            playlist = PlaylistGenerator(playlist_entries).generate()
+                            response = HttpResponse(content_type='application/force-download', content=playlist)
+                            response['Content-Disposition'] = 'attachment; filename=' + key + '.m3u8'
+                            # response['X-Sendfile'] = playlist
+                            # return response.json(404)
+                            return response
+                            # return HttpResponse(playlist)
+                        else:
+                            return response.json(0)
+                    else:
+                        return response.json(15)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(311)
+        
+    # mp4
+    def get_vod_url(self, request_dict,response):
+        token = request_dict.get('token', None)
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                key = request_dict.get('key', None)
+                uid = request_dict.get('uid', None)
+                channel = request_dict.get('channel', None)
+                if userID is not None:
+                    own_device = ModelService.check_own_device(userID=userID, UID=uid)
+                    if own_device is True:
+                        device_meal_queryset = Device_Meal.objects.filter(uid=uid, channel=channel, status=1)
+                        if device_meal_queryset.exists():
+                            meal_id = device_meal_queryset[0].rank_id
+                            bucket_meal = {
+                                1: 'ansjer.meal.1',  # 7
+                                2: 'ansjer.meal.2',  # 30
+                            }
+                            bk = bucket_meal[meal_id]
+                            path = '/'+bk+'/'+uid+'_'+channel+'/'+key
+                            signUrl = getSignUrl(path=path)
+                            return response.json(0,{'signUrl':signUrl})
+                        else:
+                            return response.json(0)
+                    else:
+                        return response.json(15)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(311)
+
+
+
+

+ 64 - 0
Controller/LogAccess.py

@@ -0,0 +1,64 @@
+#!/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/22 11:42
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: LogAccess.py
+@Contact: chanjunkai@163.com
+"""
+from Service.ModelService import ModelService
+from Object.mongodb import mongodb
+from django.views.decorators.csrf import csrf_exempt
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+
+
+@csrf_exempt
+def LogAccess(request):
+    if request.method == 'GET':
+        request.encoding = 'utf-8'
+        token = request.GET.get('token', None)
+        page = request.GET.get('page', None)
+        line = request.GET.get('line', None)
+        # order = request.GET.get('order', None)
+        # 开始时间
+        starttime = request.GET.get('starttime', None)
+        # 结束时间
+        endtime = request.GET.get('endtime', None)
+        response = ResponseObject()
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID is not None:
+                    if page is not None and line is not None:
+                        own_per = ModelService.check_permission(userID=userID, permID=30)
+                        if own_per is True:
+                            query = {}
+                            if starttime is not None and starttime != '' and endtime is not None and endtime != '':
+                                query['time'] = {'$gte': int(starttime), '$lte': int(endtime)}
+                            elif starttime is not None and starttime != '':
+                                query['time'] = {'$gte': int(starttime)}
+                            elif endtime is not None and endtime != '':
+                                query['time'] = {'$lte': int(endtime)}
+                            col = "log_access"
+                            mdb = mongodb()
+                            qs = mdb.findAll(col=col, page=int(page), line=int(line), query=query)
+                            return response.json(0, qs)
+                        else:
+                            return response.json(404)
+                    else:
+                        return response.json(444,'page,line')
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(311)

+ 226 - 0
Controller/LogManager.py

@@ -0,0 +1,226 @@
+from Controller import OTAEquipment
+from django.views.decorators.csrf import csrf_exempt
+from django.views.generic import TemplateView
+from django.utils.decorators import method_decorator
+import Ansjer.settings as api_settings
+from Service.ModelService import ModelService
+import time,os
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Ansjer.settings import BASE_DIR
+
+
+def StatisticsData(request):
+    print('------request------')
+
+    print(request)
+    print('---------------')
+    try:
+        real_ip = request.META['HTTP_X_FORWARDED_FOR']
+        clientIP = real_ip.split(",")[0]
+    except:
+        try:
+            clientIP = request.META['REMOTE_ADDR']
+        except Exception as e:
+            clientIP = ''
+
+    nowTime = time.strftime('%Y-%m-%d', time.localtime(time.time()))
+
+    print(u'当前用户: %s , 访问时间: %s' % (clientIP, nowTime))
+
+    print(u'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
+    for cookKey, cookValue in request.COOKIES.items():
+        print("COOKIES:", cookKey, cookValue)
+
+    for sessionKey, sessionValue in request.session.items():
+        print("session:", sessionKey, sessionValue)
+
+    print('HTTP_COOKIE', request.META.get('HTTP_COOKIE', 'unknown'))
+    print('CSRF_COOKIE', request.META.get('CSRF_COOKIE', 'unknown'))
+
+    print('user', request.user)
+
+    print(u'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
+
+    # print("body:", request.body)
+    print('path', request.path)
+    print('path_info', request.path_info)
+
+    print('encoding', request.encoding)
+    print('resolver_match', request.resolver_match)
+
+    for fileKey, fileValue in request.FILES.items():
+        print("FILES:", fileKey, fileValue)
+    #print('META', request.META)
+
+    print(u'******************************************************')
+    print('DOCUMENT_ROOT', request.META.get('DOCUMENT_ROOT', 'unknown'))
+    print('QUERY_STRING: ', request.META.get('QUERY_STRING', 'unknown'))
+    print('REMOTE_ADDR', request.META.get('REMOTE_ADDR', 'unknown'))
+    print('HTTP_HOST', request.META.get('HTTP_HOST', u'unknown'))
+    print('HTTP_REFERER', request.META.get('HTTP_REFERER', 'unknown'))
+    print('HTTP_COOKIE', request.META.get('HTTP_COOKIE', 'unknown'))
+    print('CSRF_COOKIE', request.META.get('CSRF_COOKIE', 'unknown'))
+    print('HTTP_CONNECTION', request.META.get('HTTP_CONNECTION', 'unknown'))
+    print('wsgi.errors', request.META.get('wsgi.errors', 'unknown'))
+    print('mod_wsgi.application_group', request.META.get('mod_wsgi.application_group', 'unknown'))
+    print('mod_wsgi.callable_object', request.META.get('mod_wsgi.callable_object', 'unknown'))
+    print('mod_wsgi.listener_host', request.META.get('mod_wsgi.listener_host', 'unknown'))
+    print('mod_wsgi.listener_port', request.META.get('mod_wsgi.listener_port', 'unknown'))
+    print('mod_wsgi.process_group', request.META.get('mod_wsgi.process_group', 'unknown'))
+    print('mod_wsgi.reload_mechanism', request.META.get('mod_wsgi.reload_mechanism', 'unknown'))
+    print('mod_wsgi.script_reloading', request.META.get('mod_wsgi.script_reloading', 'unknown'))
+    print('mod_wsgi.version', request.META.get('mod_wsgi.version', 'unknown'))
+    print('PATH', request.META.get('PATH', 'unknown'))
+    print('PATH_INFO', request.META.get('PATH_INFO', 'unknown'))
+    print('PATH_TRANSLATED', request.META.get('PATH_TRANSLATED', 'unknown'))
+    print('QUERY_STRING', request.META.get('QUERY_STRING', 'unknown'))
+    print('QUERY_STRING', request.META.get('REMOTE_ADDR', 'unknown'))
+    print('REMOTE_PORT', request.META.get('REMOTE_PORT', 'unknown'))
+    print('REQUEST_METHOD', request.META.get('REQUEST_METHOD', 'unknown'))
+    print('REQUEST_URI', request.META.get('REQUEST_URI', 'unknown'))
+    print('SCRIPT_FILENAME', request.META.get('SCRIPT_FILENAME', 'unknown'))
+    print('SCRIPT_NAME', request.META.get('SCRIPT_NAME', 'unknown'))
+    print('SERVER_ADDR', request.META.get('SERVER_ADDR', 'unknown'))
+    print('SERVER_ADMIN', request.META.get('SERVER_ADMIN', 'unknown'))
+    print('SERVER_NAME', request.META.get('SERVER_NAME', 'unknown'))
+    print('SERVER_PORT', request.META.get('SERVER_PORT', 'unknown'))
+    print('SERVER_PROTOCOL', request.META.get('SERVER_PROTOCOL', 'unknown'))
+    print('SERVER_SIGNATURE', request.META.get('SERVER_SIGNATURE', 'unknown'))
+    print('SERVER_SOFTWARE', request.META.get('SERVER_SOFTWARE', 'unknown'))
+    print('wsgi.input', request.META.get('wsgi.input', 'unknown'))
+    print('wsgi.multiprocess', request.META.get('wsgi.multiprocess', 'unknown'))
+    print('wsgi.multithread', request.META.get('wsgi.multithread', 'unknown'))
+    print('wsgi.run_once', request.META.get('wsgi.run_once', 'unknown'))
+    print('wsgi.url_scheme', request.META.get('wsgi.url_scheme', 'unknown'))
+    print('wsgi.version', request.META.get('wsgi.version', 'unknown'))
+    print('get_host', request.get_host())
+    print('get_full_path', request.get_full_path())
+    print('build_absolute_uri', request.build_absolute_uri())
+    print('is_secure', request.is_secure())
+    print('is_ajax', request.is_ajax())
+    print(u'******************************************************')
+
+    print('CONTENT_LENGTH: ', request.META.get('CONTENT_LENGTH', 'unknown'))
+    print('CONTENT_TYPE', request.META.get('CONTENT_TYPE', 'unknown'))
+    print('HTTP_ACCEPT', request.META.get('HTTP_ACCEPT', 'unknown'))
+    print('HTTP_ACCEPT_ENCODING', request.META.get('HTTP_ACCEPT_ENCODING', 'unknown'))
+    print('REMOTE_HOST', request.META.get('REMOTE_HOST', 'unknown'))
+    print('REMOTE_USER', request.META.get('REMOTE_USER', 'unknown'))
+    print('REQUEST_METHOD', request.META.get('REQUEST_METHOD', 'unknown'))
+    print('SERVER_NAME', request.META.get('SERVER_NAME', 'unknown'))
+    print('SERVER_PORT', request.META.get('SERVER_PORT', 'unknown'))
+    print('HTTP_USER_AGENT', request.META.get('HTTP_USER_AGENT', 'unknown'))
+    print('HTTP_AUTHORIZATION', request.META.get('HTTP_AUTHORIZATION', b'unknown'))
+
+
+class HelpView(TemplateView):
+    '''
+    帮助说明,包括版本信息,帮助文件等
+    '''
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(HelpView, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        reInfoType = request.GET.get('reInfoType', None)
+        token = request.GET.get('token', None)
+
+        return self.getRequestInfo(reInfoType,token)
+
+    def post(self, request, *args, **kwargs):
+        reInfoType = request.POST.get('reInfoType', None)
+        token = request.POST.get('token', None)
+        return self.getRequestInfo(reInfoType,token)
+
+    def getRequestInfo(self, reInfoType,token):
+        response = ResponseObject()
+        if reInfoType is not None and token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                own_permission = ModelService.check_permission(userID=userID, permID=30)
+                if own_permission is True:
+                    if reInfoType == 'version':
+                        return self.readInfo(response)
+                    elif reInfoType == 'requirements':
+                        return self.requirementsInfo(response)
+                    elif reInfoType == 'helpfile':
+                        return self.getHelpCHM(response)
+                    else:
+                        return response.json(801)
+                else:
+                    return response.json(404)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800,'reInfoType','reInfoType')
+
+    def readInfo(self,response):
+        verfilePath = '/'.join((api_settings.BASE_DIR, 'static/Help/')).replace('\\', '/') + 'version.txt'
+        if os.path.isfile(verfilePath):
+            file = open(verfilePath, encoding='utf-8')
+            versionStr = ''
+            for line in file:
+                versionStr += line
+            return response.json(0,{'versioninfo':versionStr})
+        else:
+            return response.json(701)
+
+    def requirementsInfo(self,response):
+        requirementsPath = '/'.join((api_settings.BASE_DIR, 'requirements.txt')).replace('\\', '/')
+        print(requirementsPath)
+        if os.path.isfile(requirementsPath):
+            file = open(requirementsPath, encoding='utf-8')
+            requirementsStr = ''
+            for line in file:
+                requirementsStr += line
+            return response.json(0,{'requirementsinfo': requirementsStr})
+        else:
+            return response.json(701)
+
+    def getHelpCHM(self,response):
+        verHelpCHM = '/'.join((api_settings.BASE_DIR, 'static/Help/')).replace('\\', '/') + 'AnsjerHelp.CHM'
+        print(verHelpCHM)
+        if os.path.isfile(verHelpCHM):
+            return OTAEquipment.downloadUrl(fileType='CHM', fileCode='', fileVersion='', fileName=verHelpCHM)
+        else:
+            return response.json(code=701)
+
+
+def upload_help_chm(request):
+    token = request.POST.get('token', None)
+    response = ResponseObject()
+    if token is not None:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            userID = tko.userID()
+            own_permission = ModelService.check_permission(userID=userID, permID=30)
+            if own_permission is True:
+                f = request.FILES.get('file', None)
+                path = os.path.join(BASE_DIR, 'static/Help/AnsjerHelp.CHM')
+                try:
+                    if os.path.exists(path):
+                        os.remove(path)
+                    with open(path, 'wb+') as destination:
+                        for chunk in f.chunks():
+                            destination.write(chunk)
+                except Exception as e:
+                    print('error:' + repr(e))
+                    return response.json(700,{'details': repr(e)})
+                return response.json(0)
+            else:
+                return response.json(404)
+        else:
+            return response.json(tko.code)
+    else:
+        return response.json(311)
+
+@csrf_exempt
+def errorPath(request,**kwargs):
+    response = ResponseObject()
+    return response.json(414)

+ 203 - 0
Controller/MealManage.py

@@ -0,0 +1,203 @@
+#!/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/29 17:07
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: MealManage.py
+@Contact: chanjunkai@163.com
+"""
+from django.views.generic.base import View
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from Service.ModelService import ModelService
+from Service.CommonService import CommonService
+from Model.models import Store_Meal
+import traceback
+from django.utils import timezone
+from Object.TokenObject import TokenObject
+from Object.ResponseObject import ResponseObject
+
+'''
+http://192.168.136.40:8077/meal/manage?operation=add&token=test&title=套餐A&price=$199&content=存7天&day=7&id=1
+http://192.168.136.45:8077/meal/manage?operation=update&token=test&id=1&title=套餐A&price=$199&content=存3天&day=7
+http://192.168.136.40:8077/meal/manage?operation=query&token=test&page=1&line=10
+http://192.168.136.40:8077/meal/manage?operation=delete&token=test&id=1&id=2&id=3&id=4&id=5
+'''
+
+
+class MealManage(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(MealManage, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.GET)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.POST)
+
+    def validation(self, request_dict, *args, **kwargs):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID is not None:
+                    operation = request_dict.get('operation', None)
+                    if operation == 'query':
+                        return self.query(request_dict, response)
+                    elif operation == 'add':
+                        return self.add(request_dict, userID, response)
+                    elif operation == 'update':
+                        return self.update(request_dict, userID, response)
+                    elif operation == 'delete':
+                        return self.delete(request_dict, userID, response)
+                    elif operation == 'find':
+                        return self.find(request_dict, userID, response)
+                    else:
+                        return response.json(444, 'operation')
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(311)
+
+    def add(self, request_dict, userID, response):
+        own_perm = ModelService.check_permission(userID=userID, permID=40)
+        if own_perm is True:
+            title = request_dict.get('title', None)
+            id = request_dict.get('id', None)
+            price = request_dict.get('price', None)
+            content = request_dict.get('content', None)
+            day = request_dict.get('day', None)
+            param_flag = CommonService.get_param_flag(data=[title, price, content])
+            if param_flag is True:
+                try:
+                    store_meal = Store_Meal(
+                        id=id,
+                        title=title,
+                        price=price,
+                        content=content,
+                        day=day,
+                    )
+                    store_meal.save()
+                except Exception:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(500, {'details': errorInfo})
+                else:
+                    if store_meal.id:
+                        return response.json(0, {
+                            'id': store_meal.id,
+                            'title': store_meal.title,
+                            'price': store_meal.price,
+                            'content': store_meal.content,
+                            'day': store_meal.day,
+                            'add_time': str(store_meal.add_time),
+                            'update_time': str(store_meal.update_time),
+                        })
+
+            return response.json(444)
+        else:
+            return response.json(404)
+
+    def query(self, request_dict, response):
+        page = int(request_dict.get('page', None))
+        line = int(request_dict.get('line', None))
+        param_flag = CommonService.get_param_flag(data=[page, line])
+        if param_flag is True:
+            queryset = Store_Meal.objects.all()
+            if queryset.exists():
+                count = queryset.count()
+                res = queryset[(page - 1) * line:page * line]
+                send_json = CommonService.qs_to_dict(res)
+                send_json['count'] = count
+                return response.json(0, send_json)
+            return response.json(0)
+        else:
+            return response.json(444)
+
+    def update(self, request_dict, userID, response):
+        own_perm = ModelService.check_permission(userID=userID, permID=30)
+        if own_perm is True:
+            id = request_dict.get('id', None)
+            title = request_dict.get('title', None)
+            price = request_dict.get('price', None)
+            day = request_dict.get('day', None)
+            content = request_dict.get('content', None)
+
+            param_flag = CommonService.get_param_flag(
+                data=[id, title, price, content, day])
+            if param_flag is True:
+                try:
+                    store_meal = Store_Meal.objects.get(id=id)
+                except Exception:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, {'details': errorInfo})
+                else:
+                    if store_meal.id:
+                        now_time = timezone.localtime(timezone.now())
+                        print(now_time)
+                        store_meal.title = title
+                        store_meal.price = price
+                        store_meal.content = content
+                        store_meal.day = day
+                        store_meal.save()
+                        return response.json(0, {'update_id': store_meal.id,
+                                                 'update_time': str(now_time)})
+            else:
+                return response.json(444)
+        else:
+            return response.json(404)
+
+    def delete(self, request_dict, userID, response):
+        own_perm = ModelService.check_permission(userID=userID, permID=10)
+        if own_perm is True:
+            id_list = request_dict.getlist('id', None)
+            param_flag = CommonService.get_param_flag(data=[id_list])
+            if param_flag is True:
+                try:
+                    for id in id_list:
+                        Store_Meal.objects.filter(id=id).delete()
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, {'details': repr(e)})
+                else:
+                    return response.json(0)
+            else:
+                return response.json(444)
+        else:
+            return response.json(404)
+
+    def find(self, request_dict, userID, response):
+        own_perm = ModelService.check_permission(userID=userID, permID=30)
+        if own_perm is True:
+            page = int(request_dict.get('page', None))
+            line = int(request_dict.get('line', None))
+            param_flag = CommonService.get_param_flag(data=[page, line])
+            if param_flag is True:
+                queryset = Store_Meal.objects.all()
+                if queryset.exists():
+                    count = queryset.count()
+                    res = queryset[(page - 1) * line:page * line]
+                    send_json = CommonService.qs_to_dict(res)
+                    send_json['count'] = count
+                    return response.json(0, send_json)
+                return response.json(0)
+            else:
+                return response.json(444)
+        else:
+            return response.json(404)

+ 540 - 0
Controller/OTAEquipment.py

@@ -0,0 +1,540 @@
+from zlib import crc32
+from django.core import serializers
+from wsgiref.util import FileWrapper
+import traceback, hashlib
+from Ansjer.config import SERVER_DOMAIN
+from django.views.decorators.csrf import csrf_exempt
+from django.views.generic import TemplateView
+from django.utils.decorators import method_decorator
+from Model.models import Equipment_Version
+from Model.models import Device_User
+from Service.ModelService import ModelService
+from Service.CommonService import CommonService
+import time, os,simplejson as json
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from django.http import HttpResponse
+from Ansjer.settings import BASE_DIR
+
+
+def getUrl(filePath, http_host):
+    urls = []
+    server_dm = 'http://' + http_host
+    filePaths = filePath.split(',')
+    if len(filePaths) > 0:
+        for path in filePaths:
+            if path.find('static/Upgrade/') != -1:
+                path = path.replace('static/Upgrade/', '').replace('\\', '/')
+                url = SERVER_DOMAIN + '/OTA/downloads/' + path + '?time=' + str(time.time())
+                urls.append(url)
+            else:
+                url = SERVER_DOMAIN + 'OTA/downloads/' + filePath.replace('\\', '/')
+                urls.append(url)
+        return urls
+    else:
+        return ''
+
+
+def getUpdataFileUrl(code, http_host, response):
+    try:
+        equipmentValid = Equipment_Version.objects.filter(code=code, status=1).order_by('-data_joined')
+    except Exception as e:
+        errorInfo = traceback.format_exc()
+        print('查询数据库错误: %s' % errorInfo)
+        return response.json(500, {'details': repr(e)})
+    else:
+        if equipmentValid:
+            equipment = equipmentValid[0]
+            file_path = equipment.filePath
+            url = getUrl(file_path, http_host)
+            https_url = getOTAHttps(file_path, http_host)
+            if len(url) > 0:
+                return response.json(0, {
+                    "urlCount": len(url),
+                    "url": url,
+                    'https_url': https_url,
+                    "fileSize": equipment.fileSize,
+                    "Description": equipment.Description,
+                })
+            else:
+                return response.json(901)
+        else:
+            return response.json(902)
+
+
+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 addNewEquipmentVersion(deviceContent, token,response):
+    """
+    :param deviceContent:
+    :return:
+    """
+    if token is not None:
+        tko = TokenObject(token)
+        tko.valid()
+        # 设置语言
+        response.lang = tko.res.get('lang', None)
+        if tko.code == 0:
+            userID = tko.userID
+            own_permission = ModelService.check_permission(userID=userID, permID=220)
+            if own_permission is True:
+                try:
+                    deviceData = json.loads(deviceContent)
+                except Exception as e:
+                    print(deviceData)
+                    return response.json(803)
+                else:
+                    version = deviceData.get('version', None)
+                    if version is not None:
+                        filePath = deviceData.get('filePath', None)
+
+                        if filePath is not None:
+                            try:
+                                deviceData['filePath'] = ','.join(filePath)
+                                equipmentVersion = Equipment_Version(
+                                    eid=CommonService.getUserID(getUser=False, setOTAID=True),
+                                    **deviceData)
+                                equipmentVersion.save()
+                            except Exception as e:
+                                errorInfo = traceback.format_exc()
+                                print('添加设备错误: %s ' % errorInfo)
+                                return response.json(806, repr(e))
+                            else:
+                                res =CommonService.qs_to_dict([equipmentVersion])
+                                return response.json(0, res)
+                        else:
+                            return response.json(806)
+                    else:
+                        return response.json(806)
+
+            else:
+                return response.json(404)
+
+    else:
+        return response.json(311)
+
+
+
+def downloadUrl(fileType, fileCode, fileVersion, fileName):
+    fullPath = os.path.join(BASE_DIR, "static/Upgrade").replace('\\', '/')
+    if fileType == 'IPC':
+        Path = '/'.join((fullPath, 'IPC', fileCode, fileVersion, fileName)).replace('\\', '/')
+    elif fileType == 'DVR':
+        Path = '/'.join((fullPath, 'DVR', fileCode, fileVersion, fileName)).replace('\\', '/')
+    elif fileType == 'NVR':
+        Path = '/'.join((fullPath, 'NVR', fileCode, fileVersion, fileName)).replace('\\', '/')
+    elif fileType == 'XVR':
+        Path = '/'.join((fullPath, 'IPC', fileCode, fileVersion, fileName)).replace('\\', '/')
+    else:
+        if fileType == 'CHM':
+            Path = fileName
+        else:
+            Path = '/'.join((fullPath, 'Other', fileName)).replace('\\', '/')
+
+    if os.path.isfile(Path):
+        try:
+            JSON = json.dumps(
+                {
+                    "result_code": 0,
+                    "reason": 'Success',
+                    "result": {},
+                    "error_code": 0,
+                }, ensure_ascii=False
+            )
+            wrapper = FileWrapper(open(Path, 'rb'))
+            response = HttpResponse(wrapper, content_type="application/octet-stream")
+            response['Content-Length'] = os.path.getsize(Path)
+            response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(Path)
+            response['Content-MD5'] = getMD5orSHA265(Path)
+            response['Content-SHA265'] = getMD5orSHA265(Path, 'SHA265')
+            response['Content-CRC32'] = getMD5orSHA265(Path, 'CRC32')
+            response['Content-Error'] = JSON
+            return response
+
+        except Exception as e:
+            res =ResponseObject()
+            errorJSON = res.formal(906, {'details': repr(e)})
+            response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
+            response['Content-Error'] = errorJSON
+            return response
+    else:
+        res = ResponseObject()
+        errorJSON = res.formal(907)
+        response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
+        response['Content-Error'] = errorJSON
+        return response
+
+def getMD5orSHA265(fileName, encryptionType='MD5'):
+    """
+
+    :param filePath:
+    :param encryptionType:
+    :return:
+    """
+    if not os.path.isfile(fileName):
+        return ''
+    else:
+        if encryptionType == 'MD5':
+            encryption = hashlib.md5()
+        elif encryptionType == 'SHA265':
+            encryption = hashlib.sha256()
+        elif encryptionType == 'CRC32':
+            f = open(fileName, 'rb')
+            chunk = f.read()
+            return crc32(chunk)
+
+        f = open(fileName, 'rb')
+        block_size = 8192  # why is 8192 | 8192 is fast than 2048
+
+        while True:
+            chunk = f.read(block_size)
+            if not chunk:
+                break
+            encryption.update(chunk)
+
+        f.close()
+        return encryption.hexdigest()
+
+
+@csrf_exempt
+def downloadUpdataFileUrl(request):
+    response = ResponseObject()
+    if request.method == 'GET':
+        request_dict = request.GET
+    elif request.method == 'POST':
+        request_dict = request.POST
+    else:
+        errorJSON = response.formal(801)
+        response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
+        response['Content-Error'] = errorJSON
+        return response
+    fileType = request_dict.get('fileType', None)
+    fileCode = request_dict.get('fileCode', None)
+    fileVersion = request_dict.get('fileVersion', None)
+    fileName = request_dict.get('fileName', None)
+    if fileType != None and fileCode != None and fileVersion != \
+            None and fileName != None:
+        return downloadUrl(fileType, fileCode, fileVersion, fileName,response)
+
+    else:
+        errorJSON = response.formal(800)
+        response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
+        response['Content-Error'] = errorJSON
+        return response
+
+
+'''
+http://192.168.136.40:8077/OTA/getEquipmentVersion?31AX162001A
+'''
+
+
+@csrf_exempt
+def getEquipmentVersionInterface(request):
+    response = ResponseObject()
+    if request.method == "POST":
+        request.encoding = 'utf-8'
+        code = request.POST.get('code', None)
+    elif request.method == "GET":
+        request.encoding = 'gb2312'
+        code = request.GET.get('code', None)
+    else:
+        return response.json(801)
+    if code is not None:
+        try:
+            equipmentValid = Equipment_Version.objects.filter(code=code, status=1).order_by('-data_joined')
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('查询数据库错误: %s' % errorInfo)
+            return response.json(500, {'details': repr(e)})
+        else:
+            if equipmentValid:
+                equipment = equipmentValid[0]
+                return response.json(0, {'softwareVersion': equipment.softwareVersion})
+            else:
+                return response.json(900)
+    else:
+        return response.json(800)
+
+
+@csrf_exempt
+def getUpdataFileUrlInterface(request):
+    response = ResponseObject()
+    if request.method == "POST":
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+    elif request.method == "GET":
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+    else:
+        return response.json(801)
+    code = request_dict.get('code', None)
+    http_host = request.META.get('HTTP_HOST', None)
+    if code is not None:
+        return getUpdataFileUrl(code, http_host, response)
+    else:
+        return response.json(800)
+
+
+@csrf_exempt
+def downloadUpdataFileUrlInterface(request, fileType, fileName,
+                                   *callback_args, **callback_kwargs):
+    res = ResponseObject()
+    if fileType is not None and fileName is not None:
+        fullPath = os.path.join(BASE_DIR, "static/Upgrade/").replace('\\', '/')
+        if fileType == 'IPC':
+            fullPath += 'IPC/' + fileName
+        elif fileType == 'DVR':
+            fullPath += 'DVR/' + fileName
+        elif fileType == 'NVR':
+            fullPath += 'NVR/' + fileName
+        elif fileType == 'XVR':
+            fullPath += 'XVR/' + fileName
+        elif fileType == 'User':
+            fullPath = os.path.join(BASE_DIR, "static/").replace('\\', '/')
+            fullPath += 'User/' + fileName
+        elif fileType == 'ADCloud':
+            fullPath = os.path.join(BASE_DIR, "static/APK/").replace('\\', '/')
+            fullPath += 'ADCloud/' + fileName
+        elif fileType == 'ACCloud':
+            fullPath = os.path.join(BASE_DIR, "static/APK/").replace('\\', '/')
+            fullPath += 'ACCloud/' + fileName
+        else:
+            fullPath += 'Other/' + fileName
+
+        print(fullPath)
+        if os.path.isfile(fullPath):
+            try:
+                JSON = res.formal(0)
+                if fileType != 'User':
+                    wrapper = FileWrapper(open(fullPath, 'rb'))
+                    response = HttpResponse(wrapper, content_type="application/octet-stream")
+                    response['Content-Length'] = os.path.getsize(fullPath)
+                    response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(fullPath)
+                    response['Content-MD5'] = getMD5orSHA265(fullPath)
+                    # 校验文件md5值
+                    response['Content-SHA265'] = getMD5orSHA265(fullPath, 'SHA265')
+                    response['Content-CRC32'] = getMD5orSHA265(fullPath, 'CRC32')
+                    response['Content-Error'] = JSON
+                    return response
+                else:
+                    Imagedata = open(fullPath, 'rb').read()
+                    response = HttpResponse(Imagedata, content_type="image/jpeg")
+                    return response
+            except Exception as e:
+                errorJSON = res.formal(906)
+                response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
+                response['Content-Error'] = errorJSON
+                return response
+        else:
+            errorJSON = res.formal(907)
+            response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
+            response['Content-Error'] = errorJSON
+            return response
+
+    else:
+        errorJSON = res.formal(800)
+        response = HttpResponse(errorJSON, content_type='text/plain', charset='utf-8')
+        response['Content-Error'] = errorJSON
+        return response
+
+
+class getUploadFiletoDirView(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(getUploadFiletoDirView, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        fileName = request.FILES.get('fileName', None)
+        return self.ValidationError(request_dict,fileName)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+        request_dict = request.GET
+        fileName = request.FILES.get('fileName', None)
+        return self.ValidationError(request_dict,fileName)
+
+    def ValidationError(self, request_dict,fileName):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        fileType = request_dict.get('fileType', None)
+        fileCode = request_dict.get('fileCode', None)
+        fileVersion = request_dict.get('fileVersion', None)
+        if fileName != None and fileType != None and token != None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID is not None:
+                    own_permission = ModelService.check_permission(userID=userID, permID=210)
+                    if own_permission is True:
+                        if fileVersion != None and fileCode != None:
+                            return self.getUploadFiletoDir(userID, fileType, fileName,response,fileCode, fileVersion=fileVersion)
+                        else:
+                            return self.getUploadFiletoDir(userID, fileType, fileName,response)
+                    else:
+                        return response.json(404)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800)
+
+    def getUploadFiletoDir(self, userID, fileType, fileName,response, *args, **kwargs):
+        """
+        将上传的文件写入服务器对应目录下
+        :param Type: equipment type
+        :param fileName: File name of upgrade file.
+        :return: filePath
+        """
+        try:
+            User = Device_User.objects.filter(userID=userID)
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('查询数据库错误: %s' % errorInfo)
+            return response.json(500, {'details': repr(e)})
+        else:
+            if not User:
+                return response.json(113)
+            own_perm = ModelService.check_permission(userID, permID=210)
+            if own_perm is not True:
+                return response.json(605)
+            updataFile = fileName.name
+            updataFile = updataFile.replace(' ', '+')
+            versionIndex = updataFile.find('.', updataFile.find('.', updataFile.find('.') + 1) + 1)
+            codeIndex = versionIndex + 12
+
+            if codeIndex != -1 and versionIndex != -1:
+                fileVersion = len(updataFile[1: versionIndex]) > 0 and updataFile[1: versionIndex] or None
+                fileCode = len(updataFile[versionIndex + 1: codeIndex]) > 0 and \
+                           updataFile[versionIndex + 1: codeIndex] or None
+                if fileCode is not None and fileVersion is not None:
+                    return self.getDir(fileType, fileName, fileCode, fileVersion)
+                else:
+                    fileCode = kwargs.get('fileCode', None)
+                    fileVersion = kwargs.get('fileVersion', None)
+                    print(fileCode, fileVersion)
+                    if fileCode != None and fileVersion != None:
+                        return self.getDir(fileType, fileName, fileCode, fileVersion)
+                    else:
+                        return response.json(903)
+            else:
+                fileCode = kwargs.get('fileCode', None)
+                fileVersion = kwargs.get('fileVersion', None)
+                if fileCode != None and fileVersion != None:
+                    return self.getDir(fileType, fileName, fileCode, fileVersion,response)
+                else:
+                    return response.json(903)
+
+    def getDir(self,fileType, fileName, fileCode, fileVersion, response):
+        try:
+            if fileCode != None and fileVersion != None:
+                path = '/'.join((BASE_DIR, 'static/Upgrade', fileType, fileCode, fileVersion)).replace('\\', '/') + '/'
+            else:
+                if fileType != 'IPC' and fileType != 'DVR' and fileType != 'NVR' and fileType != 'XVR':
+                    path = '/'.join((BASE_DIR, "static/Upgrade", 'Other')).replace('\\', '/') + '/'
+
+            if not os.path.exists(path):
+                os.makedirs(path)
+                file_name = path + str(fileName)
+                if os.path.exists(file_name):
+                    os.remove(file_name)
+                destination = open(file_name, 'wb+')
+                for chunk in fileName.chunks():
+                    destination.write(chunk)
+                destination.close()
+            else:
+                file_name = path + str(fileName)
+                if os.path.exists(file_name):
+                    os.remove(file_name)
+
+                destination = open(file_name, 'wb+')
+                for chunk in fileName.chunks():
+                    destination.write(chunk)
+                destination.close()
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('上传文件错误: %s' % errorInfo)
+            return response.json(700, {'details': repr(e)})
+        else:
+            index = file_name.find('static/')
+            filePath = file_name[index:]
+            return response.json(0, {'filePath': filePath})
+
+
+@csrf_exempt
+def addNewEquipmentVersionInterface(request):
+
+    response = ResponseObject()
+    if request.method == "POST":
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+    elif request.method == "GET":
+        request.encoding = 'gb2312'
+        request_dict = request.GET
+    else:
+        return response.json(801)
+    deviceContent = request_dict.get('content', None).encode('utf-8')
+    token = request_dict.get('token', None)
+    deviceContent = str(deviceContent, encoding='utf-8')
+    deviceContent = deviceContent.replace(' ', ' ').replace('\'', '\"')
+    if deviceContent is not None:
+        return addNewEquipmentVersion(deviceContent, token,response)
+    else:
+        return response.json(800)
+
+
+def showAllEquipmentVersion(userID,response):
+    try:
+        userValid = Device_User.objects.filter(userID=userID).order_by('-data_joined')
+    except Exception as e:
+        errorInfo = traceback.format_exc()
+        print('查询数据库错误: %s' % errorInfo)
+        return response.json(500)
+    else:
+        if userValid:
+            own_permission = ModelService.check_permission(userID=userID, permID=240)
+            if own_permission:
+                sqlJSON = serializers.serialize('json', Equipment_Version.objects.all())  # .order_by('-data_joined'))
+                sqlList = json.loads(sqlJSON)
+                print(sqlList, sqlJSON)
+                sqlDict = dict(zip(["datas"], [sqlList]))
+                return response.json(0, sqlDict)
+            else:
+                return response.json(604)
+        else:
+            return response.json(113)
+
+
+@csrf_exempt
+def showAllEquipmentVersionInterface(request):
+    response = ResponseObject()
+    if request.method == 'POST':
+        token = request.POST.get('token', None)
+    elif request.method == 'GET':
+        token = request.GET.get('token', None)
+    if token is not None:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            userID = tko.userID()
+            if userID:
+                return showAllEquipmentVersion(userID,response)
+            else:
+                return response.json(310)
+        else:
+            return response.json(tko.code)
+    else:
+        return response.json(800)
+
+

+ 286 - 0
Controller/OauthManage.py

@@ -0,0 +1,286 @@
+#!/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/7/20 11:13
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: OauthManage.py
+@Contact: chanjunkai@163.com
+"""
+from var_dump import var_dump
+from django.utils.timezone import utc
+from django.views.generic.base import View
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from Model.models import oauth_user, Device_User
+from Service.ModelService import ModelService
+from Object.TokenObject import TokenObject
+from Object.ResponseObject import ResponseObject
+from Service.CommonService import CommonService
+from Controller.CheckUserData import DataValid
+from django.contrib import auth
+import json, requests, datetime
+from django.contrib.auth.hashers import make_password  # 对密码加密模块
+from Ansjer.config import DOMAIN_OAUTH_URI
+
+'''
+http://192.168.136.40:8077/oauth/relate/?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJvaWQiOiI3N2EzNzJmYi1jNDdiLTQ5OWQtYmY3Ni0wMTIwNzdiNGRiM2MiLCJleHAiOjE1MzQyMTE1MDR9.9DAwCctDk_qwn1kHfPqkvSGiFMunnb7I9mU44YlNchE
+'''
+
+
+class OauthRelateView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(OauthRelateView, self).dispatch(*args, **kwargs)
+
+    # 定义host
+    __http_host = None
+
+    # 查询
+    def get(self, request):
+        request.encoding = 'utf-8'
+        self.__http_host = request.META.get('PATH_INFO', None)
+        response = ResponseObject()
+        token = request.GET.get('token', None)
+        return self.relate(token, response)
+
+    # 认证登录
+    def post(self, request):
+        self.__http_host = request.META.get('PATH_INFO', None)
+        response = ResponseObject()
+        try:
+            json_data = json.loads(request.body.decode("utf-8"))
+        except Exception as e:
+            print(repr(e))
+            return response.json(10, repr(e))
+        else:
+            token = json_data.get('token', None)
+            return self.relate(token, response)
+
+    def relate(self, token, response):
+
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            # 设置语言
+            response.lang = tko.lang
+            if tko.code == 0:
+                oid = tko.oid
+                if oid is not None:
+                    # 判断用户是否已关联
+                    userID = tko.userID()
+                    if userID is not None:
+                        return self.loginUpdate(userID, response)
+                    # 未关联情况下进行关联,并创建用户
+                    else:
+                        return self.relateUser(oid, token, response)
+
+                else:
+                    return response.json(444, 'oid')
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(444, 'token')
+
+    def loginUpdate(self, userID, response):
+        now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
+        userData = Device_User.objects.filter(userID=userID)
+        userData.update(last_login=now_time, online=True)
+        return self.responseRes(userData[0], response)
+
+    def relateUser(self, oid, token, response):
+        try:
+            http_oauth = requests.get(
+                url='{domain_oauth}accounts/{oid}/'.format(oid=oid, domain_oauth=DOMAIN_OAUTH_URI),
+                params={'token': token}
+            )
+            get_res = http_oauth.json()
+        except Exception as e:
+            return response.json(10, repr(e))
+        else:
+            code = get_res.get('code', None)
+            if code == 0:
+                datas = get_res['res']
+                username = datas.get('username', None)
+                password = datas.get('password', None)
+                userValid = Device_User.objects.filter(username=username)
+                try:
+                    if userValid.exists():
+                        UserData = userValid[0]
+                    else:
+                        dataValid = DataValid()
+                        if dataValid.email_validate(username):
+                            UserData = Device_User(username=username, userEmail=username, password=password,
+                                                   userID=CommonService.getUserID(μs=False, setOTAID=True),
+                                                   is_active=True, user_isValid=True)
+                        else:
+                            UserData = Device_User(username=username, password=password,
+                                                   userID=CommonService.getUserID(μs=False, setOTAID=True),
+                                                   is_active=True, user_isValid=True)
+                        UserData.save()
+                except Exception as e:
+                    var_dump(repr(e))
+                    return response.json(106)
+                else:
+                    ourValid = oauth_user.objects.get_or_create(oid=oid, userID=UserData)
+                    if ourValid:
+                        return self.responseRes(UserData, response)
+                    else:
+                        UserData.delete()
+                        return response.json(106)
+
+            else:
+                return response.json(code)
+
+    def responseRes(self, UserData, response):
+        if UserData.userID and UserData.username:
+            res = {}
+            role_dict = ModelService.own_role(userID=UserData.userID)
+            res['rid'] = role_dict['rid']
+            res['roleName'] = role_dict['roleName']
+            res['permList'] = ModelService.own_permission(UserData.userID)
+            res['username'] = UserData.username
+            res['email'] = UserData.userEmail
+            res['nickname'] = UserData.NickName
+            print(res)
+            return response.json(0, res)
+        else:
+            return response.json(10, 'userID,username参数错误')
+
+
+class OauthResUserView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(OauthResUserView, self).dispatch(*args, **kwargs)
+
+    # 查询
+    def get(self, request):
+        request.encoding = 'utf-8'
+        response = ResponseObject()
+        username = request.GET.get('username', None)
+        password = request.GET.get('password', None)
+        return self.validate(username, password, response)
+
+    # 认证登录
+    def post(self, request):
+        response = ResponseObject()
+        try:
+            print(request.body.decode("utf-8"))
+            json_data = json.loads(request.body.decode("utf-8"))
+        except Exception as e:
+            var_dump(repr(e))
+            return response.json(10, repr(e))
+        else:
+            username = json_data.get('username', None)
+            password = json_data.get('password', None)
+            return self.validate(username, password, response)
+
+    def validate(self, username, password, response):
+        if username is not None:
+            dataValid = DataValid()
+            if dataValid.mobile_validate(username):
+                user_qs = Device_User.objects.filter(username=username)
+            elif dataValid.email_validate(username):
+                user_qs = Device_User.objects.filter(username=username)
+            else:
+                return response.json(104)
+            if user_qs.exists():
+                if user_qs[0].user_isValid and user_qs[0].is_active:
+                    User = auth.authenticate(username=user_qs[0].username, password=password)
+                    if User:
+                        res = {'username': user_qs[0].username}
+                        return response.json(0, res)
+                    else:
+                        return response.json(111)
+                else:
+                    return response.json(110)
+            else:
+                return response.json(102)
+        else:
+            return response.json(444,'username')
+
+
+class ModifyRSPwdView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(ModifyRSPwdView, self).dispatch(*args, **kwargs)
+
+    # 查询
+    def get(self, request):
+        response = ResponseObject()
+        request_dict = request.GET
+        return self.validate(request_dict, response)
+
+    # 认证登录
+    def post(self, request):
+        response = ResponseObject()
+        try:
+            print(request.body.decode("utf-8"))
+            json_data = json.loads(request.body.decode("utf-8"))
+        except Exception as e:
+            from var_dump import var_dump
+            var_dump(repr(e))
+            return response.json(10, repr(e))
+        else:
+            request_dict = json_data
+            return self.validate(request_dict, response)
+
+    def validate(self, request_dict, response):
+        username = request_dict.get('username', None)
+        oldPwd = request_dict.get('oldPwd', None)
+        newPwd = request_dict.get('newPwd', None)
+
+        UserAuth = auth.authenticate(username=username, password=oldPwd)
+        if UserAuth:
+            return self.ModifyPwd(username, newPwd, response)
+        else:
+            return response.json(99)
+
+    def ModifyPwd(self, username, newPwd, response):
+        user_qs = Device_User.objects.filter(username=username)
+        upCount = user_qs.update(password=make_password(newPwd))
+        if upCount:
+            return response.json(0)
+
+
+class OauthForgetView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(OauthForgetView, self).dispatch(*args, **kwargs)
+
+    # 查询
+    def get(self, request):
+        response = ResponseObject()
+        request_dict = request.GET
+        return self.validate(request_dict, response)
+
+    # 认证登录
+    def post(self, request):
+        response = ResponseObject()
+        try:
+            json_data = json.loads(request.body.decode("utf-8"))
+        except Exception as e:
+            from var_dump import var_dump
+            var_dump(repr(e))
+            return response.json(10, repr(e))
+        else:
+            request_dict = json_data
+            return self.validate(request_dict, response)
+
+    def validate(self, request_dict, response):
+        username = request_dict.get('username', None)
+        dataValid = DataValid()
+        if dataValid.email_validate(username):
+            user_qs = Device_User.objects.filter(userEmail=username)
+        elif dataValid.mobile_validate(username):
+            user_qs = Device_User.objects.filter(username=username)
+        else:
+            return response.json(9)
+        if user_qs.exists():
+            return response.json(0, {'password': user_qs[0].password})
+        else:
+            return response.json(9)

+ 788 - 0
Controller/PermissionManager.py

@@ -0,0 +1,788 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+from itertools import chain
+from django.views.generic.base import View
+import django.dispatch, traceback,simplejson as json
+from django.views.decorators.csrf import csrf_exempt
+from django.utils.decorators import method_decorator
+from Model.models import Permissions, Role, Device_User
+from Service.CommonService import CommonService
+from Service.ModelService import ModelService
+from Object.TokenObject import TokenObject
+from Object.ResponseObject import ResponseObject
+
+
+# 创建信号
+roles_done = django.dispatch.Signal(providing_args=[])
+perms_done = django.dispatch.Signal(providing_args=[])
+rmanger_done = django.dispatch.Signal(providing_args=[])
+
+
+class Roles(object):
+    '''
+    role Manager Class
+    '''
+    try:
+        rid = []
+        rolename = []
+        roles = Role.objects.all()
+        for role in roles:
+            rolename.append(role.roleName)
+            rid.append(role.rid)
+    except Exception as e:
+        pass
+    def __init__(self):
+        '''
+        信号监听, 注册信号
+        Signal.connect(receiver, sender=None, weak=True, dispatch_uid=None)
+        receiver: 信号接受者,回调函数
+        sender: 信号发送者
+        '''
+        roles_done.connect(self.callback)
+
+        self.startSignal()
+
+    def callback(self, sender, **kwargs):
+        '''
+        开启监听之后,就要去实现回调函数了, 注册信号
+        :param sender:
+        :param kwargs:
+        :return:
+        '''
+        Roles.rid = []
+        Roles.rolename = []
+        Roles.roles = Role.objects.all()
+
+        for role in Roles.roles:
+            Roles.rolename.append(role.roleName)
+            Roles.rid.append(role.rid)
+
+    def startSignal(self):
+        '''
+        触发信号
+        指定信号发送者
+        :return:
+        '''
+        roles_done.send(sender=self.__class__)
+
+    def toJSON(self, QuerySets, fields=None, exclude=None):
+        listSets = []
+        for QuerySet in QuerySets:
+            data = {}
+            opts = QuerySet._meta
+            for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
+                if not getattr(f, 'editable', False):
+                    continue
+                if fields and f.name not in fields:
+                    continue
+                if exclude and f.name in exclude:
+                    continue
+                data[f.name] = f.value_from_object(QuerySet)
+            listSets.append(data)
+        return listSets
+
+    def queryAllRoles(self, rolenames=None, exclude=None,response=ResponseObject()):
+        roles =[]
+        for role in chain(Roles.roles):
+            if rolenames and role.roleName not in rolenames:
+                continue
+            if exclude and role.roleName in exclude:
+                continue
+            roles.append(role)
+        if len(roles) > 0:
+            resultDict=CommonService.qs_to_dict(roles)
+            for k, v in enumerate(resultDict["datas"]):
+                if len(v['fields']['permission']) > 0:
+                    resultDict["datas"][k]['fields']['permissionJson']={}
+                    for pid in v['fields']['permission']:
+                        permission_query_set= Permissions.objects.get(id=pid)
+                        resultDict["datas"][k]['fields']['permissionJson'][pid]=permission_query_set.permName
+            return response.json(0,resultDict)
+        
+        else:
+            return response.json(0, {})
+
+    def addRoles(self, content=None,response=ResponseObject()):
+        try:
+            roleContent = json.loads(content)
+        except Exception as e:
+            return response.json(803,repr(e))
+        else:
+            rid = roleContent.get('rid', None)
+            if rid == None:
+                return response.json(806)
+            try:
+                if rid in chain(Roles.rid):
+                    return response.json(807)
+
+                permission_list = roleContent['permission']
+                roleContent.pop('permission')
+                role = Role(**roleContent)
+                role.save()
+                if len(permission_list) > 0:
+                    role.permission.add(*permission_list)
+            except Exception as e:
+                return response.json(808,repr(e))
+            else:
+                self.startSignal()
+                return response.json(0)
+
+    def delRoles(self, rid=None, rolename=None,response=ResponseObject()):
+        if rid != None:
+            if rid not in Roles.rid:
+                return response.json(190)
+
+            try:
+                roletuple = Role.objects.filter(rid = rid).delete()
+            except Exception as e:
+                return response.json(192, repr(e))
+            else:
+                if roletuple[0] == 1:
+                    self.startSignal()
+                    return self.queryAllRoles(response=response)
+                else:
+                    return response.json(193,{'error_msg':roletuple})
+        elif rolename != None:
+            if rid not in Roles.rolename:
+                return response.json(191)
+            try:
+                roletuple = Role.objects.filter(roleName = rolename).delete()
+            except Exception as e:
+                return response.json(192)
+            else:
+                if roletuple[0] == 1:
+                    self.startSignal()
+                    return self.queryAllRoles(response=response)
+                else:
+                    return response.json(193)
+
+    def modifyRoles(self, rid=None, content=None,response=ResponseObject()):
+        if rid not in Roles.rid:
+            return response.json(190)
+        try:
+            roleContent = json.loads(content)
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('The content parameter format is wrong: %s' % errorInfo)
+            return response.json(803)
+        else:
+            try:
+                permission_list = roleContent['permission']
+                roleContent.pop('permission')
+                roleCount = Role.objects.filter(rid = rid).update(**roleContent)
+                if roleCount:
+                    if len(permission_list) > 0:
+                        Role.objects.get(rid=rid).permission.set(permission_list)
+                    else:
+                        Role.objects.get(rid=rid).permission.clear()
+            except Exception as e:
+                return response.json(194)
+
+            else:
+                if roleCount == 1:
+                    self.startSignal()
+                    return self.queryAllRoles(response=response)
+                else:
+                    return response.json(195)
+
+class Permission(object):
+    try:
+        id = []
+        permname = []
+        perms = Permissions.objects.all()
+        for perm in perms:
+            id.append(perm.id)
+            permname.append(perm.permName)
+    except Exception as e:
+        pass
+    def __init__(self):
+        perms_done.connect(self.callback)
+
+        self.startSignal()
+
+    def callback(self, sender, **kwargs):
+        Permission.id = []
+        Permission.permname = []
+        Permission.roles = Permissions.objects.all()
+
+        for perm in Permission.roles:
+            Permission.id.append(perm.id)
+            Permission.permname.append(perm.permName)
+
+    def startSignal(self):
+        perms_done.send(sender=self.__class__)
+
+    def queryAllPerms(self, perms=None, exclude=None,response=ResponseObject()):
+        opts =[]
+        for perm in chain(Permission.permname):
+            if perms and perm not in perms:
+                continue
+            if exclude and perm in exclude:
+                continue
+            opts.append(perm)
+        return response.json(0,{'perms':opts})
+
+    def delPerms(self, id=None, permName=None,response=ResponseObject()):
+        try:
+            if id != None:
+                perm = Permissions.objects.filter(id = id)
+            elif permName != None:
+                perm = Permissions.objects.filter(permName = permName)
+            else:
+                return response.json(800)
+        except Exception as e:
+            return response.json(500, repr(e))
+        else:
+            if not perm:
+                return response.json(817)
+            try:
+                perm.delete()
+            except Exception as e:
+                return response.json(818, repr(e))
+            else:
+                self.startSignal()
+                qs =Permissions.objects.all()
+                res = CommonService.qs_to_dict(qs)
+                return response.json(0,res)
+
+    @staticmethod
+    def getAllPermission(response=ResponseObject()):
+        send_dict=CommonService.qs_to_dict(Permissions.objects.all())
+        return response.json(0, send_dict)
+
+
+class permManager(object):
+
+    def queryMoreRole(self, rid=None):
+        role = Role.objects.filter(rid = rid)
+        if not role:
+            roleDict = {'rid': role[0].rid, 'error_msg': u'The rid does not exist!'}
+            return roleDict
+        roleDict = {'rid' : role[0].rid, 'perms': role[0].get_all_permission()}
+        return roleDict
+
+    def queryAllRole(self,response=ResponseObject()):
+        qs = Role.objects.all()
+        res = CommonService.qs_to_dict(qs)
+        return response.json(0, res)
+
+
+# 角色View
+class queryRoleView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(queryRoleView, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+        token = request.GET.get('token', None)
+        return self.ValidationError(token)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        token = request.POST.get('token', None)
+        return self.ValidationError(token)
+
+    def ValidationError(self, token):
+        response = ResponseObject()
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID:
+                    return self.queryUserRole(userID,response)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800)
+
+    def queryUserRole(self, userID,response):
+        eUser = Device_User.objects.filter(userID = userID)
+        if not eUser:
+            return response.json(102)
+        if 100 in eUser[0].get_role_id():
+            role = Roles()
+            return role.queryAllRoles(response=response)
+        own_permission = ModelService.check_permission(userID=userID, permID=30)
+        if own_permission is True:
+            role = Roles()
+            return role.queryAllRoles(response=response)
+        else:
+            return response.json(603)
+
+class addNewRoleView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(addNewRoleView, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+        token = request.GET.get('token', None)
+        content = request.GET.get('content', None)
+
+        return self.ValidationError(token, content)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        token = request.POST.get('token', None)
+        content = request.POST.get('content', None)
+
+        return self.ValidationError(token, content)
+
+    def ValidationError(self, token, content):
+        response = ResponseObject()
+        if token != None and content != None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID:
+
+                    return self.AddNewUserRole(userID, content,response)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+
+        else:
+            return response.json(800)
+
+    def AddNewUserRole(self, userID, content,response):
+        try:
+            User = Device_User.objects.filter(userID = userID)
+        except Exception as e:
+            return response.json(500,repr(e))
+        else:
+            rids = User[0].get_role_id()
+            if rids == None:
+                return response.json(606)
+            Aperms = False
+            for rid in rids:
+                if rid < 10:
+                    continue
+                else:
+                    Aperms = True
+
+            if Aperms:
+                role = Roles()
+                return role.addRoles(content=content,response=response)
+            else:
+                return response.json(607)
+
+
+class delRoleView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(delRoleView, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+        token = request.GET.get('token', None)
+        rid = request.GET.get('rid', None)
+
+        return self.ValidationError(token, rid)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        token = request.POST.get('token', None)
+        rid = request.POST.get('rid', None)
+
+        return self.ValidationError(token, rid)
+
+    def ValidationError(self, token, rid):
+        response = ResponseObject()
+        if token != None and rid != None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID:
+                    return self.delRole(userID, int(rid),response)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(444,'token,rid')
+
+    def delRole(self, userID, rid,response):
+        own_permission = ModelService.check_permission(userID=userID, permID=10)
+        if own_permission is True:
+            role = Roles()
+            return role.delRoles(rid=rid,response=response)
+        else:
+            return response.json(404)
+
+
+class modifyRoleView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(modifyRoleView, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+        token = request.GET.get('token', None)
+        rid =  request.GET.get('rid', None)
+        content = request.GET.get('content', None)
+        return self.ValidationError(token, rid, content)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        token = request.POST.get('token', None)
+        rid = request.POST.get('rid', None)
+        content = request.POST.get('content', None)
+        return self.ValidationError(token, rid, content)
+
+    def ValidationError(self, token, rid, content):
+        response = ResponseObject()
+        if token != None and content != None and rid != None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID:
+                    return self.modifyRole(userID, int(rid), content,response)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(444,'token,content,rid')
+
+    def modifyRole(self, userID, rid, content,response):
+        try:
+            User = Device_User.objects.filter(userID = userID)
+        except Exception as e:
+            return response.json(500, repr(e))
+        else:
+            rids = User[0].get_role_id()
+            if rids == None:
+                return response.json(606)
+            Aperms = False
+            for rrid in rids:
+                if rrid < 10:
+                    continue
+                else:
+                    Aperms = True
+            if Aperms:
+                role = Roles()
+                return role.modifyRoles(rid=rid, content=content,response=response)
+            else:
+                return response.json(607)
+
+
+# 权限View
+class addNewPermsView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(addNewPermsView, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.ValidationError(request_dict)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        return self.ValidationError(request_dict)
+
+    def ValidationError(self, request_dict):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        type = request_dict.get('type', None)
+        if token != None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID:
+                    if type == 'PC':
+                        return self.addNewPermission(userID=userID, request_dict=request_dict,response=response)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800)
+
+    def addNewPermission(self, userID, request_dict,response):
+        user_valid = Device_User.objects.filter(userID=userID).order_by('-data_joined')
+        if user_valid:# 判断是否为超级管理员
+            own_perm = ModelService.check_permission(userID,40)
+            # if user_valid[0].is_superuser == 100 and user_valid[0].is_superuser != 1 and user_valid[0].is_superuser != 10:
+            if own_perm is not True:
+                return response.json(600)
+            else:
+                add_dict = {'id':int(request_dict['id']),'permName':request_dict['permName'],'description':request_dict['description']}
+                try:
+                    perm = Permissions(**add_dict)
+                    perm.save()
+                except Exception as e:
+                    return response.json(816,repr(e))
+                else:
+                    return Permission.getAllPermission(response=response)
+        else:
+            return response.json(113)
+
+class delPermsView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(delPermsView, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+        return self.ValidationError(request_dict)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+        return self.ValidationError(request_dict)
+
+    def ValidationError(self, request_dict):
+        token = request_dict.get('token', None)
+        id = request_dict.get('id', None)
+        response = ResponseObject()
+        if token != None and id != None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID:
+                    return self.delPerms(userID, id,response)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800)
+
+    def delPerms(self, userID, id,response):
+        try:
+            User = Device_User.objects.filter(userID = userID)
+        except Exception as e:
+            return response.json(500, repr(e))
+
+        else:
+            rids = User[0].get_role_id()
+            if len(rids) == 0:
+                return response.json(606)
+            Aperms = False
+            for rid in rids:
+                if rid < 10:
+                    continue
+                else:
+                    Aperms = True
+            if Aperms:
+                perms = Permission()
+                return perms.delPerms(id=id,response=response)
+            else:
+                return response.json(611)
+
+class queryPermsView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(queryPermsView, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+        token = request.GET.get('token', None)
+        request_data = request.GET
+        return self.ValidationError(token,request_data)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        token = request.POST.get('token', None)
+        request_data = request.POST
+        return self.ValidationError(token,request_data)
+
+    def ValidationError(self, token, request_data):
+        response = ResponseObject()
+        if token != None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID:
+                    type = request_data.get('type',None)
+                    if type == 'PC':
+                        return self.querAllPermission(userID,response)
+                    else:
+                        return self.delPerms(userID,response)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800)
+
+    def querAllPermission(self, userID,response):
+        own_perm = ModelService.check_permission(userID,30)
+        if own_perm is True:
+            qs = Permissions.objects.all()
+            res = CommonService.qs_to_dict(qs)
+            return response.json(0, res)
+        else:
+            return response.json(404)
+
+    def delPerms(self, userID,response):
+        try:
+            User = Device_User.objects.filter(userID = userID)
+        except Exception as e:
+            return response.json(500, repr(e))
+        else:
+            rids = User[0].get_role_id()
+            if len(rids) == 0:
+                return response.json(606)
+
+            Aperms = False
+            for rid in rids:
+                if rid < 10:
+                    continue
+                else:
+                    Aperms = True
+
+            if Aperms:
+                perms = Permission()
+                return perms.queryAllPerms(response=response)
+            else:
+                return response.json(611)
+
+class modifyPermsView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(modifyPermsView, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+        request_dict = request.GET
+        return self.ValidationError(request_dict)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        # token = request.POST.get('token', None)
+        request_dict = request.POST
+        return self.ValidationError(request_dict)
+
+    def ValidationError(self, request_dict):
+        token = request_dict.get('token', None)
+        response = ResponseObject()
+        if token != None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID:
+                    update_dict = {'permName':request_dict['permName'],'description':request_dict['description']}
+                    return self.modifyPerms(userID=userID,id=request_dict['id'], update_dict=update_dict,response=response)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800)
+
+    def modifyPerms(self, userID, id, update_dict,response):
+        try:
+            User = Device_User.objects.filter(userID = userID)
+        except Exception as e:
+            return response.json(500, repr(e))
+        else:
+            rids = User[0].get_role_id()
+            if len(rids) == 0:
+                return response.json(606)
+            Aperms = False
+            for rid in rids:
+                if rid < 10:
+                    continue
+                else:
+                    Aperms = True
+
+            if Aperms:
+                try:
+                    Permissions.objects.filter(id = int(id)).update(**update_dict)
+                except Exception as e:
+                    return response.json(500,repr(e))
+                else:
+                    return Permission.getAllPermission(response=response)
+            else:
+                return response.json(611)
+
+class queryRolePermsView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(queryRolePermsView, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+
+        token = request.GET.get('token', None)
+        allUser = request.GET.get('allUser', False)
+
+        return self.ValidationError(token, allUser)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+
+        token = request.POST.get('token', None)
+        allUser = request.POST.get('allUser', False)
+
+        return self.ValidationError(token, allUser)
+
+    def ValidationError(self, token, allUser):
+        response = ResponseObject()
+        if token != None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID:
+                    return self.queryRolePerms(userID, allUser,response)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800)
+
+    def queryRolePerms(self, userID, allUser,response):
+        try:
+            dUser = Device_User.objects.filter(userID=userID).order_by('-data_joined')
+        except Exception as e:
+            return response.json(500, repr(e))
+        else:
+            if not dUser:
+                return response.json(113)
+            if allUser == '0' or allUser == 'False' or allUser == 'false':
+                allUser = False
+            elif allUser == '1' or allUser == 'True' or allUser == 'true':
+                allUser = True
+            else:
+                allUser = False
+            pM = permManager()
+            if not allUser:
+                ridslist =[]
+                rids = dUser[0].get_role_id()
+
+                for rid in rids:
+                    ridslist.append(pM.queryMoreRole(rid=rid))
+                sqlDict = dict(zip(["datas"], [ridslist]))
+                return response.json(0,sqlDict)
+            else:
+                if 100 in dUser[0].get_role_id():
+                    return pM.queryAllRole(response=response)
+                else:
+                    return response.json(612)

+ 632 - 0
Controller/StreamMedia.py

@@ -0,0 +1,632 @@
+from django.views.generic.base import View
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from Service.ModelService import ModelService
+from Model.models import Equipment_Stream
+from Object.AWS.S3ClassObject import S3ClassObject
+from Object.AWS.ElasticTranscoder import ElasticTranscoder
+import traceback, xmltodict, requests, re, subprocess, time, os,simplejson as json
+from ffmpy import FFmpeg
+from Object.AWS.CloudfrontSignCookie import BetterThanBoto
+from Ansjer.config import NGINX_RTMP_STAT, RTMP_PUSH_URL
+from Ansjer.settings import BASE_DIR
+from Object.TokenObject import TokenObject
+from Object.ResponseObject import ResponseObject
+from Service.CommonService import CommonService
+from django.http import HttpResponse
+'''
+移动端=>
+增:
+http://192.168.136.40:8077/media/stream?token=test&channel=1&status=1&uid=1&operation=add
+删:
+http://192.168.136.40:8077/media/stream?token=test&id=11&id=12&operation=delete
+改:
+http://192.168.136.40:8077/media/stream?token=test&id=13&operation=update&status=0
+查:
+http://192.168.136.40:8077/media/stream?token=test&operation=query
+获取视频播放地址
+http://13.56.215.252:82/media/stream?token=test&channel=99&uid=2N1K3LE78TYJ38CE111A&filename=1526882855.flv&operation=getVodHls
+http://192.168.136.40:8077/media/stream?token=test&channel=1&uid=1&operation=getVodUrl&filename=1_1-1523247439.mp4
+获取所有保存s3的视频
+http://192.168.136.40:8077/media/stream?token=test&channel=1&uid=1&operation=getAllVideo
+删除设备视频多个,key值传多个即可
+http://192.168.136.40:8077/media/stream?token=test&key=UKPAH63V23U4ZHEB111A_1/UKPAH63V23U4ZHEB111A_1-1524039164.mp4&uid=UKPAH63V23U4ZHEB111A&channel=1&operation=getDelVideo
+----------------------------------------------------------------------------------------------------
+后台=>
+验证推流权限
+http://192.168.136.40:8077/media/auth_stream?userID=151547867345163613800138001&uid=1&channel=1&access_token=test
+验证播放权限(直播)
+http://192.168.136.40:8077/media/auth_live?userID=151547867345163613800138001&uid=1&channel=1&token=test
+rtmp://192.168.136.45:1935/hls/UKPAH63V23U4ZHEB111A_88?userID=151547867
+获取所有推流的设备信息
+http://192.168.136.40:8077/media/stream?token=test&page=1&line=10&operation=getAdminAllStream
+删除流
+http://192.168.136.40:8077/media/stream?token=test&id=1&id=2&id=3&operation=getAdminDelStream
+删除指定设备视频
+http://192.168.136.40:8077/media/stream?token=test&key=1&key=2&key=3&operation=getAdminDelVideo
+更新
+http://192.168.136.40:8077/media/stream?token=test&id=13&operation=getAdminUpdateStream&status=0
+获取指定设备存储的视频播放地址
+http://192.168.136.40:8077/media/stream?token=test&channel=1&uid=1&filename=1_1-1523247439.mp4&operation=getAdminVodUrl
+hls播放
+http://13.56.215.252:82/media/stream?token=test&channel=1&status=1&uid=2N1K3LE78TYJ38CE111A&operation=add&rank=1
+'''
+
+
+class StreamMedia(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(StreamMedia, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.GET)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        return self.validation(request_dict=request.POST)
+
+    def validation(self, request_dict, *args, **kwargs):
+        response = ResponseObject()
+        token = request_dict.get('token', None)
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                own_permission = ModelService.check_permission(userID=userID, permID=60)
+                if own_permission is not True:
+                    operation = request_dict.get('operation', None)
+                    if operation == 'add':
+                        return self.add_stream(token=token, request_dict=request_dict, userID=userID, response=response)
+                    elif operation == 'delete':
+                        return self.delete_stream(request_dict=request_dict, userID=userID, response=response)
+                    elif operation == 'update':
+                        return self.update_stream(userID=userID, request_dict=request_dict, response=response)
+                    elif operation == 'query':
+                        return self.query_stream(userID=userID, response=response)
+                    elif operation == 'getDelVideo':
+                        return self.get_del_video(userID=userID, request_dict=request_dict, response=response)
+                    elif operation == 'getAllVideo':
+                        return self.get_all_video(request_dict=request_dict, userID=userID, response=response)
+                    elif operation == 'getVodUrl':
+                        return self.get_vod_url(request_dict=request_dict, response=response)
+                    elif operation == 'getVodHls':
+                        return self.get_vod_hls(request_dict=request_dict, response=response)
+                    elif operation == 'getAdminAllStream':
+                        return self.get_admin_all_stream(request_dict=request_dict, userID=userID, response=response)
+                    elif operation == 'getAdminDelStream':
+                        return self.get_admin_del_stream(request_dict=request_dict, userID=userID, response=response)
+                    elif operation == 'getAdminUpdateStream':
+                        return self.get_admin_update_stream(request_dict=request_dict, userID=userID, response=response)
+                    elif operation == 'getAdminVodUrl':
+                        return self.get_admin_vod_url(request_dict=request_dict, userID=userID, response=response)
+                    elif operation == 'getAdminFindStream':
+                        return self.get_admin_find_stream(request_dict=request_dict, userID=userID, response=response)
+                    elif operation == 'getAdminDelVideo':
+                        return self.get_admin_del_video(request_dict=request_dict, userID=userID, response=response)
+                    elif operation == 'getAllServerJson':
+                        return self.get_all_server_json(userID=userID, response=response)
+                    elif operation == 'getAdminHlsVod':
+                        return self.get_admin_hls_vod(userID=userID, request_dict=request_dict, response=response)
+                    elif operation == 'getAdminAddStream':
+                        return self.get_admin_add_stream(userID=userID, request_dict=request_dict, response=response)
+                    else:
+                        return response.json(444, 'operation')
+                else:
+                    return response.json(404)
+
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(311)
+
+    def add_stream(self, token, userID, request_dict, response):
+        channel = request_dict.get('channel', None)
+        status = request_dict.get('status', None)
+        uid = request_dict.get('uid', None)
+        flag_param = CommonService.get_param_flag(data=[channel, status, uid])
+        if flag_param is True:
+            is_user = ModelService.check_own_device(userID=userID, UID=uid)
+            if is_user is True:
+                stream_queryset = Equipment_Stream.objects.filter(userID=userID, uid=uid, channel=channel, rank=1)
+                if stream_queryset.exists():
+                    return response.json(174)
+                try:
+                    flag = Equipment_Stream.objects.create(userID=userID, status=status, uid=uid, channel=channel,
+                                                           access_token=token)
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, errorInfo)
+                else:
+                    if flag:
+                        rtmp_url = RTMP_PUSH_URL
+                        rtmp_name = uid + '_' + channel + '?userID=' + userID + '&uid=' + uid + '&channel=' + channel + '&access_token=' + token
+                        return response.json(0, {'userID': userID, 'channel': channel,
+                                                 'uid': uid,
+                                                 'status': status,
+                                                 'access_token': token,
+                                                 'rtmp_url': rtmp_url,
+                                                 'rtmp_name': rtmp_name})
+            else:
+                return response.json(14)
+        else:
+            return response.json(444, 'channel, status, uid')
+
+    def delete_stream(self, request_dict, userID,response):
+        id_list = request_dict.getlist('id', None)
+        if len(id_list):
+            for id in id_list:
+                Equipment_Stream.objects.filter(id=id, userID=userID).delete()
+            return response.json(0)
+        return response.json(444)
+
+    def update_stream(self, userID, request_dict,response):
+        id = request_dict.get('id', None)
+        status = request_dict.get('status', None)
+        is_update = Equipment_Stream.objects.filter(id=id, userID=userID).update(status=status)
+        if is_update:
+            return response.json(0, {'id': id, 'status': status})
+        return response.json(444)
+
+    def query_stream(self, userID,response):
+        equipment_stream_queryset = Equipment_Stream.objects.filter(userID=userID)
+        if equipment_stream_queryset.exists():
+            res = CommonService.qs_to_dict(equipment_stream_queryset)
+            return response.json(0,res)
+        else:
+            return response.json(0)
+
+    def get_all_video(self, request_dict, userID,response):
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        if uid is not None and channel is not None:
+            own_permission = ModelService.check_permission(userID=userID, permID=30)
+            own_device = ModelService.check_own_device(userID=userID, UID=uid)
+            if own_permission is True or own_device is True:
+                s3 = S3ClassObject()
+                data = s3.get_all_object(prefix=uid + '_' + channel + '/flv')
+                return response.json(0, {'files': data})
+            else:
+                return response.json(404)
+        return response.json(444,'uid,channel')
+
+    def get_vod_url(self, request_dict,response):
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        filename = request_dict.get('filename', None)
+        if uid is not None and filename is not None and channel is not None:
+            s3 = S3ClassObject()
+            url = s3.get_generate_vod_url(uid + '_' + channel + '/' + filename)
+            return response.json(0, {'url': url})
+        else:
+            return response.json(444)
+
+    def get_admin_all_stream(self, request_dict, userID,response):
+        # 判断
+        own_permission = ModelService.check_permission(userID=userID, permID=30)
+        if own_permission is True:
+            page = int(request_dict.get('page', None))
+            line = int(request_dict.get('line', None))
+            equipment_stream_queryset = Equipment_Stream.objects.all()
+            if equipment_stream_queryset.exists():
+                equipment_stream_count = equipment_stream_queryset.count()
+                equipment_stream_res = equipment_stream_queryset[(page - 1) * line:page * line]
+                send_json = CommonService.qs_to_dict(equipment_stream_res)
+                send_json['count'] = equipment_stream_count
+                send_json = CommonService.qs_to_dict(equipment_stream_queryset)
+                return response.json(0, send_json)
+            else:
+                return response.json(0)
+        else:
+            return response.json(404)
+
+    def get_admin_del_stream(self, request_dict, userID,response):
+        # 判断
+        own_permission = ModelService.check_permission(userID=userID, permID=10)
+        if own_permission is True:
+            id_list = request_dict.getlist('id', None)
+
+            if len(id_list):
+                for id in id_list:
+                    Equipment_Stream.objects.filter(id=id).delete()
+                return response.json(0)
+            else:
+                return response.json(444)
+        return response.json(404)
+
+    def get_admin_del_video(self, request_dict, userID,response):
+        # 判断
+        own_permission = ModelService.check_permission(userID=userID, permID=10)
+        if own_permission is True:
+
+            key_list = request_dict.getlist('key', None)
+            if len(key_list):
+                uid = request_dict.get('uid', None)
+                channel = request_dict.get('channel', None)
+                if uid is not None and channel is not None:
+                    re_uid = re.compile(r'^' + uid + '_' + str(channel))
+                    re_flag = False
+                    print(key_list)
+                    for keys in key_list:
+                        re_flag = re_uid.match(keys)
+                        if re_flag is not True:
+                            break
+                    print(re_flag)
+                    if re_flag:
+                        s3 = S3ClassObject()
+                        response = s3.del_object_list(keylist=key_list)
+                        if response['Deleted']:
+                            return response.json(0,
+                                                {'deleted': response['Deleted']})
+        return response.json(444)
+
+    def get_del_video(self, request_dict, userID,response):
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        if uid is not None and channel is not None:
+            own_permission = ModelService.check_own_device(userID=userID, UID=uid)
+            if own_permission is True:
+                key_list = request_dict.getlist('key', None)
+                if len(key_list) > 0 and key_list is not None:
+                    re_uid = re.compile(r'^' + uid + '_' + str(channel))
+                    re_flag = False
+                    print(key_list)
+                    for keys in key_list:
+                        re_flag = re_uid.match(keys)
+                        if re_flag is not True:
+                            break
+                    if re_flag:
+                        s3 = S3ClassObject()
+                        response = s3.del_object_list(keylist=key_list)
+                        if response['Deleted']:
+                            return response.json(0)
+            else:
+                return response.json(404)
+        return response.json(444)
+
+    def get_admin_update_stream(self, userID, request_dict,response):
+        own_permission = ModelService.check_permission(userID=userID, permID=50)
+        if own_permission is True:
+            id = request_dict.get('id', None)
+            status = request_dict.get('status', None)
+            param_flag = CommonService.get_param_flag(data=[status, id])
+            if param_flag is True:
+                is_update = Equipment_Stream.objects.filter(id=id).update(status=status)
+                if is_update:
+                    return response.json(0, {'id': id, 'status': status})
+            else:
+                return response.json(444)
+        else:
+            return response.json(404)
+
+    def get_admin_vod_url(self, userID, request_dict,response):
+        own_permission = ModelService.check_permission(userID=userID, permID=30)
+        if own_permission is True:
+            uid = request_dict.get('uid', None)
+            channel = request_dict.get('channel', None)
+            filename = request_dict.get('filename', None)
+            if uid is not None and filename is not None and channel is not None:
+                s3 = S3ClassObject()
+                url = s3.get_generate_vod_url(uid + '_' + channel + '/' + filename)
+                return response.json(0, {'url': url})
+            else:
+                return response.json(444)
+        else:
+            return response.json(404)
+
+    def get_admin_find_stream(self, userID, request_dict,response):
+        own_permission = ModelService.check_permission(userID=userID, permID=20)
+        if own_permission is True:
+            content = request_dict.get('content', None)
+            page = int(request_dict.get('page', None))
+            line = int(request_dict.get('line', None))
+            param_flag = CommonService.get_param_flag(data=[content, page, line])
+            if param_flag is True:
+                content = json.loads(content)
+                search_kwargs = CommonService.get_kwargs(data=content)
+                equipment_stream_queryset = Equipment_Stream.objects.filter(**search_kwargs)
+                if equipment_stream_queryset.exists():
+                    equipment_stream_count = equipment_stream_queryset.count()
+                    equipment_stream_res = equipment_stream_queryset[(page - 1) * line:page * line]
+                    send_json = CommonService.qs_to_dict(equipment_stream_res)
+                    send_json['count'] = equipment_stream_count
+                    return response.json(0, send_json)
+                else:
+                    return response.json(0)
+            else:
+                return response.json(444)
+        else:
+            return response.json(404)
+
+    def get_all_server_json(self, userID,response):
+        own_permission = ModelService.check_permission(userID=userID, permID=20)
+        if own_permission is True:
+            url = NGINX_RTMP_STAT
+            res = requests.get(url)
+            xml_content = res.text
+            xml_dict = xmltodict.parse(xml_content)
+            if len(xml_dict):
+                return response.json(0, {'data': xml_dict})
+        else:
+            return response.json(404)
+
+    def get_admin_add_stream(self, token, userID, request_dict,response):
+        channel = request_dict.get('channel', None)
+        status = request_dict.get('status', None)
+        uid = request_dict.get('uid', None)
+        flag_param = CommonService.get_param_flag(data=[channel, status, uid])
+        if flag_param is True:
+            own_perm = ModelService.check_permission(userID=userID, permID=40)
+            if own_perm is True:
+                stream_queryset = Equipment_Stream.objects.filter(uid=uid, channel=channel)
+                if stream_queryset.exists():
+                    return response.json(174)
+                try:
+                    flag = Equipment_Stream.objects.create(userID=userID, status=status, uid=uid, channel=channel,
+                                                           access_token=token)
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, {'details': errorInfo})
+                else:
+                    if flag:
+                        rtmp_url = RTMP_PUSH_URL
+                        rtmp_name = uid + '_' + channel + '?userID=' + userID + '&uid=' + uid + '&channel=' + channel + '&access_token=' + token
+                        return response.json(0,
+                                            {'userID': userID, 'channel': channel,
+                                             'uid': uid,
+                                             'status': status,
+                                             'access_token': token,
+                                             'rtmp_url': rtmp_url,
+                                             'rtmp_name': rtmp_name})
+            else:
+                return response.json(404)
+        else:
+            return response.json(444)
+
+    def get_admin_hls_vod(self, request_dict, userID,response):
+        own_permission = ModelService.check_permission(userID=userID, permID=30)
+        if own_permission is True:
+            uid = request_dict.get('uid', None)
+            channel = request_dict.get('channel', None)
+            filename = request_dict.get('filename', None)
+            param_flag = CommonService.get_param_flag(data=[uid, filename, channel])
+            if param_flag is True:
+                uid_channel = uid + '_' + channel
+                InputKey = uid_channel + '/flv/' + filename
+                ts = filename.split('.')[0]
+                vod_key = uid_channel + '/' + ts
+                elastictranscoder = ElasticTranscoder()
+                res = elastictranscoder.create_job(
+                    # InputKey='2N1K3LE78TYJ38CE111A_99/flv/1526882855.flv',
+                    InputKey=InputKey,
+                    # OutputKey='vod/2N1K3LE78TYJ38CE111A_99/1526882855'
+                    OutputKey='vod/' + vod_key
+                )
+                if res is True:
+                    domain_prefix = 'http://d3596w5a6euckc.cloudfront.net/vod'
+                    vod_url = domain_prefix + '/' + vod_key + '.m3u8'
+                    return response.json(0, {'vodurl': vod_url})
+                else:
+                    return response.json(403)
+            else:
+                return response.json(444)
+        else:
+            return response.json(404)
+
+    def get_vod_hls(self, request_dict,response):
+        uid = request_dict.get('uid', None)
+        channel = request_dict.get('channel', None)
+        filename = request_dict.get('filename', None)
+        param_flag = CommonService.get_param_flag(data=[uid, filename, channel])
+        if param_flag is True:
+            uid_channel = uid + '_' + channel
+            InputKey = uid_channel + '/flv/' + filename
+            ts = filename.split('.')[0]
+            vod_key = uid_channel + '/' + ts
+            elastictranscoder = ElasticTranscoder()
+            res = elastictranscoder.create_job(
+                InputKey=InputKey,
+                OutputKey='vod/' + vod_key
+            )
+            if res is True:
+                domain_prefix = 'http://d3596w5a6euckc.cloudfront.net/vod'
+                vod_url = domain_prefix + '/' + vod_key + '.m3u8'
+                vod_cookie_url = domain_prefix + '/' + uid_channel + '/*'
+                expires_at = int(time.time()) + 7200
+                cf = BetterThanBoto()
+                vodCookie = cf.create_signed_cookies(url=vod_cookie_url, keypair_id="APKAINI6BNPKV54NHH7Q",
+                                                     expires_at=expires_at,
+                                                     private_key_file=os.path.join(BASE_DIR,
+                                                                                   'Ansjer/file/pk-APKAINI6BNPKV54NHH7Q.pem'))
+                return response.json(0, {'vodurl': vod_url, 'vodCookie': vodCookie})
+            else:
+                return response.json(403)
+        else:
+            return response.json(444)
+
+
+# 推流验证
+@csrf_exempt
+def Auth_Stream(request, *callback_args,
+                **callback_kwargs):
+    if request.method == 'GET':
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+    access_token = request_dict.get('access_token', None)
+    userID = request_dict.get('userID', None)
+    uid = request_dict.get('uid', None)
+    channel = request_dict.get('channel', None)
+    param_flag = CommonService.get_param_flag(data=[access_token, userID, uid, channel])
+    if param_flag is True:
+        own_permission = ModelService.check_permission(userID=userID, permID=60)
+        if own_permission is True:
+            equipment_stream_queryset = Equipment_Stream.objects.filter(userID=userID, uid=uid, channel=channel,
+                                                                        status=1, access_token=access_token)
+            if equipment_stream_queryset.exists():
+                return HttpResponse(status=200)
+    return HttpResponse(status=404)
+
+
+# 播放验证
+@csrf_exempt
+def Auth_Live(request, *callback_args,
+              **callback_kwargs):
+    if request.method == 'GET':
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+    response = ResponseObject()
+    token = request_dict.get('token', None)
+    if token is not None:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            userID = tko.userID()
+            uid = request_dict.get('uid', None)
+            channel = request_dict.get('channel', None)
+            if userID is not None and uid is not None and channel is not None:
+                own_permission = ModelService.check_permission(userID=userID, permID=90)
+                if own_permission is True:
+                    equipment_stream_queryset = Equipment_Stream.objects.filter(userID=userID, uid=uid, channel=channel,
+                                                                                status=1)
+                    if equipment_stream_queryset.exists():
+                        return HttpResponse(status=200)
+    return HttpResponse(status=404)
+
+
+@csrf_exempt
+def send_video_s3(request, *callback_args,
+                  **callback_kwargs):
+    if request.method == 'GET':
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+    # 文件名
+    basename = request_dict.get('basename', None)
+    print(basename)
+    if basename != None:
+        base_path = '/tmp/flv/'
+        file_base_path = base_path + basename
+        input_path = file_base_path + '.flv'
+        output_path = file_base_path + '.mp4'
+        if os.path.exists(input_path):
+            uid_channel = basename.split('-')[0]
+            uid = uid_channel.split('_')[0]
+            channel = uid_channel.split('_')[1]
+            equipment_stream_queryset = Equipment_Stream.objects.filter(channel=channel, uid=uid, status=1)
+            if equipment_stream_queryset.exists():
+                try:
+                    key = uid_channel + '/' + basename + '.mp4'
+                    # 转换到
+                    ff = FFmpeg(
+                        inputs={input_path: None},
+                        outputs={output_path: ['-vcodec', 'copy', '-strict', '-2']}
+                    )
+                    ff.run()
+                    # 截取第一帧当缩略图
+                    # ffmpeg -i 555.flv -y -f image2 -ss 08.010 -t 0.001 -s 352x240 b.jpg
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                else:
+                    if os.path.exists(output_path):
+                        s3 = S3ClassObject()
+                        s3_response = s3.put_mp4_object(body=open(output_path, 'rb'), key=key)
+                        print(s3_response)
+                        if s3_response['ResponseMetadata']['HTTPStatusCode'] == 200:
+                            # 记录保存文件容量,由于此操作过于频繁入库,上线代码去掉
+                            file_size = CommonService.get_file_size(file_path=output_path, suffix_type='MB',
+                                                                    decimal_point=2)
+                            size = equipment_stream_queryset[0].total_flow
+                            if size:
+                                pass
+                            else:
+                                size = 0
+                            equipment_stream_queryset.update(total_flow=size + file_size)
+                            #
+                            rm_common = 'rm ' + input_path + ' ' + output_path
+                            subprocess.Popen(rm_common, shell=True)
+                            return HttpResponse(status=200)
+                        else:
+                            rm_common = 'rm ' + input_path + ' ' + output_path
+                            print('respone error')
+                            subprocess.Popen(rm_common, shell=True)
+        return HttpResponse(status=403)
+    else:
+        return HttpResponse(404)
+
+
+@csrf_exempt
+def push_flv_s3(request, *callback_args,
+                **callback_kwargs):
+    if request.method == 'GET':
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+    # 文件名
+    basename = request_dict.get('basename', None)
+    response = ResponseObject()
+    if basename != None:
+        base_path = 'tmp/flv/'
+        file_base_path = base_path + basename
+        flv_path = file_base_path + '.flv'
+        if os.path.exists(flv_path):
+            dict_file = basename.split('-')
+            uid_channel = dict_file[0]
+            file_time = dict_file[1]
+            uid = uid_channel.split('_')[0]
+            channel = uid_channel.split('_')[1]
+            equipment_stream_queryset = Equipment_Stream.objects.filter(channel=channel, uid=uid, status=1)
+            if equipment_stream_queryset.exists():
+                try:
+                    jpg_path = file_base_path + '.jpg'
+                    # 截取第一帧当缩略图ffmpeg -i 2N1K3LE78TYJ38CE111A_99-1526882169.flv -y -f image2 -t 0.001 -s 352x240 a.jpg
+                    ff = FFmpeg(
+                        inputs={flv_path: None},
+                        outputs={jpg_path: ['-y', '-f', 'image2', '-t', '0.001', '-s', '352x240']}
+                    )
+                    ff.cmd
+                    ff.run()
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                else:
+                    if os.path.exists(jpg_path):
+                        s3 = S3ClassObject()
+                        flv_key = uid_channel + '/flv/' + file_time + '.flv'
+                        jpg_key = uid_channel + '/jpg/' + file_time + '.jpg'
+                        try:
+                            flv_response = s3.put_object(body=open(flv_path, 'rb'), key=flv_key)
+                            jpg_response = s3.put_object(body=open(jpg_path, 'rb'), key=jpg_key)
+                            if flv_response['ResponseMetadata']['HTTPStatusCode'] == 200 and \
+                                    jpg_response['ResponseMetadata']['HTTPStatusCode'] == 200:
+                                code = 0
+                            else:
+                                code = 444
+                        except Exception as e:
+                            print(repr(e))
+                            code = 444
+                            pass
+                        path_list = [flv_path, jpg_path]
+                        for i in path_list:
+                            try:
+                                os.remove(i)
+                            except Exception as e:
+                                print(repr(e))
+                                pass
+                        return response.json(code)
+    return response.json(444)

+ 56 - 0
Controller/SysManage.py

@@ -0,0 +1,56 @@
+#!/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/8 9:10
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: SysManage.py
+@Contact: chanjunkai@163.com
+"""
+from django.views.decorators.csrf import csrf_exempt
+from Service.CommonService import CommonService
+from Service.ModelService import ModelService
+from Ansjer.settings import BASE_DIR
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+import os
+
+
+@csrf_exempt
+def updateLog(request):
+    if request.method == 'GET':
+        request.encoding = 'utf-8'
+        request_dict = request.GET
+    if request.method == 'POST':
+        request.encoding = 'utf-8'
+        request_dict = request.POST
+    token = request_dict.get('token',None)
+    content = request_dict.get('content',None)
+    response = ResponseObject()
+    param_flag = CommonService.get_param_flag(data=[token,content])
+    if param_flag is True:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            userID = tko.userID()
+            own_permission = ModelService.check_permission(userID=userID,permID=50)
+            if own_permission is True:
+                file_path = os.path.join(BASE_DIR,'static/Help/version.txt')
+                try:
+                    with open(file_path, "w", encoding="utf-8") as f:
+                        f.write(content)
+                except Exception as e:
+                    pass
+                return response.json(0)
+            else:
+                return response.json(404)
+        else:
+            return response.json(tko.code)
+    else:
+        return response.json(444)
+

+ 77 - 0
Controller/Test.py

@@ -0,0 +1,77 @@
+#!/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/22 13:58
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: Test.py
+@Contact: chanjunkai@163.com
+"""
+from django.views.generic.base import View
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+# from Ansjer.settings import *
+from django.contrib import auth
+from django.http import HttpResponseRedirect
+'''
+http://192.168.136.40:8077/Test
+'''
+import json
+import requests
+from Service.ModelService import ModelService
+from django.middleware.csrf import get_token
+from django.http import JsonResponse
+from ratelimit.decorators import ratelimit
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+
+
+class Test(View):
+    '''
+    limit=10:指定返回记录的数量
+    offset=10:指定返回记录的开始位置。
+    page=2&per_page=100:指定第几页,以及每页的记录数。
+    sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
+    animal_type_id=1:指定筛选条件
+    '''
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(Test, self).dispatch(*args, **kwargs)
+
+    @ratelimit(key='ip', rate='1/m')
+    # 查询
+    def get(self, request, *args, **kwargs):
+        response = ResponseObject()
+
+        return response.json(0)
+
+    # 增加
+    def post(self, request, *args, **kwargs):
+        response = ResponseObject()
+        return response.json(0)
+
+    # 修改 资源改变
+    def put(self, request):
+        response = ResponseObject()
+        return response.json(0)
+
+    # 修改 属性改变
+    def PATCH(self, request):
+        response = ResponseObject()
+        return response.json(0)
+
+    # 删除
+    def delete(self, request):
+        response = ResponseObject()
+
+        return response.json(0)
+
+    def validation(self, request_dict, *args, **kwargs):
+        response = ResponseObject()
+
+        return response.json(0)

+ 562 - 0
Controller/UserController.py

@@ -0,0 +1,562 @@
+#!/usr/bin/env python3  
+# -*- coding: utf-8 -*-  
+"""
+@Copyright (C) ansjer cop Video Technology Co.,Ltd.All rights reserved.
+@AUTHOR: ASJRD018
+@NAME: AnsjerFormal
+@software: PyCharm
+@DATE: 2018/9/11 15:08
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: UserController.py
+@Contact: chanjunkai@163.com
+"""
+from django.contrib import auth
+from django.core import serializers
+from django.utils.timezone import utc
+import traceback
+from django.views.decorators.csrf import csrf_exempt
+from django.views.generic import TemplateView, View
+from django.utils.decorators import method_decorator
+from django.core.files.storage import FileSystemStorage
+from django.http import HttpResponseRedirect
+from django.contrib.auth.hashers import make_password, check_password  # 对密码加密模块
+from Ansjer import settings as api_settings
+from Object.AWS.SesClassObject import SesClassObject
+from Model.models import Auth_Captcha, AuthToken_Token, Role
+from Controller.CheckUserData import DataValid, date_handler, RandomStr, TokenLink
+from Service.ModelService import ModelService
+from Service.MiscellService import MiscellService
+from django.utils import timezone
+from Ansjer.config import *
+from Service.CommonService import CommonService
+from Service.TemplateService import TemplateService
+from ratelimit.decorators import ratelimit
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Object.RedisObject import RedisObject
+from Model.models import Device_User
+import simplejson as json
+
+
+# 获取验证码
+class authCodeView(TemplateView):
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(authCodeView, self).dispatch(*args, **kwargs)
+
+    @ratelimit(key='ip', rate='2/m')
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        lang = request.POST.get('language', None)
+        response = ResponseObject(lang)
+        was_limited = getattr(request, 'limited', False)
+        if was_limited is True:
+            return response.json(5)
+        username = request.POST.get('userName', None)
+        useremail = request.POST.get('userEmail', None)
+        return self.ValidationError(username, useremail, 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('language', None)
+        response = ResponseObject(lang)
+        was_limited = getattr(request, 'limited', False)
+        if was_limited is True:
+            return response.json(5)
+        username = request.GET.get('userName', None)
+        email = request.GET.get('userEmail', None)
+        return self.ValidationError(username, email, response)
+
+    def ValidationError(self, username, email, response):
+        if username:
+            username = username.strip()
+            return self.phoneCode(username, response)
+        elif email:
+            email = email.strip()
+            return self.emailCode(email, response)
+        else:
+            return response.json(800)
+
+    def phoneCode(self, phone, response):
+        dataValid = DataValid()
+        if dataValid.mobile_validate(phone):
+            reds = RedisObject()
+            identifyingCode = reds.get_data(key=phone + '_identifyingCode')
+            if identifyingCode is False:
+                user_qs = Device_User.objects.filter(username=phone)
+                if user_qs.exists():
+                    return response.json(101)
+                else:
+                    identifyingCode = RandomStr(6, True)
+                    if reds.set_data(key=phone + '_identifyingCode', val=identifyingCode, expire=600):
+                        return response.json(0, {'identifyingCode': identifyingCode})
+                    else:
+                        return response.json(10, '生成缓存系统错误')
+
+            else:
+                return response.json(0, {'identifyingCode': identifyingCode})
+        else:
+            return response.json(107)
+
+    def emailCode(self, email, response):
+        dataValid = DataValid()
+        if dataValid.email_validate(email):
+            reds = RedisObject()
+            identifyingCode = reds.get_data(key=email + '_identifyingCode')
+            if identifyingCode is False:
+                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)
+                else:
+                    identifyingCode = RandomStr(6, True)
+                    if reds.set_data(key=email + '_identifyingCode', val=identifyingCode, expire=AuthCode_Expire):
+                        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:
+                            reds.set_data(key=email + '_registerCode', val=identifyingCode, expire=AuthCode_Expire)
+                            return response.json(0, {'identifyingCode': identifyingCode})
+                        else:
+                            return response.json(44)
+                    else:
+                        return response.json(10, '生成缓存系统错误')
+
+            else:
+                return response.json(0, {'identifyingCode': identifyingCode})
+        else:
+            return response.json(107)
+
+
+# 验证码注册
+class registerView(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(registerView, 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):
+        username = request_dict.get('userName', None)
+        userEmail = request_dict.get('userEmail', None)
+        password = request_dict.get('userPwd', None)
+        authCode = request_dict.get('identifyingCode', None)
+        language = request_dict.get('language', None)
+        response = ResponseObject(language)
+        if username and password and authCode:
+            # 过滤空格
+            username = username.strip()
+            if userEmail:
+                userEmail = userEmail.strip()
+            return self.register(username, userEmail, password, authCode, response)
+        else:
+            return response.json(800)
+
+    def register(self, username, userEmail, password, authCode, response):
+        dataValid = DataValid()
+        reds = RedisObject()
+        identifyingCode = reds.get_data(key=username + '_identifyingCode')
+        if identifyingCode is False:
+            identifyingCode = reds.get_data(key=userEmail + '_identifyingCode')
+            if identifyingCode is False:
+                return response.json(121)
+            else:
+                username = userEmail
+        if authCode != identifyingCode:
+            return response.json(121)
+        if dataValid.password_validate(password):
+            if dataValid.email_validate(username):
+                nameValid = Device_User.objects.filter(username=username)
+                emailValid = Device_User.objects.filter(userEmail=userEmail)
+                if emailValid:
+                    return response.json(103)
+                elif nameValid:
+                    return response.json(101)
+                try:
+                    create_data = {
+                        "username": username,
+                        "userEmail": userEmail,
+                        "password": make_password(password),
+                        "userID": CommonService.getUserID(μs=False, setOTAID=True),
+                        "is_active": True,
+                        "user_isValid": True,
+                    }
+                    users = Device_User.objects.create(**create_data)
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, repr(e))
+                else:
+                    if reds.del_data(key=username + '_identifyingCode'):
+                        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),
+                            }
+                        })
+                    else:
+                        return response.json(10, '删除缓存验证码错误')
+
+            elif dataValid.mobile_validate(username):
+                nameValid = Device_User.objects.filter(username=username)
+                if nameValid:
+                    return response.json(101)
+                try:
+                    create_data = {
+                        "username": username,
+                        "userEmail": userEmail,
+                        "password": make_password(password),
+                        "userID": CommonService.getUserID(μs=False, setOTAID=True),
+                        "is_active": True,
+                        "user_isValid": True,
+                    }
+                    users = Device_User.objects.create(**create_data)
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print(errorInfo)
+                    return response.json(424, repr(e))
+                else:
+                    if reds.del_data(key=username + '_identifyingCode'):
+                        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),
+                            }
+                        })
+                    else:
+                        return response.json(10, '删除缓存验证码错误')
+
+            else:
+                return response.json(107)
+        else:
+            return response.json(109)
+
+
+# 登录
+class LoginView(TemplateView):
+    @method_decorator(csrf_exempt)  # @csrf_exempt
+    def dispatch(self, *args, **kwargs):
+        return super(LoginView, 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 and password:
+            username = username.strip()
+            password = password.strip()
+            return self.login(username, password, mcode, response)
+        else:
+            return response.json(444, 'username,password')
+
+    def login(self, username, password, mcode, response):
+        dataValid = DataValid()
+        if dataValid.mobile_validate(username):
+            userValid = Device_User.objects.filter(username=username)
+            if userValid:
+                if userValid[0].user_isValid and userValid[0].is_active:
+                    c_p = check_password(password, userValid[0].password)
+                    if c_p:
+                        return self.LoginUpdate(userValid, mcode, response)
+                    else:
+                        return response.json(111)
+                else:
+                    return response.json(110)
+            else:
+                return response.json(102)
+        elif dataValid.email_validate(username):
+            userValid = Device_User.objects.filter(userEmail=username)
+            if userValid:
+                if userValid[0].user_isValid and userValid[0].is_active:
+                    User = auth.authenticate(username=userValid[0].username, password=password)
+                    if User is not None:
+                        return self.LoginUpdate(userValid, mcode, response)
+                    else:
+                        return response.json(111)
+                else:
+                    return response.json(110)
+            else:
+                return response.json(104)
+        else:
+            return response.json(104)
+
+    def LoginUpdate(self, userValid, mcode, response):
+        userID = userValid[0].userID
+        tko = TokenObject()
+        res = tko.generate(data={'userID': userID, 'lang': response.lang, 'mcode': mcode})
+        if tko.code == 0:
+            now_time = datetime.datetime.utcnow().replace(tzinfo=utc).astimezone(utc)
+            userValid.update(last_login=now_time, online=True, machine_code=mcode, 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)
+            return response.json(0, res)
+        else:
+            return response.json(tko.code)
+
+
+# 登出
+class LogoutView(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(LogoutView, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        token = request.POST.get('token')
+        return self.Logout(request, token)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        token = request.GET.get('token')
+        return self.Logout(request, token)
+
+    def Logout(self, request, token):
+        response = ResponseObject()
+        if token:
+            tko = TokenObject(token)
+            tko.valid()
+            if tko.code == 0:
+                try:
+                    MiscellService.add_access_log(request=request, status_code=200)
+                except Exception as e:
+                    pass
+                is_udpate = Device_User.objects.filter(userID=tko.userID).update(online=False)
+                if is_udpate:
+                    return response.json(0)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800)
+
+
+# 修改密码
+class ChangePwdView(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(ChangePwdView, 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 = 'gb2312'
+        request_dict = request.GET
+        return self.validates(request_dict)
+
+    def validates(self, request_dict):
+        token = request_dict.get('token', None)
+        oldPwd = request_dict.get('oldPwd', None)
+        newPwd = request_dict.get('newPwd', None)
+        response = ResponseObject()
+        if token and oldPwd and newPwd:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                return self.updatePwd(tko.userID, oldPwd, newPwd, response)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800)
+
+    def updatePwd(self, userID, oldPwd, newPwd, response):
+        user_qs = Device_User.objects.filter(userID=userID)
+        if user_qs.exists():
+            c_p = check_password(oldPwd, user_qs[0].password)
+            if c_p:
+                update = user_qs.update(password=make_password(newPwd))
+                if update:
+                    return response.json(0)
+                else:
+                    return response.json(112)
+            else:
+                return response.json(111)
+        else:
+            return response.json(113)
+
+
+class ForgetPwdView(TemplateView):
+    '''
+    忘记密码
+    '''
+    __server_host = None
+
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(ForgetPwdView, self).dispatch(*args, **kwargs)
+
+    @ratelimit(key='ip', rate='1/m')
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        self.__server_host = CommonService.req_path(request)
+        response = ResponseObject()
+        was_limited = getattr(request, 'limited', False)
+        if was_limited is True:
+            return response.json(5)
+        userName = request.GET.get('userName', None)
+        return self.ValidationError(userName, response)
+
+    @ratelimit(key='ip', rate='1/m')
+    def post(self, request):
+        self.__server_host = CommonService.req_path(request)
+        request.encoding = 'utf-8'
+        userName = request.POST.get('userName', None)
+        response = ResponseObject()
+        was_limited = getattr(request, 'limited', False)
+        if was_limited is True:
+            return response.json(5)
+        return self.ValidationError(userName)
+
+    def ValidationError(self, userName, response):
+
+        if userName != None:
+            userName = userName.strip()
+            return self.ForgetPwd(userName, response)
+        else:
+            return response.json(800)
+
+    def ForgetPwd(self, userName, response):
+        dataValid = DataValid()
+        if dataValid.mobile_validate(userName):
+            User = Device_User.objects.filter(username=userName)
+        if dataValid.email_validate(userName):
+            User = Device_User.objects.filter(username=userName)
+        if User:
+            email = User[0].userEmail
+            userID = User[0].userID
+            if email:
+                redisObj = RedisObject()
+                reset_pwd = redisObj.get_data(key=userID + '_email_reset_pwd')
+                if reset_pwd is False:
+                    tko = TokenObject()
+                    rest = tko.generate(data={'userID': userID})
+                    token = rest['access_token'].decode('utf-8')
+
+                    reset_pwd = CommonService.RandomStr(6)
+                    send_data = TemplateService.email_message(type='forget', language='en')
+                    reset_link = '{server_host}/accounts/email-re-pwd/?token={token}'.format(
+                        server_host=self.__server_host, token=token)
+                    send_body = send_data['body'].format(username=email, reset_pwd=reset_pwd, reset_link=reset_link)
+                    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):
+                            return response.json(0)
+                        else:
+                            return response.json(10, '存储验证失败')
+                else:
+                    return response.json(89)
+            else:
+                return response.json(103)
+        else:
+            return response.json(9)
+
+
+class EmailResetPwdView(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(EmailResetPwdView, self).dispatch(*args, **kwargs)
+
+    # 查询
+    def get(self, request, *args, **kwargs):
+        response = ResponseObject()
+        request_dict = request.GET
+        return self.validate(request_dict, response, *args, **kwargs)
+
+    # 认证登录
+    def post(self, request, *args, **kwargs):
+        response = ResponseObject()
+        try:
+            print(request.body.decode("utf-8"))
+            json_data = json.loads(request.body.decode("utf-8"))
+        except Exception as e:
+            return response.json(10, repr(e))
+        else:
+            request_dict = json_data
+            return self.validate(request_dict, response, *args, **kwargs)
+
+    def validate(self, request_dict, response, *args, **kwargs):
+        token = request_dict.get('token', None)
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            if tko.code == 0:
+                redisObj = RedisObject()
+                userID = tko.userID
+                reset_pwd = redisObj.get_data(key=userID + '_email_reset_pwd')
+                if reset_pwd is not False:
+                    user_qs = Device_User.objects.filter(userID=userID)
+                    if user_qs.exists():
+                        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)
+                        else:
+                            return response.json(10)
+                    else:
+                        return response.json(9)
+                else:
+                    return response.json(307, 'rpwd')
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(444, 'token')

+ 469 - 0
Controller/UserManger.py

@@ -0,0 +1,469 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+import datetime
+import os
+import traceback
+
+import simplejson as json
+from django.core import serializers
+from django.core.files.storage import FileSystemStorage
+from django.http import HttpResponse
+from django.utils import timezone
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from django.views.generic import TemplateView, View
+
+from Ansjer.config import SERVER_DOMAIN
+from Ansjer.settings import BASE_DIR
+from Model.models import Role, Device_User
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.CommonService import CommonService
+from Service.ModelService import ModelService
+
+
+# http://192.168.136.40:8077/account/showUserMore?token=test
+class showUserMoreView(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(showUserMoreView, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        token = request.POST.get('token', None)
+
+        return self.ValidationError(token)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+        token = request.GET.get('token', None)
+
+        return self.ValidationError(token)
+
+    def ValidationError(self, token):
+        response = ResponseObject()
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID:
+                    return self.showUserMore(userID, response)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800)
+
+    def showUserMore(self, userID, response):
+        try:
+            User = Device_User.objects.filter(userID=userID)
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('Query Database Error: %s' % errorInfo)
+            return response.json(500, repr(e))
+        else:
+            if User:
+                sqlJSON = serializers.serialize('json', User)
+                sqlList = json.loads(sqlJSON)
+                sqlDict = dict(zip(["datas"], [sqlList]))
+                for k, v in enumerate(sqlDict["datas"]):
+                    sqlDict['datas'][k]['fields'].pop('password')
+                    if len(v['fields']['role']):
+                        roleName = ModelService.getRole(rid=v['fields']['role'][0])
+                        sqlDict["datas"][k]['fields']['rolename'] = roleName
+                return response.json(0, sqlDict)
+            else:
+                return response.json(113)
+
+
+# http://192.168.136.40:8077/account/perfectUserInfo?token=test&content={"NickName":"333"}
+class perfectUserInfoView(TemplateView):
+    # 完善个人信息
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(perfectUserInfoView, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        userContent = request.POST.get('content', None)
+        userIcon = request.FILES.get('userIcon', None)
+        token = request.POST.get('token', None)
+        return self.ValidationError(token, userContent, userIcon)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+        userContent = request.GET.get('content', None)
+        userIcon = request.FILES.get('userIcon', None)
+        token = request.GET.get('token', None)
+        return self.ValidationError(token, userContent, userIcon)
+
+    def ValidationError(self, token, userContent, userIcon):
+        response = ResponseObject()
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                userID = tko.userID()
+                if userID:
+                    if userIcon != None:
+                        # location = 'static/User/Images/' + userID[-11:] + '/'
+                        location = 'static/User/Images/' + userID + '/'
+                        fss = FileSystemStorage(location=location)
+                        if fss.exists(userIcon.name):
+                            fss.delete(userIcon.name)
+                        filename = fss.save(userIcon.name, userIcon)
+                        userIconUrl = fss.url(filename)
+                        userIconPath = fss.path(filename).replace('\\', '/')
+                    else:
+                        userIconPath = None
+
+                    if userContent != None:
+                        dataValid = json.loads(userContent)
+                        print('userID' and 'password' and 'is_superuser' in dataValid.keys())
+                        if 'userID' and 'password' and 'is_superuser' in dataValid.keys():
+                            return response.json(802)
+                    if userIconPath == None and userContent == None:
+                        return response.json(800)
+                    elif userIconPath == None and userContent != None:
+                        return self.perfectUserInfoUpdate(userID, response, userContent=userContent)
+                    elif userIconPath != None and userContent == None:
+                        return self.perfectUserInfoUpdate(userID, response, userIconPath=userIconPath)
+                    else:
+                        return self.perfectUserInfoUpdate(userID, response, userIconPath=userIconPath,
+                                                          userContent=userContent)
+                else:
+                    return response.json(310)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800)
+
+    def perfectUserInfoUpdate(slef, userID, response, *args,
+                              **kwargs):
+        """
+        :param username:
+        :param userContent:
+        :param args:
+        :param kwargs:
+        :return:
+        """
+        try:
+            User = Device_User.objects.filter(userID=userID)
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('查询数据库失败: %s ' % errorInfo)
+            return response.json(500, repr(e))
+        else:
+            if User:
+                userIconPath = kwargs.get('userIconPath', None)
+                userContent = kwargs.get('userContent', None)
+                if userIconPath is not None:
+                    userIconPath = userIconPath[userIconPath.find('static/'):]
+                    userIconUrl = SERVER_DOMAIN + '/account/getAvatar/' + userIconPath[7:]
+                if userContent != None:
+                    try:
+                        UserData = json.loads(userContent)
+                    except Exception as e:
+                        return response.json(803, repr(e))
+                try:
+                    if userIconPath is not None and userContent is not None:
+                        User.update(userIconPath=userIconPath, userIconUrl=userIconUrl, **UserData)
+                    elif userIconPath is None and userContent is not None:
+                        User.update(**UserData)
+                    elif userIconPath is not None and userContent is None:
+                        User.update(userIconPath=userIconPath, userIconUrl=userIconUrl)
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print('修改设备信息错误: %s ' % errorInfo)
+                    return response.json(116, repr(e))
+                else:
+                    sqlJSON = serializers.serialize('json', User)
+                    sqlList = json.loads(sqlJSON)
+                    print(sqlList, sqlJSON)
+                    sqlDict = dict(zip(["datas"], [sqlList]))
+                    return response.json(0, sqlDict)
+            else:
+                return response.json(113)
+
+
+class getAvatarView(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(getAvatarView, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        filePath = kwargs.get('filePath', '')
+        filePath.encode(encoding='utf-8', errors='strict')
+        return self.getAvatar(filePath)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+        filePath = kwargs.get('filePath', '')
+        filePath.encode(encoding='gb2312', errors='strict')
+        return self.getAvatar(filePath)
+
+    def getAvatar(self, filePath):
+        response = ResponseObject()
+        if filePath == '' or filePath == None:
+            return response.json(800)
+        fullPath = os.path.join(BASE_DIR, "static", filePath).replace('\\', '/')
+        if os.path.isfile(fullPath):
+            try:
+                Imagedata = open(fullPath, 'rb').read()
+                return HttpResponse(Imagedata, content_type="image/jpeg")
+            except Exception as e:
+                return response.json(906, repr(e))
+        else:
+            return response.json(907)
+
+
+@csrf_exempt
+def delUserInterface(request):
+    if request.method == 'POST':
+        delUserID = request.POST.get('delUserID', None)
+        token = request.POST.get('token', None)
+    elif request.method == 'GET':
+        delUserID = request.GET.get('delUserID', None)
+        token = request.GET.get('token', None)
+    response = ResponseObject()
+    if token is not None and delUserID is not None:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            userID = tko.userID()
+            if userID:
+                try:
+                    userValid = Device_User.objects.filter(userID=userID)
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print('Query Database Error: %s' % errorInfo)
+                    return response.json(500, repr(e))
+                else:
+                    if userValid:
+                        own_perm = ModelService.check_permission(userID=userID, permID=10)
+                        if userValid[0].is_superuser == 100 or own_perm is True:
+                            try:
+                                delUser = Device_User.objects.filter(userID=delUserID)
+                            except Exception as e:
+                                errorInfo = traceback.format_exc()
+                                print('Query database error: %s' % errorInfo)
+                                return response.json(500, repr(e))
+                            else:
+                                if delUser:
+                                    try:
+                                        delUser.delete()
+                                    except Exception as e:
+                                        errorInfo = traceback.format_exc()
+                                        print('Query database error: %s' % errorInfo)
+                                        return response.json(114, repr(e))
+                                    else:
+                                        return response.json(0)
+                                else:
+                                    return response.json(115)
+                        else:
+                            return response.json(601)
+                    else:
+                        return response.json(113)
+            else:
+                return response.json(310)
+        else:
+            return response.json(tko.code)
+    else:
+        return response.json(800)
+
+
+def showAllUserPC(userID, line, page, response):
+    try:
+        userValid = Device_User.objects.filter(userID=userID).order_by('-data_joined')
+    except Exception as e:
+        errorInfo = traceback.format_exc()
+        print('Query Database Error:%s' % errorInfo)
+        return response.json(500, repr(e))
+    else:
+        if userValid:
+            # 管理员查询
+            own_permission = ModelService.check_permission(userID=userID, permID=30)
+            if own_permission is True:
+                device_user_queryset = Device_User.objects.all()
+                device_user_count = device_user_queryset.count()
+                device_user_res = device_user_queryset.order_by('-data_joined')[(page - 1) * line:page * line]
+                sqlDict = CommonService.qs_to_dict(device_user_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 device_user_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'] = device_user_count
+                return response.json(0, sqlDict)
+            else:
+                return response.json(600)
+        else:
+            return response.json(113)
+
+
+def showAllUser(userID, response):
+    try:
+        userValid = Device_User.objects.filter(userID=userID).order_by('-data_joined')
+    except Exception as e:
+        errorInfo = traceback.format_exc()
+        print('Query Database Error:%s' % errorInfo)
+        return response.json(500, repr(e))
+    else:
+        if userValid:
+            own_permission = ModelService.check_permission(userID=userID, permID=30)
+            if own_permission is True:
+                sqlJSON = serializers.serialize('json', Device_User.objects.all().order_by('-data_joined'))
+                sqlList = json.loads(sqlJSON)
+                print(sqlList, sqlJSON)
+                sqlDict = dict(zip(["datas"], [sqlList]))
+                return response.json(0, sqlDict)
+            else:
+                return response.json(600)
+        else:
+            return response.json(113)
+
+
+@csrf_exempt
+def showAllUserInterface(request):
+    if request.method == 'POST':
+        token = request.POST.get('token', None)
+        type = request.POST.get('type', None)
+    elif request.method == 'GET':
+        token = request.GET.get('token', None)
+        type = request.GET.get('type', None)
+    response = ResponseObject()
+    if token is not None:
+        tko = TokenObject(token)
+        tko.valid()
+        response.lang = tko.lang
+        if tko.code == 0:
+            userID = tko.userID()
+            if userID:
+                if type == 'PC':
+                    line = int(request.POST.get('line', None))
+                    page = int(request.POST.get('page', None))
+                    return showAllUserPC(userID, line, page, response)
+                else:
+                    return showAllUser(userID, response)
+            else:
+                return response.json(310)
+        else:
+            return response.json(tko.code)
+    else:
+        return response.json(800)
+
+
+class setUserValidView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(setUserValidView, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+
+        token = request.POST.get('token', None)
+        eUserID = request.POST.get('userID', None)
+        isValid = request.POST.get('isValid', None)
+        rid = request.POST.get('rid', None)
+        return self.setUserValid(token, eUserID, isValid, rid)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+
+        token = request.GET.get('token', None)
+        eUserID = request.GET.get('userID', None)
+        isValid = request.GET.get('isValid', None)
+        rid = request.GET.get('rid', None)
+
+        return self.setUserValid(token, eUserID, isValid, rid)
+
+    def setUserValid(self, token, eUserID, isValid, rid, *args, **kwargs):
+        response = ResponseObject()
+        if token is not None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                superID = tko.userID()
+                if superID != None and superID != eUserID:
+                    if rid == None:
+                        return self.UserValidUpdate(superID, eUserID, isValid, response)
+                    else:
+                        return self.UserValidUpdatePC(superID, eUserID, isValid, rid, response)
+                else:
+                    return response.json(150)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800)
+
+    def UserValidUpdatePC(self, superID, eUserID, isValid, rid, response):
+        try:
+            super = Device_User.objects.filter(userID=superID)
+            eUser = Device_User.objects.filter(userID=eUserID)
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('查询数据库错误: %s' % errorInfo)
+            return response.json(500, repr(e))
+        else:
+            if not super:
+                return response.json(615)
+            if not eUser:
+                return response.json(616)
+            own_permission = ModelService.check_permission(userID=superID, permID=50)
+            if own_permission is True:
+                try:
+                    eUser.update(user_isValid=isValid)
+                    device_user_query_set = Device_User.objects.get(userID=eUserID)
+                    if device_user_query_set.role.all():
+                        device_user_query_set.role.set([rid])
+                    else:
+                        role_user_query_set = Role.objects.get(rid=rid)
+                        device_user_query_set.role.add(role_user_query_set)
+                except Exception as e:
+                    errorInfo = traceback.format_exc()
+                    print('更新数据库错误:%s' % errorInfo)
+                    return response.json(501, repr(e))
+                else:
+                    return response.json(0)
+            else:
+                return response.json(602)
+
+    def UserValidUpdate(self, superID, eUserID, isValid, response):
+        try:
+            super = Device_User.objects.filter(userID=superID)
+            eUser = Device_User.objects.filter(userID=eUserID)
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('查询数据库错误: %s' % errorInfo)
+            return response.json(500, repr(e))
+        if not super:
+            return response.json(113)
+        if not eUser:
+            return response.json(113)
+        if super[0].is_superuser != 100 or super[0].is_superuser == eUser[0].is_superuser:
+            return response.json(602)
+        try:
+            updateCount = eUser.update(user_isValid=isValid)
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('更新数据库错误: %s' % errorInfo)
+            return response.json(501, repr(e))
+        return response.json(0)
+
+
+@csrf_exempt
+def success(request):
+    return HttpResponse(status=200)

BIN
Controller/__pycache__/AccessLog.cpython-36.pyc


BIN
Controller/__pycache__/AccessLog.cpython-36.pyc.2410490088496


BIN
Controller/__pycache__/AdminManage.cpython-36.pyc


BIN
Controller/__pycache__/AppInfo.cpython-36.pyc


BIN
Controller/__pycache__/BatchProcessingDatabase.cpython-36.pyc


BIN
Controller/__pycache__/CheckUserData.cpython-36.pyc


BIN
Controller/__pycache__/DeviceLog.cpython-36.pyc


BIN
Controller/__pycache__/DeviceManage.cpython-36.pyc


BIN
Controller/__pycache__/DeviceMeal.cpython-36.pyc


BIN
Controller/__pycache__/EquipmentInfo.cpython-36.pyc


BIN
Controller/__pycache__/EquipmentManager.cpython-36.pyc


BIN
Controller/__pycache__/EquipmentOTA.cpython-36.pyc


BIN
Controller/__pycache__/EquipmentSensor.cpython-36.pyc


BIN
Controller/__pycache__/EquipmentStatus.cpython-36.pyc


BIN
Controller/__pycache__/FeedBackInfo.cpython-36.pyc


BIN
Controller/__pycache__/HlsManage.cpython-36.pyc


BIN
Controller/__pycache__/LogAccess.cpython-36.pyc


BIN
Controller/__pycache__/LogManager.cpython-36.pyc


BIN
Controller/__pycache__/MealManage.cpython-36.pyc


BIN
Controller/__pycache__/OTAEquipment.cpython-36.pyc


BIN
Controller/__pycache__/OauthManage.cpython-36.pyc


BIN
Controller/__pycache__/PermissionManager.cpython-36.pyc


BIN
Controller/__pycache__/StreamMedia.cpython-36.pyc


BIN
Controller/__pycache__/SysManage.cpython-36.pyc


BIN
Controller/__pycache__/Test.cpython-36.pyc


BIN
Controller/__pycache__/UserController.cpython-36.pyc


BIN
Controller/__pycache__/UserManger.cpython-36.pyc


BIN
Controller/__pycache__/shareUserPermission.cpython-36.pyc


+ 403 - 0
Controller/shareUserPermission.py

@@ -0,0 +1,403 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+from django.core import serializers
+import traceback, simplejson as json
+from django.views.generic.base import View
+from django.core.exceptions import FieldError
+from django.views.decorators.csrf import csrf_exempt
+from django.utils.decorators import method_decorator
+from Model.models import Device_User, Device_Info, Role
+from Service.CommonService import CommonService
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+
+
+class searchUserView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(searchUserView, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        fieldDict = request.POST
+        return self.searchUser(fieldDict, args, kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+        fieldDict = request.GET
+        return self.searchUser(fieldDict, args, kwargs)
+
+    def searchUserSQL(self, fieldDict, response, *args, **kwargs):
+        exact = fieldDict.get('exact', True)
+        if exact == '0' or exact == 'False':
+            exact = False
+        else:
+            exact = True
+
+        if 'exact' in fieldDict.keys():
+            fieldDict.pop('exact')
+        try:
+            if exact == 'True' or exact == 1:
+                User = Device_User.objects.filter(**fieldDict).order_by('-data_joined')
+            elif exact == 'False' or exact == 0:
+                if 'username' in fieldDict.keys():
+                    User = Device_User.objects.filter(username=fieldDict.get('username',
+                                                                             None)).order_by('-data_joined')
+                elif 'userEmail' in fieldDict.keys():
+                    User = Device_User.objects.filter(userEmail=fieldDict.get('userEmail',
+                                                                              None)).order_by('-data_joined')
+                elif 'userID' in fieldDict.keys():
+                    User = Device_User.objects.filter(userID=fieldDict.get('userID',
+                                                                           None)).order_by('-data_joined')
+                else:
+                    User = Device_User.objects.filter(**fieldDict).order_by('-data_joined')
+            else:
+                User = Device_User.objects.filter(**fieldDict).order_by('-data_joined')
+
+        except FieldError:
+            return response.json(502)
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('查询数据库错误: %s' % errorInfo)
+            return response.json(500, {'details': repr(e)})
+        else:
+            if User:
+                ddUser = User[0].device_info_set.all()
+                sqlJSON = serializers.serialize('json', User)
+                sqlList = json.loads(sqlJSON)
+                if ddUser:
+                    sqlJSON1 = serializers.serialize('json', ddUser)
+                    sqlList1 = json.loads(sqlJSON1)
+                    device_Info_dict = {}
+                    device_Info_list = []
+                    for eachJson1 in sqlList1:
+                        device_Info_dict['primaryUserID'] = eachJson1['fields']['primaryUserID']
+                        device_Info_dict['Type'] = eachJson1['fields']['Type']
+                        device_Info_dict['UID'] = eachJson1['fields']['UID']
+                        device_Info_dict['pk'] = eachJson1['pk']
+                        device_Info_dict['NickName'] = eachJson1['fields']['NickName']
+                        device_Info_dict['View_Password'] = eachJson1['fields']['View_Password']
+                        device_Info_dict['View_Account'] = eachJson1['fields']['View_Account']
+                        device_Info_dict['Online'] = eachJson1['fields']['Online']
+                        device_Info_dict['EventNotification'] = eachJson1['fields']['EventNotification']
+                        device_Info_dict['ChannelIndex'] = eachJson1['fields']['ChannelIndex']
+                        device_Info_dict['EventNotification'] = eachJson1['fields']['EventNotification']
+                        device_Info_dict['NotificationMode'] = eachJson1['fields']['NotificationMode']
+                        device_Info_list.append(device_Info_dict)
+                        device_Info_dict = {}
+                    sqlList[0]['device_info'] = device_Info_list
+                sqlDict = dict(zip(["datas"], [sqlList]))
+                return response.json(0, sqlDict)
+            else:
+                return response.json(102)
+
+    def searchUserPCSQL(self, fieldDict, response):
+        try:
+            page = int(fieldDict['page'])
+            line = int(fieldDict['line'])
+            fieldDict.pop('page')
+            fieldDict.pop('line')
+            fieldDict.pop('type')
+            if len(fieldDict) > 0:
+                searchCondition = CommonService.get_kwargs(data=fieldDict)
+                device_user_queryset = Device_User.objects.filter(**searchCondition).order_by('-data_joined')
+            else:
+                device_user_queryset = Device_User.objects.all().order_by('-data_joined')
+        except FieldError:
+            return response.json(502)
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('查询数据库错误: %s' % errorInfo)
+            return response.json(500, {"details": repr(e)})
+        else:
+            if device_user_queryset:
+                device_user_count = device_user_queryset.count()
+                device_user_res = device_user_queryset[(page - 1) * line:page * line]
+                sqlDict = CommonService.qs_to_dict(device_user_res)
+                for k, v in enumerate(sqlDict["datas"]):
+                    for val in device_user_res:
+                        if v['pk'] == val.userID:
+                            device_info_query_set = val.device_info_set.all()
+                            device_info_list = CommonService.qs_to_dict(device_info_query_set)
+                            # device_user关联到device_info
+                            sqlDict["datas"][k]['device_info'] = device_info_list
+                    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)
+                sqlDict['count'] = device_user_count
+                return response.json(0, sqlDict)
+            else:
+                return response.json(0, {"datas": ""})
+
+    def searchUser(self, fieldDict, *args, **kwargs):
+        response = ResponseObject()
+        token = fieldDict.get('token', None)
+        if token != None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                fieldDict = fieldDict.dict()
+                fieldDict.pop('token')
+                type = fieldDict.get('type', None)
+                if type == 'PC':
+                    return self.searchUserPCSQL(fieldDict, response)
+                else:
+                    return self.searchUserSQL(fieldDict, response, args, kwargs)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(444)
+
+
+class shareUserEquipmentView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(shareUserEquipmentView, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+
+        queryDict = request.POST
+        return self.shareUser(queryDict, args, kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+
+        queryDict = request.GET
+        return self.shareUser(queryDict, args, kwargs)
+
+    def shareUser(self, queryDict, *args, **kwargs):
+        token = queryDict.get('token', None)
+        GuestID = queryDict.get('guestID', None)
+        content = queryDict.get('content', None)
+        sharedAll = queryDict.get('sharedAll', False)
+
+        if sharedAll in ('1', '0'):
+            sharedAll = bool(int(sharedAll))
+        elif sharedAll in ('true', 'false'):
+            if sharedAll == 'true':
+                sharedAll = 1
+            else:
+                sharedAll = 0
+        response = ResponseObject()
+        if token != None and GuestID != None:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                MasterID = tko.userID()
+                if sharedAll and MasterID != None:
+                    return self.shareUserSQL(MasterID, GuestID, True, response, args, kwargs)
+                if content != None and MasterID != None:
+                    return self.shareUserSQL(MasterID, GuestID, False, response, args, content=content)
+                else:
+                    return response.json(804)
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800)
+
+    def shareUserSQL(self, MasterID, GuestID, sharedAll, response, *args, **kwargs):
+        try:
+            Guest = Device_User.objects.filter(userID=GuestID).order_by('-data_joined')
+            Master = Device_Info.objects.filter(userID_id=MasterID).order_by('-data_joined')
+        except Exception as e:
+            errorInfo = traceback.format_exc()
+            print('查询数据库错误: %s' % errorInfo)
+            return response.json(500, {"details": repr(e)})
+        else:
+            if Master:
+                if Guest:
+                    querysetList = []
+                    dictLen = 0
+
+                    if sharedAll:
+                        for equipment in Master:
+                            eqDict = equipment.model_to_dict(exclude=['id', 'data_joined', 'primaryUserID'])
+
+                            shareEquipment = Device_Info.objects.filter(userID_id=GuestID, primaryUserID= \
+                                MasterID, UID=eqDict.get('UID', None)).order_by('-data_joined')
+
+                            if shareEquipment:
+                                dictLen += 1
+                                continue
+                            else:
+                                eqDict['primaryUserID'] = eqDict.pop('userID')
+                                eqDict['isShare'] = True
+                                eqDict['userID_id'] = GuestID
+                                eqDict['id'] = CommonService.getUserID(getUser=False)
+                                querysetList.append(Device_Info(**eqDict))
+                    else:
+                        content = kwargs.get('content', None)
+                        if content != None:
+                            contentDict = json.loads(content)
+                            uidlist = UID = contentDict.get('UID', None)
+                            print(uidlist)
+                            for equipment in Master:
+                                eqDict = equipment.model_to_dict(exclude=['id', 'data_joined', 'primaryUserID'])
+
+                                if eqDict['UID'] in uidlist:
+                                    UID.remove(eqDict['UID'])
+                                    shareEquipment = Device_Info.objects.filter(userID_id=GuestID, primaryUserID= \
+                                        MasterID, UID=eqDict.get('UID', None)).order_by('-data_joined')
+                                    if shareEquipment:
+                                        dictLen += 1
+                                    else:
+                                        eqDict['primaryUserID'] = eqDict.pop('userID')
+                                        eqDict['isShare'] = True
+                                        eqDict['userID_id'] = GuestID
+                                        eqDict['id'] = CommonService.getUserID(getUser=False)
+                                        querysetList.append(Device_Info(**eqDict))
+                                else:
+                                    continue
+
+                    if len(querysetList) == 0:
+                        if sharedAll:
+                            return response.json(160)
+                        else:
+                            if len(UID) > 0:
+                                return response.json(160, {'error_UID': UID})
+                            else:
+                                return response.json(160)
+                    else:
+                        try:
+                            equipmentCount = Device_Info.objects.bulk_create(querysetList)
+                        except Exception as e:
+                            errorInfo = traceback.format_exc()
+                            print('添加数据库记录错误: %s' % errorInfo)
+                            return response.json(500, {"details": repr(e)})
+                        else:
+                            if dictLen > 0:
+                                return response.json(0, {
+                                    'Shared': dictLen,
+                                    'Sharing': len(querysetList),
+                                    'errormsg': u'A part of the equipment has been shared!',
+                                })
+                            else:
+                                if sharedAll:
+                                    return response.json(0, {
+                                        'Sharing': len(querysetList)
+                                    })
+                                else:
+                                    if len(UID) > 0:
+                                        return response.json(0, {
+                                            'error_UID': UID,
+                                            'Sharing': len(querysetList),
+                                        })
+                                    else:
+                                        return response.json(0, {
+                                            'Sharing': len(querysetList),
+                                        })
+                else:
+                    return response.json(113)
+
+            else:
+                return response.json(172)
+
+
+class unsharedUserEquipmentView(View):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(unsharedUserEquipmentView, self).dispatch(*args, **kwargs)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+
+        queryset = request.POST
+        return self.unsharedUserEquipment(queryset, args, kwargs)
+
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'gb2312'
+
+        queryset = request.GET
+        return self.unsharedUserEquipment(queryset, args, kwargs)
+
+    def unsharedUserEquipment(self, queryset, *args, **kwargs):
+        token = queryset.get('token', None)
+        GuestID = queryset.get('guestID', None)
+        content = queryset.get('content', None)
+        unsharedAll = queryset.get('unsharedAll', False)
+
+        response = ResponseObject()
+
+        if unsharedAll in ('1', '0'):
+            unsharedAll = bool(int(unsharedAll))
+        elif unsharedAll in ('true', 'false'):
+            if unsharedAll == 'true':
+                unsharedAll = 1
+            else:
+                unsharedAll = 0
+
+        if token != None and GuestID != None and len(GuestID) > 0:
+            tko = TokenObject(token)
+            tko.valid()
+            response.lang = tko.lang
+            if tko.code == 0:
+                MasterID = tko.userID()
+                if unsharedAll and MasterID != None:
+                    return self.unsharedUserEquipmentSQL(MasterID, GuestID, True, response, args, kwargs)
+                else:
+                    if content != None and MasterID != None:
+                        return self.unsharedUserEquipmentSQL(MasterID, GuestID, False, response, args, content=content)
+                    else:
+                        return response.json(805)
+
+            else:
+                return response.json(tko.code)
+        else:
+            return response.json(800)
+
+    def unsharedUserEquipmentSQL(self, MasterID, GuestID, unsharedAll, response, *args, **kwargs):
+        if unsharedAll:
+            try:
+                equipmentCount = Device_Info.objects.filter(userID_id=GuestID, primaryUserID=MasterID).delete()
+            except Exception as e:
+                errorInfo = traceback.format_exc()
+                print('删除设备更新数据库错误: %s' % errorInfo)
+                return response.json(171, {"details": repr(e)})
+            else:
+                return response.json(0, {'removeCount': equipmentCount[0]})
+        else:
+            content = kwargs.get('content', None)
+            if content != None:
+                removeCount = 0
+                errorRemove = []
+                errorUID = []
+
+                contentDict = json.loads(content)
+                uidlist = contentDict.get('UID', None)
+
+                for index in range(len(uidlist)):
+                    uid = uidlist[index]
+                    try:
+                        equipment = Device_Info.objects.filter(userID_id=GuestID, primaryUserID=MasterID, UID=uid)
+                        if equipment:
+                            equipmentCount = equipment.delete()
+                        else:
+                            errorUID.append(uid)
+                            continue
+                    except Exception as e:
+                        errorInfo = traceback.format_exc()
+                        print('查询数据库错误: %s' % errorInfo)
+
+                        errorRemove.append(uid)
+                        continue
+                    else:
+                        removeCount += equipmentCount[0]
+
+                if len(errorRemove) > 0:
+                    return response.json(171, {
+                        'removeCount': removeCount,
+                        'error_UID': errorRemove,
+                    })
+                else:
+                    if len(errorUID) > 0:
+                        return response.json(173, {
+                            'removeCount': removeCount,
+                            'error_UID': errorUID,
+                        })
+                    else:
+                        return response.json(0, {
+                            'removeCount': removeCount
+                        })

BIN
DB/17monipdb.dat


+ 5 - 0
DB/data.json

@@ -0,0 +1,5 @@
+{
+  "code": "200",
+  "res": {},
+  "msg":{}
+}

+ 2 - 0
DB/data.sql

@@ -0,0 +1,2 @@
+alter table device_user add language varchar(16) NULL;
+ALTER TABLE device_info MODIFY COLUMN NickName varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

+ 0 - 0
Model/__init__.py


BIN
Model/__pycache__/__init__.cpython-36.pyc


BIN
Model/__pycache__/admin.cpython-36.pyc


BIN
Model/__pycache__/models.cpython-36.pyc


+ 5 - 0
Model/admin.py

@@ -0,0 +1,5 @@
+from django.contrib import admin
+from Model.models import Device_User,Device_Info
+# Register your models here.
+
+admin.site.register([Device_User, Device_Info])

+ 4 - 0
Model/apps.py

@@ -0,0 +1,4 @@
+from django.apps import AppConfig
+
+class UsermanagerConfig(AppConfig):
+    name = 'Model'

+ 399 - 0
Model/migrations/0001_initial.py

@@ -0,0 +1,399 @@
+# Generated by Django 2.1.1 on 2018-09-12 03:11
+
+import Model.models
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+import imagekit.models.fields
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Access_Log',
+            fields=[
+                ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增标记ID')),
+                ('user', models.CharField(blank=True, max_length=100, null=True, verbose_name='用户')),
+                ('operation', models.CharField(blank=True, db_index=True, max_length=100, null=True, verbose_name='操作')),
+                ('ip', models.CharField(blank=True, max_length=100, null=True, verbose_name='访问ip地址')),
+                ('url', models.CharField(blank=True, max_length=150, null=True, verbose_name='访问路径')),
+                ('status', models.IntegerField(blank=True, null=True, verbose_name='状态')),
+                ('time', models.DateTimeField(blank=True, db_index=True, null=True, verbose_name='访问时间')),
+                ('content', models.TextField(blank=True, null=True, verbose_name='参数内容')),
+            ],
+            options={
+                'verbose_name': '访问日志表',
+                'verbose_name_plural': '访问日志表',
+                'db_table': 'access_log',
+            },
+        ),
+        migrations.CreateModel(
+            name='App_Info',
+            fields=[
+                ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增标记ID')),
+                ('appBundleId', models.CharField(blank=True, max_length=32, verbose_name='appID')),
+                ('appName', models.CharField(blank=True, max_length=32, verbose_name='app名称')),
+                ('systemLanguage', models.CharField(blank=True, max_length=32, verbose_name='系统语言')),
+                ('newAppversion', models.CharField(blank=True, max_length=12, verbose_name='系统版本')),
+                ('bundleVersion', models.CharField(blank=True, max_length=12, verbose_name='项目版本')),
+                ('content', models.TextField(blank=True, null=True, verbose_name='更新内容')),
+                ('app_type', models.IntegerField(blank=True, null=True, verbose_name='app类型')),
+                ('add_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='加入时间')),
+                ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
+                ('downloadLink', models.TextField(blank=True, null=True, verbose_name='升级')),
+            ],
+            options={
+                'verbose_name': 'app信息表',
+                'verbose_name_plural': 'app信息表',
+                'db_table': 'app_info',
+                'ordering': ('id',),
+            },
+        ),
+        migrations.CreateModel(
+            name='Auth_Captcha',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('username', models.CharField(help_text='用户名(邮箱或电话号码)', max_length=50)),
+                ('authcaptca', models.CharField(help_text='验证码', max_length=6)),
+                ('sendtype', models.CharField(choices=[('register', '注册'), ('forget', '找回密码')], max_length=15)),
+                ('sendtime', models.DateTimeField(auto_now_add=True)),
+            ],
+            options={
+                'verbose_name': '邮箱验证码',
+                'verbose_name_plural': '邮箱验证码',
+                'db_table': 'auth_captcha',
+                'ordering': ('-sendtime',),
+            },
+        ),
+        migrations.CreateModel(
+            name='Device_Info',
+            fields=[
+                ('id', models.CharField(blank=True, max_length=32, primary_key=True, serialize=False)),
+                ('NickName', models.CharField(blank=True, max_length=32, verbose_name='设备名称')),
+                ('UID', models.CharField(blank=True, max_length=32, verbose_name='设备UID')),
+                ('SID', models.CharField(blank=True, max_length=32, verbose_name='服务器ID')),
+                ('View_Account', models.CharField(blank=True, max_length=32, verbose_name='设备用户名称')),
+                ('View_Password', models.CharField(blank=True, max_length=32, verbose_name='设备密码')),
+                ('AudioFormat', models.IntegerField(blank=True, default=1, verbose_name='初始化影像')),
+                ('EventNotification', models.IntegerField(blank=True, verbose_name='报警类型')),
+                ('ChannelIndex', models.IntegerField(blank=True, verbose_name='通道号')),
+                ('Online', models.BooleanField(blank=True, default=False, verbose_name='设备是否在线')),
+                ('mMonitorIndex', models.IntegerField(blank=True, default=-1)),
+                ('Type', models.IntegerField(blank=True)),
+                ('DebugMode', models.IntegerField(blank=True, verbose_name='调试模式')),
+                ('NotificationMode', models.IntegerField(blank=True, verbose_name='是否报警')),
+                ('qvgaLevel', models.BooleanField(blank=True, default=0, help_text='0代表:SD、1代表:HD', verbose_name='SD与HD画面')),
+                ('isShare', models.BooleanField(blank=True, default=False, help_text='是否为共享获取的设备', verbose_name='共享设备')),
+                ('primaryUserID', models.CharField(blank=True, default='', help_text='该设备的主用户', max_length=32, verbose_name='主用户')),
+                ('data_joined', models.DateTimeField(auto_now_add=True, verbose_name='设备添加时间')),
+                ('update_time', models.DateTimeField(auto_now=True, null=True, verbose_name='更新时间')),
+                ('ip', models.CharField(blank=True, max_length=100, null=True, verbose_name='设备区域ip')),
+                ('area', models.CharField(blank=True, max_length=100, null=True, verbose_name='设备区域area')),
+            ],
+            options={
+                'verbose_name': '用户设备信息表',
+                'verbose_name_plural': '用户设备信息表',
+                'db_table': 'device_info',
+                'ordering': ('-data_joined',),
+            },
+        ),
+        migrations.CreateModel(
+            name='Device_Meal',
+            fields=[
+                ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增标记ID')),
+                ('status', models.IntegerField(blank=True, null=True, verbose_name='状态')),
+                ('uid', models.CharField(blank=True, max_length=32, null=True, verbose_name='设备ID')),
+                ('channel', models.IntegerField(blank=True, null=True, verbose_name='设备通道')),
+                ('add_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='加入时间')),
+                ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
+                ('end_time', models.DateTimeField(blank=True, verbose_name='最后时间')),
+            ],
+            options={
+                'verbose_name': '设备关联套餐表',
+                'verbose_name_plural': '设备关联套餐表',
+                'db_table': 'device_meal',
+                'ordering': ('id',),
+            },
+        ),
+        migrations.CreateModel(
+            name='Email_Captcha',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('userCaptcha', models.CharField(max_length=10, verbose_name='验证码')),
+                ('userEmail', models.EmailField(max_length=50, verbose_name='邮箱')),
+                ('sendType', models.CharField(choices=[('register', '注册'), ('forget', '找回密码')], max_length=15)),
+                ('sendTime', models.DateField(auto_now_add=True)),
+            ],
+            options={
+                'verbose_name': '邮箱验证码',
+                'verbose_name_plural': '邮箱验证码',
+                'db_table': 'email_captcha',
+                'ordering': ('-sendTime',),
+            },
+        ),
+        migrations.CreateModel(
+            name='Equipment_Info',
+            fields=[
+                ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增标记ID')),
+                ('devUid', models.CharField(blank=True, max_length=32, null=True, verbose_name='设备ID')),
+                ('devNickName', models.CharField(blank=True, default='', max_length=32, verbose_name='设备昵称')),
+                ('Channel', models.IntegerField(blank=True, null=True, verbose_name='设备通道')),
+                ('eventType', models.IntegerField(blank=True, null=True, verbose_name='事件类型')),
+                ('viewAccont', models.CharField(blank=True, max_length=32, null=True, verbose_name='设备账户')),
+                ('viewPwd', models.CharField(blank=True, max_length=32, null=True, verbose_name='设备密码')),
+                ('status', models.BooleanField(blank=True, default=False, verbose_name='事件状态')),
+                ('alarm', models.CharField(blank=True, max_length=256, verbose_name='报警信息')),
+                ('eventTime', models.CharField(blank=True, max_length=16, null=True, verbose_name='设备报警时间')),
+                ('receiveTime', models.CharField(blank=True, max_length=16, null=True, verbose_name='接收到报警时间')),
+            ],
+            options={
+                'verbose_name': '设备信息推送表',
+                'verbose_name_plural': '设备信息推送表',
+                'db_table': 'equipment_info',
+                'ordering': ('-id',),
+            },
+        ),
+        migrations.CreateModel(
+            name='Equipment_Sensor',
+            fields=[
+                ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增标记ID')),
+                ('status', models.IntegerField(blank=True, null=True, verbose_name='状态')),
+                ('type', models.IntegerField(blank=True, null=True, verbose_name='类型')),
+                ('name', models.CharField(blank=True, max_length=128, null=True, verbose_name='传感器名称')),
+                ('add_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='加入时间')),
+                ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
+                ('uid', models.CharField(blank=True, max_length=32, null=True, verbose_name='设备ID')),
+            ],
+            options={
+                'verbose_name': '设备传感器表',
+                'verbose_name_plural': '设备传感器表',
+                'db_table': 'equipment_sensor',
+                'ordering': ('id',),
+            },
+        ),
+        migrations.CreateModel(
+            name='Equipment_Stream',
+            fields=[
+                ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增标记ID')),
+                ('userID', models.CharField(blank=True, max_length=32, verbose_name='用户ID')),
+                ('status', models.IntegerField(blank=True, null=True, verbose_name='状态')),
+                ('uid', models.CharField(blank=True, max_length=32, null=True, verbose_name='设备ID')),
+                ('channel', models.IntegerField(blank=True, null=True, verbose_name='设备通道')),
+                ('access_token', models.CharField(blank=True, max_length=128, verbose_name='设备推流验证令牌')),
+                ('total_flow', models.FloatField(blank=True, null=True, verbose_name='传输总容量')),
+                ('add_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='加入时间')),
+                ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
+                ('rank', models.IntegerField(blank=True, null=True, verbose_name='推流套餐类型')),
+            ],
+            options={
+                'verbose_name': '用户设备推流表',
+                'verbose_name_plural': '用户设备推流表',
+                'db_table': 'equipment_stream',
+            },
+        ),
+        migrations.CreateModel(
+            name='Equipment_Version',
+            fields=[
+                ('eid', models.CharField(blank=True, max_length=32, primary_key=True, serialize=False)),
+                ('ESN', models.CharField(blank=True, max_length=32, verbose_name='设备规格名称')),
+                ('code', models.CharField(blank=True, max_length=32, verbose_name='设备规格代码')),
+                ('version', models.CharField(blank=True, max_length=32, verbose_name='设备版本')),
+                ('softwareVersion', models.CharField(blank=True, max_length=32, verbose_name='软件本版本')),
+                ('chipModelList2Code', models.CharField(blank=True, max_length=32, verbose_name='主芯片码')),
+                ('channel', models.IntegerField(blank=True, verbose_name='通道数')),
+                ('resolutionRatio', models.IntegerField(blank=True, verbose_name='分辨率')),
+                ('type', models.CharField(blank=True, max_length=16, verbose_name='设备机型')),
+                ('companyCode', models.CharField(blank=True, max_length=128, verbose_name='用户公司名称')),
+                ('data_joined', models.DateTimeField(auto_now_add=True, verbose_name='加入时间')),
+                ('fileSize', models.IntegerField(blank=True, verbose_name='文件总大小')),
+                ('filePath', models.CharField(blank=True, max_length=256, verbose_name='升级文件路径')),
+                ('Description', models.TextField(blank=True, default='', verbose_name='描述信息')),
+                ('fileMd5', models.CharField(blank=True, max_length=32, null=True, verbose_name='上传文件MD5加密')),
+                ('status', models.BooleanField(blank=True, default=True, verbose_name='是否开启更新状态')),
+                ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
+            ],
+            options={
+                'verbose_name': '设备版本信息',
+                'db_table': 'equipment_version',
+                'ordering': ('-data_joined',),
+            },
+        ),
+        migrations.CreateModel(
+            name='Feedback_Info',
+            fields=[
+                ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增标记ID')),
+                ('userID', models.CharField(blank=True, max_length=32, verbose_name='用户ID')),
+                ('status', models.BooleanField(blank=True, default=False, verbose_name='状态:0未解决/解决')),
+                ('content', models.TextField(blank=True, null=True, verbose_name='反馈描述')),
+                ('add_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='加入时间/反馈时间')),
+                ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
+            ],
+            options={
+                'verbose_name': '用户反馈信息表',
+                'verbose_name_plural': '用户反馈信息表',
+                'db_table': 'feedback_info',
+                'ordering': ('id',),
+            },
+        ),
+        migrations.CreateModel(
+            name='oauth_user',
+            fields=[
+                ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增标记ID')),
+                ('oid', models.CharField(blank=True, max_length=36, null=True, unique=True)),
+                ('add_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='加入时间')),
+                ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
+            ],
+            options={
+                'verbose_name': '认证用户关联表',
+                'verbose_name_plural': '认证用户关联表',
+                'db_table': 'oauth_user',
+                'ordering': ('id',),
+            },
+        ),
+        migrations.CreateModel(
+            name='Permissions',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('permName', models.CharField(blank=True, max_length=32, null=True, unique=True, verbose_name='权限名称')),
+                ('description', models.CharField(blank=True, default='', max_length=128, null=True, verbose_name='描述信息')),
+            ],
+            options={
+                'verbose_name': 'role permission',
+                'verbose_name_plural': 'role permission',
+                'db_table': 'permissions',
+                'ordering': ['permName'],
+            },
+            managers=[
+                ('objects', Model.models.PermissionsManager()),
+            ],
+        ),
+        migrations.CreateModel(
+            name='Role',
+            fields=[
+                ('rid', models.SmallIntegerField(primary_key=True, serialize=False, unique=True, verbose_name='用户角色组ID')),
+                ('roleName', models.CharField(choices=[('Guests', 'Guests'), ('Users', 'Users'), ('Admins', 'Admins'), ('SysAdmins', 'SysAdmins'), ('LOGAdmins', 'LOGAdmins'), ('OTAAdmins', 'OTAAdmins'), ('DBAAdmins', 'DBAAdmins'), ('SuperAdmins', 'SuperAdmins')], default='User', max_length=32, unique=True, verbose_name='角色名称')),
+                ('Description', models.TextField(blank=True, default='', verbose_name='描述信息')),
+                ('permission', models.ManyToManyField(blank=True, db_table='role_permissions', to='Model.Permissions', verbose_name='权限')),
+            ],
+            options={
+                'verbose_name': '用户角色',
+                'verbose_name_plural': '用户角色',
+                'db_table': 'role',
+                'ordering': ['roleName'],
+            },
+            managers=[
+                ('objects', Model.models.RoleManager()),
+            ],
+        ),
+        migrations.CreateModel(
+            name='Store_Meal',
+            fields=[
+                ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='自增ID')),
+                ('title', models.CharField(blank=True, max_length=32, verbose_name='标题')),
+                ('price', models.CharField(blank=True, max_length=32, verbose_name='价格')),
+                ('day', models.IntegerField(blank=True, null=True, verbose_name='存储时间')),
+                ('content', models.TextField(blank=True, null=True, verbose_name='描述')),
+                ('add_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='加入时间')),
+                ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
+            ],
+            options={
+                'verbose_name': '存储套餐',
+                'verbose_name_plural': '存储套餐',
+                'db_table': 'store_meal',
+                'ordering': ('id',),
+            },
+        ),
+        migrations.CreateModel(
+            name='Device_User',
+            fields=[
+                ('userID', models.CharField(blank=True, default='153672190513592013800138000', max_length=32, primary_key=True, serialize=False, unique=True, verbose_name='用户ID')),
+                ('username', models.CharField(max_length=40, unique=True, verbose_name='用户名')),
+                ('password', models.CharField(max_length=128, verbose_name='密码')),
+                ('userEmail', models.EmailField(blank=True, max_length=64, null=True, unique=True, verbose_name='邮箱')),
+                ('userIconPath', imagekit.models.fields.ProcessedImageField(blank=True, default='static/User/default.png', upload_to='User/Images/', verbose_name='头像')),
+                ('userIconUrl', models.URLField(blank=True, default='http://192.168.136.45:8077/account/getAvatar/User/defaultUser.png', max_length=128)),
+                ('NickName', models.CharField(blank=True, default='', max_length=32, verbose_name='用户昵称')),
+                ('is_superuser', models.IntegerField(blank=True, default=0, verbose_name='用户类型')),
+                ('is_active', models.BooleanField(blank=True, default=False, verbose_name='用户活动状态')),
+                ('data_joined', models.DateTimeField(auto_now_add=True, verbose_name='加入时间')),
+                ('last_login', models.DateTimeField(auto_now=True, verbose_name='u最后登录时间')),
+                ('user_isValid', models.BooleanField(blank=True, default=False, help_text='是否是认证通过的用户', verbose_name='用户有效性')),
+                ('online', models.BooleanField(blank=True, default=False, verbose_name='用户登录状态')),
+                ('machine_code', models.CharField(blank=True, default='', max_length=128, verbose_name='机械码')),
+                ('language', models.CharField(blank=True, default='', max_length=16, null=True, verbose_name='语言地区')),
+            ],
+            options={
+                'verbose_name': '用户信息',
+                'db_table': 'device_user',
+                'ordering': ('-data_joined',),
+                'get_latest_by': 'last_login',
+            },
+        ),
+        migrations.CreateModel(
+            name='AuthToken_JWT',
+            fields=[
+                ('jwtID', models.OneToOneField(blank=True, on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL, verbose_name='token userID')),
+                ('access_token', models.CharField(blank=True, max_length=384, verbose_name='Access Token')),
+                ('refresh_token', models.CharField(blank=True, max_length=384, verbose_name='Refresh Token')),
+                ('secret', models.CharField(blank=True, max_length=32, verbose_name='Secret')),
+                ('last_update', models.DateTimeField(auto_now=True, verbose_name='Last Update')),
+            ],
+            options={
+                'verbose_name': '用户JWT',
+                'verbose_name_plural': '用户JWT',
+                'db_table': 'authtoken_jwt',
+                'ordering': ('-last_update',),
+            },
+        ),
+        migrations.CreateModel(
+            name='AuthToken_Token',
+            fields=[
+                ('tokenID', models.OneToOneField(blank=True, on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to=settings.AUTH_USER_MODEL)),
+                ('access_token', models.CharField(blank=True, max_length=256)),
+                ('refresh_token', models.CharField(blank=True, max_length=256)),
+                ('last_update', models.DateTimeField(auto_now=True)),
+                ('iCode', models.CharField(blank=True, max_length=12, verbose_name='干扰码')),
+                ('mCode', models.CharField(blank=True, max_length=64, verbose_name='设备码')),
+            ],
+            options={
+                'verbose_name': '用户Token',
+                'db_table': 'authtoken_token',
+                'ordering': ('-last_update',),
+            },
+        ),
+        migrations.AddField(
+            model_name='device_user',
+            name='role',
+            field=models.ManyToManyField(blank=True, db_table='user_role', to='Model.Role', verbose_name='用户角色'),
+        ),
+        migrations.AlterUniqueTogether(
+            name='permissions',
+            unique_together={('permName',)},
+        ),
+        migrations.AddField(
+            model_name='oauth_user',
+            name='userID',
+            field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='用户表userID'),
+        ),
+        migrations.AddField(
+            model_name='equipment_info',
+            name='userID',
+            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
+        ),
+        migrations.AddField(
+            model_name='device_meal',
+            name='rank',
+            field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='Model.Store_Meal', verbose_name='套餐类型'),
+        ),
+        migrations.AddField(
+            model_name='device_info',
+            name='userID',
+            field=models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
+        ),
+    ]

+ 0 - 0
Model/migrations/__init__.py


BIN
Model/migrations/__pycache__/0001_initial.cpython-36.pyc


BIN
Model/migrations/__pycache__/__init__.cpython-36.pyc


+ 581 - 0
Model/models.py

@@ -0,0 +1,581 @@
+from itertools import chain
+
+from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
+from django.db import models
+from django.utils import six
+from django.utils.encoding import python_2_unicode_compatible
+from imagekit.models import ProcessedImageField
+from imagekit.processors import ResizeToFill
+
+from Ansjer.config import SERVER_DOMAIN
+from Service.CommonService import CommonService
+
+
+class PermissionsManager(models.Manager):
+    use_in_migrations = True
+
+    def get_by_natural_key(self, permName):
+        return self.get(
+            permName = permName
+        )
+
+class RoleManager(models.Manager):
+    """
+    The manager for the auth's Role model.
+    """
+    use_in_migrations = True
+
+    def get_by_natural_key(self, roleName):
+        return self.get(roleName = roleName)
+
+class UserManager(BaseUserManager):
+
+    def create_user(self, username, password, userID, is_active,
+                    user_isValid, **extra_fields):
+
+        user = self.model(
+            username = username,
+            userID = userID,
+            is_active = is_active,
+            user_isValid = user_isValid,
+            **extra_fields
+        )
+        user.set_password(password)
+        user.save(using=self._db)
+
+        role = Role.objects.get(rid = 1)
+        user.role.add(role)
+        return user
+
+    def create_superuser(self, username, password, userID, is_active,
+                         user_isValid , **extra_fields):
+        #extra_fields.setdefault('is_superuser', is_superuser)
+        is_superuser = extra_fields.get('is_superuser', None)
+        if is_superuser != 100 and is_superuser != 1:
+            raise ValueError('Superuser must have is_superuser=1 or 100.')
+
+        return self.create_user(username, password, userID, is_active,
+                                user_isValid, **extra_fields)
+
+@python_2_unicode_compatible
+class Permissions(models.Model):
+    permName = models.CharField(blank=True, null=True, max_length=32, unique=True, verbose_name=u'权限名称')
+    description = models.CharField(blank=True, null=True, max_length=128, verbose_name=u'描述信息', default='')
+    objects = PermissionsManager()
+    def __str__(self):
+        return "%s" % (
+            six.text_type(self.description))
+    class Meta:
+        ordering = ['permName']
+        db_table = 'permissions'
+        verbose_name = u'role permission'
+        verbose_name_plural = verbose_name
+        unique_together = (('permName'),)
+
+    def natural_key(self):
+        return (self.permName)
+
+class Role(models.Model):
+    ROLE_TYPES = (
+        ('Guests', u'Guests'),
+        ('Users', u'Users'),
+        ('Admins', u'Admins'),
+        ('SysAdmins', u'SysAdmins'),
+        ('LOGAdmins', u'LOGAdmins'),
+        ('OTAAdmins', u'OTAAdmins'),
+        ('DBAAdmins', u'DBAAdmins'),
+        ('SuperAdmins', u'SuperAdmins'),
+    )
+    rid = models.SmallIntegerField(primary_key=True, unique=True, verbose_name=u'用户角色组ID')
+    roleName = models.CharField(max_length=32, choices=ROLE_TYPES, unique=True,
+                                default='User', verbose_name=u'角色名称')
+    permission = models.ManyToManyField(to='Permissions', blank=True, verbose_name=u'权限', db_table='role_permissions')
+    Description = models.TextField(blank=True, default='', verbose_name=u'描述信息')
+
+    objects = RoleManager()
+
+    class Meta:
+        ordering = ['roleName']
+        db_table = 'role'
+        verbose_name = u'用户角色'
+        verbose_name_plural = verbose_name
+
+    def __str__(self):
+        return self.roleName
+
+    def natural_key(self):
+        return (self.roleName,)
+
+    def has_perm(self, permission, obj=None):
+        if self.rid == 100:
+            return True
+
+        permlist = self.permission.all()
+        for perm in permlist:
+            if perm.permName == permission:
+                return True
+
+        return False
+
+    def get_all_perms_id(self):
+        perms = self.permission.all()
+        permslist = []
+        if self.rid == 100:
+            perms = Permissions.objects.all()
+            for perm in perms:
+                permslist.append(perm.id)
+            return permslist
+        else:
+            permlist_tmp = []
+            for perm in perms:
+                permlist_tmp.append(perm.id)
+            permSet = set(permlist_tmp)
+            permslist = list(permSet)
+            permslist.sort()
+            return permslist
+
+    def get_all_permission(self):
+        perms = self.permission.all()
+
+        permslist = []
+        if self.rid == 100:
+            perms = Permissions.objects.all()
+            for perm in perms:
+                permslist.append(perm.permName)
+            return permslist
+        else:
+            permlist_tmp = []
+            for perm in perms:
+                permlist_tmp.append(perm.permName)
+            permSet = set(permlist_tmp)
+            permslist = list(permSet)
+            permslist.sort()
+            return permslist
+
+class Device_User(AbstractBaseUser):
+    userID = models.CharField(blank=True, max_length=32, primary_key=True,
+                              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)
+    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来指定文件存放的前缀路径
+    userIconPath = ProcessedImageField(blank=True, upload_to='User/Images/', default='static/User/default.png',
+                        verbose_name=u'头像',
+                        # 图片将处理成85x85的尺寸
+                        processors=[ResizeToFill(85, 85)],)
+    userIconUrl = models.URLField(blank = True, max_length = 128, default=SERVER_DOMAIN
+                                                                          + '/account/getAvatar/User/defaultUser.png')
+    NickName = models.CharField(blank=True, max_length=32, default='', verbose_name=u'用户昵称')
+    is_superuser = models.IntegerField(blank=True, default=0, verbose_name=u'用户类型')
+    is_active = models.BooleanField(blank=True, default=False, verbose_name=u'用户活动状态')
+    data_joined = models.DateTimeField(blank=True, verbose_name=u'加入时间', auto_now_add=True)
+    last_login = models.DateTimeField(blank=True, verbose_name='u最后登录时间', auto_now=True)
+    user_isValid = models.BooleanField(blank=True, default=False, verbose_name=u'用户有效性', help_text=u'是否是认证通过的用户')
+    online = models.BooleanField(blank=True, default=False, verbose_name=u'用户登录状态')
+    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'语言地区')
+
+    objects = UserManager()
+
+    USERNAME_FIELD = 'username' # 必须有一个唯一标识
+    REQUIRED_FIELDS = ['userID', 'is_superuser'] # 创建superuser时的必须字段
+
+    class Meta:
+        ordering = ('-data_joined', )
+        verbose_name = u'用户信息'
+        db_table = 'device_user'
+        get_latest_by = 'last_login'
+
+    def __str__(self):
+        return self.username
+
+    def get_full_name(self):
+        return self.userEmail
+
+    def get_short_name(self):
+        return self.username
+
+    def get_role_id(self):
+        rids = []
+        roles = self.role.all()
+        for role in roles:
+            rids.append(role.rid)
+        return rids
+
+    def has_perm(self, permission, obj=None):
+        roles = self.role.all()
+        for role in roles:
+            if role.rid == 100:
+                return True
+
+        permlist = self.permission.all()
+        for perm in permlist:
+            if perm.permName == permission:
+                return True
+
+        for role in roles:
+            permlist = role.permission.all()
+            for perm in permlist:
+                if perm.permName == permission:
+                    return True
+
+        return False
+
+    def get_all_perms_id(self):
+        roles = self.role.all()
+        perms = self.permission.all()
+
+        permslist = []
+        for role in roles:
+            if role.rid == 100:
+                perms = Permissions.objects.all()
+                for perm in perms:
+                    permslist.append(perm.id)
+                return permslist
+
+        for perm in perms:
+            permslist.append(perm.id)
+
+        permSet = set(permslist)
+        for role in roles:
+            permlist_tmp = []
+            for perm in role.permission.all():
+                permlist_tmp.append(perm.id)
+
+            permSet_tmp = set(permlist_tmp)
+            permSet = permSet.union(permSet_tmp)
+            permslist = list(permSet)
+            permslist.sort()
+            return permslist
+
+    def get_all_permission(self):
+        roles = self.role.all()
+        perms = self.permission.all()
+
+        permslist = []
+        for role in roles:
+            if role.rid == 100:
+                perms = Permissions.objects.all()
+                for perm in perms:
+                    permslist.append(perm.permName)
+                return permslist
+
+        for perm in perms:
+            permslist.append(perm.permName)
+
+        permSet = set(permslist)
+        for role in roles:
+            permlist_tmp = []
+            for perm in role.permission.all():
+                permlist_tmp.append(perm.permName)
+
+            permSet_tmp = set(permlist_tmp)
+            permSet = permSet.union(permSet_tmp)
+            permslist = list(permSet)
+            permslist.sort()
+            return permslist
+    def has_module_perms(self, app_label):
+        return True
+    @property
+    def is_staff(self):
+        return self.is_superuser
+
+class Device_Info(models.Model):
+    id = models.CharField(blank=True, max_length=32, primary_key=True)
+    userID = models.ForeignKey(Device_User, blank=True, to_field='userID',
+                                   on_delete=models.CASCADE)
+    NickName = models.CharField(blank=True, max_length=32, verbose_name=u'设备名称')
+    UID = models.CharField(blank=True, max_length=32, verbose_name=u'设备UID')
+    SID = models.CharField(blank=True, max_length=32, verbose_name=u'服务器ID')
+    View_Account = models.CharField(blank=True, max_length=32, verbose_name=u'设备用户名称')
+    View_Password = models.CharField(blank=True, max_length=32, verbose_name=u'设备密码')
+    AudioFormat = models.IntegerField(blank=True, default=1, verbose_name=u'初始化影像')
+    EventNotification = models.IntegerField(blank=True, verbose_name=u'报警类型')
+    ChannelIndex = models.IntegerField(blank=True, verbose_name=u'通道号')
+    Online = models.BooleanField(blank=True, default=False, verbose_name=u'设备是否在线')
+    mMonitorIndex = models.IntegerField(blank=True, default=-1)
+    Type = models.IntegerField(blank=True)
+    DebugMode = models.IntegerField(blank=True, verbose_name=u'调试模式')
+    NotificationMode = models.IntegerField(blank=True, verbose_name=u'是否报警')
+    qvgaLevel = models.BooleanField(blank=True, verbose_name=u'SD与HD画面', default=0,
+                                    help_text=u'0代表:SD、1代表:HD')
+    isShare = models.BooleanField(blank=True, verbose_name=u'共享设备',
+                                  help_text=u'是否为共享获取的设备', default=False)
+    primaryUserID = models.CharField(blank=True, verbose_name='主用户',
+                                     help_text=u'该设备的主用户', max_length=32, default='')
+    data_joined = models.DateTimeField(blank=True, verbose_name=u'设备添加时间', auto_now_add=True)
+    update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True,null=True)
+
+    ip = models.CharField(blank=True, max_length=100, null=True, verbose_name=u'设备区域ip')
+    area = models.CharField(blank=True, max_length=100, null=True, verbose_name=u'设备区域area')
+
+    REQUIRED_FIELDS = []
+
+    def __str__(self):
+        return self.NickName
+    def model_to_dict(self, fields=None, exclude=None):
+        opts = self._meta
+        data = {}
+        for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
+            if not getattr(f, 'editable', False):
+                continue
+            if fields and f.name not in fields:
+                continue
+            if exclude and f.name in exclude:
+                continue
+            data[f.name] = f.value_from_object(self)
+        return data
+
+    class Meta:
+        db_table = 'device_info'
+        ordering = ('-data_joined',)
+        verbose_name = u'用户设备信息表'
+        verbose_name_plural=verbose_name
+
+class AuthToken_Token(models.Model):
+    tokenID = models.OneToOneField(Device_User, blank=True,on_delete=models.CASCADE,
+                                   primary_key=True) #定义一对一关系
+    access_token = models.CharField(blank=True, max_length=256)
+    refresh_token = models.CharField(blank=True, max_length=256)
+    last_update = models.DateTimeField(blank=True, auto_now=True)
+    iCode = models.CharField(blank=True, max_length=12, verbose_name=u'干扰码')
+    mCode = models.CharField(blank=True, max_length=64, verbose_name=u'设备码')
+    class Meta:
+        verbose_name = u'用户Token'
+        db_table = 'authtoken_token'
+        ordering = ('-last_update', )
+
+class AuthToken_JWT(models.Model):
+    jwtID = models.OneToOneField(Device_User, blank=True, on_delete=models.CASCADE,
+                                 primary_key=True, verbose_name=u'token userID')
+    access_token = models.CharField(blank=True, max_length=384, verbose_name=u'Access Token')
+    refresh_token = models.CharField(blank=True, max_length=384, verbose_name=u'Refresh Token')
+    secret = models.CharField(blank=True, max_length=32, verbose_name=u'Secret')
+    last_update = models.DateTimeField(blank=True, auto_now=True, verbose_name=u'Last Update')
+
+    class Meta:
+        verbose_name = u'用户JWT'
+        verbose_name_plural = verbose_name
+        db_table = 'authtoken_jwt'
+        ordering = ('-last_update', )
+
+class Email_Captcha(models.Model):
+    userCaptcha = models.CharField(max_length=10, verbose_name=u'验证码')
+    userEmail = models.EmailField(max_length=50, verbose_name=u'邮箱')
+    sendType = models.CharField(choices=(("register",u"注册"),("forget",u"找回密码")), max_length=15)
+    sendTime = models.DateField(auto_now_add=True)
+
+    class Meta:
+        db_table = 'email_captcha'
+        ordering = ('-sendTime',)
+
+        verbose_name = u'邮箱验证码'
+        verbose_name_plural=verbose_name
+
+class Auth_Captcha(models.Model):
+    username = models.CharField(max_length=50, help_text=u'用户名(邮箱或电话号码)')
+    authcaptca = models.CharField(max_length=6, help_text=u'验证码')
+    sendtype = models.CharField(max_length=15, choices=(("register",u"注册"),("forget",u"找回密码")))
+    sendtime = models.DateTimeField(auto_now_add=True)
+
+    class Meta:
+        db_table = 'auth_captcha'
+        ordering = ('-sendtime',)
+
+        verbose_name = u'邮箱验证码'
+        verbose_name_plural=verbose_name
+
+class Access_Log(models.Model):
+    id = models.AutoField(primary_key=True,verbose_name=u'自增标记ID')
+    user = models.CharField(max_length=100,null=True,blank=True,verbose_name=u'用户')
+    operation = models.CharField(max_length=100,db_index=True,null=True,blank=True,verbose_name=u'操作')
+    ip = models.CharField(max_length=100,null=True,blank=True,verbose_name=u'访问ip地址')
+    url = models.CharField(max_length=150,null=True,blank=True,verbose_name=u'访问路径')
+    status = models.IntegerField(null=True,blank=True,verbose_name=u'状态')
+    time = models.DateTimeField(null=True,blank=True, db_index=True,verbose_name=u'访问时间')
+    content = models.TextField(blank=True,null=True, verbose_name=u'参数内容')
+    class Meta:
+        db_table = 'access_log'
+        verbose_name = u'访问日志表'
+        verbose_name_plural=verbose_name
+
+class Equipment_Stream(models.Model):
+    id = models.AutoField(primary_key=True,verbose_name=u'自增标记ID')
+    userID = models.CharField(blank=True, max_length=32,verbose_name=u'用户ID')
+    status = models.IntegerField(null=True, blank=True, verbose_name=u'状态')
+    uid = models.CharField(null=True, blank=True,max_length=32, verbose_name=u'设备ID')
+    channel = models.IntegerField(null=True, blank=True, verbose_name=u'设备通道')
+    access_token = models.CharField(blank=True, max_length=128,verbose_name=u'设备推流验证令牌')
+    total_flow = models.FloatField(null=True, blank=True, verbose_name=u'传输总容量')
+    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)
+    rank = models.IntegerField(null=True, blank=True, verbose_name=u'推流套餐类型')
+
+    class Meta:
+        db_table = 'equipment_stream'
+        verbose_name = u'用户设备推流表'
+        verbose_name_plural=verbose_name
+
+class Equipment_Sensor(models.Model):
+    id = models.AutoField(primary_key=True,verbose_name=u'自增标记ID')
+    status = models.IntegerField(null=True, blank=True, verbose_name=u'状态')
+    type = models.IntegerField(null=True, blank=True, verbose_name=u'类型')
+    name = models.CharField(null=True, blank=True,max_length=128, verbose_name=u'传感器名称')
+    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)
+    uid = models.CharField(null=True, blank=True,max_length=32, verbose_name=u'设备ID')
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_sensor'
+        verbose_name = u'设备传感器表'
+        verbose_name_plural=verbose_name
+        ordering = ('id',)
+
+class Equipment_Info(models.Model):
+    id = models.AutoField(primary_key=True,verbose_name=u'自增标记ID')
+    devUid = models.CharField(null=True, blank=True,max_length=32, verbose_name=u'设备ID')
+    devNickName = models.CharField(blank=True, max_length=32, default='',verbose_name=u'设备昵称')
+    Channel = models.IntegerField(null=True, blank=True, verbose_name=u'设备通道')
+    eventType = models.IntegerField(null=True, blank=True, verbose_name=u'事件类型')
+    viewAccont = models.CharField(blank=True,null=True, max_length=32, verbose_name=u'设备账户')
+    viewPwd = models.CharField(blank=True, null=True,max_length=32, verbose_name=u'设备密码')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'事件状态')
+    alarm = models.CharField(blank=True, max_length=256, verbose_name=u'报警信息')
+    eventTime = models.CharField(blank=True,null=True, max_length=16, verbose_name=u'设备报警时间')
+    receiveTime = models.CharField(blank=True,null=True, max_length=16, verbose_name=u'接收到报警时间')
+    userID = models.ForeignKey(Device_User, null=True,blank=True, to_field='userID',
+                                   on_delete=models.CASCADE)
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'equipment_info'
+        verbose_name = u'设备信息推送表'
+        verbose_name_plural=verbose_name
+        ordering = ('-id',)
+
+class Feedback_Info(models.Model):
+    id = models.AutoField(primary_key=True,verbose_name=u'自增标记ID')
+    userID = models.CharField(blank=True, max_length=32, verbose_name=u'用户ID')
+    status = models.BooleanField(blank=True, default=False, verbose_name=u'状态:0未解决/解决')
+    content = models.TextField(blank=True,null=True, verbose_name=u'反馈描述')
+    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)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'feedback_info'
+        verbose_name = u'用户反馈信息表'
+        verbose_name_plural=verbose_name
+        ordering = ('id',)
+
+
+class Store_Meal(models.Model):
+    id = models.AutoField(primary_key=True,verbose_name=u'自增ID')
+    title = models.CharField(blank=True, max_length=32, verbose_name=u'标题')
+    price = models.CharField(blank=True, max_length=32, verbose_name=u'价格')
+    day = models.IntegerField(null=True, blank=True, verbose_name=u'存储时间')
+    content = models.TextField(blank=True,null=True, verbose_name=u'描述')
+    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)
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'store_meal'
+        verbose_name = u'存储套餐'
+        verbose_name_plural=verbose_name
+        ordering = ('id',)
+
+
+class Device_Meal(models.Model):
+    id = models.AutoField(primary_key=True,verbose_name=u'自增标记ID')
+    status = models.IntegerField(null=True, blank=True, verbose_name=u'状态')
+    uid = models.CharField(null=True, blank=True,max_length=32,verbose_name=u'设备ID')
+    channel = models.IntegerField(null=True, blank=True, verbose_name=u'设备通道')
+    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)
+    end_time = models.DateTimeField(blank=True, verbose_name=u'最后时间')
+    rank = models.ForeignKey(Store_Meal, blank=True, to_field='id',
+                               on_delete=models.CASCADE,verbose_name='套餐类型')
+
+    class Meta:
+        db_table = 'device_meal'
+        verbose_name = u'设备关联套餐表'
+        verbose_name_plural=verbose_name
+        ordering = ('id',)
+
+    def __str__(self):
+        return self.id
+
+class Equipment_Version(models.Model):
+    eid = models.CharField(blank=True, max_length=32, primary_key=True)
+    ESN = models.CharField(blank=True, max_length=32, verbose_name=u'设备规格名称')
+    code = models.CharField(blank=True, max_length=32, verbose_name=u'设备规格代码')
+    version = models.CharField(blank=True, max_length=32, verbose_name=u'设备版本')
+    softwareVersion = models.CharField(blank=True, max_length=32, verbose_name=u'软件本版本')
+    chipModelList2Code = models.CharField(max_length=32,blank=True, verbose_name=u'主芯片码')
+    channel = models.IntegerField(blank=True, verbose_name=u'通道数')
+    resolutionRatio = models.IntegerField(blank=True, verbose_name=u'分辨率')
+    type = models.CharField(blank=True, max_length=16, verbose_name=u'设备机型')
+    companyCode = models.CharField(blank=True, max_length=128, verbose_name=u'用户公司名称')
+    data_joined = models.DateTimeField(blank=True, verbose_name=u'加入时间', auto_now_add=True)
+    fileSize = models.IntegerField(blank=True, verbose_name=u'文件总大小')
+    filePath = models.CharField(blank=True, max_length=256, verbose_name=u'升级文件路径')
+    Description = models.TextField(blank=True, default='', verbose_name=u'描述信息')
+    fileMd5 = models.CharField(blank=True,max_length=32,null=True,verbose_name=u'上传文件MD5加密')
+    status = models.BooleanField(blank=True, default=True, verbose_name=u'是否开启更新状态')
+    update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)
+    class Meta:
+        verbose_name = '设备版本信息'
+        ordering = ('-data_joined',)
+        db_table = 'equipment_version'
+
+class App_Info(models.Model):
+
+    id = models.AutoField(primary_key=True,verbose_name=u'自增标记ID')
+    appBundleId = models.CharField(blank=True, max_length=32, verbose_name=u'appID')
+    appName = models.CharField(blank=True, max_length=32, verbose_name=u'app名称')
+    systemLanguage = models.CharField(blank=True, max_length=32, verbose_name=u'系统语言')
+    newAppversion = models.CharField(blank=True, max_length=12, verbose_name=u'系统版本')
+    bundleVersion = models.CharField(blank=True, max_length=12, verbose_name=u'项目版本')
+    content = models.TextField(blank=True,null=True, verbose_name=u'更新内容')
+    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)
+    update_time = models.DateTimeField(blank=True, verbose_name=u'更新时间', auto_now=True)
+    downloadLink = models.TextField(blank=True, null=True, verbose_name='升级')
+
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'app_info'
+        verbose_name = u'app信息表'
+        verbose_name_plural=verbose_name
+        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)
+    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)
+
+    def __str__(self):
+        return self.oid
+
+    class Meta:
+        db_table = 'oauth_user'
+        verbose_name = u'认证用户关联表'
+        verbose_name_plural=verbose_name
+        ordering = ('id',)

+ 105 - 0
Object/AWS/CloudfrontSignCookie.py

@@ -0,0 +1,105 @@
+#!/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/23 16:03
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: CloudfrontSignCookie.py
+@Contact: chanjunkai@163.com
+"""
+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

+ 43 - 0
Object/AWS/CloudfrontSignUrl.py

@@ -0,0 +1,43 @@
+#!/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/31 11:19
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: CloudfrontSignUrl.py
+@Contact: chanjunkai@163.com
+"""
+from Ansjer.config import *
+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(os.path.join(BASE_DIR,'Ansjer/file/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()
+
+
+def CloudfrontSignUrl(url):
+    key_id = 'APKAINI6BNPKV54NHH7Q'
+    # url = 'http://d3om3d8c0l14oc.cloudfront.net/vod/2N1K3LE78TYJ38CE111A_99/1234.ts'
+    expire_date = datetime.datetime.now() + datetime.timedelta(days=10)
+    print(expire_date)
+    cloudfront_signer = CloudFrontSigner(key_id, rsa_signer)
+    signed_url = cloudfront_signer.generate_presigned_url(
+        url, date_less_than=expire_date)
+    return signed_url

+ 46 - 0
Object/AWS/ElasticTranscoder.py

@@ -0,0 +1,46 @@
+#!/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/17 10:09
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: ElasticTranscoderClassObject.py
+@Contact: chanjunkai@163.com
+"""
+from boto3.session import Session
+from Ansjer.config import *
+
+class ElasticTranscoder:
+    def __init__(self, *args, **kwargs):
+        self.access_id = AWS_ACCESS_ID,
+        self.access_secret = AWS_ACCESS_SECRET,
+        session = Session(
+            aws_access_key_id=AWS_ACCESS_ID,
+            aws_secret_access_key=AWS_ACCESS_SECRET,
+            region_name=AWS_ACCESS_REGION,
+        )
+        self.conn = session.client('elastictranscoder')
+
+    def create_job(self, InputKey='', OutputKey=''):
+        response = self.conn.create_job(
+            PipelineId='1526962004445-bmasp8',
+            Input={
+                'Key': InputKey
+            },
+            Outputs=[
+                {
+                    'Key': OutputKey,
+                    'PresetId': '1351620000001-200010',
+                    'SegmentDuration': '2',
+                }
+            ]
+        )
+        print(response)
+        if response['ResponseMetadata']['HTTPStatusCode'] == 201:
+            return True
+        else:
+            return False

+ 185 - 0
Object/AWS/S3ClassObject.py

@@ -0,0 +1,185 @@
+from Ansjer.config import *
+from boto3.session import Session
+import simplejson as json
+import boto3
+from botocore.client import Config
+
+
+class S3ClassObject:
+    def __init__(self, *args, **kwargs):
+        self.bucket = AWS_BUCKET
+        self.access_id = AWS_ACCESS_ID
+        self.access_secret = AWS_ACCESS_SECRET
+        self.region_name = AWS_ACCESS_REGION
+        session = Session(
+            aws_access_key_id=AWS_ACCESS_ID,
+            aws_secret_access_key=AWS_ACCESS_SECRET,
+            region_name=AWS_ACCESS_REGION
+        )
+        self.conn = session.client('s3')
+
+    def put_object(self, body, key, bucket=''):
+        if bucket == '':
+            bucket = self.bucket
+        s3_client = self.conn
+        response = s3_client.put_object(
+            Body=body,
+            Key=key,
+            Bucket=bucket,
+            # Expires=datetime()
+        )
+        return response
+
+    def download_file(self, file_name):
+        s3_client = self.conn
+        try:
+            s3_client.download_file(
+                self.bucket,
+                file_name,
+            )
+            return file_name
+        except:
+            print('Cannot download file', file_name)
+            return
+
+    def get_all_object(self, prefix):
+        paginator = self.conn.get_paginator('list_objects')
+        s3_results = paginator.paginate(
+            Bucket=self.bucket,
+            Prefix=prefix,
+            PaginationConfig={'PageSize': 1000}
+        )
+        bucket_object_list = []
+        for page in s3_results:
+            if "Contents" in page:
+                for key in page["Contents"]:
+                    s3_file_name = key['Key'].split('/')[-1]
+                    bucket_object_list.append(s3_file_name)
+        return bucket_object_list
+
+    def get_prefix_obj(self, prefix,bucket):
+        paginator = self.conn.get_paginator('list_objects')
+        s3_results = paginator.paginate(
+            Bucket=bucket,
+            Prefix=prefix,
+            # PaginationConfig={'PageSize': 1000}
+        )
+        bucket_object_list = []
+        for page in s3_results:
+            if "Contents" in page:
+                for key in page["Contents"]:
+                    s3_file_name = key['Key'].split('/')[-1]
+                    bucket_object_list.append(s3_file_name)
+        return bucket_object_list
+
+    def delete_object(self, key):
+        response = self.conn.delete_object(
+            Bucket=self.bucket,
+            Key=key,
+        )
+        return response
+
+    def get_object(self, key):
+        response = self.conn.get_object(
+            Bucket=self.bucket,
+            Key=key,
+        )
+        return response
+
+    def del_list_object(self, keydict):
+        keylist = json.loads(keydict)['keylist']
+        del_list = []
+        for i in keylist:
+            del_list.append({'Key': i})
+        response = self.conn.delete_objects(
+            Bucket=self.bucket,
+            Delete={'Objects': del_list}
+        )
+        print(response)
+        return response
+
+    def del_object_list(self, keylist):
+        del_list = []
+        for i in keylist:
+            del_list.append({'Key': i})
+        response = self.conn.delete_objects(
+            Bucket=self.bucket,
+            Delete={'Objects': del_list}
+        )
+        print(response)
+        return response
+
+    def get_download_url(self, key):
+        self.conn.generate_presigned_url(
+            'get_object',
+            Params={
+                'Bucket': 'www.mybucket.com',
+                'Key': key
+            },
+            ExpiresIn=100)
+        return
+
+    # 推mp4到s3,且设置为html5播放
+    def put_mp4_object(self, body, key):
+        s3_client = self.conn
+        response = s3_client.put_object(
+            Body=body,
+            Key=key,
+            Bucket=self.bucket,
+            ContentType='video/mp4'
+        )
+        return response
+
+    def get_generate_vod_url(self, key):
+
+        response_url = self.conn.generate_presigned_url(
+            'get_object',
+            Params={
+                'Bucket': self.bucket,
+                'Key': key
+            },
+            ExpiresIn=3600
+        )
+        return response_url
+
+    def sign_put_object(self, key,bucket_meal):
+        s3_con = boto3.client('s3',
+            aws_access_key_id=AWS_ACCESS_ID,
+            aws_secret_access_key=AWS_ACCESS_SECRET,
+            config=Config(signature_version='s3v4'),
+            region_name=AWS_ACCESS_ID,
+        )
+        try:
+            url = s3_con.generate_presigned_url(
+                'put_object',
+                Params={
+                    'Bucket':bucket_meal,
+                    'Key': key,
+                },
+                ExpiresIn=60,
+                HttpMethod='PUT'
+            )
+        except Exception as e:
+            print(repr(e))
+            return False
+        else:
+            return url
+
+    def sign_post_object(self, key,bucket_meal):
+        s3_con = boto3.client('s3',
+            aws_access_key_id=AWS_ACCESS_ID,
+            aws_secret_access_key=AWS_ACCESS_SECRET,
+            config=Config(signature_version='s3v4'),
+            region_name=AWS_ACCESS_REGION,
+        )
+        try:
+            data = s3_con.generate_presigned_post(
+                Key=key,
+                ExpiresIn=60,
+                Bucket=bucket_meal
+            )
+        except Exception as e:
+            print(repr(e))
+            return False
+        else:
+            return data

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.