当前位置: 首页 > news >正文

wzl-django学习

####################################################总的urls.py

from django.contrib import admin
from django.urls import path,include, re_path
from django.views.static import serve
from django.conf import settings
from drf_yasg import openapi
from drf_yasg.views import get_schema_view
from rest_framework import permissions
from django.views.generic.base import RedirectView
from rest_framework_simplejwt.views import (
    TokenRefreshView,
)

from mysystem.views.login import LoginView,CaptchaView
from utils.swagger import CustomOpenAPISchemaGenerator

#前端接口view
from apps.logins.views import UsernamePassWordLoginView,APPMobilePasswordLoginView,SendSmsCodeView,APPMobileSMSLoginView,ForgetPasswdResetView,RegisterView
from apps.lyusers.views import SetUserNicknameView,ChangeAvatarView,uploadImagesView,DestroyUserView
from apps.lymessages.views import UserMessagesView,UserMessagesNoticeView,GetUnreadMessageNumView
from apps.platformsettings.views import *


#媒体文件流式响应
from utils.streamingmedia_response import streamingmedia_serve
#部署vue
from django.views.generic import TemplateView
#是否允许前端接口访问
from utils.middleware import OperateAllowFrontendView

schema_view = get_schema_view(
    openapi.Info(
        title="django-vue-lyadmin API",
        default_version='v1',
        # description="Test description",
        # terms_of_service="https://www.google.com/policies/terms/",
        # contact=openapi.Contact(email="contact@snippets.local"),
        # license=openapi.License(name="BSD License"),
    ),
    # public 如果为False,则只包含当前用户可以访问的端点。True返回全部
    public=True,
    permission_classes=(permissions.AllowAny,),# 可以允许任何人查看该接口
    # permission_classes=(permissions.IsAuthenticated) # 只允许通过认证的查看该接口
    generator_class=CustomOpenAPISchemaGenerator,
)

