Django-Vue 学习-VUE

主组件中有多个Vue组件

是指在Vue.js框架中,主组件是一个父组件,它包含了多个子组件(Vue组件)。这种组件嵌套的方式可以用于构建复杂的前端应用程序,通过拆分功能和视图,使代码更加模块化、可复用和易于维护。

Vue组件是Vue.js框架的核心概念之一,它是一个自定义的可重用的元素,包含了HTML模板、CSS样式和JavaScript逻辑。每个Vue组件可以有自己的状态(data)、计算属性(computed)、方法(methods)和生命周期钩子(lifecycle hooks),并且可以与其他组件进行通信。

优势:

  1. 模块化:将复杂的界面拆分成独立的组件,使代码结构更加清晰和可维护。
  2. 可复用:每个组件都可以被其他组件多次使用,提高了代码的复用性。
  3. 响应式:通过Vue.js的响应式系统,组件的状态变化可以自动驱动视图更新。
  4. 开发效率:使用Vue.js开发组件化的应用可以提高开发效率,减少重复代码的编写

一个VUE 组成多个VUE,比如一个VUE  ##############sanalysis.vue由多个VUE组成

<template>
    <div class="lycontainer">
        <el-scrollbar>
            <div>
                <ly-growcard :loading="showloading" :rows="2" ></ly-growcard>
            </div>
            <div :style="{ marginBottom: '20px' }">
              <lingyutongji :loading="showloading" :rows="5"></lingyutongji>
            </div>

<!--            <div class="echarts-inner">-->
<!--                <ly-echartcard :loading="showloading" :rows="3" ></ly-echartcard>-->
<!--            </div>-->
        </el-scrollbar>
    </div>
</template>

<script>
    import lingyutongji from "@/components/analysis/sectorTable.vue";
    import LyGrowcard from "@/components/analysis/growCard.vue";
    import LyEchartcard from "@/components/analysis/echartCard.vue";
    export default {
      // eslint-disable-next-line vue/multi-word-component-names
        name: "analysis",
        components: {LyGrowcard,lingyutongji},
        data(){
            return{
                showloading:true,

                echartsData:[

                ]
            }
        },
        created() {
            setTimeout(() => {
                this.showloading = false
            }, 600)
        },
    }
</script>
<style lang="scss" scoped>
    .lycontainer{
        width: 100%;
        height: calc(100vh - 130px); //动态计算长度值
    }
    .echarts-inner{
        margin-top: 1px;
    }
    ::v-deep(.el-scrollbar__bar.is-horizontal) {
        display: none;
    }

</style>

#################sectorTable.vue

<template>
  <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
    <el-tab-pane label="领域+机型统计" name="areaAndMode">
      <sectorTableAreaAndModel></sectorTableAreaAndModel>
    </el-tab-pane>
    <el-tab-pane label="用途+机型统计" name="UsageAndMode">
      <sectorTableUsageAndModel></sectorTableUsageAndModel>
    </el-tab-pane>
    <el-tab-pane label="领域统计" name="area">
        <sectorTableArea></sectorTableArea>
    </el-tab-pane>
    <el-tab-pane label="用途统计" name="Usage">
        <sectorTableUsage ></sectorTableUsage>
    </el-tab-pane>
  </el-tabs>
</template>
<script>


import sectorTableUsage from "@/components/analysis/sectorTableUsage.vue";
import sectorTableUsageAndModel from "@/components/analysis/sectorTableUsageAndModel.vue";
import sectorTableArea from "@/components/analysis/sectorTableArea.vue";
import sectorTableAreaAndModel from "@/components/analysis/sectorTableAreaAndModel.vue";
export default {
  components: {sectorTableArea,sectorTableAreaAndModel,sectorTableUsage,sectorTableUsageAndModel},
  data() {
    return {
      activeName: 'areaAndMode',
    };
  },
  methods: {
    handleClick(tab, event) {
      console.log(tab, event);
    },

  }
};
</script>

#####################sectorTableAreaAndModel.vue

