当前位置: 首页 > news >正文

Vue 使用 Cropper.js 实现图片裁剪功能

前言

图片裁剪功能无论是用户头像的裁剪,还是图片内容的精确调整,都成为了提升用户体验的关键一环。Vue.js 结合 Cropper.js 这一功能丰富的图片裁剪库,可以轻松实现高效、直观的图片裁剪功能。本文将详细介绍如何在 Vue.js 项目中集成并使用 Cropper.js,实现一个强大的图片裁剪组件。

前置工作

首先,我们需要确保已经安装了 Vue.js 和 Cropper.js。如果你还没有安装它们,可以通过以下命令进行安装:

# 安装 Vue CLI
npm install -g @vue/cli# 创建一个新的 Vue 项目
vue create vue-cropper# 进入项目目录
cd vue-cropper# 安装 Cropper.js
npm install cropperjs

项目结构

我们将在 src 目录下创建一个 components 文件夹,用于存放我们的组件。我们的主要文件包括:

  • App.vue: 主应用组件
  • components/CropperComponent.vue: 图片裁剪组件

实现步骤

1. App.vue

首先,我们在 App.vue 中引入并使用 CropperComponent 组件:

<template><div id="app"><h1>Vue.js 与 Cropper.js 图片裁剪示例</h1><CropperComponent /></div>
</template><script>
import CropperComponent from './components/CropperComponent.vue';export default {name: 'App',components: {CropperComponent}
};
</script><style>
#app {text-align: center;margin-top: 50px;
}
</style>

2. CropperComponent.vue

接下来,我们在 components 文件夹中创建 CropperComponent.vue 文件,这是我们实现图片裁剪逻辑的地方。

<template><div class="cropper-container"><input type="file" @change="onFileChange" /><div v-if="imageUrl"><img ref="image" :src="imageUrl" alt="Source Image" /><button @click="cropImage">裁剪图片</button><div v-if="croppedImageUrl"><h3>裁剪后的图片:</h3><img :src="croppedImageUrl" alt="Cropped Image" /></div></div></div>
</template><script>
import Cropper from 'cropperjs';
import 'cropperjs/dist/cropper.css';export default {name: 'CropperComponent',data() {return {imageUrl: null,cropper: null,croppedImageUrl: null};},methods: {onFileChange(event) {const file = event.target.files[0];if (file && file.type.startsWith('image/')) {this.imageUrl = URL.createObjectURL(file);this.$nextTick(() => {if (this.cropper) {this.cropper.destroy();}this.cropper = new Cropper(this.$refs.image, {aspectRatio: 1,viewMode: 1});});}},cropImage() {if (this.cropper) {const canvas = this.cropper.getCroppedCanvas();this.croppedImageUrl = canvas.toDataURL('image/png');}}}
};
</script><style>
.cropper-container {text-align: center;
}
.cropper-container img {max-width: 100%;
}
</style>

解释

  1. 文件选择器:通过一个 元素,用户可以选择要裁剪的图片文件。
  2. 图片预览与 Cropper 实例化:当用户选择图片后,我们使用 URL.createObjectURL 方法生成图片的 URL,并将其赋值给 imageUrl。然后,我们在 nextTick 中创建 Cropper 实例。
  3. 图片裁剪:点击 “裁剪图片” 按钮后,我们调用 cropper.getCroppedCanvas 方法获取裁剪后的图片,并将其转为 base64 格式的 URL。

进阶用法

我们的基础功能已经实现,但在实际应用中,你可能需要更多的功能和更好的用户体验。接下来,我们将探讨一些常见的优化和扩展方法。

1. 添加裁剪比例选择

有时候我们需要用户在多种裁剪比例之间进行选择,比如 1:1、16:9、4:3 等。我们可以在 CropperComponent.vue 中添加一个下拉菜单供用户选择裁剪比例。