urlpatterns = [
    path('static/<path:path>', serve, {'document_root': settings.STATIC_ROOT},),  # 处理静态文件
    # path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT},),  # 处理媒体文件
    path('media/<path:path>', streamingmedia_serve, {'document_root': settings.MEDIA_ROOT}, ),  # 处理媒体文件

    #管理后台的标准接口
    path('api/system/', include('mysystem.urls')),
    path('api/monitor/', include('lymonitor.urls')),
    path('api/terminal/', include('lywebsocket.urls')),
    path('api/token/', LoginView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    path('api/captcha/', CaptchaView.as_view()),

    #管理后台其他自定义接口
    path('api/platformsettings/', include('apps.platformsettings.urls')),
    path('api/messages/', include('apps.lymessages.urls')),
    path('api/users/', include('apps.lyusers.urls')),
    path('api/crontab/', include('apps.lycrontab.urls')),
    path('api/wholeMachine/', include('apps.wholeMachine.urls')),


    #获取平台信息
    path('api/getsysconfig/', GetSystemConfigSettingsView.as_view(), name='前端用户获取平台其他设置'),
    path('api/getothersettings/', GetOtherManageDetailView.as_view(), name='前端用户获取平台其他设置'),
    path('api/getrotationimgs/', GetLunboManageListView.as_view(), name='前端用户获取平台轮播图设置'),


    #是否允许前端接口访问(临时操作,重启后无效)
    path('api/super/operate/', OperateAllowFrontendView.as_view(), name='超级管理员动态操作是否允许前端api接口访问'),

    #集成部署后端管理页面

    path('favicon.ico',RedirectView.as_view(url=r'static/favicon.ico')),
    path('', TemplateView.as_view(template_name="index.html"),name='后台管理默认页面'),
]

####################################################models.py

from django.db import models
from utils.models import CoreModel
from application import settings

# ================================================= #
# ************** 服务器分类 model  ************** #
# ================================================= #


class ServersUsage(CoreModel):
    """整机用途"""
    objects = None
    name = models.CharField(max_length=255, unique=True, verbose_name='名称')
    desc = models.CharField( max_length=255,null=True, blank=True,verbose_name='描述')
    sort = models.PositiveSmallIntegerField(default=0, verbose_name="排序", help_text="显示顺序")
    status = models.BooleanField(default=True, verbose_name="整机用途状态", help_text="整机用途状态")
    is_delete = models.BooleanField(default=False, verbose_name="是否逻辑删除", help_text="是否逻辑删除")
    class Meta:
        db_table = 'tb_servers_usage'
        verbose_name = '整机用途'
        verbose_name_plural = verbose_name
    def __str__(self):
        return self.name


class ServersModel(CoreModel):
    """整机机型"""
    objects = None
    name = models.CharField( max_length=255,unique=True, verbose_name='名称')
    area= models.CharField(max_length=255, null=True, verbose_name='设备领域')
    desc = models.CharField( max_length=255,null=True, blank=True,verbose_name='描述')
    sort = models.PositiveSmallIntegerField(default=0, verbose_name="排序", help_text="显示顺序")
    status = models.BooleanField(default=True, verbose_name="整机机型状态", help_text="整机机型状态")
    is_delete = models.BooleanField(default=False, verbose_name="是否逻辑删除", help_text="是否逻辑删除")

    class Meta:
        db_table = 'tb_servers_model'
        verbose_name = '整机机型'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

# # ================================================= #
# # ************** 跳板机信息 ************** #
# # ================================================= ##
class JumpServers(CoreModel):
    """跳板机信息"""
    jumpip = models.CharField(max_length=255, verbose_name="跳板机IP")
    jumpuser = models.CharField(max_length=255, verbose_name="跳板机user")
    jumppassword= models.CharField(max_length=255,verbose_name="跳板机password")


# ================================================= #
# ************** 整机信息 ************** #
# ================================================= #

class ServersInfo(CoreModel):
    """整机信息"""
    objects = None
    serverFrom  = models.CharField(max_length=255,blank=True, null=True, verbose_name="信息来源")  #
    serverCode  = models.CharField(max_length=255,blank=False, null=False, unique=True,verbose_name="设备编号")  #
    location = models.CharField(max_length=255, blank=False, null=False,  verbose_name="设备位置")
    hardware = models.CharField(max_length=255, blank=True, null=True, verbose_name="硬件配置")
    serversModel = models.ForeignKey(ServersModel, on_delete=models.PROTECT,blank=False, null=False,verbose_name='设备型号')
    serversUsage = models.ForeignKey(ServersUsage, on_delete=models.PROTECT, blank=False, null=False,verbose_name='设备用途')
    status = models.BooleanField(default=True, verbose_name="设备状态", help_text="设备状态")
    bmcIP = models.CharField(max_length=255, verbose_name="BMC地址")
    bmcUser = models.CharField(max_length=255, verbose_name="bmcuser",blank=True)
    bmcPassword= models.CharField(max_length=255, verbose_name="bmcpassword",blank=True)
    hostIP = models.CharField(max_length=255, verbose_name="host地址",blank=True)
    hostUser = models.CharField(max_length=255, verbose_name="hostUser", blank=True)
    hostPassword = models.CharField(max_length=255, verbose_name="hostPassword", blank=True)
    serialIP = models.CharField(max_length=255, verbose_name="串口地址", blank=True,null=True)
    serialPort= models.CharField(max_length=255, verbose_name="串口端口", blank=True,null=True)
    serialUser = models.CharField(max_length=255, verbose_name="串口User",  blank=True,null=True)
    serialPassword = models.CharField(max_length=255, verbose_name="串口Password",blank=True,null=True)
    toolingMachine = models.CharField(max_length=255, verbose_name="工装机", blank=True,null=True)
    borrowUser = models.CharField(max_length=255, null=True, blank=True,verbose_name="借用人")
    borrowFromtime= models.DateField(null=True, blank=True, verbose_name="借用时间")
    borrowEndtime= models.DateField(null=True, blank=True,  verbose_name="归还时间")
    borrowUse= models.CharField(max_length=255, verbose_name="借用用途", blank=True,null=True)
    notes = models.TextField( verbose_name="备注", blank=True,null=True)
    missingStatus = models.BooleanField( default=True, verbose_name="联通状态")
    recordStatus =models.BooleanField( default=False,verbose_name="备案不下电")
    jumpserver = models.ForeignKey(JumpServers, on_delete=models.SET_NULL,null=True,  verbose_name='跳板机')
    class Meta:
        db_table = 'tb_servers_info'
        verbose_name = '服务器信息'
        verbose_name_plural = verbose_name
    def __str__(self):
        return self.serverscode

class HostOffRecord(CoreModel):
    """下电记录"""
    servers = models.ForeignKey(ServersInfo, on_delete=models.PROTECT, verbose_name='整机')
    status = models.BooleanField( verbose_name="下电是否成功")
    class Meta:
        db_table = 'tb_servers_hostoffrecord'
        verbose_name = 'host下电记录'
        verbose_name_plural = verbose_name

class ServersUseRecord(CoreModel):
    """整机使用记录"""
    servers = models.ForeignKey(ServersInfo, on_delete=models.CASCADE, verbose_name='整机')
    borrowUser = models.CharField(max_length=255,verbose_name="借用人", blank=True)
    borrowFromtime= models.DateField(null=True, blank=True, verbose_name="借用时间")
    borrowEndtime= models.DateField(null=True, blank=True,  verbose_name="归还时间")
    class Meta:
        db_table = 'tb_servers_useRecord'
        verbose_name = '整机使用记录'
        verbose_name_plural = verbose_name

############views.py

import openpyxl
from django.db.models import Count, Q, Case, When, IntegerField, Value
from django.utils.timezone import now
from django_filters.rest_framework import DjangoFilterBackend
from apps.wholeMachine.models import ServersUsage, ServersModel, ServersInfo
from rest_framework import serializers
from apps.wholeMachine.mytools import is_valid_date
from utils.export_excel import export_excel
from utils.jsonResponse import SuccessResponse, ErrorResponse
from utils.serializers import CustomModelSerializer
from utils.viewset import CustomModelViewSet
class ServersUsageManageSerializer(CustomModelSerializer):
    """
    服务器用途-序列化器
    """
    class Meta:
        model = ServersUsage
        read_only_fields = ["id"]
        fields = '__all__'
class ServersUsageManageViewSet(CustomModelViewSet):
    """
    服务器用途 接口
    """
    queryset = ServersUsage.objects.all().order_by("sort")
    serializer_class = ServersUsageManageSerializer
    search_fields = ('name','status')
class ServersModelManageSerializer(CustomModelSerializer):
    """
    服务器机型-序列化器
    """
    class Meta:
        model = ServersModel
        read_only_fields = ["id"]
        fields = '__all__'

class ServersModelManageSerializer_UsageandModel(serializers.Serializer):
    serversUsage__name = serializers.CharField()
    serversUsage = serializers.CharField()
    serversModel__name= serializers.CharField()
    serversModel= serializers.CharField()
    serversCount = serializers.IntegerField()
    serversCount_dis = serializers.IntegerField()
class ServersModelManageViewSet(CustomModelViewSet):
    """
    服务器机型 接口
    """
    queryset = ServersModel.objects.all().order_by("sort")
    serializer_class = ServersModelManageSerializer
    search_fields = ('name',)
    filterset_fields = ('status','area',)
    def getArea(self,request,*args, **kwargs):
        queryset =  ServersModel.objects.values('area')
        return SuccessResponse(data=queryset, msg='success')

class ServersInfoManageSerializer(CustomModelSerializer):
    """
    整机信息-序列化器
    """
    serversmodel_area = serializers.SerializerMethodField(read_only=True)
    serversmodel_name = serializers.SerializerMethodField(read_only=True)
    serversusage_name = serializers.SerializerMethodField(read_only=True)
    def get_serversmodel_area(self,obj):
        if obj.serversModel :
            return obj.serversModel.area
    def get_serversmodel_name(self,obj):
        if obj.serversModel :
            return obj.serversModel.name
    def get_serversusage_name(self,obj):
        if obj.serversUsage :
            return obj.serversUsage.name
    class Meta:
        model = ServersInfo
        read_only_fields = ["id"]
        fields = '__all__'

class ExportServersInfoManageSerializer(CustomModelSerializer):
    """
    导出 整机信息 简单序列化器
    """
    serversmodel_area = serializers.SerializerMethodField(read_only=True)
    serversusage_name = serializers.SerializerMethodField(read_only=True)
    serversmodel_name = serializers.SerializerMethodField(read_only=True)
    def  get_serversmodel_area(self,obj):
        if obj.serversModel :
            return obj.serversModel.area
    def get_serversusage_name(self,obj):
        if obj.serversUsage :
            return obj.serversUsage.name
    def get_serversmodel_name(self,obj):
        if obj.serversModel :
            return obj.serversModel.name
    class Meta:
        model = ServersInfo
        fields = ('serverCode', 'location','serversmodel_area', 'serversusage_name','serversmodel_name','bmcip','bmcuser','bmcpassword','serialIP','serialPort')
# class ServersInfoCountSerializer_TypeandModel(serializers.Serializer):
#     serversModel__area = serializers.CharField()
#     serversModel__name= serializers.CharField()
#     serversModel= serializers.CharField()
#     serversCount = serializers.IntegerField()
#     serversCount_dis = serializers.IntegerField()
#     serversCount_nouse = serializers.IntegerField()


class ServersInfoManageViewSet(CustomModelViewSet):
    """
    整机信息 接口
    """
    queryset = ServersInfo.objects.filter(status=1).order_by("-create_datetime")
    # queryset = ServersInfo.objects.all().order_by("-create_datetime")
    serializer_class =  ServersInfoManageSerializer
    create_serializer_class =  ServersInfoManageSerializer
    update_serializer_class =ServersInfoManageSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = {
        'serverCode': ['icontains'],
        'serverFrom': ['icontains'],
        'hardware': ['icontains'],
        'borrowEndtime': ['lte'],
        'serversUsage': ['exact'],
        'serversModel': ['exact'],
        'serversModel__area': ['exact'],
    }
    search_fields = ('serverCode', 'serverFrom', 'hardware')
    def get_queryset(self):
        queryset = super().get_queryset()
        search_param = self.request.query_params.get('search', None)
        borrow_user_is_null = self.request.query_params.get('borrowUserIsNull', None)
        borrow_endtime_earlier_param = self.request.query_params.get('borrowEndtimeEarlierThan', None)
        borrow_endtime_later_param = self.request.query_params.get('borrowEndtimeLaterThan', None)
        if borrow_user_is_null is not None:
            borrow_user_is_null = borrow_user_is_null.lower()=='true'
            queryset = queryset.filter(borrowUser__isnull=borrow_user_is_null)
        if search_param:
            queryset = queryset.filter(
                Q(serverCode__icontains=search_param) |
                Q(serverFrom__icontains=search_param) |
                Q(hardware__icontains=search_param)|
                Q(bmcIP__icontains=search_param)
            )
        if borrow_endtime_earlier_param:
            queryset = queryset.filter(
                Q(borrowEndtime__lt=borrow_endtime_earlier_param) | Q(borrowEndtime__isnull=True)
            )
        if borrow_endtime_later_param:
            queryset = queryset.filter(
                Q(borrowEndtime__gte=borrow_endtime_later_param) | Q(borrowEndtime__isnull=True)
            )
        return queryset


    def countAll(self,request,*args, **kwargs):
        total_books = ServersInfo.objects.count()
        serversCount_dis = ServersInfo.objects.filter(missingStatus=0).count()
        data = {
            'total_books': total_books,
            'serversCount_dis':serversCount_dis,
        }
        return SuccessResponse(data=data, msg='success')

    def countbyAreaandModel(self,request,*args, **kwargs):
        current_date = now().date()
        queryset =  ServersInfo.objects.values('serversModel__area', 'serversModel__name','serversModel').annotate(
            serversCount=Count('id'),
            serversCount_dis=Count('id', filter=Q(missingStatus=0)),
            serversCount_nouse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        ((Q(borrowEndtime__lt=current_date) & Q(borrowUser__isnull=False)) |
                         Q(borrowUser__isnull=True)),
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            ),
            serversCount_inuse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        (Q(borrowEndtime__gte=current_date) | Q(borrowEndtime__isnull=True)) &
                        Q(borrowUser__isnull=False),
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            )
        ).order_by('-serversCount')
        # serializer = ServersInfoCountSerializer_TypeandModel(queryset, many=True)
        return SuccessResponse(data=queryset, msg='success')
    def countbyArea(self,request,*args, **kwargs):
        current_date = now().date()
        queryset =  ServersInfo.objects.values('serversModel__area').annotate(
            serversCount=Count('id'),
            serversCount_dis = Count('id', filter=Q(missingStatus=0)),
            serversCount_nouse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        ((Q(borrowEndtime__lt=current_date) & Q(borrowUser__isnull=False)) |
                         Q(borrowUser__isnull=True)),
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            ),
            serversCount_inuse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        (Q(borrowEndtime__gte=current_date) | Q(borrowEndtime__isnull=True))&
                        Q(borrowUser__isnull=False),
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            )
        ).order_by('-serversCount')
        return SuccessResponse(data=queryset, msg='success')

    def countbyUsageandModel(self,request,*args, **kwargs):
        current_date = now().date()
        queryset =  ServersInfo.objects.values('serversModel__name','serversUsage__name','serversModel','serversUsage').annotate(
            serversCount=Count('id'),
            serversCount_dis = Count('id', filter=Q(missingStatus=0)),
            serversCount_nouse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        ((Q(borrowEndtime__lt=current_date) & Q(borrowUser__isnull=False)) |
                         Q(borrowUser__isnull=True)),
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            ),
            serversCount_inuse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        (Q(borrowEndtime__gte=current_date) | Q(borrowEndtime__isnull=True)) &
                        Q(borrowUser__isnull=False),
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            )

        ).order_by('-serversModel__name','-serversCount')
        # serializer = ServersInfoCountSerializer_UsageandModel(queryset, many=True)
        return SuccessResponse(data=queryset, msg='success')
    def countbyUsage(self,request,*args, **kwargs):
        current_date = now().date()
        queryset =  ServersInfo.objects.values('serversUsage__name','serversUsage').annotate(
            serversCount=Count('id'),
            serversCount_dis = Count('id', filter=Q(missingStatus=0)),
            serversCount_nouse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        ((Q(borrowEndtime__lt=current_date) & Q(borrowUser__isnull=False)) |
                         Q(borrowUser__isnull=True)),
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            ),
            serversCount_inuse=Count(
                Case(
                    When(
                        Q(serversUsage__name='公共资源') &
                        (Q(borrowEndtime__gte=current_date) | Q(borrowEndtime__isnull=True))&
                        Q(borrowUser__isnull=False),
                        # queryset=queryset.filter(borrowUser__isnull=borrow_user_is_null)
                        then=Value(1)
                    ),
                    output_field=IntegerField()
                )
            )
        ).order_by('-serversCount')
        return SuccessResponse(data=queryset, msg='success')

    def exportexecl(self, request):
        field_data =  ['服务器编号', '服务器位置', '整机类别', '整机用途', '整机型号', 'BMCIP','bmcuser','bmcpassword','串口地址','串口端口']
        queryset = self.filter_queryset(self.get_queryset())
        data = ExportServersInfoManageSerializer(queryset, many=True).data
        return SuccessResponse(data=export_excel(request, field_data, data, '服务器数据.xls'), msg='success')

    def importexcel(self,request, *args, **kwargs):
        """
        导入execl中字段如果为数字会自动加.0 ,解决方法:execl设置该列为文本型
        """
        f = request.FILES.get('file')
        if not f:
            return ErrorResponse(msg="未找到上传的文件")
        excel_type = f.name.split('.')[1]
        if excel_type not in ['xlsx']:
            return ErrorResponse(msg="仅允许导入xlsx文件")
        workbook = openpyxl.load_workbook(filename=f,read_only=True)
        sheet = workbook.active
        data_import_list = []
        error_import_list = []
        rowsnum=1
        existing_server_codes = set(ServersInfo.objects.values_list('serverCode', flat=True))
        for rowvalue in sheet.iter_rows(min_row=2, values_only=True):
            rowsnum = rowsnum+1
            errordict={}
            errordict['rowsnum']= rowsnum
            serverCode = rowvalue[2]
            if serverCode is not None:
                # serverCode = serverCode.replace(' ', '')
                serverCode = serverCode.strip()
            else:
                errordict['serverCode'] = f'设备编号错误----{serverCode}'
                error_import_list.append(errordict)
                continue
            if serverCode in existing_server_codes:
                errordict['serverCode'] = f'serverCode 重复----{serverCode}'
                error_import_list.append(errordict)
                continue
            serversUsage =rowvalue[5]
            if serversUsage != None:
                serversUsage =rowvalue[5].replace(' ', '')
            else:
                errordict['serversUsage'] = f'设备用途错误----{serversUsage}'
                error_import_list.append(errordict)
                continue
            servers_Info_obj=False
            try:
                servers_Info_obj =  ServersInfo.objects.get(serverCode=serverCode)
            except :
                print('')
            if servers_Info_obj:
                errordict['serverCode'] = f'serverCode重复----{serverCode}'
                error_import_list.append(errordict)
                continue
            serversModel=''
            index = serverCode.find('-')
            print()
            if index != -1:
                serversModel=serverCode[:index]
            else:
                serversModel = serverCode
            try:
                servers_model_obj = ServersModel.objects.get(name=serversModel)
            except ServersModel.DoesNotExist as e:
                errordict['ServersModel']=f'设备机型不在机型列表中---{serversModel}'
                error_import_list.append(errordict)
                continue
            try:
                servers_Usage_obj =ServersUsage.objects.get(name=rowvalue[5])
            except ServersUsage.DoesNotExist as e:
                errordict['ServersUsage'] = f'设备用途不在用途列表中---{rowvalue[5]}'
                error_import_list.append(errordict)
                continue
            borrowFromtime = rowvalue[9]
            borrowEndtime = rowvalue[10]
            if borrowFromtime!=None:
                borrowFromtime=borrowFromtime.replace(' ', '').replace('\ufeff','')
                if borrowFromtime!=''and is_valid_date(borrowFromtime) == False:
                    errordict['borrowFromtime'] = f'borrowFromtime日期格式不对---{borrowFromtime}'
                    error_import_list.append(errordict)
                    continue
                if borrowFromtime == '':
                    borrowFromtime = None
            if borrowEndtime != None:
                borrowEndtime= borrowEndtime.replace(' ', '').replace('\ufeff','')
                if borrowEndtime!='' and is_valid_date(borrowEndtime) == False:
                    errordict['borrowEndtime'] = f'borrowEndtime日期格式不对---{borrowEndtime}'
                    error_import_list.append(errordict)
                    continue
                if borrowEndtime == '':
                    borrowEndtime = None
            borrowUser = rowvalue[8]
            if borrowUser != None:
                borrowUser=borrowUser.replace(' ', '').replace('\ufeff','')
                if len(borrowUser) > 130:
                    errordict['borrowUser'] = f'borrowUser数据错误---{borrowUser}'
                    error_import_list.append(errordict)
                    continue
                if borrowUser=='':
                    borrowUser = None

            try:
                data_dict = {
                    'serverFrom':rowvalue[1] ,
                    'serverCode':serverCode,
                    'serversModel':servers_model_obj ,
                    'location':rowvalue[3],
                    'hardware':rowvalue[4],
                    'serversUsage':servers_Usage_obj,
                    'bmcIP':rowvalue[6],
                    'hostIP':rowvalue[7],
                    'borrowUser':borrowUser,
                    'borrowFromtime':borrowFromtime,
                    'borrowEndtime':borrowEndtime,
                    'borrowUse':rowvalue[11],
                    'notes':rowvalue[12]
                }
                obj = ServersInfo(**data_dict)
                data_import_list.append(obj)
                existing_server_codes.add(serverCode)  # 将当前 serverCode 添加到已存在集合中
            except Exception as e:
                errordict['datachange'] = e
                error_import_list.append(errordict)
                continue
        lenObjects=len(data_import_list)
        lenOerror=len(error_import_list)
        ServersInfo.objects.bulk_create(data_import_list)
        return SuccessResponse(data= error_import_list, msg=f"导入{lenObjects}行,错误行数{lenOerror}")

