Ver código fonte

新增: 云飞监控项目增加四情孢子仪,杀虫灯拍照封禁手动解封功能

root 3 anos atrás
pai
commit
3811e5538a

+ 1 - 1
monitor/monitor/pagination.py

@@ -5,7 +5,7 @@ from rest_framework.pagination import PageNumberPagination
 
 
 
 
 class CustomPagination(PageNumberPagination):
 class CustomPagination(PageNumberPagination):
-    page_size = 2
+    page_size = 10
     max_page_size = 20
     max_page_size = 20
     page_size_query_param = 'size'
     page_size_query_param = 'size'
     page_query_param = 'page'
     page_query_param = 'page'

+ 11 - 2
monitor/monitor/settings.py

@@ -104,6 +104,15 @@ DATABASES = {
     'default': {
     'default': {
         'ENGINE': 'django.db.backends.sqlite3',
         'ENGINE': 'django.db.backends.sqlite3',
         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
+    },
+    'siqing': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': 'yfwlw',
+        'USER': 'root',
+        'PASSWORD': 'sql_yfkj_6019@root',
+        'HOST': '120.27.222.26',
+        'PORT': 3306,
+        'OPTIONS': {'charset': 'utf8mb4'}
     }
     }
 }
 }
 
 
@@ -130,13 +139,13 @@ AUTH_PASSWORD_VALIDATORS = [
 
 
 LANGUAGE_CODE = 'en-us'
 LANGUAGE_CODE = 'en-us'
 
 
-TIME_ZONE = 'UTC'
+TIME_ZONE = 'Asia/Shanghai'
 
 
 USE_I18N = True
 USE_I18N = True
 
 
 USE_L10N = True
 USE_L10N = True
 
 
-USE_TZ = True
+USE_TZ = False
 
 
 # Static files (CSS, JavaScript, Images)
 # Static files (CSS, JavaScript, Images)
 # https://docs.djangoproject.com/en/2.2/howto/static-files/
 # https://docs.djangoproject.com/en/2.2/howto/static-files/

+ 2 - 43
monitor/monitor/urls.py

@@ -13,49 +13,11 @@ Including another URLconf
     1. Import the include() function: from django.urls import include, path
     1. Import the include() function: from django.urls import include, path
     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
     2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))
 """
 """
-from rest_framework import permissions
+
 from django.contrib import admin
 from django.contrib import admin
 from django.urls import path, include, re_path
 from django.urls import path, include, re_path
 from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
 from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView
 
 
