Avue实现动态查询与数据展示的示例代码

 更新时间:2024年08月20日 11:22:38   作者:码农研究僧  
Avue是一个基于Vue.js的前端框架,它是由阿里云开发的一款企业级UI组件库,旨在提供一套全面、易用且高性能的界面解决方案本文介绍了Avue实现动态查询与数据展示的示例,需要的朋友可以参考下

下面是一个前端查询页面的总结,包括Demo示例和注释

1. 基本知识

数据展示配置 (optiontotal, datatotal, totalPage)

<avue-crud
  :option="optiontotal"
  :data="datatotal"
  :page="totalPage"
  @on-load="loadPage">
  <!-- 插槽模板 -->
  <template slot-scope="scope" slot="menu">
    <el-button style="margin-left:10px;" size="small" type="text" @click.native="showDetail(scope.row)">查看</el-button>
  </template>
  <template slot-scope="scope" slot="remainCapacity" class="el-progress-bar__innerText">
    <el-progress :text-inside="true" :stroke-width="24" :color="percentageStyle(scope.row.remainCapacity)" :percentage="scope.row.remainCapacity"></el-progress>
  </template>
</avue-crud>
  • :option="optiontotal":配置avue-crud组件的显示选项,如表格列的定义、是否显示删除、编辑、添加按钮等
  • :data="datatotal": 绑定要显示的数据,通常是从API获取的结果数组
  • :page="totalPage":配置分页信息,包括当前页码、每页大小、总记录数等
  • @on-load="loadPage": 当数据需要加载时调用loadPage方法,通常用于处理分页和数据加载

基本的注意事项如下:

  • 分页参数:
    确保分页参数(currentPage和pageSize)正确传递,并与后端API的分页要求一致
    在分页变化时(如页码变动),需要重新加载数据以反映当前页的数据

  • 数据绑定:
    :data="datatotal"绑定的数据应确保格式正确,并与表格列定义中的prop属性一致
    数据中每一项的字段名称应与optiontotal中定义的列字段一致,以确保数据能正确显示

  • 插槽使用:
    slot="menu"用于自定义行操作按钮,如“查看”按钮
    slot="remainCapacity"用于自定义进度条显示,动态设置颜色和百分比,提供直观的设备状态反馈

2. Demo

以下为充电桩的实时动态数据,通过PLC实时传输到数据库中,对应这个页面动态查询数据即可

整体界面逻辑如下:

  1. 组件初始化:在组件挂载时,启动定时器每30秒自动刷新数据
  2. 查询功能
    -搜索:根据输入的条件(如车辆名称)查询数据并更新展示
    -重置:重置表单字段和查询条件,重新加载数据
  3. 数据显示:通过avue-crud组件展示车辆信息,包括车辆名称、状态、充电枪状态、电池温度、剩余电量和更新时间等
  4. 详情查看:点击“查看”按钮时,跳转到设备详情页面,并将设备名称作为查询参数传递
  5. 设备详情对话框:显示设备详细信息的对话框(在此例中为空)
<template>
  <div>
    <basic-container>
      <!-- 查询表单 -->
      <el-form :inline="true" ref="formInline" :model="formInline" label-width="150px">
        <el-form-item label="车辆名称">
          <el-input v-model="formInline.deviceName" placeholder="请输入车辆名称"></el-input>
        </el-form-item>
        
        <el-form-item>
          <el-button type="primary" size="small" @click="onSearch">查询</el-button>
          <el-button size="small" @click="resetForm('formInline')">重置</el-button>
        </el-form-item>
      </el-form>

      <!-- 数据展示卡片 -->
      <el-card class="box-card">
        <div class="clearfix">
          <span>总数为:{{totalPage.total}}辆</span>
          <avue-crud
            :option="optiontotal"
            :data="datatotal"
            :page="totalPage"
            @on-load="loadPage">
            <!-- 查看按钮模板 -->
            <template slot-scope="scope" slot="menu">
              <el-button style="margin-left:10px;" size="small" type="text" @click.native="showDetail(scope.row)">查看</el-button>
            </template>
            <!-- 剩余电量进度条模板 -->
            <template slot-scope="scope" slot="remainCapacity" class="el-progress-bar__innerText">
              <el-progress :text-inside="true" :stroke-width="24" :color="percentageStyle(scope.row.remainCapacity)" :percentage="scope.row.remainCapacity"></el-progress>
            </template>
          </avue-crud>
        </div>
      </el-card>
    </basic-container>

    <!-- 设备详情对话框 -->
    <el-dialog title="设备详情" :append-to-body='true' :visible="detailVisible" @close="closeDetialDialog"></el-dialog>
  </div>
</template>

<script>
import { getDeviceRealList } from "@/api/equipment/chargingSchedule/devicereal";

