九、Vben之可拖拽穿梭框和水印背景如何添加

news2024/11/17 10:34:38

        近期在开发的过程中遇到了两个难题,一个是目前的穿梭框不支持产品的要求,不能够上下拖拽,二是vben没有水印的api,需要我们自己来开发。

一、可拖拽穿梭框

        做成功的效果如下:

思路:

  1. 将table放入transfer的slot里进行使用。

     2、将table的拖拽事件写出来,让其中的值赋值正确

     3、因为左边不能拖动,右边可以拖动,判断是否为right来绑定是否拖拽事件

代码展示

html代码

<!-- 新增编辑弹窗 -->
<AddEditModel
  :addFormSchema="addFormSchema"
  :title="'薪酬方案'"
  @register="registerModal1"
  @success="handleSuccess1"
  @cancel="handleCancel1"
>
  <template #itemIds="{ model, field }">
    <Transfer
      ref="transferRef"
      :titles="['待选薪酬项目', '已选薪酬项目']"
      v-model:target-keys="model[field]"
      :data-source="mockData"
      show-search
      :list-style="{
        width: '210px',
        height: '300px',
      }"
      :render="(item) => `${item.title}`"
    >
      <template #notFoundContent>
        <span>没数据</span>
      </template>
      <template
        #children="{ direction, filteredItems, selectedKeys, onItemSelectAll, onItemSelect }"
      >
        <Table
          :row-selection="
            getRowSelection({
              selectedKeys,
              onItemSelectAll,
              onItemSelect,
            })
          "
          :columns="TransferColumns"
          :data-source="filteredItems"
          :pagination="false"
          :scroll="{
            y: 160,
          }"
          height="400"
          size="small"
          :customRow="direction === 'right' ? customRow.bind(list, filteredItems) : undefined"
        />
      </template>
    </Transfer>
  </template>
</AddEditModel>

Js代码

// 拖动排序
function customRow(list, record) {
  return {
    props: {
      draggable: 'true',
    },
    style: {
      cursor: 'move',
    },
    // 鼠标移入
    onMouseenter: (event) => {
      // 兼容IE
      var ev = event || window.event;
      ev.target.draggable = true;
    },
    // 开始拖拽
    onDragstart: (event) => {
      var ev = event || window.event; // 兼容IE
      ev.stopPropagation(); // 阻止冒泡
      fistIndex.value = list.findIndex(function (event) {
        return event.key === record.key;
      });
    },
    // 拖动元素经过的元素
    onDragover: (event) => {
      var ev = event || window.event;
      ev.preventDefault(); // 阻止默认行为
    },
    // 鼠标松开
    onDrop: (event) => {
      var ev = event || window.event;
      ev.stopPropagation(); // 阻止冒泡
      let tagIndex = list.findIndex(function (event) {
        return event.key === record.key;
      });
      let temp = list[fistIndex.value];
      set(list, fistIndex.value, list[tagIndex]);
      set(list, tagIndex, temp);
      sortList.value = list;
    },
  };
}
const getRowSelection = ({
  disabled,
  selectedKeys,
  onItemSelectAll,
  onItemSelect,
}: Record<string, any>) => {
  return {
    getCheckboxProps: (item: Record<string, string | boolean>) => ({
      disabled: disabled || item.disabled,
    }),
    onSelectAll(selected: boolean, selectedRows: Record<string, string | boolean>[]) {
      const treeSelectedKeys = selectedRows
        .filter((item) => !item.disabled)
        .map(({ key }) => key);
      onItemSelectAll(treeSelectedKeys, selected);
    },
    onSelect({ key }: Record<string, string>, selected: boolean) {
      onItemSelect(key, selected);
    },
    selectedRowKeys: selectedKeys,
  };
};

二、水印问题

        客户要求在table背后加上公司的水印,vben框架没有这个的api,我们自己开发完成。效果图如下:

需求:给整个页面添加背景水印。

  思路:

    1、使用 canvas 特性生成 base64 格式的图片文件,设置其字体大小,颜色等。

    2、将其设置为背景图片,从而实现页面或组件水印效果

    3、监听新旧父元素宽高,让水印填充满

使用:设置水印文案,颜色,字体大小即可

 <div v-waterMarker="{text:'版权所有',textColor:'rgba(180, 180, 180, 0.4)'}"></div>

废话不多说,直接上代码:

import type { Directive, DirectiveBinding, App } from 'vue';
function createBase64(
  str: string,
  textSize: number,
  textColor: string,
  textXGap: number,
  textYGap: number
) {
  const can = document.createElement('canvas')
  const width = textXGap || 300
  const height = textYGap || width / 3
  Object.assign(can, { width, height })
  const cans = can.getContext('2d')
  if (cans) {
    cans.rotate((-20 * Math.PI) / 120)
    cans.font = textSize + 'px Microsoft JhengHei' || '16px Microsoft JhengHei'
    cans.fillStyle = textColor || 'rgba(0, 0, 0, 0.15)'
    cans.textAlign = 'left'
    cans.textBaseline = 'middle'
    cans.fillText(str, width / 10, height)
  }
  return can.toDataURL('image/png')
}
const addWaterMarker = (
  str: string,
  parentNode: any,
  textSize: number,
  textColor: string,
  textXGap: number,
  textYGap: number
) => {
  const el = parentNode
  const waterMarkerlist = document.getElementsByClassName('waterMarker-box')
  if (waterMarkerlist.length) {
    for (let i = 0; i < waterMarkerlist.length; i++) {
      el.removeChild(waterMarkerlist[i])
    }
  }
  el.style.position = 'relative'
  const { clientHeight: height, clientWidth: width } = el
  const div = document.createElement('div')
  div.style.pointerEvents = 'none'
  div.className = 'waterMarker-box'
  div.style.top = '0px'
  div.style.left = '0px'
  div.style.position = 'absolute'
  div.style.height = height + 'px'
  div.style.width = width + 'px'
  div.style.zIndex = '100000'
  div.style.background = `url(${createBase64(
    str,
    textSize,
    textColor,
    textXGap,
    textYGap
  )}) left top repeat`
  el.appendChild(div)
}
const waterMarker = {
  mounted(el: DirectiveBinding, binding: DirectiveBinding) {
    let width = '',
      height = '';
    function isReize() {
      const style = document.defaultView.getComputedStyle(el);
      if (width !== style.width || height !== style.height) {
        addWaterMarker(
          binding.value.text,
          el,
          binding.value.textSize,
          binding.value.textColor,
          binding.value.textXGap,
          binding.value.textYGap
        )
      }
      width = style.width;
      height = style.height;
    }
    el.__vueSetInterval__ = setInterval(isReize, 300);
  },
};
export function setupWaterMarkerDirective(app: App) {
  app.directive('waterMarker', waterMarker);
}
export default waterMarker;

        以上就是拖拽穿梭框和背景水印的核心内容,如果使用的是vben框架的话,大家会更容易理解,有什么不同的问题,可以留言一起讨论哦。

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

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

相关文章

操作系统权限提升(十七)之绕过UAC提权-Windows令牌概述和令牌窃取攻击

系列文章 操作系统权限提升(十二)之绕过UAC提权-Windows UAC概述 操作系统权限提升(十三)之绕过UAC提权-MSF和CS绕过UAC提权 操作系统权限提升(十四)之绕过UAC提权-基于白名单AutoElevate绕过UAC提权 操作系统权限提升(十五)之绕过UAC提权-基于白名单DLL劫持绕过UAC提权 操作系…

android EditText设置后缀