<template><div class="cropper-container"><input type="file" @change="onFileChange" /><div v-if="imageUrl"><select v-model="aspectRatio" @change="updateAspectRatio"><option value="1">1:1</option><option value="16/9">16:9</option><option value="4/3">4:3</option><option value="NaN">自由比例</option></select><img ref="image" :src="imageUrl" alt="Source Image" /><button @click="cropImage">裁剪图片</button><div v-if="croppedImageUrl"><h3>裁剪后的图片:</h3><img :src="croppedImageUrl" alt="Cropped Image" /></div></div></div>
</template><script>
import Cropper from 'cropperjs';
import 'cropperjs/dist/cropper.css';export default {name: 'CropperComponent',data() {return {imageUrl: null,cropper: null,croppedImageUrl: null,aspectRatio: 1};},methods: {onFileChange(event) {const file = event.target.files[0];if (file && file.type.startsWith('image/')) {this.imageUrl = URL.createObjectURL(file);this.$nextTick(() => {if (this.cropper) {this.cropper.destroy();}this.initCropper();});}},initCropper() {this.cropper = new Cropper(this.$refs.image, {aspectRatio: this.aspectRatio,viewMode: 1});},updateAspectRatio() {if (this.cropper) {this.cropper.setAspectRatio(this.aspectRatio === 'NaN' ? NaN : Number(this.aspectRatio));}},cropImage() {if (this.cropper) {const canvas = this.cropper.getCroppedCanvas();this.croppedImageUrl = canvas.toDataURL('image/png');}}}
};
</script><style>
.cropper-container {text-align: center;
}
.cropper-container img {max-width: 100%;
}
</style>

2. 处理裁剪后的图片

对于裁剪后的图片,我们可能需要进一步处理,比如上传到服务器或者下载到本地。下面是一个简单的示例,展示如何下载裁剪后的图片:

<template><div class="cropper-container"><input type="file" @change="onFileChange" /><div v-if="imageUrl"><select v-model="aspectRatio" @change="updateAspectRatio"><option value="1">1:1</option><option value="16/9">16:9</option><option value="4/3">4:3</option><option value="NaN">自由比例</option></select><img ref="image" :src="imageUrl" alt="Source Image" /><button @click="cropImage">裁剪图片</button><div v-if="croppedImageUrl"><h3>裁剪后的图片:</h3><img :src="croppedImageUrl" alt="Cropped Image" /><a :href="croppedImageUrl" download="cropped-image.png">下载裁剪后的图片</a></div></div></div>
</template><script>
import Cropper from 'cropperjs';
import 'cropperjs/dist/cropper.css';export default {name: 'CropperComponent',data() {return {imageUrl: null,cropper: null,croppedImageUrl: null,aspectRatio: 1};},methods: {onFileChange(event) {const file = event.target.files[0];if (file && file.type.startsWith('image/')) {this.imageUrl = URL.createObjectURL(file);this.$nextTick(() => {if (this.cropper) {this.cropper.destroy();}this.initCropper();});}},initCropper() {this.cropper = new Cropper(this.$refs.image, {aspectRatio: this.aspectRatio,viewMode: 1});},updateAspectRatio() {if (this.cropper) {this.cropper.setAspectRatio(this.aspectRatio === 'NaN' ? NaN : Number(this.aspectRatio));}},cropImage() {if (this.cropper) {const canvas = this.cropper.getCroppedCanvas();this.croppedImageUrl = canvas.toDataURL('image/png');}}}
};
</script><style>
.cropper-container {text-align: center;
}
.cropper-container img {max-width: 100%;
}
</style>

3. 图片上传至服务器

如果想将裁剪后的图片上传到服务器,可以使用 axios 或者原生的 fetch 等方法。以下是一个简单的示例:

