【实践功能记录6】表格列悬浮展示tooltip信息

news2024/12/24 21:30:01

需求描述:

鼠标悬浮在表格的IP字段上时,使用tooltip展示IP信息,如图:

1.封装根据IP展示信息的组件

请求接口获取IP信息,注意请求接口时防抖

<!-- 根据IP展示资产信息 -->
<template>
  <div>
    <el-tooltip placement="left" trigger="hover" :show-after="500">
      <template #content>
        <div v-if="state.ipAssetLoading">loading</div>
        <div v-else>
          <!-- IP信息 -->
          <div>
            <div class="font-bold">{{ t('alertQuery.ipInfo') }}:</div>
            <div>{{ t('alertQuery.ipInfo_ip') }}: {{ state.showIp }}</div>
            <div>{{ t('alertQuery.ipInfo_address') }}: {{ state.showAssetInfo.ipAddressInfo }}</div>
          </div>
          <!-- 资产信息 -->
          <template v-if="!_.isEmpty(state.showAssetInfo.ipAssetInfo)">
            <el-divider></el-divider>
            <div class="font-bold">{{ t('alertQuery.assetInfo') }}:</div>
            <div v-for="item of state.showAssetInfo.ipAssetInfo" :key="item.key">
              <div>{{ item.label }}: {{ item.value }}</div>
            </div>
          </template>
        </div>
      </template>
      <el-link type="primary" @mouseenter="initIpAsset(state.ipValue)" :underline="false">
        {{ state.ipValue }}
      </el-link>
    </el-tooltip>
  </div>
</template>

<script setup lang="ts">
import _ from '@lodash';
import { initIpInfoLink } from '@/utils/util';
import { getIpInfo } from '@/api/common';
import type { AssetInfo } from '@/api/common';

const { t } = useI18n();
const state = reactive({
  ipAssetLoading: false,
  showAssetInfo: {} as AssetInfo,
  ipValue: '',
  showIp: '',
});
const props = defineProps<{ rowValue: string }>();

watch(
  () => props.rowValue,
  () => {
    state.ipValue = props.rowValue;
  },
  { immediate: true },
);

// 获取IP地址及资产信息
const searchInfoDebounce = _.debounce((_ip) => getIpAsset(_ip), 500);
// 获取IP
async function initIpAsset(ip: string) {
  state.showIp = await initIpInfoLink(ip);
  searchInfoDebounce(state.showIp);
}
async function getIpAsset(ip: string) {
  try {
    state.ipAssetLoading = true;
    const res = await getIpInfo(ip);
    if (res?.code) throw new Error(res?.message);
    state.showAssetInfo.ipAddressInfo = res?.data?.ipAddressInfo ?? '';
    state.showAssetInfo.ipAssetInfo = res?.data?.ipAssetInfo ?? [];
  } catch (error) {
    if (error === 'cancel' || error?.code === RESPONSE_CODE.CANCEL) return;
    console.log(`[log] - getIpInfo - error:`, error);
  } finally {
    state.ipAssetLoading = false;
  }
}
</script>

获取IP信息的方法

// 获取IP
export async function initIpInfoLink(ip: string) {
  if (!ip) return '';
  ip = _.escape(ip);
  let _ip = ip;
  // 兼容特殊的这种写法 192.168.2.101(192.168.2.101)
  if (_ip.includes('(')) {
    _ip = _ip.substr(0, _ip.indexOf('('));
  }
  // IP:端口格式
  if (_ip.includes(':')) {
    _ip = _ip.substr(0, _ip.indexOf(':'));
  }
  return _ip;
}
2.请求接口的文件

为了防止接口重复请求时请求被中断,在请求接口的时候加上时间Date.now()

// 通用接口
import type { ResDto } from '@/utils/request';

// 根据IP查询资产信息
export interface AssetInfo {
  ipAssetInfo: { label: string; value: string; key: string }[];
  ipAddressInfo: string;
}
export function getIpInfo(ip: string): ResDto<AssetInfo> {
  return SecRequest({
    method: 'POST',
    url: '/test/alert/ip?time=' + Date.now(),
    data: { ip },
  });
}
3.在表格列中调用方法

首先判断表格的字段是否符合IP格式,符合再去调用封装好的组件

