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.rhkb.cn/news/21874.html

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

相关文章

MATLAB基础学习相关知识

MATLAB安装参考&#xff1a;抖音-记录美好生活 MATLAB基础知识学习参考&#xff1a;【1小时Matlab速成教程-哔哩哔哩】 https://b23.tv/CnvHtO3 第1部分&#xff1a;变量定义和基本运算 生成矩阵&#xff1a; % 生成矩阵% 直接法% ,表示行 ;表示列 a [1,2,3;4,5,6;7,8,9];%…

TypeScript - 数据类型 - 声明变量

TypeScript 是一种强类型的 JavaScript 超集&#xff0c;它引入了静态类型检查和类型注解。基础类型是 TypeScript 中最基本的类型&#xff0c;用于定义变量的类型。 一、数据类型 常用基本类型&#xff1a;boolean 、number 、string 常用&#xff0c;都是小写 1.布尔类型&…

有序任务规划的局限性

有序任务规划的局限性&#xff08;Limitation of Ordered-Task Planning&#xff09; 1. 任务前向分解&#xff08;TFD&#xff09;的限制 TFD&#xff08;Task Forward Decomposition&#xff09;是一种 基于完全有序方法&#xff08;Totally Ordered Methods&#xff09;的任…

MATLAB学习之旅:数据插值与曲线拟合

在MATLAB的奇妙世界里,我们已经走过了一段又一段的学习旅程。从基础的语法和数据处理,到如今,我们即将踏入数据插值与曲线拟合这片充满魅力的领域。这个领域就像是魔法中的艺术创作,能够让我们根据现有的数据点,构建出更加丰富的曲线和曲面,从而更好地理解和描述数据背后…

ASP.NET Core 下载文件

本文使用 ASP .NET Core&#xff0c;适用于 .NET Core 3.1、.NET 5、.NET 6和.NET 8。 另请参阅&#xff1a; 如何在将文件发送到浏览器后自动删除该文件。 如何将文件从浏览器上传到服务器。 如何在 ASP.NET Core 应用程序中从 URL/URI 下载文件。 如果使用.NET Framework&am…

Part 3 第十二章 单元测试 Unit Testing

概述 第十二章围绕单元测试展开&#xff0c;阐述了单元测试的实践与重要性&#xff0c;通过对比其他测试类型&#xff0c;突出其特点&#xff0c;还介绍了单元测试的最佳实践、避免的反模式以及与测试替身相关的内容&#xff0c;为编写高质量单元测试提供指导。 章节概要 1…

SpringCloud-Eureka初步使用

什么是REST是一组用于规范资源在网络中转移的表现形式软件架构设计风格.简单来说就是客户端和服务器之间的一种交互形式 什么是RESTful,满足了REST风格的接口或者程序,RESTful API是其中的接口,spring中提供了RestTemplate这个类,他强制执行了REST的规范,包括使用HTTP协议的状…

Linux 高级篇 日志管理、定制自己的Linux系统、备份与恢复

一、日志管理 &#xff08;1&#xff09;基本介绍 日志文件是重要的系统信息文件&#xff0c;记录了如用户登录、系统启动、系统安全、邮件及各种服务等相关重要系统事件在安全方面&#xff0c;日志也至关重要&#xff0c;它能记录系统日常发生的各类事情&#xff0c;可用于检…

SpringMVC 请求参数接收

目录 请求 传递单个参数 基本类型参数传递 未传递参数 ?传递参数类型不匹配 传递多个参数 传递对象 后端参数重命名 传递数组 传递集合 传递JSON数据 JSON是什么 JSON的优点 传递JSON对象 获取URL中的参数 文件上传 在浏览器与程序进行交互时&#xff0c;主要…

深度学习之图像回归(一)

前言 图像回归任务主要是理解一个最简单的深度学习相关项目的结构&#xff0c;整体的思路&#xff0c;数据集的处理&#xff0c;模型的训练过程和优化处理。 因为深度学习的项目思路是差不多的&#xff0c;主要的区别是对于数据集的处理阶段&#xff0c;之后模型训练有一些小…

23. AI-大语言模型-DeepSeek简介

文章目录 前言一、DeepSeek是什么1. 简介2. 产品版本1. 类型2. 版本3. 参数规模与模型能力 3. 特征4. 三种访问方式1. 网页端和APP2. DeepSeek API 二、DeepSeek可以做什么1. 应用场景2. 文本生成1. 文本创作2. 摘要与改写3. 结构化生成 3. 自然语言理解与分析1. 语义分析2. 文…

京东cfe滑块 分析

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 headers {"accept&qu…

什么是事务?并发事务引发的问题?什么是MVCC?

文章目录 什么是事务&#xff1f;并发事务引发的问题&#xff1f;什么是MVCC&#xff1f;1.事务的四大特性2.并发事务下产生的问题&#xff1a;脏读、不可重复读、幻读3.如何应对并发事务引发的问题&#xff1f;4.什么是MVCC&#xff1f;5.可见性规则&#xff1f;参考资料 什么…

火语言RPA--Excel插入空行

【组件功能】&#xff1a;在Excel内指定的位置插入空行 配置预览 配置说明 在第n行之前 支持T或# 填写添加插入第n行之前行号。 插入n行 支持T或# 插入多少行。 Sheet页名称 支持T或# Excel表格工作簿名称。 示例 Excel插入空行 描述 在第3行之后插入3行。 配置 输…

【算法基础】--前缀和

前缀和 一、一维前缀和示例模板[寻找数组的中心下标 ](https://leetcode.cn/problems/tvdfij/description/)除自身以外的数组乘积和可被k整除的子数组 一、一维前缀和 前缀和就是快速求出数组某一个连续区间内所有元素的和。 示例模板 已知一个数组arr&#xff0c;求前缀和 …

buuctf-[极客大挑战 2019]Knife题解

一个很简单的web题&#xff0c;进入界面 网页名还加白给的shell&#xff0c;并且给的提示也很明显&#xff0c;给了一个一句话木马再加上菜刀&#xff0c;很怀疑是一个webshell题&#xff0c;那么直接打开蚁剑测试连接拿shell 用提示的一句话木马的密码&#xff0c;测试链接发现…

基于YOLO11深度学习的半导体芯片缺陷检测系统【python源码+Pyqt5界面+数据集+训练代码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

零食店收银pos源码

各位零食店老板&#xff0c;你是否还在为以下问题头疼&#xff1f; 连锁门店越来越多&#xff0c;管理起来力不从心&#xff1f;散装称重商品收银效率低&#xff0c;顾客排队抱怨&#xff1f;线上订单激增&#xff0c;库存混乱&#xff0c;配送跟不上&#xff1f;营销活动花样少…

DeepSeek 冲击(含本地化部署实践)

DeepSeek无疑是春节档最火爆的话题&#xff0c;上线不足一月&#xff0c;其全球累计下载量已达4000万&#xff0c;反超ChatGPT成为全球增长最快的AI应用&#xff0c;并且完全开源。那么究竟DeepSeek有什么魔力&#xff0c;能够让大家趋之若鹜&#xff0c;他又将怎样改变世界AI格…

卷积与动态特征选择:重塑YOLOv8的多尺度目标检测能力

文章目录 1. YOLOv8的网络结构概述2. 添加注意力机制2.1 为什么添加注意力机制&#xff1f;2.2 如何将注意力机制集成到YOLOv8中&#xff1f;2.3 效果分析 3. C2f模块的集成3.1 C2f模块简介3.2 如何在YOLOv8中集成C2f模块&#xff1f;3.3 效果分析 4. 卷积操作的优化4.1 卷积操…