# 安装 axios
npm install axios
<template><div class="cropper-container"><input type="file" @change="onFileChange" /><div v-if="imageUrl"><select v-model="aspectRatio" @change="updateAspectRatio"><option value="1">1:1</option><option value="16/9">16:9</option><option value="4/3">4:3</option><option value="NaN">自由比例</option></select><img ref="image" :src="imageUrl" alt="Source Image" /><button @click="cropImage">裁剪图片</button><div v-if="croppedImageUrl"><h3>裁剪后的图片:</h3><img :src="croppedImageUrl" alt="Cropped Image" /><button @click="uploadImage">上传裁剪后的图片</button></div></div></div>
</template><script>
import Cropper from 'cropperjs';
import 'cropperjs/dist/cropper.css';
import axios from 'axios';export default {name: 'CropperComponent',data() {return {imageUrl: null,cropper: null,croppedImageUrl: null,aspectRatio: 1};},methods: {onFileChange(event) {const file = event.target.files[0];if (file && file.type.startsWith('image/')) {this.imageUrl = URL.createObjectURL(file);this.$nextTick(() => {if (this.cropper) {this.cropper.destroy();}this.initCropper();});}},initper() {this.cropper = new Cropper(this.$refs.image, {aspectRatio: this.aspectRatio,viewMode: 1});},updateAspectRatio() {if (this.cropper) {this.cropper.setAspectRatio(this.aspectRatio === 'NaN' ? NaN : Number(this.aspectRatio));}},cropImage() {if (this.cropper) {const canvas = this.cropper.getCroppedCanvas();this.croppedImageUrl = canvas.toDataURL('image/png');}},async uploadImage() {if (this.croppedImageUrl) {const formData = new FormData();const blob = await fetch(this.croppedImageUrl).then(res => res.blob());formData.append('croppedImage', blob, 'cropped-image.png');try {const response = await axios.post('YOUR_UPLOAD_URL', formData, {headers: {'Content-Type': 'multipart/form-data'}});console.log('上传成功:', response.data);} catch (error) {console.error('上传失败:', error);}}}}
};
</script><style>
.cropper-container {text-align: center;
}
.cropper-container img {max-width: 100%;
}
</style>

在上述示例中,我们使用 axios 将裁剪后的图片上传到服务器。请确保替换 YOUR_UPLOAD_URL 为实际的上传 URL。

4. 图片旋转和缩放

除了裁剪图片,用户有时还需要旋转和缩放图片。Cropper.js 提供了相应的方法来处理这些操作。你可以在组件中添加按钮,调用这些方法。

<template><div class="cropper-container"><input type="file" @change="onFileChange" /><div v-if="imageUrl"><select v-model="aspectRatio" @change="updateAspectRatio"><option value="1">1:1</option><option value="16/9">16:9</option><option value="4/3">4:3</option><option value="NaN">自由比例</option></select><img ref="image" :src="imageUrl" alt="Source Image" /><div><button @click="rotateImage(-90)">左旋转</button><button @click="rotateImage(90)">右旋转</button><button @click="zoomImage(0.1)">放大</button><button @click="zoomImage(-0.1)">缩小</button></div><button @click="cropImage">裁剪图片</button><div v-if="croppedImageUrl"><h3>裁剪后的图片:</h3><img :src="croppedImageUrl" alt="Cropped Image" /><button @click="uploadImage">上传裁剪后的图片</button></div></div></div>
</template><script>
import Cropper from 'cropperjs';
import 'cropperjs/dist/cropper.css';
import axios from 'axios';export default {name: 'CropperComponent',data() {return {imageUrl: null,cropper: null,croppedImageUrl: null,aspectRatio: 1};},methods: {onFileChange(event) {const file = event.target.files[0];if (file && file.type.startsWith('image/')) {this.imageUrl = URL.createObjectURL(file);this.$nextTick(() => {if (this.cropper) {this.cropper.destroy();}this.initCropper();});}},initCropper() {this.cropper = new Cropper(this.$refs.image, {aspectRatio: this.aspectRatio,viewMode: 1});},updateAspectRatio() {if (this.cropper) {this.cropper.setAspectRatio(this.aspectRatio === 'NaN' ? NaN : Number(this.aspectRatio));}},rotateImage(degree) {if (this.cropper) {this.cropper.rotate(degree);}},zoomImage(ratio) {if (this.cropper) {this.cropper.zoom(ratio);}},cropImage() {if (this.cropper) {const canvas = this.cropper.getCroppedCanvas();this.croppedImageUrl = canvas.toDataURL('image/png');}},async uploadImage() {if (this.croppedImageUrl) {const formData = new FormData();const blob = await fetch(this.croppedImageUrl).then(res => res.blob());formData.append('croppedImage', blob, 'cropped-image.png');try {const response = await axios.post('YOUR_UPLOAD_URL', formData, {headers: {'Content-Type': 'multipart/form-data'}});console.log('上传成功:', response.data);} catch (error) {console.error('上传失败:', error);}}}}
};
</script><style>
.cropper-container {text-align: center;
}
.cropper-container img {max-width: 100%;
}
.cropper-container button {margin: 5px;
}
</style>

