Browse Source

添加【问题帮助】

tanghongbin 5 years ago
parent
commit
48a176759f
8 changed files with 284 additions and 43 deletions
  1. 8 6
      Ansjer/config_local.py
  2. 4 1
      Ansjer/urls.py
  3. 2 2
      Controller/AdminManage.py
  4. 132 0
      Controller/Alexa.py
  5. 104 29
      Controller/FAQController.py
  6. 6 3
      Controller/TestApi.py
  7. 17 2
      Controller/UidUser.py
  8. 11 0
      Model/models.py

+ 8 - 6
Ansjer/config_local.py

@@ -15,12 +15,14 @@
 OAUTH_ACCESS_TOKEN_SECRET = 'local_a+jbgnw%@1%zy^=@dn62%'
 OAUTH_REFRESH_TOKEN_SECRET = 'local_r+jbgnw%@1%zy^=@dn62%'
 
-NGINX_RTMP_STAT = 'http://192.168.136.45:8077/stat'
-SERVER_DOMAIN = 'http://192.168.136.45:8077/'
-SERVER_DOMAIN_SSL = 'http://192.168.136.45:8077/'
-SERVER_HOST = '192.168.136.45'
-DOMAIN_HOST = '192.168.136.45'
-RTMP_PUSH_URL = 'rtmp://192.168.136.45:1935/hls'
+NGINX_RTMP_STAT = 'http://192.168.136.99:8077/stat'
+SERVER_DOMAIN = 'http://192.168.136.99:8077/'
+SERVER_DOMAIN_SSL = 'http://192.168.136.99:8077/'
+SERVER_HOST = '192.168.136.99'
+DOMAIN_HOST = '192.168.136.99'
+# SERVER_HOST = '127.0.0.1'
+# DOMAIN_HOST = '192.168.136.99'
+RTMP_PUSH_URL = 'rtmp://192.168.136.99:1935/hls'
 PAYPAL_CRD = {
     "mode": "sandbox",  # sandbox or live
     "client_id": "AeuhR7FHisO-lOd2OwtzyDu7PSLMmDZoDLgmzuEQ12WCtTu_8Z1AzcD4gG5SnymnuvJs-n5KBB8H9Z_G",

+ 4 - 1
Ansjer/urls.py

@@ -10,7 +10,7 @@ from Controller import FeedBack, EquipmentOTA, EquipmentInfo, AdminManage, AppIn
     StsOssController, UIDPreview, OssCrd, SysMsg, UidUser, EquipmentManagerV2, EquipmentManagerV3, PushDeploy, \
     AppSetController, \
     ApplicationController, UserExController, CloudStorage, TestApi, UserBrandControllerV2, \
-    StatisticsController, FAQController
+    StatisticsController, Alexa, FAQController
 
 urlpatterns = [
     url(r'^testApi/(?P<operation>.*)$', TestApi.testView.as_view()),
@@ -219,6 +219,9 @@ urlpatterns = [
     url(r'^statistcs/appFrequencyMonth$', StatisticsController.statistcsAppFrequency),
     url(r'^statistcs/appFrequencyYear$', StatisticsController.statistcsAppFrequencyYear),
 
+    #统计alexa连接数
+    url(r'^alexa/(?P<operation>.*)$', Alexa.AlexaConnectNum.as_view()),
+
     # FAQ
     url(r'^faq/upload', FAQController.FAQUploadView.as_view()),
     url(r'^faq/image/(?P<filePath>.*)$', FAQController.getFAQImage.as_view()),

+ 2 - 2
Controller/AdminManage.py

@@ -6,8 +6,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, UserExModel, User_Brand, UidSetModel, UserAppFrequencyModel, \
-    AppFrequencyStatisticsModel, AppFrequencyYearStatisticsModel
+from Model.models import Device_Info, Role, UserExModel, User_Brand, UidSetModel, AppFrequencyYearStatisticsModel, \
+    AppFrequencyStatisticsModel
 from Service.ModelService import ModelService
 from django.utils import timezone
 from Model.models import Access_Log, Device_User

+ 132 - 0
Controller/Alexa.py

@@ -0,0 +1,132 @@
+#!/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: 2020/8/14 10:13
+@Version: python3.6
+@MODIFY DECORD:ansjer dev
+@file: AlexaConnectNum.py
+@Contact: sonalh@foxmail.com
+"""
+from django.views.generic.base import View
+import os
+
+import json
+import math
+import time
+import urllib
+import logging
+import logging
+import requests
+import time
+import datetime
+from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
+from Model.models import AlexaConnectStatisticsModel
+from django.views.generic import TemplateView
+from django.utils.decorators import method_decorator
+from django.views.decorators.csrf import csrf_exempt
+from django.views.generic.base import View
+from django.contrib.auth.hashers import make_password, check_password  # 对密码加密模块
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+from Service.ModelService import ModelService
+from django.db import connection
+
+rtspServer = "rtsp.zositech.org,3.16.66.144"
+
+# 获取alexa连接数接口
+class AlexaConnectNum(TemplateView):
+    @method_decorator(csrf_exempt)
+    def dispatch(self, *args, **kwargs):
+        return super(AlexaConnectNum, self).dispatch(*args, **kwargs)
+
+    def get(self, request, *args, **kwargs):
+        response = ResponseObject()
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        #每隔十分钟定时保存每天最高连接数,crontab 在alexa_oauth2_oserver
+        if operation == 'saveConnectNum':
+            today = datetime.date.today()
+            today_start_time = int(time.mktime(time.strptime(str(today), '%Y-%m-%d')))
+            today_end_time = int(time.mktime(time.strptime(str(today), '%Y-%m-%d'))) + 86399
+             #获取当前连接数
+            current_connect_num = self.currentConnect()
+            today_data = AlexaConnectStatisticsModel.objects.\
+                filter(data_time__lte=today_end_time,data_time__gte=today_start_time).values('num','data_time')
+            if today_data.exists():
+                num = list(today_data)[0]['num']
+                if current_connect_num > num:
+                    today_data.update(num=current_connect_num, data_time=time.time())
+            else:
+                today_data.create(num=current_connect_num, data_time=time.time())
+            return response.json(0)
+        return response.json(10006)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        response = ResponseObject()
+        operation = kwargs.get('operation')
+        post_data = request.POST
+        token = post_data.get('token', None)
+        # tko = TokenObject()
+        # newToken = tko.generate( data={'userID': '158943594633713800138000', 'lang': 'cn', 'user': '597471180@qq.com', 'm_code': '123413243214'})
+        # return response.json(0, {'data': newToken})
+        tko = TokenObject(token)
+        response.lang = tko.lang
+        if tko.code != 0:
+            return response.json(tko.code)
+        userID = tko.userID
+        own_permission = ModelService.check_perm(userID=userID, permID=30)
+        if own_permission is not True:
+            return response.json(404)
+
+        #获取当前连接数
+        current_connect_num = self.currentConnect()
+        res = []
+        #最近三十天每天最高连接数
+        if operation == 'thirtyDays':
+            query_num = AlexaConnectStatisticsModel.objects.\
+                extra(select={"data_time": "FROM_UNIXTIME(data_time, '%%m-%%d')"}).\
+                values('num', 'data_time').order_by('-data_time')[:30]
+            res = list(query_num)
+
+        #最近十二个月每月最高连接数
+        if operation == 'years':
+            cursor=connection.cursor()
+            cursor.execute("SELECT FROM_UNIXTIME(data_time,'%Y-%m') as month, max(num) as max_num FROM alexa_statistics GROUP BY month order by month asc LIMIT 12")
+            res_query = cursor.fetchall()
+            for max_num, month in res_query:
+                res.append({'num':month, 'month':max_num})
+
+        res_desc = {'result_code': 0, 'reason': '成功', 'current_num':current_connect_num, 'top_num': res, 'error_code': 0}
+        result_json = json.dumps(res_desc, ensure_ascii=False)
+        return HttpResponse(result_json)
+
+    def currentConnect(self):
+        urls = rtspServer.split(',')
+        httpPrefix = 'http://'
+        postfix = ':10008/api/v1/pushers'
+        current_connect_num = 0
+        for url in urls:
+            apiUrl = httpPrefix + url + postfix
+            try:
+                selectRtsp = requests.get(url=apiUrl, timeout=5)
+                current_connect_num += selectRtsp.json()['total']
+            except Exception as e:
+                continue
+        return current_connect_num
+
+
+
+
+
+
+
+
+
+
+
+

+ 104 - 29
Controller/FAQController.py

@@ -1,6 +1,9 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
+import json
 import os
+import shutil
+import time
 import traceback
 
 from django.http import HttpResponse
@@ -8,8 +11,11 @@ from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
 from django.views.generic.base import View
 
-from Ansjer.config import BASE_DIR
+from Ansjer.config import BASE_DIR, SERVER_TYPE
+from Ansjer.config_formal import SERVER_DOMAIN
+from Ansjer.config_test import SERVER_DOMAIN
 from Model.models import FAQModel
+from Object.RedisObject import RedisObject
 from Object.ResponseObject import ResponseObject
 from Object.TokenObject import TokenObject
 from var_dump import var_dump
@@ -45,25 +51,49 @@ class FAQUploadView(View):
         #     return response.json(404)
 
         try:
-            path = '/'.join((BASE_DIR, 'static/FAQImages')).replace('\\', '/') + '/'
+            redisObject = RedisObject()
+            path = '/'.join((BASE_DIR, 'static/FAQImages/tmp')).replace('\\', '/') + '/'
+            # path = '/'.join((BASE_DIR, 'static/{user}/FAQImages'.format(user=token.userID))).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()
+
+            # 先从redis中取出token对应的图片信息
+            images = redisObject.get_data(key=token.token)
+            if images is not False:
+                images = json.loads(images)
+                # 判断此次编辑是否已经存在对应的图片
+                if images.__contains__(str(fileName)):
+                    file_name = images[str(fileName)]
+                    index = file_name.find('static/')
+                    filePath = file_name[index:]
+                    filePath = SERVER_DOMAIN + 'faq/image/' + filePath
+                    # filePath = "http://192.168.136.35:8000/" + 'faq/image/' + filePath
+                    return response.json(0, {'filePath': filePath})
+
+            # redis中没有对应的图片信息
+            tmp_name = str(fileName)
+            suffix = tmp_name[tmp_name.find('.'):]
+            tmp_file_name = int(time.time())
+            tmp_file_name = '{file_name}{suffix}'.format(file_name=tmp_file_name, suffix=suffix)
+
+            file_name = path + str(tmp_file_name)
+            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()
+
+            # 把图片信息保存到redis中
+            images = redisObject.get_data(token.token)
+            if images is False:
+                images = json.dumps({})
+
+            images = json.loads(images)
+            images[tmp_name] = file_name
+            redisObject.set_data(key=token.token, val=json.dumps(images), expire=3600)
+
         except Exception as e:
             errorInfo = traceback.format_exc()
             print('上传文件错误: %s' % errorInfo)
@@ -71,8 +101,8 @@ class FAQUploadView(View):
         else:
             index = file_name.find('static/')
             filePath = file_name[index:]
-            # filePath = SERVER_DOMAIN + 'faq/image/' + filePath
-            filePath = "http://192.168.136.35:8000/" + 'faq/image/' + filePath
+            filePath = SERVER_DOMAIN + 'faq/image/' + filePath
+            # filePath = "http://192.168.136.35:8000/" + 'faq/image/' + filePath
             return response.json(0, {'filePath': filePath})
 
 
@@ -134,17 +164,17 @@ class FAQView(View):
             return response.json(token.code)
 
         if operation == 'add':
-            return self.do_add(token.userID, request_dict, response)
+            return self.do_add(token, request_dict, response)
         elif operation == 'query':
             return self.do_query(token.userID, request_dict, response)
         elif operation == 'update':
-            return self.do_update(token.userID, request_dict, response)
+            return self.do_update(token, request_dict, response)
         elif operation == 'delete':
             return self.do_delete(token.userID, request_dict, response)
         else:
             return response.json(404)
 
-    def do_add(self, userID, request_dict, response):
+    def do_add(self, token, request_dict, response):
 
         # own_permission = ModelService.check_perm(userID=userID, permID=120)
         # if own_permission is not True:
@@ -154,10 +184,35 @@ class FAQView(View):
         content = request_dict.get('content', None)
 
         if title and content:
-            FAQModel.objects.create(**{
-                'title': title,
-                'content': content
-            })
+            try:
+                # 对content中的图片路径进行修改
+                content = str(content)
+                content = content.replace('faq/image/static/FAQImages/tmp', 'faq/image/static/FAQImages')
+
+                # 取出redis中保存的此次上传的图片信息
+                redisObject = RedisObject()
+                images = redisObject.get_data(key=token.token)
+                if images is not False:
+                    images = json.loads(images)
+
+                    # 把图片从临时文件移动到FAQ资源文件夹下
+                    for k, v in images.items():
+                        start_index1 = v.find('tmp/')
+                        start_index2 = start_index1 + 4
+                        new_path = v[0:start_index1] + v[start_index2:]
+                        shutil.move(v, new_path)
+
+                FAQModel.objects.create(**{
+                    'title': title,
+                    'content': content
+                })
+
+                # 删除redis中token对应的信息
+                redisObject.del_data(key=token.token)
+            except Exception as e:
+                print(e)
+                return response.json(174)
+
             return response.json(0)
         else:
             return response.json(444)
@@ -193,7 +248,7 @@ class FAQView(View):
         else:
             return response.json(444)
 
-    def do_update(self, userID, request_dict, response):
+    def do_update(self, token, request_dict, response):
         # own_permission = ModelService.check_perm(userID=userID, permID=130)
         # if own_permission is not True:
         #     return response.json(404)
@@ -209,9 +264,28 @@ class FAQView(View):
                 data['title'] = title
 
             if content:
+                content = str(content)
+                content = content.replace('faq/image/static/FAQImages/tmp', 'faq/image/static/FAQImages')
+
+                # 取出redis中保存的此次上传的图片信息
+                redisObject = RedisObject()
+                images = redisObject.get_data(key=token.token)
+                if images is not False:
+                    images = json.loads(images)
+
+                    # 把图片从临时文件移动到FAQ资源文件夹下
+                    for k, v in images.items():
+                        start_index1 = v.find('tmp/')
+                        start_index2 = start_index1 + 4
+                        new_path = v[0:start_index1] + v[start_index2:]
+                        shutil.move(v, new_path)
+                # 删除redis中token对应的信息
+                redisObject.del_data(key=token.token)
+
                 data['content'] = content
 
             FAQModel.objects.filter(id=id).update(**data)
+
             return response.json(0)
         else:
             return response.json(444)
@@ -225,7 +299,8 @@ class FAQView(View):
         id = request_dict.get('id', None)
         if id:
             try:
-                FAQModel.objects.filter(id=id).delete()
+                faq_qs = FAQModel.objects.filter(id=id)
+                faq_qs.delete()
             except Exception as e:
                 print(e)
                 return response.json(173)

+ 6 - 3
Controller/TestApi.py

@@ -35,6 +35,7 @@ from django.http import JsonResponse, HttpResponseRedirect, HttpResponse
 from django.utils.decorators import method_decorator
 from django.views.decorators.csrf import csrf_exempt
 from django.views.generic.base import View
+from django.contrib.auth.hashers import make_password, check_password  # 对密码加密模块
 
 from Ansjer.config import OSS_STS_ACCESS_KEY, OSS_STS_ACCESS_SECRET, OSS_ROLE_ARN, SERVER_DOMAIN, PAYPAL_CRD, \
     SERVER_DOMAIN_SSL
@@ -76,8 +77,8 @@ class testView(View):
         if operation is None:
             return response.json(444, 'error path')
         elif operation == 'tests':
-            userID  = '158943594633713800138000'
-            return self.do_filter_playlist(request_dict, userID, response)
+             res = make_password(123456)
+             return JsonResponse(status=200, data=res,safe=False)
         elif operation == 'cbu':
             return self.createBucket()
         elif operation == 'vodList':
@@ -92,12 +93,14 @@ class testView(View):
         elif operation == 'eqi_query':
             userID = '158943594633713800138000'
             return self.queryInterface(request_dict, userID, response)
+        elif operation == 'getAlexa':
+            userID = '158943594633713800138000'
+            return self.queryInterface(request_dict, userID, response)
         else:
             return 12344444
 
     def createBucket(self):
 
-
         #查看桶列表
         # url = "https://azvod1.s3-ap-northeast-1.amazonaws.com"
         # session = Session(ACCESS_KEY, SECRET_KEY)

+ 17 - 2
Controller/UidUser.py

@@ -29,6 +29,7 @@ from Service.CommonService import CommonService
 from Service.ModelService import ModelService
 from Object.RedisObject import RedisObject
 import base64
+from Controller.CheckUserData import RandomStr
 '''
 http://192.168.136.40:8077/uiduser/add?token=local&UID=z123asdfqwerzxcvqw12&NickName=xxoxox&View_Account=user&View_Password=password&ChannelIndex=8&is_ap=1&Type=5&NickName=1234zcxv
 http://192.168.136.40:8077/uiduser/query?token=local&page=1&line=10&is_ap=1&NickName=1234zcxv&uid=zxcvasdfqwerzxcvqwer
@@ -365,6 +366,7 @@ class UidUserView(View):
 
 
 
+
 # v3添加设备字段
 def v3addInterface(request):
     request.encoding = 'utf-8'
@@ -477,7 +479,6 @@ def v3queryInterface(request):
     response.lang = tko.lang
     if page <= 0:
         return response.json(0)
-
     if tko.code == 0:
         userID = tko.userID
         redisObj = RedisObject(db=8)
@@ -509,7 +510,6 @@ def v3queryInterface(request):
         # 设备拓展信息表
         us_qs = UidSetModel.objects.filter(uid__in=uid_list).values('uid', 'version', 'nickname')
         uv_dict = {}
-        return response.json(0, us_qs)
         for us in us_qs:
             uv_dict[us['uid']] = {'version': us['version'], 'nickname': us['nickname']}
         for p in uid_user_ls:
@@ -519,6 +519,7 @@ def v3queryInterface(request):
                     if dm['endTime'] > nowTime:
                         p['vod'].append(dm)
             p['preview'] = []
+            p['View_Password'] = encrypt_pwd(p['View_Password'])
             for up in upqs:
                 if p['UID'] == up['uid']:
                     obj = 'uid_preview/{uid}/channel_{channel}.png'.format(uid=up['uid'], channel=up['channel'])
@@ -539,6 +540,20 @@ def v3queryInterface(request):
     else:
         return response.json(tko.code)
 
+# 加密
+def encrypt_pwd(userPwd):
+    for i in range(1, 4):
+        if i == 1:
+            userPwd = RandomStr(3, False)+userPwd+RandomStr(3, False)
+            userPwd = base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
+        if i == 2:
+            userPwd = RandomStr(2, False)+str(userPwd)+RandomStr(2, False)
+            userPwd = base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
+        if i == 3:
+            userPwd = RandomStr(1, False)+str(userPwd)+RandomStr(1, False)
+            userPwd = base64.b64encode(str(userPwd).encode("utf-8")).decode('utf8')
+    return userPwd
+
 
 
 

+ 11 - 0
Model/models.py

@@ -950,6 +950,17 @@ class AppFrequencyYearStatisticsModel(models.Model):
         verbose_name_plural = verbose_name
         db_table = 'app_frequency_year_statistics'
 
+# alexa连接数统计表
+class AlexaConnectStatisticsModel(models.Model):
+    id = models.AutoField(primary_key=True)
+    num = models.IntegerField(default=0, verbose_name='总人数')
+    data_time = models.IntegerField(default=0, verbose_name='数据时间')
+
+    class Meta:
+        verbose_name = 'alexa连接数统计表'
+        verbose_name_plural = verbose_name
+        db_table = 'alexa_statistics'
+
 
 class FAQModel(models.Model):
     id = models.AutoField(primary_key=True)