使用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.hqwc.cn/news/457876.html

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

相关文章

springboot Feign方式注入注解详解

一、FeignClient注解详解 FeignClient是Spring Cloud中用于声明Feign客户端的注解&#xff0c;它使得编写HTTP客户端变得更简单。通过Feign的自动化配置机制&#xff0c;可以很容易地编写HTTP API客户端。以下是FeignClient的详解&#xff1a; 作用&#xff1a;FeignClient注解…

Pinia介绍和使用

1. pinia是什么 Pinia 是一个基于 Vue.js 的状态管理库&#xff0c;用于管理应用程序的数据。它提供了一种简单、直观且可扩展的方式来组织和访问应用程序的状态&#xff0c;下面是详细介绍 基于 Vue 3&#xff1a;Pinia 是专门为 Vue 3 开发的状态管理库&#xff0c;充分利用…

Termux配置安卓编译环境

前言 Termux安装后&#xff0c;就相当于把手机变成了一台Linux服务器&#xff0c;而且现在手机卡通常是能拿到ipv6公网地址的&#xff0c;所以&#xff0c;这个服务器能干啥&#xff1f; 编程搭建网站跑脚本 本文讲述的就是怎么在Termux搭建安卓编译环境&#xff0c;实现手机…

解决计算机“缺失ffmpeg.dll”报错?修复ffmpeg.dll文件方案

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“ffmpeg.dll丢失”。ffmpeg.dll是FFmpeg多媒体框架中的一个重要组件&#xff0c;它负责处理音频和视频的编解码。当打开某些软件时&#xff0c;如果系统找不到该文件&#xff0c;就会出现这…

【数据结构】链表OJ面试题3(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 后三题在这http://t.csdnimg.cn/gbohQ 记录每天的刷题&#xff0c;继续坚持&#xff01; 2.OJ题目训练 9. 给定一个链表&#xff0c;判断链表中是否有环。 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成…

怎么理解 Redis 事务

背景 在面试中经常会被问到&#xff0c;redis支持事务吗&#xff1f;事务是怎么实现的&#xff1f;事务会回滚吗&#xff1f;又是一键三连&#xff0c;我下面分析下&#xff0c;看看能不能吊打面试官 什么是Redis事务 事务是一个单独的隔离操作&#xff1a;事务中的所有命令…

《Git 简易速速上手小册》第3章:分支管理(2024 最新版)

文章目录 3.1 创建与合并分支3.1.1 基础知识讲解3.1.2 重点案例&#xff1a;为 Python 项目添加新功能3.1.3 拓展案例 1&#xff1a;使用 Pull Requests (PRs) 在团队中合作3.1.4 拓展案例 2&#xff1a;解决合并冲突 3.2 分支策略的最佳实践3.2.1 基础知识讲解3.2.2 重点案例&…

JVM 性能调优- 五种内存溢出(5)

在介绍之前先简单介绍下 直接内存(Direct Memory)和堆内存(Heap Memory): 关系: 直接内存并不是Java虚拟机的一部分,它是通过Java的NIO库中的ByteBuffer来分配和管理的。直接内存通常由操作系统的本地内存(Native Memory)提供支持。堆内存是Java虚拟机的一部分,用于存…

幻兽帕鲁mac可以玩吗?

《幻兽帕鲁》&#xff08;英文&#xff1a;Palworld&#xff09;是一款近期在 Steam 爆红的动作冒险生存游戏&#xff0c;游戏设置在一个居住着「帕鲁」的开放世界中&#xff0c;玩家可以战斗并捕捉帕鲁&#xff0c;也能用它们来建造基地、骑乘和战斗。 不过目前《幻兽帕鲁》仅…

2024/02/06

画出TCP三次握手和四次挥手的示意图 三次握手 四次挥手 并且总结TCP和UDP的区别 TCP: TCP提供面向连接的&#xff0c;可靠的数据传输服务传输过程中&#xff0c;数据无误、数据无丢失、数据无失序、数据无重复 TCP会给每个数据包编上编号&#xff0c;该编号称之为序列号每个序…

林浩然与杨凌芸的Java奇缘:抽象类、接口与多态的编程三部曲

林浩然与杨凌芸的Java奇缘&#xff1a;抽象类、接口与多态的编程三部曲 The Java Odyssey of Lin Haoran and Yang Lingyun: A Trio of Programming Wisdom with Abstract Classes, Interfaces, and Polymorphism 在代码王国里&#xff0c;住着两位程序员明星——林浩然和杨凌芸…

Deepin基本环境查看(八)【系统安全:房、车、查房、查车】

Deepin基本环境查看&#xff08;八&#xff09;【系统安全&#xff1a;房、车、查房、查车】 - 相关文章目录1、概述2、想象中的... 现实中的...1&#xff09;想象中的我2&#xff09;梦幻中的我3&#xff09;现实中的我 3 要房、要车、还是房车都要1&#xff09;超级计算机2&a…