总结

通过本文的详细讲解,您应该已经掌握了如何在 Vue.js 项目中集成并使用 Cropper.js 实现功能强大的图片裁剪组件。我们不仅介绍了基础的图片裁剪实现,还展示了如何扩展功能以支持裁剪比例选择、图片旋转与缩放,以及裁剪后图片的上传处理。这个组件可作为您项目中的一个重要模块,提升用户体验。

相关文章:

Vue 使用 Cropper.js 实现图片裁剪功能

前言 图片裁剪功能无论是用户头像的裁剪&#xff0c;还是图片内容的精确调整&#xff0c;都成为了提升用户体验的关键一环。Vue.js 结合 Cropper.js 这一功能丰富的图片裁剪库&#xff0c;可以轻松实现高效、直观的图片裁剪功能。本文将详细介绍如何在 Vue.js 项目中集成并使用…...

Python 3 和 JSON 数据格式

Python 3 和 JSON 数据格式 Python 3 是一种广泛使用的编程语言,以其简洁明了的语法和强大的功能而闻名。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Python 3 提供了内置的 json 模块,使得在 Python 程序…...

Halo 正式开源: 使用可穿戴设备进行开源健康追踪

在飞速发展的可穿戴技术领域&#xff0c;我们正处于一个十字路口——市场上充斥着各式时尚、功能丰富的设备&#xff0c;声称能够彻底改变我们对健康和健身的方式。 然而&#xff0c;在这些光鲜的外观和营销宣传背后&#xff0c;隐藏着一个令人担忧的现实&#xff1a;大多数这些…...

第一个autogen与docker项目

前提条件&#xff1a;在windows上安装docker 代码如下&#xff1a; import os import autogen from autogen import AssistantAgent, UserProxyAgentllm_config {"config_list": [{"model": "GLM-4-Plus","api_key": "your api…...

React第四节 组件的三大属性之state

前言 状态 state适用于类式组件中&#xff0c;而再函数式组件中需要使用 useState HOOK 模拟状态; React的组件就是一个状态机&#xff0c;通过与用户的交互&#xff0c;实现不同的状态&#xff0c;根据不同的状态展现出不一样的UI视图 并不是组件中所有的属性 都是组件的状态…...

在 CentOS 系统上直接安装 MongoDB 4.0.25

文章目录 步骤 1&#xff1a;配置 MongoDB 官方源步骤 2&#xff1a;安装 MongoDB步骤 3&#xff1a;启动 MongoDB 服务步骤 4&#xff1a;验证安装步骤 5&#xff1a;可选配置注意事项 以下是在 CentOS 系统上直接安装 MongoDB 4.0.25 的详细步骤&#xff1a; 步骤 1&#x…...

C++知识点总结(58):序列型动态规划

动态规划Ⅰ 一、基础1. 意义2. 序列 dp 解法 二、例题1. 最大子段和2. 删数最大子段和&#xff08;数据强度&#xff1a;pro max&#xff09;3. 最长上升子序列&#xff08;数据强度&#xff1a;pro max&#xff09;4. 3 或 5 的倍数序列5. 数码约数序列 一、基础 1. 意义 动…...

【系统架构设计师】真题论文: 论网络安全体系设计(包括解题思路和素材)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 真题题目(2014年 试题4)解题思路论文素材参考网络安全体系设计目标与原则网络安全体系的主要组成部分网络安全体系设计流程真题题目(2014年 试题4) 随着社会信息化的普及,计算机网络已经在各行各业得到了广泛…...

TypeScript学习笔记(三)