<el-table-column
    v-for="col of appState.headList"
    :key="col.value"
    :label="col.label"
    :prop="col.value"
    align="center">
     <template #default="scope">
         <!--添加ip悬浮查看信息 -->
         <template v-if="isFieldIP(scope.row[col?.value])">
             <ShowIpAsset :rowValue="scope.row[col?.value] ?? ''"></ShowIpAsset>
         </template>
     </template>
</el-table-column>

// 导入组件
import ShowIpAsset from '@/components/VIpAsset/ShowIpAsset.vue';
// 判断字段内容是否符合IP格式
import { isFieldIP } from '@/utils/validate';

判断是否为IP字段

// 判断是否为IP字段
export function isFieldIP(ip: string) {
  ip = _.escape(ip);
  let _ip = ip;
  if (_ip?.includes(':')) {
    _ip = _ip.substr(0, _ip.indexOf(':'));
  }
  const reg =
    /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
  return reg.test(_ip);
}

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

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

相关文章

vue-i18n使用步骤详解(含完整操作步骤)

开篇 下面是从创建vue项目开始&#xff0c;完整使用i18n实现国际化功能的步骤&#xff0c;希望对您有所帮助。 完整步骤 创建项目 创建项目&#xff0c;并在创建项目的时候选择vuex,router 选择3.x版本 后面随意选即可&#xff0c;下面是完整的代码结构 安装vue-i18n,并封装…

队列——Acwing.829模拟队列

队列 定义 队列是一种特殊的线性表&#xff0c;遵循先进先出&#xff08;First In First Out&#xff0c;FIFO&#xff09;的原则。可以进行入队&#xff08;在队尾添加元素&#xff09;和出队&#xff08;从队首移除元素&#xff09;操作。 运用情况 任务调度&#xff1a;…

vue3和ant-design 实现前端多种验证密码规则,最全的前端验证密码规则

1、小眼睛可以显示/隐藏明文密码&#xff08;无法用input typepassword&#xff0c;用css样式实现切换明文&#xff09; 2、输入长度统计&#xff08;不是自带的&#xff0c;用div写的&#xff0c;然后定位到框内的&#xff09; 3、每输入一个字符分别验证每一项规则&#xf…

C++ 34 之 单例模式

#include <iostream> #include <string.h> using namespace std;class King{// 公共的函数&#xff0c;为了让外部可以获取唯一的实例 public:// getInstance 获取单例 约定俗成static King* getInstance(){return true_king;}private: // 私有化// 构造函数设置为…

易趋(EasyTrack)资深咨询顾问刘苗受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 易趋&#xff08;EasyTrack&#xff09;资深咨询顾问刘苗女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“企业级项目管理平台推动 IPD 数字化”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议…

【Nginx系列】分发算法

文章目录 一、分发算法介绍二、nginx集群默认算法三、nginx业务服务器状态四、nginx集群默认算法测试实验环境实验拓扑4.1、轮询算法4.2、基于权重4.3、基于ip_hash分发4.4、基于url的hash &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f388;欢迎踏入我的博客世界…

STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建

STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建 文章目录 STM32 Customer BootLoader 刷新项目 (一) STM32CubeMX UART串口通信工程搭建功能与作用典型工作流程 1. 硬件原理图介绍2. STM32 CubeMX工程搭建2.1 创建工程2.2 系统配置2.3 USART串口配…

Centos系统yum安装mysql数据库

安装之前需要将系统自带的mariadb-libs软件包删除。 检查是否存在mariadb-libs包。 yum list installed|grep mariadb-libs 删除mariadb-libs包 yum -y remove mariadb-libs 声明&#xff1a; 系统&#xff1a;CentOS-7-x86_64-DVD-2009 安装为最小化安装&#xff0c;没…

跟卖五种常用采集方式,关键词采集升级,更加让新手上手更快!

今天给大家分享一个跟卖选品软件&#xff0c;相信很多卖家都在为选品而苦恼&#xff0c;人工筛选一天也筛选不出几个能用的链接&#xff0c;不仅耗费时间精力&#xff0c;还提升不了选品效率&#xff0c;今天就分享一款实用的选品工具&#xff0c;它能够帮助我们节省选品时间&a…

计算机网络实验(15):基于Socket的网络编程(附JAVA源码.txt)