相关文章:

wzl-django学习

####################################################总的urls.py from django.contrib import admin from django.urls import path,include, re_path from django.views.static import serve from django.conf import settings from drf_yasg import openapi from drf_yas…...

《AI强化学习:元应用中用户行为引导的智能引擎》

在科技飞速发展的当下&#xff0c;元应用正以前所未有的速度融入我们的生活&#xff0c;从沉浸式的虚拟社交到高度仿真的工作模拟&#xff0c;元应用构建出一个个丰富多彩的虚拟世界。而在这背后&#xff0c;人工智能的强化学习技术宛如一位无形却强大的幕后推手&#xff0c;深…...

Django基础环境准备

Django基础环境准备 文章目录 Django基础环境准备1.准备的环境 win11系统&#xff08;运用虚拟环境搭建&#xff09;1.1详见我的资源win11环境搭建 2.准备python环境2.1 winr 打开命令提示符 输入cmd 进入控制台2.2 输入python --version 查看是否有python环境2.3在pyhton官网下…...

机器视觉线阵相机分时频闪选型/机器视觉线阵相机分时频闪选型

在机器视觉系统中,线阵相机的分时频闪技术通过单次扫描切换不同光源或亮度,实现在一幅图像中捕捉多角度光照效果,从而提升缺陷检测效率并降低成本。以下是分时频闪线阵相机的选型要点及关键考量因素: 一、分时频闪技术的核心需求 多光源同步控制 分时频闪需相机支持多路光源…...