类型详细介绍 七、常用类型与语法 1.any any 的含义是&#xff1a;任意类型&#xff0c;一旦将变量类型限制为 any , 那就意味着放弃了对该变量的类型检查。 // 明确的表示a的类型是 any —— 【显式的any】 let a: any // 以下对a的赋值&#xff0c;均⽆警告 a 100 a 你…...

logstash 解析数组格式json数据:split, json

1&#xff0c;需求说明 原始数据格式&#xff1a; 1条 &#xff08;2*2&#xff09;》4个指标数据 [{"app":"aa","url":"www.1.com","metrics":[{"name":"cpu","value":11},{"name&quo…...

修改一下达梦disql 提示符

经常用disql的有时某些信息希望提示一下&#xff0c;默认的只显示SQL> 为了方便使用&#xff0c;可以在 glogin.sql 中增加些内容。 vi $DM_HOME/bin/disql_conf/glogin.sql增加以下几行 set time on set lineshow offcol global_name new_value global_name SELECT ins…...

Vue通用组件设计原则

在 Vue.js 开发中&#xff0c;设计通用组件是一项重要的任务&#xff0c;可以提升代码的复用性和可维护性。以下是通用组件设计的主要原则和最佳实践&#xff1a; 1. 清晰的职责划分 通用组件应该具有单一的职责&#xff0c;专注于完成某一类特定功能&#xff0c;而不依赖具体…...

uniapp页面样式和布局和nvue教程详解

uniapp页面样式和布局和nvue教程 尺寸单位 uni-app 支持的通用 css 单位包括 px、rpx px 即屏幕像素。rpx 即响应式px&#xff0c;一种根据屏幕宽度自适应的动态单位。以750宽的屏幕为基准&#xff0c;750rpx恰好为屏幕宽度。屏幕变宽&#xff0c;rpx 实际显示效果会等比放大…...

Ubuntu问题 -- 设置ubuntu的IP为静态IP (图形化界面设置) 小白友好

目的 为了将ubuntu服务器IP固定, 方便ssh连接人在服务器前使用图形化界面设置 设置 找到自己的网卡名称, 我的是 eno1, 并进入设置界面 查看当前的IP, 网关, 掩码和DNS (注意对应eno1) nmcli dev show掩码可以通过以下命令查看完整的 (注意对应eno1) , 我这里是255.255.255.…...

【Java】期末复习章节 未完待续(版)

文章目录 【01算法类】1.1 使用冒泡排序算法对数组a{9, 7, 4, 6, 3, 1,10}&#xff0c;按由小到大的规律排序数组中的元素。1.2 从键盘输入一个4位整数n&#xff0c;判断n是否是回文数。&#xff08;回文数是指&#xff0c;将其数字反转排列的数与其本身相同。例如&#xff1a;…...

C语言数据结构——详细讲解 双链表

从单链表到双链表&#xff1a;数据结构的演进与优化 前言一、单链表回顾二、单链表的局限性三、什么是双链表四、双链表的优势1.双向遍历2.不带头双链表的用途3.带头双链表的用途 五、双链表的操作双链表的插入操作&#xff08;一&#xff09;双链表的尾插操作&#xff08;二&a…...

经验笔记:Git 中的远程仓库链接及上下游关系管理

Git 中的远程仓库链接及上下游关系管理 1. 远程仓库的链接信息 当你克隆一个远程仓库时&#xff0c;Git 会在本地仓库中记录远程仓库的信息。这些信息包括远程仓库的 URL、默认的远程名称&#xff08;通常是 origin&#xff09;&#xff0c;以及远程仓库中的所有分支和标签。…...

Swift闭包的本质

1 闭包的本质其实是一个引用类型&#xff1a;存储在堆空间上&#xff0c;由堆分配空间&#xff0c;且生命周期由ARC&#xff08;自动引用计数机制&#xff09;管理 2 捕获值&#xff1a;闭包会捕获上下文使用到的变量&#xff08;引用类型会保持引用关系&#xff09;&#xff…...

【SKFramework框架核心模块】3-2、音频管理模块

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群&#xff1a;398291828小红书小破站 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…...

常用Rust日志处理工具教程