export default {
  data() {
    return {
      timer: null,
      detailVisible: false,
      query: {},
      totalPage: {
        pageSize: 20,
        currentPage: 1,
        total: 0
      },
      formInline: {
        deviceName: ''
      },
      datatotal: [],
      optiontotal: {
        height: 'auto',
        calcHeight: 95,
        fit: true,
        border: true,
        delBtn: false,
        editBtn: false,
        addBtn: false,
        menuWidth: 100,
        highlightCurrentRow: true,
        column: [
          {
            label: '车辆名称',
            prop: 'deviceName'
          },
          {
            label: '车辆状态',
            prop: 'vehicleStatus',
            dicData: [
              { label: '启动', value: '01' },
              { label: '熄火', value: '02' },
              { label: '充电', value: '03' },
              { label: '离线', value: '99' }
            ]
          },
          {
            label: '充电枪状态',
            prop: 'chargeGun',
            dicData: [
              { label: '未连接', value: '00' },
              { label: '已连接', value: '11' }
            ]
          },
          {
            label: '电池系统温度(℃)',
            prop: 'batteryTemp'
          },
          {
            label: '剩余电量(%)',
            prop: 'remainCapacity',
            slot: true
          },
          {
            label: '更新时间',
            prop: 'infoUpdateTime',
            width: '150'
          },
          {
            label: '时间差值(天)',
            prop: 'timeDifferenceDay',
            width: '70',
            formatter: (row) => this.calculateTimeDifference(row.infoUpdateTime)
          }
        ]
      }
    };
  },
  computed: {
    currentTime() {
      return new Date();
    }
  },
  mounted() {
    // 定时刷新页面
    this.timer = setInterval(() => {
      setTimeout(() => this.loadPage(this.totalPage, this.query), 0);
    }, 1000 * 30);
  },
  methods: {
    calculateTimeDifference(updateTime) {
      const updateTimeObj = new Date(updateTime);
      const timeDifference = this.currentTime - updateTimeObj; // 时间差值,单位为毫秒
      const dayDifference = Math.floor(timeDifference / (1000 * 60 * 60 * 24));
      return dayDifference;
    },
    onSearch() {
      let searchInfo = {
        deviceName: this.formInline.deviceName === '' ? null : this.formInline.deviceName
      };
      this.totalPage.currentPage = 1;
      this.loadPage(this.totalPage, searchInfo);
    },
    resetForm(formName) {
      this.$refs[formName].resetFields();
      this.formInline.deviceName = null;
      this.onSearch();
    },
    showDetail(row) {
      this.$router.push({ path: '/equipment/chargingSchedule/deviceInfoVisual', query: { deviceName: row.deviceName } });
    },
    loadPage(page, params = {}) {
      getDeviceRealList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
        const data = res.data.data;
        this.totalPage.total = data.total;
        this.datatotal = data.records;
      });
    },
    percentageStyle(percentage) {
      if (percentage <= 20) return '#CD0000';
      if (percentage > 20 && percentage <= 40) return '#FF0000';
      if (percentage > 80) return '#32CD32';
      if (percentage > 60 && percentage <= 80) return '#EEEE00';
      if (percentage <= 60 && percentage > 40) return '#EEC900';
    },
    closeDetialDialog() {
      this.detailVisible = false;
    }
  }
}
</script>

<style>
.el-progress-bar__innerText {
  color: #0b0a0a;
  font-size: 12px;
  margin: 0px 5px;
}
</style>

最终界面如下所示:

到此这篇关于Avue实现动态查询与数据展示的示例代码的文章就介绍到这了,更多相关Avue动态查询与数据展示内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何解决.vue文件url引用文件的问题

    如何解决.vue文件url引用文件的问题

    这篇文章主要介绍了解决.vue文件url引用文件的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Vue.use的原理和设计源码探究

    Vue.use的原理和设计源码探究

    这篇文章主要为大家介绍了Vue.use的原理和设计源码探究详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • vue3中pinia的使用方法

    vue3中pinia的使用方法

    Pinia是Vue3的状态管理工具,安装后在入口文件引入,定义store并在组件中使用,本文就来介绍一下vue3中pinia的使用方法,感兴趣的可以了解一下
    2024-10-10
  • vue 按钮 权限控制介绍

    vue 按钮 权限控制介绍

    这篇文章主要介绍了vue 按钮 权限控制,在日常项目中,会碰到需要根据后台接口返回的数据,来判断当前用户的操作权限,必须当有删除权限时,就显示删除按钮,下面我们就来了解一下具体的解决方法,需要的朋友也可以参考一下
    2021-12-12
  • Vue3使用contenteditable打造定制化输入

    Vue3使用contenteditable打造定制化输入

    contenteditable 属性为网页开发者提供了一种灵活的方式来创建可编辑的内容区域,使用户可以直接在网页上进行内容编辑,而无需依赖传统的输入框,本文将利用contenteditable打造定制化输入,感兴趣的可以了解下
    2023-12-12
  • Vue+element-ui添加自定义右键菜单的方法示例

    Vue+element-ui添加自定义右键菜单的方法示例

    这篇文章主要给大家介绍了关于Vue+element-ui添加自定义右键菜单的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • ElementUI修改实现更好用图片上传预览组件

    ElementUI修改实现更好用图片上传预览组件

    这篇文章主要为大家介绍了ElementUI修改实现更好用图片上传预览组件示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • 使用element-ui,el-row中的el-col数据为空页面布局变乱问题

    使用element-ui,el-row中的el-col数据为空页面布局变乱问题

    这篇文章主要介绍了使用element-ui,el-row中的el-col数据为空页面布局变乱问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • vue 插值 v-once,v-text, v-html详解

    vue 插值 v-once,v-text, v-html详解

    这篇文章主要介绍了vue 插值 v-once,v-text, v-html详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • 解决elementui表格操作列自适应列宽

    解决elementui表格操作列自适应列宽

    这篇文章主要介绍了解决elementui表格操作列自适应列宽,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论