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>
 


 


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络安全之一:网络安全概述

1.1 网络安全的内涵 随着计算机和网络技术的迅猛发展和广泛普及&#xff0c;越来越多的企业将经营的各种业务建立在Internet/Intranet环境中。于是&#xff0c;支持E-mail、文件共享、即时消息传送的消息和协作服务器成为当今商业社会中的极重要的IT基础设施。然而&#xff0…

AI学习指南DeepSeek篇(6)-DeepSeek论文介绍

1. DeepSeek LLM: Scaling Open-Source Language Models with Longtermism 发布时间: 2024 年 1 月 5 日 主要内容: 基于 Transformer 架构,采用分组查询注意力(GQA)优化推理成本。 支持多步学习率调度器,提升训练效率。 在预训练和对齐(监督微调与 DPO)方面进行了创新…

刺客信条 枭雄 画质设置以及【锁帧60帧】的办法

刺客信条 枭雄 锁帧60帧的办法 画质设置帧率锁60帧办法 画质设置 关爱老电脑和GPU&#xff0c;适当设置一下画质 我们设置画面的时候&#xff0c;可以看游戏右上角的显存占用&#xff0c;进而观察自己这样设置&#xff0c;GPU的显存够不够&#xff1a; 环境质量&#xff1a;超…

适用于复杂背景的YOLOv8改进:基于DCN的特征提取能力提升研究

文章目录 1. YOLOv8的性能瓶颈与改进需求1.1 YOLOv8的优势与局限性1.2 可变形卷积&#xff08;DCN&#xff09;的优势 2. DCN在YOLOv8中的应用2.1 DCN的演变与YOLOv8的结合2.2 将DCN嵌入YOLOv8的结构中2.2.1 DCNv1在YOLOv8中的应用2.2.2 DCNv2与DCNv3的优化 2.3 实验与性能对比…

cesium视频投影

先看效果 使用cesium做视频投影效果&#xff0c;而且还要跟随无人机移动而移动&#xff0c;我现在用定时器更新无人机的坐标来实现效果具体代码如下&#xff1a; 1、CesiumVideo3d.js(某个cesium技术群大佬分享的) // import ECEF from "./CoordinateTranslate"; le…

滚珠花键在使用时需注意什么?

滚珠花键是一种直线运动系统&#xff0c;当花键套利用其中的钢球在经过精密磨削的花键轴上直线运动时&#xff0c;可以传递扭矩。在使用滚珠花键时&#xff0c;需要注意以下几个重要的事项&#xff1a; 1、不要擅自拆卸滚珠花键的各部分&#xff0c;因为这样可能会导致异物进入…

AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践

清华大学出品《DeepSeek&#xff1a;从入门到精通》分享 在忙碌的职场中&#xff0c;制作一份高质量的PPT往往需要投入大量时间和精力&#xff0c;尤其是在临近截止日期时。今天&#xff0c;我们将探索如何借助 AI 工具 —— DeepSeek 和 Kimi —— 让 PPT 制作变得既快捷又高…

PcVue : 点亮马来西亚砂拉越偏远村庄

导读 背景简介 新项目的需求 实施亮点 成果 背景简介 2021年&#xff0c;砂拉越能源公司&#xff08;Sarawak Energy Berhad&#xff09;启动了一项意义非凡的项目-借助太阳能、微型水力发电机等可再生能源&#xff0c;为砂拉越州偏远村庄送去光明与动力。然而&#xff0c…

图论 之 迪斯科特拉算法求解最短路径

文章目录 题目743.网络延迟时间3341.到达最后一个房间的最少时间I 求解最短路径的问题&#xff0c;分为使用BFS和使用迪斯科特拉算法&#xff0c;这两种算法求解的范围是有区别的 BFS适合求解&#xff0c;边的权值都是1的图中的最短路径的问题 图论 之 BFS迪斯科特拉算法适合求…

在mfc中使用自定义三维向量类和计算多个三维向量的平均值

先添加一个普通类, Vector3.h, // Vector3.h: interface for the Vector3 class. // //#if !defined(AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_) #define AFX_VECTOR3_H__53D34D26_95FF_4377_BD54_57F4271918A4__INCLUDED_#if _MSC_VER > 1000 #p…