在本文中&#xff0c;我想讨论Rust中的日志。通过一些背景信息&#xff0c;我将带您了解两个日志库&#xff1a;env_logger和log4rs。最后&#xff0c;我将分享我的建议和github的片段。 Rust log介绍 log包是Rust中日志API的事实标准&#xff0c;共有五个日志级别&#xff1…...

深入理解索引(二)

1.引言 在数据库和数据结构中&#xff0c;索引&#xff08;Index&#xff09;是一种用于提高数据检索速度的重要机制。本文将详细深入介绍索引。 2. 为什么要使用索引 大家在使用索引之前一定要搞清楚使用索引的目的&#xff0c;因为索引的不当使用可能不但起不到正向作用&a…...

Python 开发工具 -- PyCharm 简介

一、PyCharm 简介 PyCharm 是由 JetBrains 打造的一款 Python IDE。 PyCharm 具备一般 Python IDE 的功能&#xff0c;比如&#xff1a;调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制等。 另外&#xff0c;PyCharm 还提供了一些很好的功能用…...

C# 属性 学习理解记录

字段和属性 左边字段&#xff0c;右边属性 拓展&#xff0c;属性安全&#xff1a; 1、设置public private 和protected 等&#xff0c;只读&#xff0c;只写&#xff0c; 2、在get set 方法时&#xff0c;验证&#xff0c;异常时抛出错误...

使用chrome 访问虚拟机Apache2 的默认页面,出现了ERR_ADDRESS_UNREACHABLE这个鸟问题

本地环境 主机MacOs Sequoia 15.1虚拟机Parallels Desktop 20 for Mac Pro Edition 版本 20.0.1 (55659)虚拟机-操作系统Ubuntu 22.04 服务器版本 最小安装 开发环境 编辑器编译器调试工具数据库http服务web开发防火墙Vim9Gcc13Gdb14Mysql8Apache2Php8.3Iptables 第一坑 数…...

【大数据学习 | Spark-Core】Spark的分区器(HashPartitioner和RangePartitioner)

之前学过的kv类型上面的算子 groupby groupByKey reduceBykey sortBy sortByKey join[cogroup left inner right] shuffle的 mapValues keys values flatMapValues 普通算子&#xff0c;管道形式的算子 shuffle的过程是因为数据产生了打乱重分&#xff0c;分组、排序、join等…...

第六届国际科技创新学术交流大会(IAECST 2024)暨第四届物流系统与交通运输国际学术会议(LSTT 2024)

重要信息 会议官网&#xff1a;www.lstt.org 大会时间&#xff1a;2024年12月6-8日 大会地点&#xff1a;中国-广州 大会简介 第六届国际科技创新学术交流大会暨第四届物流系统与交通运输国际学术会议&#xff08;LSTT 2024&#xff09;将于2024年12月6-8日在广州举办&…...

看Threejs好玩示例,学习创新与技术(ogl)

本文标题可能看的你莫名奇妙&#xff0c;什么是ogl&#xff1f;ogl是一个新的三维引擎库&#xff0c;可以简单任务是非常简化的ThreeJS。下面图是它的一个示例&#xff0c;可见虽然它是一个麻雀&#xff0c;但五脏还是比较全的。 1、先说OGL OGL的代码非常简单&#xff0c;主要…...

读书笔记_《创华为.任正非传》_精华书摘

人生经历 43岁&#xff0c;开始创建华为 爷爷:金华火腿乡间厨师 父亲: 1910年生&#xff0c;北平民大经济系读书->职业学校任教->国民党兵工厂会计&#xff0c;组织读书会(读书会后来有很多人在新中国成立后成为高级干部。) 母亲: 高中毕业&#xff0c;乡村教师&#xf…...

4.4 MySQL 触发器(Trigger)

触发器是一种特殊的数据库对象&#xff0c;在特定事件&#xff08;如INSERT、UPDATE或DELETE&#xff09;触发时自动执行定义好的操作。它可以帮助我们实现更高效的数据管理和业务规则的约束。 1. 简介 1.1 什么是触发器 触发器&#xff08;Trigger&#xff09;是由用户定义的…...

遗传算法(Genetic Algorithm, GA)