<template>
  <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
    <el-tab-pane label="领域+机型统计" name="areaAndMode">
      <sectorTableAreaAndModel></sectorTableAreaAndModel>
    </el-tab-pane>
    <el-tab-pane label="用途+机型统计" name="UsageAndMode">
      <sectorTableUsageAndModel></sectorTableUsageAndModel>
    </el-tab-pane>
    <el-tab-pane label="领域统计" name="area">
        <sectorTableArea></sectorTableArea>
    </el-tab-pane>
    <el-tab-pane label="用途统计" name="Usage">
        <sectorTableUsage ></sectorTableUsage>
    </el-tab-pane>
  </el-tabs>
</template>
<script>

##################sectorTableUsage.vue

<template>
  <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
    <el-tab-pane label="领域+机型统计" name="areaAndMode">
      <sectorTableAreaAndModel></sectorTableAreaAndModel>
    </el-tab-pane>
    <el-tab-pane label="用途+机型统计" name="UsageAndMode">
      <sectorTableUsageAndModel></sectorTableUsageAndModel>
    </el-tab-pane>
    <el-tab-pane label="领域统计" name="area">
        <sectorTableArea></sectorTableArea>
    </el-tab-pane>
    <el-tab-pane label="用途统计" name="Usage">
        <sectorTableUsage ></sectorTableUsage>
    </el-tab-pane>
  </el-tabs>
</template>
<script>


import sectorTableUsage from "@/components/analysis/sectorTableUsage.vue";
import sectorTableUsageAndModel from "@/components/analysis/sectorTableUsageAndModel.vue";
import sectorTableArea from "@/components/analysis/sectorTableArea.vue";
import sectorTableAreaAndModel from "@/components/analysis/sectorTableAreaAndModel.vue";
export default {
  components: {sectorTableArea,sectorTableAreaAndModel,sectorTableUsage,sectorTableUsageAndModel},
  data() {
    return {
      activeName: 'areaAndMode',
    };
  },
  methods: {
    handleClick(tab, event) {
      console.log(tab, event);
    },

  }
};
</script>
 


import sectorTableUsage from "@/components/analysis/sectorTableUsage.vue";
import sectorTableUsageAndModel from "@/components/analysis/sectorTableUsageAndModel.vue";
import sectorTableArea from "@/components/analysis/sectorTableArea.vue";
import sectorTableAreaAndModel from "@/components/analysis/sectorTableAreaAndModel.vue";
export default {
  components: {sectorTableArea,sectorTableAreaAndModel,sectorTableUsage,sectorTableUsageAndModel},
  data() {
    return {
      activeName: 'areaAndMode',
    };
  },
  methods: {
    handleClick(tab, event) {
      console.log(tab, event);
    },

  }
};
</script>

#############sectorTableUsageAndModel.vue

<template>
  <div>
    <el-table
        :data="tableData"
        border
        style="width: 100%;">
      <el-table-column
          prop="serversModel__name"
          label="机型"
          width="180">
      </el-table-column>
      <el-table-column
          prop="serversUsage__name"
          label="设备数量">
      </el-table-column>

      <el-table-column
          label="设备数量">
        <template #default="scope">
          <el-link type="primary" @click="navigateToServersManage(scope.row.serversUsage,scope.row.serversModel,'all')">
            {{ scope.row.serversCount }}
          </el-link>
        </template>
      </el-table-column>
      <el-table-column
          label="空闲设备数量">
        <template #default="scope">
          <el-link type="primary" @click="navigateToServersManage(scope.row.serversUsage,scope.row.serversModel,'nouse')">
            {{ scope.row.serversCount_nouse}}
          </el-link>
        </template>
      </el-table-column>
      <el-table-column
          label="在用设备数量">
        <template #default="scope">
          <el-link type="primary" @click="navigateToServersManage(scope.row.serversUsage,scope.row.serversModel,'inuse')">
            {{ scope.row.serversCount_inuse}}
          </el-link>
        </template>
      </el-table-column>
      <el-table-column
          prop="serversCount_dis"
          label="失联设备数量">
      </el-table-column>
      <el-table-column
          prop="serversCount_dis"
          label="备案设备数量">
      </el-table-column>
      <el-table-column
          prop="serversCount_dis"
          label="下电失败数量">
      </el-table-column>
    </el-table>
  </div>
</template>


