Browse Source

微瞳网站

guanhailong 2 years ago
parent
commit
42c2dad542
2 changed files with 321 additions and 7 deletions
  1. 274 0
      Controller/VseesWeb/VseesController.py
  2. 47 7
      Model/models.py

+ 274 - 0
Controller/VseesWeb/VseesController.py

@@ -0,0 +1,274 @@
+# -*- coding: utf-8 -*-
+"""
+@Author : Rocky
+@Time : 2023/07/13 11:30
+@File :VseesController.py
+"""
+import time
+
+from django.db import transaction
+from django.views import View
+
+from Ansjer.config import AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SES_ACCESS_REGION
+from Model.models import VseesDeviceType, vseesProductInfo
+from Object.AWS.AmazonS3Util import AmazonS3Util
+from Object.ResponseObject import ResponseObject
+from Object.TokenObject import TokenObject
+
+
+class VseesManagement(View):
+    def get(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.GET, operation, request)
+
+    def post(self, request, *args, **kwargs):
+        request.encoding = 'utf-8'
+        operation = kwargs.get('operation')
+        return self.validation(request.POST, operation, request)
+
+    def validation(self, request_dict, operation, request):
+        response = ResponseObject()
+        if operation == 'get-device-info':  # 查询微瞳设备类型图标信息
+            return self.get_device_info(response)
+        if operation == 'get-product-info':  # 获取产品信息
+            return self.get_product_info(request_dict, request)
+        else:
+            tko = TokenObject(
+                request.META.get('HTTP_AUTHORIZATION'),
+                returntpye='pc')
+            if tko.code != 0:
+                return response.json(tko.code)
+            response.lang = tko.lang
+            user_id = tko.userID
+            if operation == 'get-info':  # 获取信息
+                return self.get_info(request_dict, response)
+            if operation == 'add-info':  # 新增信息
+                return self.add_info(request_dict, request, response)
+            if operation == 'edit-status':  # 修改状态
+                return self.edit_status(request_dict, response)
+            if operation == 'upload-file':  # 更新文件
+                return self.upload_file(request_dict, request, response)
+            if operation == 'edit-info':  # 修改信息
+                return self.edit_info(request_dict, response)
+            else:
+                return response.json(404)
+
+    @staticmethod
+    def get_info(request_dict, response):
+        """
+        获取微瞳产品信息
+        @request_dict vsees_id:设备类型id
+        @request_dict type:0:视频, 1:说明书, 2:固件
+        return:
+        """
+        vsees_id = request_dict.get('vsees_id', None)
+        product_type = request_dict.get('type', None)
+        if not all([vsees_id, product_type]):
+            return response.json(444, 'vsees_id, product_type')
+        try:
+            product_info_qs = vseesProductInfo.objects.filter(vsees__id=vsees_id, product_type=product_type,
+                                                              status=1).values('title', 'file_name', 'status')
+            if not product_info_qs.exists():
+                return response.json(173)
+            return response.json(0, list(product_info_qs))
+        except Exception as e:
+            print(e)
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @classmethod
+    def add_info(cls, request_dict, request, response):
+        """
+        新增微瞳产品信息
+        @request_dict product_id:产品信息id
+        @request_dict file:文件
+        @request_dict vsees_id:设备类型id
+        @request_dict url:路径
+        @request_dict title:标题
+        @request_dict device_type:0:视频, 1:说明书, 2:固件
+        @request_dict status:状态0:已上架, 1: 已下架
+        return:
+        """
+        file = request.FILES.get('file', None)
+        vsees_id = request_dict.get('vsees_id', None)
+        url = request_dict.get('url', None)
+        title = request_dict.get('title', None)
+        product_type = request_dict.get('type', None)
+
+        if not all([file or url, title, product_type, vsees_id]):
+            return response.json(444, 'error: file or url, title, product_type, vsees_id')
+        nowTime = int(time.time())
+        fileName = str(file)
+        device_type = int(product_type)
+        # 判断上架状态标题是否重复
+        product_info_qs = vseesProductInfo.objects.filter(vsees__id=vsees_id, title=title, type=product_type, status=1)
+        if product_info_qs.exists():
+            return response.json(174)
+        try:
+            with transaction.atomic():
+                data = {
+                    'vsees_id': vsees_id,
+                    'title': title,
+                    'type': device_type,
+                    'status': 1,
+                    'add_time': nowTime,
+                    'upd_time': nowTime,
+                }
+                #  添加链接
+                if device_type == 0:
+                    data['file_name'] = url
+                    data['url'] = url
+                    vseesProductInfo.objects.create(**data)
+                    return response.json(0)
+                #  添加说明书
+                elif device_type == 1:
+                    url = 'https://d2cjxvw3tr9apc.cloudfront.net/vsees/clarification'.format(fileName)
+                    file_key = 'vsees/clarification'
+                #  添加固件
+                elif device_type == 2:
+                    url = 'https://d2cjxvw3tr9apc.cloudfront.net/vsees/firmware'.format(fileName)
+                    file_key = 'vsees/firmware'
+                key = file_key.format(fileName)
+                s3 = cls.upload(file, key)
+                if s3:
+                    data['file_name'] = fileName
+                    data['url'] = url
+                    vseesProductInfo.objects.create(**data)
+                    return response.json(0)
+                return response.json(178)
+        except Exception as e:
+            print(e)
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @classmethod
+    def upload(cls, file, key):
+        """
+        上传
+        @request_dict file:文件
+        @request_dict key:需要上传文件路径+文件名
+        """
+        bucket_name = 'ansjerfilemanager'
+        s3 = AmazonS3Util(AWS_ACCESS_KEY_ID[1], AWS_SECRET_ACCESS_KEY[1], AWS_SES_ACCESS_REGION)
+        s3 = s3.upload_file_obj(
+            bucket_name,
+            key,
+            file,
+            {'ContentType': file.content_type, 'ACL': 'public-read'})
+        if s3:
+            return True
+        else:
+            return False
+
+    @classmethod
+    def upload_file(cls, request_dict, request, response):
+        """
+        重新上传文件按钮
+        @request_dict product_id:产品信息id
+        @request_dict file:文件
+        @request_dict device_type:0:视频, 1:说明书, 2:固件
+        """
+        file = request.FILES.get('file', None)
+        product_id = request_dict.get('product_id', None)
+        device_type = request_dict.get('type', None)
+        if not all([file, device_type, product_id]):
+            return response.json(444, 'error: file, device_type, product_id')
+        nowTime = int(time.time())
+        fileName = str(file)
+        try:
+            # 说明
+            if device_type == 1:
+                url = 'https://d2cjxvw3tr9apc.cloudfront.net/vsees/clarification'.format(fileName)
+                file_key = 'vsees/clarification'
+            # 固件
+            else:
+                url = 'https://d2cjxvw3tr9apc.cloudfront.net/vsees/firmware'.format(fileName)
+                file_key = 'vsees/firmware'
+            key = file_key.format(fileName)
+            s3 = cls.upload(file, key)
+            if s3:
+                vseesProductInfo.objects.filter(id=product_id).update(url=url, upd_time=nowTime)
+                return response.json(0)
+            return response.json(177)
+        except Exception as e:
+            print(e)
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def edit_status(request_dict, response):
+        """
+        修改状态
+        @request_dict product_id:id
+        @request_dict status:状态0:已上架, 1: 已下架
+        """
+        product_id = request_dict.get('product_id', None)
+        status = request_dict.get('status', None)
+        if not all([status, product_id]):
+            return response.json(444, 'error: status, product_id')
+        if int(status) == 2:
+            return response.json(177)
+        vseesProductInfo.objects.filter(id=product_id).update(status=status)
+        return response.json(0)
+
+    @staticmethod
+    def edit_info(request_dict, response):
+        """
+        修改信息
+        @request_dict product_id:id
+        @request_dict url:路径
+        @request_dict title:标题
+        """
+        product_id = request_dict.get('product_id', None)
+        url = request_dict.get('url', None)
+        title = request_dict.get('title')
+        if not product_id:
+            return response.json(444, 'error: product_id')
+        product_info_qs = vseesProductInfo.objects.filter(id=product_id, title=title, status=1)
+        if product_info_qs.exists():
+            return response.json(174)
+        if title:
+            product_info_qs.update(title=title)
+        if url:
+            product_info_qs.update(url=url)
+        return response.json(0)
+
+    # 用户界面接口 -------------------------------------------------------------------------------------------------------
+    @staticmethod
+    def get_device_info(response):
+        """
+        获取微瞳图标信息
+        """
+        try:
+            device_type_qs = VseesDeviceType.objects.all().values()
+            return response.json(0, list(device_type_qs))
+        except Exception as e:
+            print(e)
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
+
+    @staticmethod
+    def get_product_info(request_dict, response):
+        """
+        获取微瞳产品信息
+        @request_dict deviceTypeId:设备类型id
+        @request_dict type:0:视频, 1:说明书, 2:固件
+        @request_dict title:标题
+        return:
+        """
+        vsees_id = request_dict.get('vsees_id', None)
+        title = request_dict.get('title', None)
+        product_type = request_dict.get('type', None)
+        if not vsees_id:
+            return response.json(444, 'vsees_id')
+        try:
+            product_info_qs = vseesProductInfo.objects.all()
+            if not title and product_type:
+                product_info_qs = product_info_qs.filter(vsees__id=vsees_id, status=1).values('title')
+                return response.json(0, list(product_info_qs))
+            else:
+                product_info_qs = product_info_qs.filter(vsees__id=vsees_id, title=title, type=product_type,
+                                                         status=1).values('url')
+                if not product_info_qs.exists():
+                    return response.json(173)
+                return response.json(0, {'url': product_info_qs[0]['url']})
+        except Exception as e:
+            print(e)
+            return response.json(500, 'error_line:{}, error_msg:{}'.format(e.__traceback__.tb_lineno, repr(e)))