【企业场景】上线的项目如何进行限流

一、常见的四种速率限流算法 对于限流&#xff0c;最为直接的就是速率限流了 固定窗口算法 比如 10r/s 就是把时间线分为 1s 一段&#xff0c;也就是周期为 1s&#xff0c;对一个时间段的请求进行计数&#xff0c;超过 10 则舍弃&#xff0c;未超过则直接处理经过 1s 后&…...

【FL0090】基于SSM和微信小程序的球馆预约系统

&#x1f9d1;‍&#x1f4bb;博主介绍&#x1f9d1;‍&#x1f4bb; 全网粉丝10W,CSDN全栈领域优质创作者&#xff0c;博客之星、掘金/知乎/b站/华为云/阿里云等平台优质作者、专注于Java、小程序/APP、python、大数据等技术领域和毕业项目实战&#xff0c;以及程序定制化开发…...

用大白话解释缓存Redis +MongoDB是什么有什么用怎么用

Redis和MongoDB是什么&#xff1f; Redis&#xff1a;像你家的“小冰箱”&#xff0c;专门存高频使用的食物&#xff08;数据&#xff09;。它是基于内存的键值数据库&#xff0c;读写速度极快&#xff08;每秒超10万次操作&#xff09;。比如你每次打开手机App&#xff0c;用…...