<script>
import { wholeMachineServersCountbyUsageandModel} from '@/api/api'
export default {
  data() {
    return {
      tableData:[],
    }
  },

  methods:{
    navigateToServersManage(serversUsage,serversModel,filter) {
      const currentDate = new Date().toISOString().split('T')[0];
      const query = { };
      if (filter === 'nouse') {
        query.borrowEndtimeEarlierThan = currentDate;
      } else if(filter === 'inuse') {
        query.borrowEndtimeLaterThan = currentDate;
        query.borrowUserIsNull = 'false';
      }
      query.serversUsage= serversUsage;
      query.serversModel= serversModel;
      this.$router.push({
        path: '/serversManage',
        query,
      });
    },

    async getData(){
      this.loadingPage = true
      wholeMachineServersCountbyUsageandModel(this.formInline).then(res => {
        this.loadingPage = false
        if(res.code ===2000) {
          this.tableData = res.data.data
          console.log(this.tableData )
        }
      })
    },
  },

  created() {
    this.getData()
  },
}
</script>
 

#################growCard.vue

<template>
  <el-row :gutter="20">
    <el-col :span="6" :xs="{span: 24}" :sm="{span: 24}" :md="{span: 6}" v-for="item in growData">
      <div :style="{height:height}" class="space-inner">
        <div class="lycard">
          <div class="space-header">
            <div class="space-header-title">{{item.title}}</div>
            <div class="space-header-extend-right">

            </div>
          </div>
          <el-skeleton :rows="rows" :animated="animated" :count="count" :loading="loading" style="padding: 20px;width: auto;overflow: hidden;">
            <template #default>
              <div class="space-main">
                <div class="space-main-up">
                  <span style="font-size: 24px;">{{ item.nums }}</span>
                  <div class="space-main-icon">
                    <el-avatar :size="50" :icon="item.icon.type" :style="{background:item.icon.background?item.icon.background:null}" />
                  </div>
                </div>
                <div class="space-main-down">

                </div>
              </div>
            </template>
          </el-skeleton>
        </div>
      </div>
    </el-col>
  </el-row>
</template>


<script>
import {wholeMachineServersCountAll, } from "@/api/api";

    export default {
        name: "LyGrowcard",
        data(){
            return{
              growData:[
                {id:1,title:"服务器总数",nums:0,icon:{
                    type:"View",
                    background:"#67c23a",
                  }},
                {id:2,title:"失联服务器",nums:0,icon:{
                    type:"GoodsFilled",
                    background:"#e6a23c",
                  }},
                {id:3,title:"备案服务器",nums:0,icon:{
                    type:"Download",
                    background:"#409eff",
                  }},
                {id:4,title:"下电失败服务器",nums:0,icon:{
                    type:"WalletFilled",
                    background:"#f56c6c",
                  }},
              ],
            }
        },

      methods:{


        async getData(){
          this.loadingPage = true
          wholeMachineServersCountAll(this.formInline).then(res => {
            this.loadingPage = false
            if(res.code ==2000) {
              this.growData[0].nums = res.data.data.total_books;
              this.growData[1].nums = res.data.data.serversCount_dis;
              this.growData[2].nums = res.data.data.serversCount_dis;
              this.growData[3].nums = res.data.data.serversCount_dis;
              console.log(this.tableData )

            }
          })
        },
      },

      created() {
        this.getData()
      },
        props:{
            loading: {
                type: Boolean,
                default: true
            },
            direction:{
                type:String,
                default:"horizontal",
            },
            alignment:{
                type:String,
                default:"flex-start",
            },
            count:{
                type:Number,
                default:1,
            },
            rows:{
                type:Number,
                default:4,
            },
            animated:{
                type:Boolean,
                default:true,
            },
            modelValue: {
              type: Array,
              default: []
            },
            height:{
                type:Number,
                default:200,
            }
        },
        watch:{

            dataList: function(nval) {
                this.$emit('update:modelValue', nval);
            }
        },


    }
</script>