+ 47 - 7
Model/models.py

@@ -1385,7 +1385,7 @@ class UidSetModel(models.Model):
     tb_country = models.IntegerField(blank=True, default=0, verbose_name='国家')
     device_type = models.SmallIntegerField(default=0, verbose_name='设备类型')
     ai_type = models.SmallIntegerField(default=0, verbose_name='检测类型')
-    msg_notify = models.JSONField(null=True, verbose_name='消息通知Json')
+    # msg_notify = models.JSONField(null=True, verbose_name='消息通知Json')
 
     class Meta:
         db_table = 'uid_set'
@@ -3558,8 +3558,8 @@ class SwitchDimmingSettings(models.Model):
     location = models.CharField(max_length=100, default='', verbose_name=u'位置')
     click_turn_on_speed = models.SmallIntegerField(default=0, verbose_name='单击开启速度')
     click_turn_off_speed = models.SmallIntegerField(default=0, verbose_name='单击关闭速度')
-    double_click = models.CharField(max_length=8, default='', verbose_name='双击')   # 0: 无, 1: 缓慢开/关, x%: 预设亮度
-    press = models.CharField(max_length=8, default='', verbose_name='长按')   # 0: 无, 1: 缓慢开/关, x%: 预设亮度
+    double_click = models.CharField(max_length=8, default='', verbose_name='双击')  # 0: 无, 1: 缓慢开/关, x%: 预设亮度
+    press = models.CharField(max_length=8, default='', verbose_name='长按')  # 0: 无, 1: 缓慢开/关, x%: 预设亮度
     double_press_click_turn_on_speed = models.SmallIntegerField(default=0, verbose_name='双击/长按开启速度')
     double_press_click_turn_off_speed = models.SmallIntegerField(default=0, verbose_name='双击/长按单击关闭速度')
     led = models.BooleanField(default=False, verbose_name='LED指示灯')  # True: 开, False: 关