有两种实现方案。 方案一&#xff1a;是自己写一个TextWatcher。 方案二&#xff1a;是重写TextView的getOffsetForPosition方法&#xff0c;返回一个计算好的offset。 我在工作时&#xff0c;使用的是方案一。在离职之后&#xff0c;我还是对这个问题耿耿于怀&#xff0c;所以…

git在工作中的正常使用

开发A和B功能后进行发版。。 一、拉取代码 git clone http://ntc.ntsvars.com:8090/lvweijie/test.git二、开发功能A任务 创建A任务本地分支 #创建A分支&#xff0c;并切换A分支 git checkout -b A三、开发A任务 四、提交A功能文件到本地分支 git add .五、添加提交A功能备…

Tina_Linux打包流程说明指南_new

OpenRemoved_Tina_Linux_打包流程_说明指南_new 1 概述 1.1 编写目的 介绍Allwinner 平台上打包流程。 1.2 适用范围 Allwinner 软件平台Tina v3.0 版本以上。 1.3 相关人员 适用Tina 平台的广大客户&#xff0c;想了解Tina 打包流程的开发人员。 2 固件打包简介 固件…

Jenkins+Gitlab实现代码自动构建部署

一、环境准备 主机名ip安装软件jenkins192.168.75.149jenkinsgitlab192.168.75.147gitlabweb192.168.75.155部署应用 二、jenkins服务器配置 1、生产公钥 [rootjenkins ~]# ssh-keygen &#xff08;2&#xff09;获取公钥信息 公钥信息在配置 Gitlab SSH Keys 时用到。 &am…

Tcpdump抓包验证zookeeper的心跳机制

一、背景 在分布式系统中&#xff0c;zookeeper可以作为服务注册中心&#xff0c;所有提供服务的节点都可以在zookeeper上面注册&#xff0c;并作为一个node被组织起来&#xff0c;如下图&#xff1a; 在RPC框架中&#xff0c;这些服务提供者就是RPC服务的提供者。zookeeper注…

【测试】Python手机自动化测试库uiautomator2和weditor的详细使用

1.说明 我们之前在电脑操作手机进行自动化测试&#xff0c;基本上都是通过Appium的&#xff0c;这个工具确实强大&#xff0c;搭配谷歌官方的UiAutomator基本上可以完成各种测试&#xff0c;但缺点也很明显&#xff0c;配置环境太麻烦了&#xff0c;需要jdk、sdk等&#xff0c…

利用较新版本的IDEA 2022.3.2 创建Java Web的maven项目

1.创建项目 正常三步走&#xff0c;没什么可说的 2.用模板创建项目&#xff08;重要&#xff09; 第一步&#xff0c;一定要选Jakarta EE。这个模板是基于JavaWeb的一个标准模板&#xff0c;如果选了maven中的JavaWeb模板&#xff0c;那就变成了web目录在根目录下&#xff0c;…

测试跟踪模块UX交互升级,多个X-Pack功能开放至开源版,MeterSphere开源持续测试平台v2.7.0发布

2023年2月24日&#xff0c;MeterSphere一站式开源持续测试平台正式发布v2.7.0版本。 在这一版本中&#xff0c;MeterSphere在测试跟踪模块进行了UX交互升级&#xff0c;整个页面采用轻量化设计进行整体降噪&#xff0c;页面信息更加清晰易懂&#xff0c;操作流程更顺畅&#x…

【学习笔记】深入理解JVM之类加载机制

【学习笔记】深入理解JVM之类加载机制 以后基本上都在语雀上面更新&#xff0c;大家有兴趣可以看看嗷&#xff01; 首发地址&#xff1a; 知识库 文章流程图&#xff1a; 1、概述 首先我们先来看看一个 Class 文件所需要经过的一个流程图&#xff1a; 而我们今天要重点需讲的…

如何保护阿里云、政采云等云市场三方账号安全?