<style scoped>
    .space-inner{
    }
    .lycard{
        background: var(--el-bg-color);
        box-shadow: var(--el-box-shadow-light);
        border: 1px solid var(--el-border-color-light);
    }
    .space-header{
        border-bottom: 1px solid var(--el-color-info-light-7);
        font-size: 14px;
        padding: 2px;
        display: flex;
        justify-content: space-between;
        align-items: center;
    }
    .space-header-title{
        padding: 8px 0;
        overflow: hidden;
        white-space: nowrap;
        text-overflow: ellipsis;
        margin-left: 10px;
    }
    .space-header-extend-right{
        padding: 8px 0;
        margin-right: 10px;
    }
    .space-main{
        padding: 20px;
    }
    .space-main-icon{
    }
    .space-main-up{
        display: flex;
        align-items: center;
        justify-content: space-between;
    }
    .space-main-down{
        margin-top: 15px;
        display: flex;
        justify-content: space-between;
    }
    ::v-deep(.el-col) {
        margin-bottom: 11px;
    }
</style>
 


 


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/70553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么学习调试ISP的参数

摄像头的 **Sensor 获取的 RAW 数据** 是未经处理的原始图像数据&#xff0c;通常需要经过 **ISP&#xff08;Image Signal Processor&#xff0c;图像信号处理器&#xff09;** 的处理&#xff0c;才能生成可用的图像或视频。ISP 的作用是对 RAW 数据进行一系列图像处理操作&a…

万字长文解析:深入理解服务端渲染(SSR)架构与全栈实践指南

一、SSR核心原理深度剖析 1.1 技术定义与演进历程 服务端渲染&#xff08;Server-Side Rendering&#xff09;指在服务器端完成页面DOM构建的技术方案。其发展历程可分为三个阶段&#xff1a; 阶段时期典型技术传统SSR2000-2010JSP/PHP现代SSR2015-2020Next.js/Nuxt.js混合渲…

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_array_push