@@ -3574,12 +3574,14 @@ class SwitchDimmingSettings(models.Model):
 class SwitchChronopher(models.Model):
     id = models.AutoField(primary_key=True, verbose_name='自增id')
     device_id = models.CharField(max_length=32, default='', verbose_name='设备id')
-    time_type_radio = models.SmallIntegerField(default=0, verbose_name='切换时间点/时间段')   # 1: 按时间点, 2: 按时间段
+    time_type_radio = models.SmallIntegerField(default=0, verbose_name='切换时间点/时间段')  # 1: 按时间点, 2: 按时间段
     time_point = models.IntegerField(default=0, verbose_name='时间点')
     time_quantum_start_time = models.IntegerField(default=0, verbose_name='时间段开始时间')
     time_quantum_end_time = models.IntegerField(default=0, verbose_name='时间段结束时间')
-    time_point_device_will_doing = models.CharField(max_length=8, default='', verbose_name='设备将会')  # 0: 开启, 1: 关闭, x%: 预设亮度
-    time_quantum_device_will_doing = models.SmallIntegerField(default=0, verbose_name='设备将会')   # 0: 开启, 1: 关闭, x: 开启/关闭切换间隔
+    time_point_device_will_doing = models.CharField(max_length=8, default='',
+                                                    verbose_name='设备将会')  # 0: 开启, 1: 关闭, x%: 预设亮度
+    time_quantum_device_will_doing = models.SmallIntegerField(default=0,
+                                                              verbose_name='设备将会')  # 0: 开启, 1: 关闭, x: 开启/关闭切换间隔
     slow_open_or_close_speed = models.SmallIntegerField(default=0, verbose_name='缓慢开/关速度')
     repeat = models.SmallIntegerField(default=0, verbose_name=u'重复周期')
 