软件测试需求分析如何实施?专业软件测试服务公司分享

在现代软件开发中&#xff0c;软件测试需求分析被认为是确保软件质量的关键环节之一。软件测试需求分析是指在软件开发过程中&#xff0c;对测试需求进行系统性分析的过程。它旨在确定软件系统功能、性能及其他非功能性需求的具体细节&#xff0c;从而为后续的测试活动提供指导…...

pg pg_prewarm用法

按照插件 > create extension pg_prewarm ;缓存表 > test# select pg_prewarm(weather,buffer ) ; pg_prewarm > ------------ > 1缓存表部分内容 test# select pg_prewarm(weather,buffer,main,0,0) ;pg_prewarm ------------1 (1 row)表大小只有0号…...

2025年光电科学与智能传感国际学术会议(ICOIS 2025)

重要信息 官网&#xff1a;www.ic-icois.org 时间&#xff1a;2025年3月14-16日 地点&#xff1a;中国-长春 简介 2025年光电科学与智能传感国际学术会议&#xff08;ICOIS 2025&#xff09;将于2025年3月14-16日在中国-长春隆重召开。会议将围绕“光学光电”、“智能传感”…...

uni小程序wx.switchTab有时候跳转错误tab问题,解决办法

在一个子页面里面使用uni.switchTab或者wx.switchTab跳转到tab菜单的时候&#xff0c;先发送了一个请求&#xff0c;然后执行跳转到tab菜单&#xff0c;但是这个时候&#xff0c;出错了........也是非常的奇怪&#xff0c;不加请求就没问题......但是业务逻辑就是要先执行某个请…...

