使用npm包js-web-screen-shot做网页截图,可以对截图加文字,箭头等等,类似于微信截图

<template><div class="m-feedback-wrap" :style="{ top: `${feedbackHeight}px` }"><div class="m-feedback-icon-wrap"><el-tooltipclass="item"effect="dark"content="内容"placement="left-end"><span:class="[`icon iconfont icon-xiaoxi m-feedback-icon`]"@click="handleOpen"@mousedown="handleFeedbackDrag"></span></el-tooltip></div><el-dialogtitle="标题":visible.sync="visible"width="1000px"append-to-bodyclass="m-dialog m-dialog-feedback"><div><el-form ref="form" :model="form" :rules="rules" label-width="100px"><div class="m-feedback-row-wrap"><el-row><el-col :span="24"><el-form-item label="问题描述" prop="describe"><el-input type="textarea" :rows="5" v-model="form.describe" /></el-form-item></el-col></el-row><el-row><el-col :span="24"><el-form-item label="附件" prop="attachment"><el-uploadclass="upload-demo m-feedback-upload"action="https://jsonplaceholder.typicode.com/posts/":on-preview="handlePreview":on-remove="handleRemove":before-remove="beforeRemove"multiple:on-exceed="handleExceed":file-list="fileList"list-type="picture"><el-button size="small" type="primary">点击上传</el-button><el-buttonsize="small"type="primary"@click.stop="handleCapture2">截图</el-button><div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过5M</div></el-upload></el-form-item></el-col></el-row></div></el-form></div><div slot="footer" class="dialog-footer"><el-button type="primary" @click="handleSubmit">提交</el-button><el-button @click="handleClose">取消</el-button></div></el-dialog></div>
</template><script>
import {Button,Tooltip,Dialog,Form,Row,Col,FormItem,Upload,Link,Input,
} from 'element-ui'import html2canvas from 'html2canvas'
import ScreenShot from 'js-web-screen-shot'
import temp from './images/m-temp.jpg'
// import temp from '../../../bizapp/m-biz.jpg'
import temp2 from './images/m-temp2.jpg'import './font/iconfont.css'
import './index.css'let defaultFileList = [{name: 'food.jpg',url: temp,},{name: 'food2.jpg',url: temp2,},
]
export default {name: 'Feedback-Index',data() {return {visible: false,fileList: [...defaultFileList],form: {},// 表单校验rules: {title: [{ required: true, message: '请输入标题', trigger: 'blur' }],},feedbackMouseY: 0,feedbackDragging: false,feedbackHeight: 200,}},components: {[Button.name]: Button,[Tooltip.name]: Tooltip,[Dialog.name]: Dialog,[Form.name]: Form,[Row.name]: Row,[Col.name]: Col,[FormItem.name]: FormItem,[Upload.name]: Upload,[Link.name]: Link,[Input.name]: Input,},mounted() {document.addEventListener('mousemove', this.handleMouseMove)document.addEventListener('mouseup', this.handleMouseUp)},methods: {handleCapture() {html2canvas(document.body).then(function (canvas) {document.body.appendChild(canvas)})},convertBase64UrlToBlob(urlData) {let bytes = window.atob(urlData.split(',')[1]) //去掉url的头,并转换为byte//处理异常,将ascii码小于0的转换为大于0let ab = new ArrayBuffer(bytes.length)let ia = new Uint8Array(ab)for (var i = 0; i < bytes.length; i++) {ia[i] = bytes.charCodeAt(i)}return new Blob([ab], {type: 'image/jpg',})},async handleCapture2() {this.visible = falsesetTimeout(() => {try {new ScreenShot({enableWebRtc: false,completeCallback: this.callback,triggerCallback: this.triggerCallback,})} catch (error) {console.log(error)}}, 500)},callback(value) {this.visible = trueconsole.log(value)let file = this.convertBase64UrlToBlob(value.base64)console.log(file)this.fileList = [...this.fileList,{name: `${Date.now()}.png`,//url: 'https://fuss10.elemecdn.com/3/63/4e7f3a15429bfda99bce42a18cdd1jpeg.jpeg?imageMogr2/thumbnail/360x360/format/webp/quality/100',url: value.base64,},]},triggerCallback() {this.visible = false},handleSubmit() {this.$refs['form'].validate((valid) => {if (valid) {console.log(this.form)this.visible = falsethis.$message({message: '成功',type: 'success',})this.$refs['form'].resetFields()this.fileList = [...defaultFileList]}})},handleClose() {this.visible = falsethis.$refs['form'].clearValidate()this.$refs['form'].resetFields()this.fileList = [...defaultFileList]},handleOpen() {this.visible = true},handleRemove(file, fileList) {console.log(file, fileList)this.fileList = [...fileList]},handlePreview(file) {console.log(file)},handleExceed(files, fileList) {this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`)},beforeRemove(file, fileList) {return this.$confirm(`确定删除这张图片吗?`, '提示', {type: 'warning',customClass: 'm-confirm',})},//#region 拖拽handleMouseMove(event) {if (this.feedbackDragging) {event.preventDefault()const deltaY = event.clientY - this.feedbackMouseYthis.feedbackMouseY = event.clientYlet tempFeedbackHeight = this.feedbackHeight + deltaYif (tempFeedbackHeight < 0) {tempFeedbackHeight = 0} else if (tempFeedbackHeight > window.innerHeight - 30) {tempFeedbackHeight = window.innerHeight - 30}this.feedbackHeight = tempFeedbackHeight}},handleMouseUp() {this.feedbackDragging = false},handleFeedbackDrag(event) {this.feedbackDragging = truethis.feedbackMouseY = event.clientY},//#endregion},
}
</script><style></style>

我开发的chatgpt项目:

https://chat.xutongbao.top

 

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

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

相关文章

# 流量回放工具之 Goreplay 安装及初级使用

流量回放工具之 Goreplay 安装及初级使用 文章目录 流量回放工具之 Goreplay 安装及初级使用GoReplay使用场景环境搭建Golang环境安装Goreplay 安装 Windows 下使用基本使用其它使用注意点 GoReplay GoReplay是一个开源工具&#xff0c;用于捕获和重放实时HTTP流量到测试环境中…

Java学习网络编程

Java学习网络编程 大纲 网络相关概念IP地址网络协议InetAdressSocket 具体案例 1. 网络相关概念 网络 网络通信 2. IP地址 域名 3.网络协议 4. InetAdress 获得本机的名字和IP public static void main(String[] args) throws UnknownHostException {InetAddress inetA…

前端学习之路(6) npm详解

npm 是什么&#xff1f; npm&#xff08;node package manager&#xff09;&#xff1a;node.js 的包管理器&#xff0c;用于node插件管理&#xff08;包括安装、卸载、管理依赖等&#xff09; &#xff0c;npm 是随同 node.js 一起安装的包管理工具&#xff0c;能解决 node.j…

小项目:蓝牙模块点亮RGB三色灯

在之前的教程中&#xff0c;我们学习了蓝牙模块的原理&#xff0c;并动手写了驱动&#xff0c;实现了串口的接收和发送。本次我们就来教大家如何使用蓝牙串口控制灯。这是一个简单的示例&#xff0c;展示了如何将蓝牙通信与硬件控制相结合&#xff0c;实现远程控制的功能。你也…

vue3+vite+ts 配置commit强制码提交规范配置 commitlint

配置 git 提交时的 commit 信息&#xff0c;统一提交 git 提交规范 安装命令: npm install -g commitizen npm i cz-customizable npm i commitlint/config-conventional commitlint/cli -D 文件配置 根路径创建文件 commitlint.config.js module.exports {// 继承的规…

【Linux】进程学习(一):基本认识

目录 1.基本概念2.初步理解3.描述进程-PCB3.1task_struct-PCB的一种3.2task_ struct内容分类 4.组织进程5.查看进程5.1通过ps指令查看5.2通过系统目录查看 6.通过系统调用获取进程的PID和PPID7.通过系统调用创建进程-fork初识 1.基本概念 课本概念&#xff1a;程序的一个执行实…

QGIS介绍

一.基本概念 QGIS的官方网站为&#xff1a;https://www.qgis.org Github地址&#xff1a;https://github.com/qgis/QGIS QGIS采用开源证书GNU GPLv2 (GNU General Public License version 2&#xff09;发布&#xff0c;主要采用C语言开发&#xff0c;用户界面依赖Qt平台。 二…

PlantUML绘制UML图教程

UML&#xff08;Unified Modeling Language&#xff09;是一种通用的建模语言&#xff0c;广泛用于软件开发中对系统进行可视化建模。PlantUML是一款强大的工具&#xff0c;通过简单的文本描述&#xff0c;能够生成UML图&#xff0c;包括类图、时序图、用例图等。PlantUML是一款…

【Linux】线程

线程 我们常常会在linux中或者在操作系统这门课中听到进程和线程的名称&#xff0c;我们之前认识了进程的概念&#xff0c;现在我们来了解一下线程的概念 线程概念&#xff1a; 什么是线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定…

k8s 部署java应用 基于ingress+jar包

k8 集群ingress的访问模式 先部署一个namespace 命名空间 vim namespace.yaml kind: Namespace apiVersion: v1 metadata:name: ingress-testlabels:env: ingress-test 在部署deployment deployment是pod层一层封装。可以实现多节点部署 资源分配 回滚部署等方式。 部署的…

牛客网SQL进阶127: 月总刷题数和日均刷题数

官网链接&#xff1a; 月总刷题数和日均刷题数_牛客题霸_牛客网现有一张题目练习记录表practice_record&#xff0c;示例内容如下&#xff1a;。题目来自【牛客题霸】https://www.nowcoder.com/practice/f6b4770f453d4163acc419e3d19e6746?tpId240 0 问题描述 基于练习记录表…

基于SSM的图书馆预约占座系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的图书馆预约占座系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

java基础(2) 面向对象编程-java核心类

面向对象 面向对象对应的就是面向过程&#xff0c; 面向过程就是一步一步去操作&#xff0c;你需要知道每一步的步骤。 面向对象的编程以对象为核心&#xff0c;通过定义类描述实体及其行为&#xff0c;并且支持继承、封装和多态等特性 面向对象基础 面向对象编程&#xff0…

HARRYPOTTER: FAWKES

攻击机 192.168.223.128 目标机192.168.223.143 主机发现 nmap -sP 192.168.223.0/24 端口扫描 nmap -sV -p- -A 192.168.223.143 开启了21 22 80 2222 9898 五个端口&#xff0c;其中21端口可以匿名FTP登录&#xff0c;好像有点说法,百度搜索一下发现可以用anonymous登录…

L1-088 静静的推荐

一、题目 二、解题思路 如果有的学生天梯赛成绩虽然与前一个人相同&#xff0c;但其参加过 PAT 考试&#xff0c;且成绩达到了该企业的面试分数线&#xff0c;则也可以接受——同一批次这样的人可以有多个&#xff01;&#xff01;&#xff01;如果 pta 分数不低于 175 &#…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书添加模块UI设计实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

如何写一个其他人可以使用的GitHub Action

前言 在GitHub中&#xff0c;你肯定会使用GitHub Actions自动部署一个项目到GitHub Page上&#xff0c;在这个过程中总要使用workflows工作流&#xff0c;并在其中使用action&#xff0c;在这个使用的过程中&#xff0c;总会好奇怎么去写一个action呢&#xff0c;所以&#xff…

Linux线程 分离和同步与互斥 条件变量

Linux线程 分离和同步与互斥 条件变量 1. 分离线程2. 线程互斥与互斥量3. 线程同步与竞态条件4. pthread库与条件变量5. 生产者-消费者 1. 分离线程 什么是线程分离&#xff1f; 线程分离是指线程在结束时&#xff0c;操作系统会自动回收其资源&#xff0c;而无需其他线程显式地…

Java:内部类、枚举、泛型以及常用API --黑马笔记

内部类 内部类是类中的五大成分之一&#xff08;成员变量、方法、构造器、内部类、代码块&#xff09;&#xff0c;如果一个类定义在另一个类的内部&#xff0c;这个类就是内部类。 当一个类的内部&#xff0c;包含一个完整的事物&#xff0c;且这个事物没有必要单独设计时&a…

[职场] 进入大数据领域需要掌握哪些软件 #其他#职场发展#职场发展

进入大数据领域需要掌握哪些软件 学习大数据首先我们要学习Java语言和Linux操作系统&#xff0c;这两个是学习大数据的基础&#xff0c;学习的顺序不分前后。 Java 大家都知道Java的方向有JavaSE、JavaEE、JavaME&#xff0c;学习大数据要学习那个方向呢? 只需要学习Java的…