简介 遗传算法&#xff08;Genetic Algorithm, GA&#xff09;是一种基于自然选择和遗传机制的优化算法&#xff0c;由 John Holland 于20世纪70年代提出。它是一种模拟生物进化过程的启发式搜索算法&#xff0c;被广泛应用于函数优化、机器学习、调度问题等领域。 代码说明 …...

CentOS8.5.2111(7)完整的Apache综合实验

一、实验目标 1.掌握Linux系统中Apache服务器的安装与配置&#xff1b; 2.掌握个人主页、虚拟目录、基于用户和主机的访问控制及虚拟主机的实现方法。 二、实验要求 练习使用linux系统下WEB服务器的配置方法。 三、实验背景 重庆工程学院为筹备“重庆工程大学”特申请了c…...

flink学习(3)——方法的使用—对流的处理(map,flatMap,filter)

map 数据 86.149.9.216 10001 17/05/2015:10:05:30 GET /presentations/logstash-monitorama-2013/images/github-contributions.png 83.149.9.216 10002 17/05/2015:10:06:53 GET /presentations/logstash-monitorama-2013/css/print/paper.css 83.149.9.216 10002 17/05/20…...

Feed流系统重构:架构篇

重构对我而言&#xff0c;最大的乐趣在于解决问题。我曾参与一个C#彩票算奖系统的重构&#xff0c;那时系统常因超时引发用户投诉。接手任务时&#xff0c;我既激动又紧张&#xff0c;连续两天几乎废寝忘食地编码。结果令人振奋&#xff0c;算奖时间从一小时大幅缩短至十分钟。…...

YOLOv11融合[NeurlS2022]递归门控卷积gnconv模块及相关改进思路

YOLOv11v10v8使用教程&#xff1a; YOLOv11入门到入土使用教程 YOLOv11改进汇总贴&#xff1a;YOLOv11及自研模型更新汇总 《HorNet: Efficient High-Order Spatial Interactions with Recursive Gated Convolutions》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org…...

java: itext 5.5 create pdf