@@ -3677,7 +3679,8 @@ class IcloudStorageRecord(models.Model):
     time_stamp = models.BigIntegerField(verbose_name='视频/图片名字时间戳', default=0, db_index=True)  # 单位毫秒
     sec = models.IntegerField(verbose_name='秒数', default=0)
     bucket_id = models.IntegerField(verbose_name='关联存储桶id', default=0)
-    fg = models.CharField(max_length=20, verbose_name='ts个数,时间描述片段数', default='')  # 阿里为时间片段数,亚马逊为一个32bit整型,前28bit代表ts文件的时长
+    fg = models.CharField(max_length=20, verbose_name='ts个数,时间描述片段数',
+                          default='')  # 阿里为时间片段数,亚马逊为一个32bit整型,前28bit代表ts文件的时长
     size = models.DecimalField(default=0, max_digits=4, decimal_places=2, verbose_name='视频/图片大小')  # 单位MB
     file_type = models.SmallIntegerField(default=0, verbose_name='文件类型')  # 0:图片, 1:ts视频, 2:MP4视频
 
@@ -3689,3 +3692,40 @@ class IcloudStorageRecord(models.Model):
         verbose_name = u'云盘信息记录表'
         verbose_name_plural = verbose_name
         ordering = ('-id',)
+
+
+class VseesDeviceType(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='列表主键')
+    name = models.CharField(max_length=50, default='', verbose_name='设备类型名称')
+    icon_url = models.CharField(max_length=200, default='', verbose_name='图标地址')
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'vsees_device_type'
+        verbose_name = u'微瞳设备类型表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)
+
+
+class vseesProductInfo(models.Model):
+    id = models.AutoField(primary_key=True, verbose_name='列表主键')
+    file_name = models.CharField(max_length=120, default='', verbose_name='文件名')
+    vsees = models.ForeignKey(VseesDeviceType, to_field='id', on_delete=models.CASCADE, verbose_name='关联微瞳设备类型表')
+    title = models.CharField(max_length=32, default='', verbose_name='标题')
+    type = models.SmallIntegerField(default=0, verbose_name='类型{0:视频, 1:说明书, 2:固件}')
+    url = models.CharField(max_length=200, default='', verbose_name='路径')
+    add_time = models.IntegerField(verbose_name='添加时间', default=0)
+    upd_time = models.IntegerField(verbose_name='更新时间', default=0)
+    status = models.SmallIntegerField(default=False, verbose_name='状态0:已上架, 1: 已下架')
+    is_del = models.BooleanField(blank=True, default=False, verbose_name=u'是否删除')
+
+    def __str__(self):
+        return self.id
+
+    class Meta:
+        db_table = 'vsees_product_info'
+        verbose_name = u'微瞳产品信息记录表'
+        verbose_name_plural = verbose_name
+        ordering = ('-id',)