Django-Vue 学习-VUE

news2025/2/26 4:44:15

主组件中有多个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>
 


 


 

        <el-form label-position="left" :model="ruleForm" :rules="rules" ref="ruleForm" label-width="0px" class="demo-ruleForm login-container">
            <h3 class="title">
                <div class="login-logo">
                   <img style="width: 100%; margin-bottom: 0; " src="../assets/logo.gif" alt="logo">
               </div>
                <span>{{ $t('login.loginInTitle') }}</span>
            </h3>

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

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

相关文章

Ollama部署本地大模型DeepSeek-R1-Distill-Llama-70B

文章目录 一、下模二、转模1. 下载转换工具2. 安装环境依赖3. llama.cpp1. 转换脚本依赖2. llama.cpp安装依赖包3. llama.cpp编译安装4. 格式转换 三、Ollama部署1. 安装启动Ollama2. 添加模型3. 测试运行 一、下模 #模型下载 from modelscope import snapshot_download model…

Zabbix问题记录2--踩坑HttpRequest,header添加无效

背景 在试图尝试通过Zabbix接入DeepSeek API的时候&#xff0c;由于使用了HTTP的方式&#xff0c;所以需要使用Zabbix 自带的HttpRequest库进行请求&#xff0c;产生了下面的问题 问题 curl curl -X POST https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completio…

Redis 集群的三种模式:一主一从、一主多从和多主多从

本文记述了博主在学习 Redis 在大型项目下的使用方式&#xff0c;包括如何设置Redis主从节点&#xff0c;应对突发状况如何处理。在了解了Redis的集群搭建和相关的主从复制以及哨兵模式的知识以后&#xff0c;进而想要了解 Redis 集群如何使用&#xff0c;如何正确使用&#xf…

网络工程知识笔记

1. 什么是网络&#xff1f; 网络是由多个节点&#xff08;如计算机、打印机、路由器等&#xff09;通过物理或逻辑连接组成的系统&#xff0c;用于数据的传输和共享。这些节点可以通过有线&#xff08;如以太网&#xff09;或无线&#xff08;如 Wi-Fi&#xff09;方式进行连接…

初识.git文件泄露

.git 文件泄露 当在一个空目录执行 git init 时&#xff0c;Git 会创建一个 .git 目录。 这个目录包含所有的 Git 存储和操作的对象。 如果想备份或复制一个版本库&#xff0c;只需把这个目录拷贝至另一处就可以了 这是一种常见的安全漏洞&#xff0c;指的是网站的 .git 目录…

政安晨【零基础玩转各类开源AI项目】DeepSeek 多模态大模型Janus-Pro-7B,本地部署!支持图像识别和图像生成

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 目录 下载项目 创建虚拟环境 安装项目依赖 安装 Gradio&#xff08;UI&#xff09; 运…

(六)趣学设计模式 之 代理模式!

目录 一、啥是代理模式&#xff1f;二、为什么要用代理模式&#xff1f;三、代理模式的实现方式1. 静态代理2. JDK动态代理3. CGLIB动态代理 四、三种代理的对比五、代理模式的优缺点六、代理模式的应用场景七、总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&a…

力扣LeetCode:1656 设计有序流

题目&#xff1a; 有 n 个 (id, value) 对&#xff0c;其中 id 是 1 到 n 之间的一个整数&#xff0c;value 是一个字符串。不存在 id 相同的两个 (id, value) 对。 设计一个流&#xff0c;以 任意 顺序获取 n 个 (id, value) 对&#xff0c;并在多次调用时 按 id 递增的顺序…

鸿蒙开发深入浅出03(封装通用LazyForEach实现懒加载)

鸿蒙开发深入浅出03&#xff08;封装通用LazyForEach实现懒加载&#xff09; 1、效果展示2、ets/models/BasicDataSource.ets3、ets/models/HomeData.ets4、ets/api/home.ets5、ets/pages/Home.ets6、ets/views/Home/SwiperLayout.ets7、后端代码 1、效果展示 2、ets/models/Ba…

DSP芯片C6678的SRIO及其中断跳转的配置