DM执行计划

DM执行计划 1. 引言 理解执行计划对于优化查询性能、诊断慢查询问题至关重要。本文将从基础概念入手&#xff0c;逐步深入探讨执行计划的各个组成部分&#xff0c;并通过设计用例来验证所学知识。 2. SQL 执行计划基础 SQL 执行计划是数据库引擎在执行 SQL 语句时生成的一个…

【鸿蒙开发】第四十三章 Notification Kit(用户通知服务)

目录​​​​​​​ 1 简介 1.1 使用场景 1.2 能力范围 1.3 业务流程 1.4 通知样式 1.5 约束限制 1.6 与相关Kit的关系 2 请求通知授权 2.1 接口说明 2.2 开发步骤 3 管理通知角标 3.1 接口说明 3.2 开发步骤 4 管理通知渠道 4.1 通知渠道类型说明 4.2 接口说明…

SpringBoot:SSL证书部署+SpringBoot实现HTTPS安全访问

一、前言 SSL协议介于TCP/IP协议栈的第四层&#xff08;传输层&#xff09;和第七层&#xff08;应用层&#xff09;之间&#xff0c;为基于TCP的应用层协议&#xff08;如HTTP&#xff09;提供安全连接。它通过在客户端和服务器之间建立一个加密的通道&#xff0c;确保数据在传…

【数学】数论干货(疑似密码学基础)

文章目录 前言一. 整除、算术基本定理、同余、同余类、剩余系的基本定义1.整除2.算数基本定理3.同余4.同余类&#xff08;也叫剩余类&#xff09;5.剩余系 二. 费马小定理的内容及其证明1.费马小定理基本内容2.费马小定理的证明&#xff08;interesting 版&#xff09; 三. 欧拉…

[实现Rpc] 消息抽象层的具体实现

目录 具象层 _ 消息抽象的实现 信息的抽象类 实现 JsonMessage JsonRequest & JsonResponse 消息-不同消息分装实现 实现 Request RpcRequest TopicRequest ServiceRequest Response RpcResponse TopicResponse ServiceResponse 实现 生产工厂 本篇文章继 …

《A++ 敏捷开发》- 16 评审与结对编程

客户&#xff1a;我们的客户以银行为主&#xff0c;他们很注重质量&#xff0c;所以一直很注重评审。他们对需求评审、代码走查等也很赞同&#xff0c;也能找到缺陷&#xff0c;对提升质量有作用。但他们最困惑的是通过设计评审很难发现缺陷。 我&#xff1a;你听说过敏捷的结对…

PHP房屋出租出售高效预约系统小程序源码

&#x1f3e0; 房屋出租出售高效预约系统 —— 您的智能找房新选择 &#x1f4a1; 这是一款集智慧与匠心于一体的房屋出租出售预约系统&#xff0c;它巧妙地融合了ThinkPHP与Uniapp两大先进框架&#xff0c;精心打造而成。无论是小程序、H5网页&#xff0c;还是APP端&#xff…

给老系统做个安全检查——Burp SqlMap扫描注入漏洞

背景 在AI技术突飞猛进的今天&#xff0c;类似Cursor之类的工具已经能写出堪比大部分程序员水平的代码了。然而&#xff0c;在我们的代码世界里&#xff0c;仍然有不少"老骥伏枥"的系统在兢兢业业地发光发热。这些祖传系统的代码可能早已过时&#xff0c;架构可能岌…

Repeated Sequence

记suma[1]a[2]a[3]...a[n]。 该序列以a[1]&#xff0c;a[2]&#xff0c;a[3]....a[n]为循环节&#xff0c;明显的&#xff0c;问题可转化为:s%sum是否为该序列的某个连续子序列和。 断环为链。将a复制一份。 枚举a[i]为左端点的所有区间的和。再查找s是否存在。二分O&#x…

【DeepSeek】Mac m1电脑部署DeepSeek

一、电脑配置 个人电脑配置 二、安装ollama 简介&#xff1a;Ollama 是一个强大的开源框架&#xff0c;是一个为本地运行大型语言模型而设计的工具&#xff0c;它帮助用户快速在本地运行大模型&#xff0c;通过简单的安装指令&#xff0c;可以让用户执行一条命令就在本地运…