python-leetcode-下一个排列

31. 下一个排列 - 力扣&#xff08;LeetCode&#xff09; class Solution:def nextPermutation(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""# Step 1: Find the first decreasing element …...

如何获取mac os 安装盘

发现虚拟机VirtualBox支持Mac虚拟&#xff0c;就想尝试一下。但是发现Mac的安装盘特别难拿到&#xff0c;因此留档。 第一种方法 在mac环境下&#xff0c;使用softwareupdate命令来获取mac安装&#xff0c;能获得当前设备支持的系统。 使用这个命令&#xff1a;/usr/sbin/soft…...

常见AI写作工具介绍(ChatGPT 4o、DeepClaude、Claude 3.5 Sonnet 、DeepSeek R1等)

AI写作工具介绍 1. ChatGPT-4o ChatGPT-4o是OpenAI于2024年5月发布的最新旗舰模型&#xff0c;相比之前的版本&#xff0c;它在多模态支持和实时推理能力上有了显著提升。它能够处理和理解音频、图像和文本数据&#xff0c;适用于复杂的图像分析、语音识别等应用场景[1]。 2…...

环境会影响你的决策:K近邻算法(KNN)

环境会影响你的决策&#xff1a;K近邻算法&#xff08;KNN) 1. 核心思想与流程 KNN是一种基于局部相似性的分类算法&#xff0c;核心思想是“近朱者赤”&#xff1a;待测样本的类别由其最近的k个邻居的多数类别决定。 关键步骤&#xff1a; 定义空间与距离&#xff1a;通常采…...

JMeter 中实现 100 个用户在 3 秒内并发登录

在 JMeter 中实现 100 个用户在 3 秒内并发登录,需要合理配置线程组、定时器和测试逻辑。以下是具体步骤: 1. 创建测试计划 打开 JMeter。右键点击“Test Plan”,选择 Add > Threads (Users) > Thread Group。 : 设置为 100(模拟 100 个用户)。 : 设置为 3...

2-3文件的属性信息

文章目录 1 file命令2 stat命令 1 file命令 用来识别文件类型 # 参数的位置是任意的 file 文件名 [参数]-b 只显示文件类型和文件编码&#xff0c;不显示文件名-i 显示文件的MIME类型-F 设置输出字符串的分隔符-L 查看软链接文件自身文件属性liyblyb:/tmp$ file xxxtmp.log …...

【云原生之kubernetes实战】在k8s环境中高效部署Vikunja任务管理工具(含数据库配置)

【【云原生之kubernetes实战】在k8s环境中高效部署Vikunja任务管理工具(含数据库配置) 前言一、Vikunja介绍1.1 Vikunja简介1.2 Vikunja主要特点1.3 使用场景二、相关知识介绍2.1 本次实践存储介绍2.2 k8s存储介绍三、本次实践介绍3.1 本次实践简介3.2 本次环境规划3.3 部署前…...

(IDE接入DeepSeek)简单了解DeepSeek接入辅助开发与本地部署建议

重点&#xff1a;IDE接入DeepSeek是否收费 收费&#xff01; 本文章主要是为了给小白避雷&#xff0c;目前很多文章告诉大家怎么接入DeepSeek&#xff0c;但是并未告知大家是否收费。如果是想白嫖的&#xff0c;就可以不用去接入了。 一、引言 最近爆火的AI人工智能工具DeepSe…...

TCP的三次握手与四次挥手:建立与终止连接的关键步骤

引言 ‌TCP&#xff08;传输控制协议&#xff09;工作在OSI模型的传输层‌。OSI模型将计算机网络功能划分为七个层级&#xff0c;从底层到顶层依次是&#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。传输层负责在网络节点之间提供可靠的端到端通信&a…...