C6678SRIO读写测试门铃中断跳转测试 SRIO简述代码前言SRIO配置原始代码1.使能电源2.初始化SRIO回环修改 3.SRIO测试 Doorbell门铃中断1.初始化中断函数2.中断向量表建立3.中断向量表的链接 本博客基于创龙“678ZH产品线”的SRIO代码&#xff0c;部分参考于网友们的博客&#xf…

2025asp.net全栈技术开发学习路线图

2025年技术亮点‌&#xff1a; Blazor已全面支持WebAssembly 2.0标准 .NET 8版本原生集成AI模型部署能力 Azure Kubernetes服务实现智能自动扩缩容 EF Core新增向量数据库支持特性 ‌ASP.NET 全栈开发关键技术说明&#xff08;2025年视角&#xff09;‌ 以下技术分类基于现…

01 冲突域和广播域的划分

目录 1、冲突域和广播域的划分 1.1、冲突域 1.2、广播域 1.3、对比总结 1.4、冲突域与广播域个数计算例题 2、交换机和路由器的结构 2.1、交换机的结构 2.2、路由器的结构 1、冲突域和广播域的划分 1.1、冲突域 冲突域是指网络中可能发生数据帧冲突的物理范围。当多…

nodejs npm install、npm run dev运行的坎坷之路

1、前面的种种都不说了&#xff0c;好不容易运行起来oap-portal项目&#xff0c;运行idm-ui项目死活运行不起来&#xff0c;各种报错&#xff0c;各种安装&#xff0c;各种卸载nodejs&#xff0c;卸载nvm&#xff0c;重装&#xff0c;都不好使。 2、甚至后来运行npm install会…

大型装备故障诊断解决方案

大型装备故障诊断解决方案 方案背景 在全球航空工业迅猛发展的背景下&#xff0c;我国在军用和民用飞机自主研发制造领域取得了显著成就。尤其是在国家大力支持下&#xff0c;国内飞机制造企业攻克了诸多关键技术难题&#xff0c;实现了从设计研发到生产制造再到售后保障的完整…

反向代理模块kfj

1 概念 1.1 反向代理概念 反向代理是指以代理服务器来接收客户端的请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0c;将从服务器上得到的结果返回给客户端&#xff0c;此时代理服务器对外表现为一个反向代理服务器。 对于客户端来说&#xff0c;反向代理就相当于…

Python Seaborn库使用指南:从入门到精通

1. 引言 Seaborn 是基于 Matplotlib 的高级数据可视化库,专为统计图表设计。它提供了更简洁的 API 和更美观的默认样式,能够轻松生成复杂的统计图表。Seaborn 在数据分析、机器学习和科学计算领域中被广泛使用。 本文将详细介绍 Seaborn 的基本概念、常用功能以及高级用法,…

Android之APP更新(通过接口更新)

文章目录 前言一、效果图二、实现步骤1.AndroidManifest权限申请2.activity实现3.有版本更新弹框UpdateappUtilDialog4.下载弹框DownloadAppUtils5.弹框背景图 总结 前言 对于做Android的朋友来说&#xff0c;APP更新功能再常见不过了&#xff0c;因为平台更新审核时间较长&am…

JVM生产环境问题定位与解决实战(二):JConsole、VisualVM到MAT的高级应用

生产问题定位指南&#xff1a;几款必备的可视化工具 引言 在上一篇文章中&#xff0c;详细的介绍了JDK自带的一系列命令行工具&#xff0c;&#xff0c;如jps、jmap、jstat、jstack以及jcmd等&#xff0c;这些工具为排查和诊断Java虚拟机&#xff08;JVM&#xff09;问题提供…

力扣3102.最小化曼哈顿距离

力扣3102.最小化曼哈顿距离 题目 题目解析及思路 题目要求返回移除一个点后的最小的最大曼哈顿距离 最大最小值的题一般直接想到二分 本题有一个简单办法就是利用切比雪夫距离 当正方形转45&#xff0c;即边上点**( x , y ) -> (x y , y - x)时&#xff0c;两点间max(…

国标28181协议在智联视频超融合平台中的接入方法

一. 国标28181介绍 国标 28181 协议全称是《安全防范视频监控联网系统信息传输、交换、控制技术要求》&#xff0c;是国内视频行业最重要的国家标准&#xff0c;目前有三个版本&#xff1a; 2011 年&#xff1a;推出 GB/T 28181-2011 版本&#xff0c;为安防行业的前端设备、平…