什么是云市场&#xff1f;根据百度百科释义&#xff0c;云市场是指物联网中分布在不同地点的海量的商品生产者和消费者之间各种经济关系的集合体&#xff0c;是通过相对集中的云平台资源联合物联网各个感知节点信息资源的方式&#xff0c;以运行分布在不同地点的海量的经济交换…

Java——数组

目录 前言 一、数组的定义 二、数组声明和创建 三、三种初始化及内存分析 Java内存分析 三种初始化 静态初始化 动态初始化 数组的默认初始化 数组的四个基本特点 四、下标越界及小结 五、数组的使用 For-Each循环 数组作方法入参 数组作返回值 六、二维数组 七…

项目管理工具dhtmlxGantt甘特图入门教程(十四):导出/导入 Excel到 iCal

这篇文章给大家讲解利用dhtmlxgantt导入/导出Excel到iCal的操作方法。 dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表&#xff0c;可满足应用程序的所有需求&#xff0c;是完善的甘特图图表库 DhtmlxGantt正版试用下载&#xff08;qun&#xff1b;765665…

中国跨境平台出海,产业带依然是最大优势

对外贸工厂来说&#xff0c;借助跨境电商服务平台开拓海外市场可行吗&#xff1f;2023年2月11日&#xff0c;在郑州荥阳举办的Starday线下招商会联合线上直播荥阳站上&#xff0c;这是很多现场参会的企业负责人面对大屏上的招商介绍宣传时&#xff0c;大脑飞速思考的问题。2023…

android kotlin 协程(六) 源码浅析

android kotlin 协程(六) 源码浅析 前言: kotlin协程源码十分庞大, 本篇只能吧我理解的源码聊一聊,不会特别深入研究,只会浅浅的看看表层. 本来计划协程系列是10篇左右,后续是flow热流冷流之类的, 冷流操作符之类的应该不会在写了, flow当作Rxjava来用就可以,后续可能还会写一…

Bitlocker加密,与解除加密

引文&#xff1a;应为C盘空间不够用了&#xff0c;想着用U盘从新给C盘分下区。操作时才发现我系统里的磁盘都是Bitlocker加密的&#xff0c;分区工具操作不了磁盘&#xff0c;所以就找到一下方法来解决。1&#xff0c;先讲一下解除加密&#xff1a;直接点击 &#xff1a;设置-&…

python pandas 常用方法汇总

前言 一、pandas是什么&#xff1f; 二、使用步骤 1.引入库 2.处理时间序列数据 3.分组聚合&#xff08;groupby&#xff09; 3.1基本方法 3.2具体使用&#xff1a;如图包含三个字段&#xff0c;company、salary、age 总结 Pandas 最最常用函数罗列 Pandas 函数用法示…

软件测试2年半的我,谈谈自己的理解...

软件测试两年半的我&#xff0c;谈谈自己的理解从2020年7月毕业&#xff0c;就成为一名测试仔。日子混了一鲲年&#xff0c;感觉需要好好梳理一下自己的职业道路了&#xff0c;回顾与总结下吧。一、测试的定位做事嘛&#xff0c;搞清楚自己的定位很重要。要搞清楚自己的定位&am…

新手小白根据Forexclub6点建议就能选择到最佳外汇经纪商

选择外汇经纪商很重要&#xff0c;尤其是对于外汇交易者新手而言。 在确定您计划使用的外汇交易员之前&#xff0c;Forexclub建议考虑以下6个因素产品丰富即使在这个阶段&#xff0c;您只对外汇交易感兴趣&#xff0c;拥有期权也是件好事。 大多数外汇经纪商提供对其他金融资产…

Excel工作表不能移动或复制?看看是不是这两个原因

Excel工作表不能移动或复制&#xff1f;今天来看看如何解决。 大家都知道&#xff0c;Excel表格分为工作簿和工作表&#xff0c;工作簿就是整个Excel文件&#xff1b;工作簿里面&#xff0c;也就是Excel表可以有多个工作表。 而各个工作表之间是可以相互移动或复制的&#xf…