CMU15445(2023fall) Project #3 - Query Execution(上)详细分析

晚日寒鸦一片愁 柳塘新绿却温柔 若教眼底无离恨 不信人间有白头 ——鹧鸪天 完整代码见&#xff1a; SnowLegend-star/CMU15445-2023fall: Having Conquered the Loftiest Peak, We Stand But a Step Away from Victory in This Stage. With unwavering determination, we pre…...

.sql文件怎么打开

.sql 文件是一个 SQL 脚本文件&#xff0c;通常包含了数据库的 SQL 查询语句&#xff0c;可以是创建数据库、创建表、插入数据、查询数据等操作。要打开并查看 .sql 文件&#xff0c;你可以使用以下几种方法&#xff1a; 1. 使用文本编辑器打开 .sql 文件是一个文本文件&…...

【Swift 算法实战】城市天际线问题解法

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

Linux的软件安装

Linux命令行内的“应用商店” yum命令安装软件。 yum命令&#xff1a; yum&#xff1a;RPM软件管理器&#xff0c;用于自动化安装配置Linux软件&#xff0c;可以自动解决依赖问题。 语法&#xff1a;yum [-y] [install | remove | search] 软件名称 选项&#xff1a;-y。自动确…...

需求和开发模型

文章目录 什么是需求&#xff1f;用户需求软件需求用户需求和软件需求的不同 开发模型什么是“模型”&#xff1f;软件的生命周期常见的开发模型瀑布模型&#xff08;Waterfall Model&#xff09;螺旋模型增量模型、迭代模型敏捷模型 测试模型V 模型W 模型&#xff08;双 V 模型…...

unity学习61:UI布局layout

目录 1 布局 layout 1.1 先准备测试UI,新增这样一组 panel 和 image 1.2 新增 vertical layout 1.3 现在移动任意一个image 都会影响其他 1.3.1 对比 如果没有这个&#xff0c;就会是覆盖效果了 1.3.2 对比 如果没有这个&#xff0c;就会是覆盖效果了 1.4 总结&#xf…...

腾讯混元文生图大模型(Hunyuan-DiT)与Stable Diffusion(SD)对比分析

腾讯混元文生图大模型&#xff08;Hunyuan-DiT&#xff09;与Stable Diffusion&#xff08;SD&#xff09;对比分析 腾讯混元文生图大模型&#xff08;Hunyuan-DiT&#xff09;与Stable Diffusion&#xff08;SD&#xff09;作为当前文生图领域的两大代表模型&#xff0c;各自…...

Flume

Flume安装配置 使用的三台主机名称分别为bigdata1&#xff0c;bigdata2&#xff0c;bigdata3。所使用的安装包名称按自己的修改&#xff0c;安装包可去各大官网上下载 1.解压 将Master节点Flume安装包解压到/opt/module目录下 tar -zxvf /opt/software/apache-flume-1.9.0-bi…...

【Python LeetCode】面试经典 150 题

数组 / 字符串快慢指针&#xff08;双指针&#xff09;总结88. 合并两个有序数组27. 移除元素26. 删除有序数组中的重复项80. 删除有序数组中的重复项 II Boyer-Moore 投票算法169. 多数元素扩展&#xff1a;寻找 n/3 多数元素 翻转法189. 轮转数组 贪心121. 买卖股票的最佳时机…...

营养助力:进行性核上性麻痹患者的饮食管理

进行性核上性麻痹是一种复杂的神经系统退行性疾病&#xff0c;科学的饮食管理不仅能够改善患者的营养状况&#xff0c;还能为神经系统提供必要的支持&#xff0c;延缓病情进展。 这种疾病会导致吞咽困难、营养吸收障碍等问题&#xff0c;增加营养不良的风险。针对性的饮食调理能…...

spineNET模型详解及代码复现

模型背景 在SpineNet模型诞生之前,多尺度特征融合已成为计算机视觉领域的研究热点。研究者们提出了各种方法来处理不同尺度的特征,如 特征金字塔网络(FPN) 和 深度可分离卷积 。然而,这些方法在跨尺度特征融合方面仍存在局限性。 FPN通过自上而下的路径融合不同尺度的特…...

【Mybatis】如何简单使用mybatis-plus,以及MybatisGenerator自动生成或者实现SQL语句

前言 &#x1f31f;&#x1f31f;本期讲解关于mybatis中SQL自动生成的相关知识介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;…...

ds-国内主要显卡

国产显卡 寒武纪思元系列 思元 370&#xff1a;采用 7nm 制程工艺及 chiplet 技术&#xff0c;集成 390 亿个晶体管&#xff0c;最大算力高达 256TOPS&#xff08;INT8&#xff09;。是国内第一款公开发布支持 LPDDR5 内存的云端 AI 芯片&#xff0c;内存带宽是上一代产品的 3 …...

类和对象——const修饰的类的对象和函数

const修饰的类的对象和函数 const成员函数和const对象1 const成员函数2 调用关系3 const在成员函数中的位置4 取地址&及const取地址操作符重载 const成员函数和const对象 1 const成员函数 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&…...

防火墙的智能选路与NAT实验

实验拓扑 配置IP 防火墙的安全区域划分 销售部和运维部不能互相访问&#xff0c;采取vlan的方式来进行隔离。 在配置vlan之后 &#xff0c;两个部门将不会通信。 以上是基础配置&#xff0c;只是演示在各个部门不通的情况下&#xff0c;使用什么技术来进行隔离网络&#xff0c;…...