ngx_array_push 声明在 src\core\ngx_array.h void *ngx_array_push(ngx_array_t *a); 实现在 src\core\ngx_array.c void * ngx_array_push(ngx_array_t *a) {void *elt, *new;size_t size;ngx_pool_t *p;if (a->nelts a->nalloc) {/* the array is full…

python用 PythonNet 从 Python 调用 WPF 类库 UI 用XAML

pythonnet 是pythonhe.net通用的神器不多介绍了. 这次这基本上跟python没有关系了. 和winform一样先导包 import clr clr.AddReference("PresentationFramework.Classic, Version3.0.0.0, Cultureneutral, PublicKeyToken31bf3856ad364e35") clr.AddReference(&…

MySql数据库运维学习笔记

数据库运维常识 DQL、DML、DCL 和 DDL 是 SQL&#xff08;结构化查询语言&#xff09;中的四个重要类别&#xff0c;它们分别用于不同类型的数据库操作&#xff0c;下面为你简单明了地解释这四类语句&#xff1a; 1. DQL&#xff08;数据查询语言&#xff0c;Data Query Langu…

如何为自己的 PDF 文件添加密码?在线加密 PDF 文件其实更简单

随着信息泄露和数据安全问题的日益突出&#xff0c;保护敏感信息变得尤为重要。加密 PDF 文件是一种有效的手段&#xff0c;可以确保只有授权用户才能访问或修改文档内容。本文将详细介绍如何使用 CleverPDF 在线工具为你的 PDF 文件添加密码保护&#xff0c;确保其安全性。 为…

UEFI Spec 学习笔记---9 - Protocols — EFI Loaded Image

本节定义EFI_LOADED_IMAGE_PROTOCOL和 EFI_LOADED_IMAGE_DEVICE_PATH_PROTOCOL。这些协议分别描述了已加载到内存中的映像&#xff0c;并指定了PE/COFF映像通过EFI引导服务LoadImage()加载 时使用的设备路径。这些描述包括 load image 的源、映像在内存中的当前位置、为image分…

pycharm中配置PyQt6详细教程

PyQt6 是 Qt 框架的 Python 绑定库,基于 Qt 6 开发,专为创建跨平台图形用户界面(GUI)应用程序设计。 本章教程,主要记录在pycharm中配置使用PyQt6的流程。 一、安装基础环境 在此之前,你需要提前安装好Python解释器,推荐使用anaconda创建虚拟环境。 conda create -n pyt…

AJAX 简介

AJAX 简介 引言 随着互联网技术的不断发展,Web 应用程序已经从简单的信息展示平台演变成为高度交互的动态系统。AJAX(Asynchronous JavaScript and XML)作为一种关键技术,极大地推动了Web应用的发展。本文将详细介绍AJAX的基本概念、工作原理、应用场景以及未来发展趋势。…

大模型在肝硬化风险预测及临床决策中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与数据来源 二、肝硬化及大模型相关理论基础 2.1 肝硬化概述 2.2 大模型技术原理 2.3 大模型在医疗领域的应用现状 三、大模型预测肝硬化术前风险 3.1 术前风险因素分析 3.2 大模型预测术前风险…

Java+SpringBoot+Vue+数据可视化的综合健身管理平台(程序+论文+讲解+安装+调试+售后)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当今社会&#xff0c;随着人们生活水平的不断提高和健康意识的日益增强&#xff0c;健…

【从0做项目】Java音缘心动(2)———登录、统一返回设计

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;登录模块设计 1&#xff1a;实体类 2&#xff1a;登录的请求和响应设计 二&#xff…

【Linux网络】认识协议(TCP/UDP)、Mac/IP地址和端口号、网络字节序、socket套接字

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、初识协议2、UDP、TCP3、Mac、IP地址4、端口号5、网络字节序6、socket 1、初识协议 协议就是一种约定。如何让不同厂商生产的计…

【个人开源】——从零开始在高通手机上部署sd(二)

代码&#xff1a;https://github.com/chenjun2hao/qualcomm.ai 推理耗时统计 单位/ms 硬件qnncpu_clipqnncpu_unetqnncpu_vaehtp_cliphtp_unethtp_vae骁龙8 gen124716.994133440.39723.215411.097696.327 1. 下载依赖 下载opencv_x64.tar,提取码: rrbp下载opencv_aarch64.t…

从混沌到有序:一个数据血缘分析的进化故事

从混沌到有序&#xff1a;一个数据血缘分析的进化故事 从混沌到有序的数据治理之路数据血缘的建设方法和实践路径数据血缘的实践场景和未来趋势。 数据就像流淌在企业血管中的血液&#xff0c;它的每一次流动、每一次转化都留下独特的印记。 作为数据工程师&#xff0c;我曾困惑…

JavaSE学习笔记25-反射(reflection)

反射 在Java中&#xff0c;反射&#xff08;Reflection&#xff09; 是一种强大的机制&#xff0c;允许程序在运行时检查和操作类、方法、字段等信息。通过反射&#xff0c;可以动态地创建对象、调用方法、访问字段&#xff0c;甚至修改私有成员。反射的核心类是 java.lang.re…

图表控件Aspose.Diagram入门教程:使用 Python 将 VSDX 转换为 PDF

将VSDX转换为PDF可让用户轻松共享图表。PDF 文件保留原始文档的布局和设计。它们广泛用于演示文稿、报告和文档。在这篇博文中&#xff0c;我们将探讨如何在 Python 中将 VSDX 转换为 PDF。 本文涵盖以下主题&#xff1a; Python VSDX 到 PDF 转换器库使用 Python 将 VSDX 转…

【测试】⽤例篇

本节重点⽬标 测试⽤例的概念 设计测试⽤例的万能思路 设计测试⽤例的⽅法 基于需求的设计⽅法 具体的设计⽅法 等价类 边界值 判定表法 正交法 场景法 错误猜测法 1. 测试⽤例 1.1 概念 什么是测试⽤例&#xff1f; 测试⽤例&#xff08;Test Case&#xff09;是为…

C++17中std::chrono::duration和std::chrono::time_point的舍入函数

文章目录 1. std::chrono::duration的舍入函数1.1 floor1.2 ceil1.3 round 2. std::chrono::time_point的舍入函数2.1 示例 3. 舍入函数的应用场景3.1 时间测量3.2 数据记录3.3 时间同步 4. 总结 在C17中&#xff0c; std::chrono库提供了一组强大的时间处理工具&#xff0c;包…

Go 语言结合 Redis 实现固定窗口、滑动窗口、令牌桶和漏桶限流算法的示例代码

固定窗口算法 原理&#xff1a;将时间划分为固定大小的窗口&#xff0c;在每个窗口内对请求进行计数。如果请求数超过设定的阈值&#xff0c;则拒绝后续请求&#xff0c;直到进入下一个窗口。代码&#xff1a; package mainimport ("fmt""time""git…