一、实验名称 UDP客户服务器即时通信程序 二、实验目的&#xff1a; 掌握基于SOCKET的网络编程方法。 基于JAVA语言&#xff0c;编写一个SOCKET的即时通信小程序 三、实验内容和要求 实验内容&#xff1a; 基于JAVA语言&#xff0c;编写一个SOCKET的即时通信小程序 实…

手把手教你构建和使用Redis Cluster去中心化集群

Redis Cluster是Redis官方提供的分布式解决方案。当遇到内存、并发、流量等瓶颈时&#xff0c;就可以采用Cluster架构达到负载均衡目的。官方文档:Scale with Redis Cluster | Docs 1.为什么要用redis-cluster集群&#xff1f; 1.首先Redis单实例主要有单点&#xff0c;容量有…

Spring Cloud Alibaba Nacos作为服务配置中心实践

Nacos官网文档&#xff1a;Nacos 融合 Spring Cloud&#xff0c;成为注册配置中心 【1】服务实例 ① pom依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </de…

使用 Azure AI Document Intelligence 创建智能文档处理

简介 借助 Azure AI 文档智能中的预生成模型&#xff0c;无需自行训练模型&#xff0c;即可从常见表单和文档中提取数据。 公司中&#xff0c;表单种类繁多&#xff0c;如发票、收据、调查表等。你可能想知道&#xff0c;从这些文档中提取姓名、地址、金额等信息需要多少工作…

数字化制造案例分享以及数字化制造能力评估(34页PPT)

资料介绍&#xff1a; 通过全面的数字化企业平台和智能制造技术的应用&#xff0c;制造型企业不仅提升了自身的竞争力&#xff0c;也为整个制造业的数字化转型提供了借鉴。同时&#xff0c;数字化制造能力的评估是企业实现数字化转型的关键环节&#xff0c;需要从技术变革、组…

Linux 并发与竞争基础知识学习

Linux 并发与竞争 并发与竞争 Linux 系统是个多任务操作系统&#xff0c;会存在多个任务同时访问同一片内存区域&#xff0c;这些任务可能会相互覆盖这段内存中的数据&#xff0c;造成内存数据混乱。针对这个问题必须要做处理&#xff0c;严重的话可能会导致系统崩溃。现在的…

Maven:一个下载jar依赖失败的问题解决方案

内部的一个jar包已经上传到了私服上&#xff0c;在私服管理端也能看到该jar包的完整信息&#xff0c;但是springboot项目引入该jar包发现死活下载不下来&#xff0c;报错如图&#xff1a; 从该错误信息中可以看到&#xff0c;找不到服务名是xxl-job这个的&#xff0c;我们要找的…

C语言入门系列:运算符及其优先级

文章目录 一&#xff0c;算术运算符二&#xff0c;自增运算符与自减运算符三&#xff0c;关系运算符四&#xff0c;逻辑运算符逻辑与&#xff08;&&&#xff09;逻辑或&#xff08;||&#xff09;逻辑非&#xff08;!&#xff09;最佳实践&#xff1a;行为单一原则 五&…

最新区块链论文速读--CCF A会议 ICSE 2024 共13篇 附pdf下载 (2/2)

Conference&#xff1a;International Conference on Software Engineering (ICSE) CCF level&#xff1a;CCF A Categories&#xff1a;Software Engineering/System Software/Programming Languages Year&#xff1a;2024 Num&#xff1a;13 第1~7篇区块链文章请点击此处…

【产品经理】订单处理2

本次讲解订单初始化成功到ERP系统过程中的后续环节。 一、根据客服备注更新订单信息 初始化订单过程中&#xff0c;若订单中的客服备注信息对订单进行更新&#xff0c;包括可能改收货信息、改商品、加赠品、指定快递等。 注意&#xff1a;更新订单的过程中要注意订单当前状…

10M速率1553总线终端(RT)模块是依据SAE-AS5652标准设计

10M速率1553总线终端(RT)模块是依据SAE-AS5652标准设计的支持传输速率10Mbps的总线远程终端&#xff08;RT&#xff09;模块&#xff0c;采用SIP封装技术&#xff0c;支持LocalBus接口或UART通信访问&#xff0c;64K*16bits存储空间&#xff0c;灵活的RT数据存储&#xff0c;具…