/*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司* 许可信息查看&#xff1a; https://github.com/itext/itext-publications-examples-java/blob/develop/src/main/java/com/itextpdf/samples/sandbox/fonts/FreeSansBold.java* 描述&#xff1a;https://mvnreposit…...

EF Core学习笔记二

一、新建.net core的控制台项目 二、安装Entity Framework Core 我们使用的数据库是Sqlite,所以我们需要的程序包是Microsoft.EntityFrameworkCore.Sqlite。 如果想了解更多EF Core NuGet包,请参考:EF Core NuGet 包 | Microsoft Learn Install-Package Microsoft.Entit…...

快速排序【hoare版】

目录 介绍 算法思路 函数实现 函数声明 确定基准值 创建新函数 创建循环找数据&#xff08;right&#xff0c;left&#xff09; 交换左右数据 交换条件设置 外部循坏条件设置 初步总结代码 循环条件完善 内层循环的完善 外层循环的完善 相遇值大于keyi 相遇值等于k…...

day03(单片机高级)RTOS

目录 RTOS(实时操作系统) 裸机开发模式 轮询方式 前后台&#xff08;中断方式&#xff09; 改进&#xff08;前后台&#xff08;中断&#xff09;&#xff09;定时器 裸机进一步优化 裸机的其他问题 RTOS的概念 什么是RTOS 为什么要使用 RTOS RTOS的应用场景 RTOS的…...

vue中v-if和v-show的区别

文章为本菜鸡学习过程中遇到的问题记录&#xff0c;不是专业的&#xff0c;如有问题和不足还请大佬指正 >参考文章 文章目录 前言1、v-if2、v-show3、v-if和v-show的区别 前言 问题描述&#xff1a; 在完成表单验证任务的学习过程中&#xff0c;发现在使用v-show隐藏元素后…...

MacOS通过VMware Fusion安装windows 11问题汇总

环境 虚拟机&#xff0c;VMware Fusion 13.6.1本地机器&#xff0c;ARM芯片的Mac&#xff0c;系统版本14.5Windows系统镜像&#xff0c;Window11 ARM 64 bit 安装卡在WiFi连接界面 适合我本地环境的解决步骤为&#xff1a; 1、系统设置网络共享 我开启的是en5&#xff0c;这…...

Stable Diffusion的解读(二)

Stable Diffusion的解读&#xff08;二&#xff09; 文章目录 Stable Diffusion的解读&#xff08;二&#xff09;摘要Abstract一、机器学习部分1. 算法梳理1.1 LDM采样算法1.2 U-Net结构组成 2. Stable Diffusion 官方 GitHub 仓库2.1 安装2.2 主函数2.3 DDIM采样器2.4 Unet 3…...

十五届蓝桥杯赛题-c/c++ 大学b组

握手问题 很简单&#xff0c;相互牵手即可&#xff0c;但是要注意&#xff0c;第一个人只能与其他49个人牵手&#xff0c;所以开头是加上49 #include <iostream> using namespace std; int main() {int cnt0;for(int i49;i>7;i--){cnti;//cout<<i<<&quo…...

NFS搭建

NFS搭建 单节点安装配置服务器安装配置启动并使NFS服务开机自启客户端挂载查看是否能发现服务器的共享文件夹创建挂载目录临时挂载自动挂载 双节点安装配置服务器安装配置服务端配置NFS服务端配置Keepalived编辑nfs_check.sh监控脚本安装部署RsyncInofity 客户端 单节点安装配置…...

【贪心算法第二弹——2208.将数组和减半的最小操作数】

1.题目解析 题目来源 2208.将数组和减半的最小操作数——力扣 测试用例 2.算法原理(贪心策略) 3.实战代码 class Solution { public:int halveArray(vector<int>& nums) {priority_queue<double> hash;double sum 0.0;for(auto e : nums){hash.push(e);sum …...

ByteBuffer 与 ByteBuf 的对比与优缺点分析

在 Java 网络编程和高性能 I/O 场景中&#xff0c;ByteBuffer 和 ByteBuf 是两种重要的缓冲区处理工具。ByteBuffer 是 Java NIO 标准库的一部分&#xff0c;而 ByteBuf 是由 Netty 框架提供的增强缓冲区工具。在实际开发中&#xff0c;选择哪一种取决于场景需求和性能目标。 …...

SpringBoot 集成 html2Pdf

一、概述&#xff1a; 1. springboot如何生成pdf&#xff0c;接口可以预览可以下载 2. vue下载通过bold如何下载 3. 一些细节&#xff1a;页脚、页眉、水印、每一页得样式添加 二、直接上代码【主要是一个记录下次开发更快】 模板位置 1. 导入pom包 <dependency><g…...

【IDEA】插件篇

环境&#xff1a;Mac M &#xff0c;IDEA 2024.2.4 一、汉化 & 汉化后转回英文 1、汉化 IntelliJ IDEA -> Preferences -> Plugins -> MarketPlace&#xff0c;输入 chinese&#xff0c;点击 安装&#xff0c;安装完成后 重启IDE 2、汉化后转回英文 IntelliJ …...

librdns一个开源DNS解析库

原文地址&#xff1a;librdns一个开源DNS解析库 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 介绍 librdns是一个开源的异步多功能插件式的解析器&#xff0c;用于DNS解析。 源代码地址&#xff1a;GitHub - vstakhov/librdns: Asynchrono…...

数据结构 【带环单链表】

在单链表中可能会存在一种情况&#xff0c;某一结点在经过几次转移之后回到了自己本身&#xff0c;这种情况就称之为带环链表。对于带环链表&#xff0c;我们不能轻易对其进行遍历&#xff0c;遍历可能会导致产生死循环。 带环链表的逻辑图如下所示&#xff1a;&#xff08;这…...

CodiMD导出pdf失败或无中文

CodiMD导出pdf失败&#xff0c;弹出文件保存窗口&#xff0c;有个pdf文件能下载&#xff0c;但是保存的时候提示“网站出问题了”&#xff0c;实际到服务器上看会发现docker崩溃了。 解决办法&#xff1a; 使用最新的CodiMD镜像&#xff0c;如nabo.codimd.dev/hackmdio/hackmd:…...