-from drf_yasg import openapi
-from drf_yasg.views import get_schema_view
-from drf_yasg.inspectors import CoreAPICompatInspector, FieldInspector, NotHandled, SwaggerAutoSchema
-
-schema_view = get_schema_view(
-    openapi.Info(
-        title="云飞监控API文档",
-        default_version="v1",
-        description="""
-<strong>HTTP状态码</strong>:
-    200 表示成功
-    400 表示请求失败
-    403 表示无权限访问
-    500 表示服务器异
-
-<strong>接口返回格式统一为</strong>:
-
-{
-&nbsp;&nbsp; "msg": "", &nbsp;&nbsp; 错误描述信息,正常响应下此为空字符串,只有错误异常情况下才有内容
-&nbsp;&nbsp; "code": 0, &nbsp;&nbsp; 响应状态码:0表示正确,400表示请求错误,403表示无权限访问,500表示服务器异常。
-&nbsp;&nbsp; "result": {
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "data": {}, &nbsp;&nbsp; 后端返回的数据, 格式为对象或者数组,没有数据返回为空对象
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "paging": {&nbsp;&nbsp;&nbsp;&nbsp;# 分页信息,如果没有分页,则为空对象
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'next': 1,	&nbsp;&nbsp;&nbsp;&nbsp;# 下一页页码
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'previous': 1, &nbsp;&nbsp;&nbsp;&nbsp;# 上一页页码
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'total': 10, &nbsp;&nbsp;&nbsp;&nbsp;# 总页数
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'page': 1, &nbsp;&nbsp;&nbsp;&nbsp;# 当前页
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'page_size': 5, &nbsp;&nbsp;&nbsp;&nbsp;# 每页条目数
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'total_page': 10 &nbsp;&nbsp;&nbsp;&nbsp;# 总页数
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
-&nbsp;&nbsp;&nbsp;&nbsp;}
-}
-"""
-    ),
-    public=True,
-    permission_classes=(permissions.AllowAny, )
-)
-
 
 
 api_urlpatterns = [
 api_urlpatterns = [
     path('', include('monitor_app.urls'))
     path('', include('monitor_app.urls'))
@@ -67,8 +29,5 @@ urlpatterns = [
     path('api/', include(api_urlpatterns)),
     path('api/', include(api_urlpatterns)),
     path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
     path('api/schema/', SpectacularAPIView.as_view(), name='schema'),
     path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
     path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'),
-    path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
-
-    re_path(r'doc/swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
-    re_path(r'doc/redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
+    path('api/schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc')
 ]
 ]

+ 16 - 0
monitor/monitor_app/models.py

@@ -1,3 +1,19 @@
 from django.db import models
 from django.db import models
 
 
 # Create your models here.
 # Create your models here.
+
+
+class PhotoForbiddenInfo(models.Model):
+    device_name = models.CharField(verbose_name="设备名称", max_length=50)
+    device_id = models.CharField(verbose_name="设备编码", max_length=50)
+    device_path = models.CharField(verbose_name="设备路径", max_length=500)
+    photo_num = models.IntegerField(verbose_name="拍照数量", default=0)
+    operate_type = models.CharField(verbose_name="任务类型", max_length=50)
+    msg_info = models.TextField(verbose_name="描述信息")
+    create_time = models.DateTimeField(verbose_name="封禁时间")
+    operate_time = models.DateTimeField(verbose_name="解封时间")
+    is_allowrd = models.IntegerField(verbose_name="是否解封")
+
+    class Meta:
+        managed = False
+        db_table = 'photo_forbidden_tb'

+ 0 - 0
monitor/monitor_app/photo/__init__.py


+ 32 - 0
monitor/monitor_app/photo/serializers.py

@@ -0,0 +1,32 @@
+# coding:utf-8
+
+import datetime
+from rest_framework import serializers
+from ..models import PhotoForbiddenInfo
+
+
+class PhotoMonitorListSerializer(serializers.Serializer):
+    device_name = serializers.CharField(help_text="设备名称", max_length=50)
+    device_id = serializers.CharField(help_text="设备编码", max_length=50)
+    photo_num = serializers.IntegerField(help_text="拍照数量", default=0)
+    msg_info = serializers.CharField(help_text="描述信息")
+    create_time = serializers.DateTimeField(help_text="封禁时间", default="2021-01-01 11:21:32")
+
+    def to_representation(self, instance):
+        return {
+            'id': instance.id,
+            'device_name': instance.device_name,
+            'device_id': instance.device_id,
+            'photo_num': instance.photo_num,
+            'msg_info': instance.msg_info,
+            'create_time': instance.create_time.strftime('%Y-%m-%d %H:%M:%S')
+        }
+
+
+class PhotoMonitorPostSerializer(serializers.Serializer):
+    device_id = serializers.CharField(help_text="设备编码", max_length=50)
+
+    def validate_device_id(self, value):
+        queryset = PhotoForbiddenInfo.objects.using('siqing').filter(is_allowrd=1, device_id=value).order_by('-id')
+        if not queryset:
+            serializers.ValidationError('设备不存在')

+ 71 - 0
monitor/monitor_app/photo/views.py

@@ -0,0 +1,71 @@
+# coding:utf-8
+
+import datetime
+from rest_framework.response import Response
+from rest_framework.views import APIView
+from drf_spectacular.utils import extend_schema, OpenApiResponse, OpenApiParameter, OpenApiExample, OpenApiTypes
+from rest_framework.generics import GenericAPIView
+from ..models import PhotoForbiddenInfo
+from monitor.pagination import CustomPagination
+from .serializers import PhotoMonitorListSerializer, PhotoMonitorPostSerializer
+
+
+class PhotoMonitorView(GenericAPIView):
+    # queryset = PhotoForbiddenInfo.objects.using('siqing').filter(is_allowrd=1).order_by('-id')
+    queryset = PhotoForbiddenInfo.objects.using('siqing').exclude(is_allowrd=1)
+    serializer_class = PhotoMonitorListSerializer
+    pagination_class = CustomPagination
+
+    def get_serializer_class(self):
+        if self.request.method == 'POST':
+            return PhotoMonitorPostSerializer
+        return self.serializer_class
+
+    @extend_schema(
+        parameters=[
+            OpenApiParameter(
+                name='page',
+                type=OpenApiTypes.STR,
+                location=OpenApiParameter.QUERY,
+                description='页码,第几页',
+            ),
+            OpenApiParameter(
+                name='size',
+                type=OpenApiTypes.STR,
+                location=OpenApiParameter.QUERY,
+                description='每页条目数',
+            ),
+            OpenApiParameter(
+                name='device_id',
+                type=OpenApiTypes.STR,
+                location=OpenApiParameter.QUERY,
+                description='设备编号',
+            ),
+        ],
+        description="获取待解封列表接口",
+        request=None,
+        responses=PhotoMonitorListSerializer
+    )
+    def get(self, request):
+        '''获取待解封列表接口'''
+        queryset = self.get_queryset()
+        page_data = self.paginate_queryset(queryset)
+        ser_obj = self.get_serializer(page_data, many=True)
+        data = self.get_paginated_response(ser_obj.data)
+        return data
+
+    @extend_schema(
+        description="解封封禁接口",
+        request=PhotoMonitorPostSerializer,
+        responses=None
+    )
+    def post(self, request):
+        '''解封封禁'''
+        ser_obj = self.get_serializer(data=request.data)
+        ser_obj.is_valid(raise_exception=True)
+        device_id = request.data['device_id']
+        queryset = self.get_queryset()
+        queryset = queryset.filter(device_id=device_id)
+        if queryset:
+            queryset.update(is_allowrd=2, operate_time=datetime.datetime.now())
+        return Response(status=200)

+ 2 - 0
monitor/monitor_app/urls.py

@@ -4,6 +4,7 @@ from django.urls import path, re_path
 from .process.views import ProcessListView, ProcessDetailView, ProcessDeleteView
 from .process.views import ProcessListView, ProcessDetailView, ProcessDeleteView
 from .system.views import SystemDetailView
 from .system.views import SystemDetailView
 from .user.views import UserLoginView, UserLogoutView
 from .user.views import UserLoginView, UserLogoutView
+from .photo.views import PhotoMonitorView
 
 
 urlpatterns = [
 urlpatterns = [
     re_path('user/login/?$', UserLoginView.as_view()),
     re_path('user/login/?$', UserLoginView.as_view()),
@@ -12,4 +13,5 @@ urlpatterns = [
     re_path('process/detail/?$', ProcessDetailView.as_view()),
     re_path('process/detail/?$', ProcessDetailView.as_view()),
     re_path('process/delete/?$', ProcessDeleteView.as_view()),
     re_path('process/delete/?$', ProcessDeleteView.as_view()),
     re_path('system/detail/?$', SystemDetailView.as_view()),
     re_path('system/detail/?$', SystemDetailView.as_view()),
+    re_path('photo/?$', PhotoMonitorView.as_view())
 ]
 ]