ARM学习(43)armcc HardFault函数链接不到的问题理解

armcc HardFault函数链接不到的问题理解 1、问题背景&#xff1a; 笔者汇编语言编写了一个HardFault异常处理函数&#xff0c;HardFault函数属于芯片架构异常处理函数&#xff0c;没有显著的调用&#xff08;中断向量表中有该函数地址&#xff09;&#xff0c;且启动函数里面也…...

php序列化与反序列化

文章目录 基础知识魔术方法&#xff1a;在序列化和反序列化过程中自动调用的方法什么是 __destruct() 方法&#xff1f;何时触发 __destruct() 方法&#xff1f;用途&#xff1a;语法示例&#xff1a; 反序列化漏洞利用前提条件一些绕过策略绕过__wakeup函数绕过正则匹配绕过相…...

【STL】7.STL常用算法(2)

STL常用算法&#xff08;2&#xff09; 前言简介四.常用拷贝和替换算法1.copy2.replace3.replace_if4.swap 五.算术生成算法1.accumulate2.fill 六.常用集合算法1.set_intersection2.set_union3.set_difference 总结 前言 stl系列主要讲述有关stl的文章&#xff0c;使用STL可以…...

怎么获取免费的 GPU 资源完成大语言模型(LLM)实验

怎么获取免费的 GPU 资源完成大语言模型(LLM)实验 目录 怎么获取免费的 GPU 资源完成大语言模型(LLM)实验在线平台类Google ColabKaggle NotebooksHugging Face Spaces百度飞桨 AI Studio在线平台类 Google Colab 特点:由 Google 提供的基于云端的 Jupyter 笔记本环境,提…...

xr-frame 3D Marker识别,扬州古牌坊 3D识别技术稳定调研

目录 识别物体规范 3D Marker 识别目标文件 map 生成 生成任务状态解析 服务耗时&#xff1a; 对传入的视频有如下要求&#xff1a; 对传入的视频建议&#xff1a; 识别物体规范 为提高Marker质量&#xff0c;保证算法识别效果&#xff0c;可参考Marker规范文档 Marker规…...

盛京开源社区加入 GitCode,书写东北开源生态新篇章

在数字化转型与开源技术蓬勃发展的浪潮下&#xff0c;开源社区已成为推动技术创新的核心力量。盛京开源社区&#xff08;SJOSC&#xff09;作为沈阳地区的开源交流平台&#xff0c;始终致力于连接开发者、企业及高校&#xff0c;构建区域技术生态圈。 现在&#xff0c;盛京开源…...

【六祎 - Note】SQL备忘录;DDL,DML,DQL,DCL

SQL备忘录 from to : 点击访问源地址...

几个api

几个api 原型链 可以阅读此文 Function instanceof Object // true Object instanceof Function // true Object.prototype.isPrototypeOf(Function) // true Function.prototype.isPrototypeOf(Object) // true Object.__proto__ Function.prototype // true Function.pro…...

(转)Java单例模式(1)

l单例模式的好多&#xff1a;节约了内存&#xff0c;提高了代码的执行效率。...

return和print

目录 1.print的用法 2.return的用法 3. print 和 return 的区别 4.总结 1.print的用法 print 是一个函数&#xff0c;用于将信息输出到控制台&#xff08;终端&#xff09;。它主要用于显示程序运行的结果&#xff0c;方便用户查看。print 的作用是输出内容&#xff0c;而不…...

设计模式——过滤器模式在 Spring 中的实践

设计模式——过滤器模式在 Spring 中的实践 基础介绍模块介绍简单实现业务落地额外问题 基础介绍 过滤器模式&#xff08;Filter Pattern&#xff09;&#xff0c;也称为标准模式&#xff08;Criteria Pattern&#xff09;&#xff0c;是结构型设计模式之一&#xff0c;旨在通…...

15.7 LangChain 版智能销售顾问实战:构建企业级知识驱动型对话系统

LangChain 版智能销售顾问实战:构建企业级知识驱动型对话系统 关键词:LangChain 销售系统、知识图谱集成、对话状态管理、生产级部署、多链协同优化 1. LangChain 销售系统架构设计 1.1 模块化架构全景图 #mermaid-svg-42MLuD3aMcpX0y8c {font-family:"trebuchet ms&q…...

QT异步编程之线程池QThreadPool

一、概述 在一个应用程序中&#xff0c;我们需要多次使用线程&#xff0c;也就意味着&#xff0c;我们需要多次创建并销毁线程。而创建线程并销毁线程的过程势必会消耗内存。QThreadPool是Qt框架中用于管理线程池的类。它提供了一种高效的方式来管理和重用线程&#xff0c;从而…...

HTMLS基本结构及标签

HTML5是目前制作网页的核心技术&#xff0c;有叫超文本标记语言。 基本结构 声明部分位于文档的最前面&#xff0c;用于向浏览器说明当前文档使用HTML标准规范。 根部标签位于声明部分后&#xff0c;用于告知浏览器这是一个HTML文档。< html>表示文档开始&#xff0c;&l…...

linux(2)用户管理

文章目录 1. 切换用户2. 添加删除用户3.写改密码 1. 切换用户 # 切换用户名&#xff0c;不切换工作目录 su 用户名 # 一起切换工作目录 su - 用户名 # 退出用户 exit2. 添加删除用户 # 添加用户 sudo adduser username # 推荐sudo useradd -m -s /bin/bash 用户名-m 如果创建…...