vue制作的pc系统中(如若依系统),需要实现按照固定尺寸进行裁剪后再进行图片上传,以下代码讲述的是实现单张图片裁剪上传。

1.第一步需要安装vue-cropper
npm install vue-cropper
2.第二步在需要的页面进入代码引入

import {VueCropper} from "vue-cropper"
3.第三步封装子组件
<template><div><div class="user-info-head" @click="editCropper()"><img v-bind:src="options.img" title="点击上传头像" class="img-lg" /></div><el-dialog :title="title" :visible.sync="open" width="800px" append-to-body @opened="modalOpened"  @close="closeDialog"><el-row><el-col :xs="24" :md="12" :style="{height: '350px'}"><vue-cropperref="cropper":img="options.img":info="true":autoCrop="options.autoCrop":autoCropWidth="options.autoCropWidth":autoCropHeight="options.autoCropHeight":fixedBox="options.fixedBox":outputType="options.outputType"@realTime="realTime"v-if="visible"/></el-col><el-col :xs="24" :md="12" :style="{height: '350px'}"><div class="avatar-upload-preview-update"><img :src="previews.url" :style="previews.img" /></div></el-col></el-row><br /><el-row><el-col :lg="2" :sm="3" :xs="3"><el-upload action="#" :http-request="requestUpload" :show-file-list="false" :before-upload="beforeUpload"><el-button size="small">选择<i class="el-icon-upload el-icon--right"></i></el-button></el-upload></el-col><el-col :lg="{span: 1, offset: 2}" :sm="2" :xs="2"><el-button icon="el-icon-plus" size="small" @click="changeScale(1)"></el-button></el-col><el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2"><el-button icon="el-icon-minus" size="small" @click="changeScale(-1)"></el-button></el-col><el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2"><el-button icon="el-icon-refresh-left" size="small" @click="rotateLeft()"></el-button></el-col><el-col :lg="{span: 1, offset: 1}" :sm="2" :xs="2"><el-button icon="el-icon-refresh-right" size="small" @click="rotateRight()"></el-button></el-col><el-col :lg="{span: 2, offset: 6}" :sm="2" :xs="2"><el-button type="primary" size="small" @click="uploadImg()">提 交</el-button></el-col></el-row></el-dialog></div>
</template><script>
import store from "@/store"
import { VueCropper } from "vue-cropper"
import { uploadCommonImg } from "@/api/system/user"
import { debounce } from '@/utils'export default {components: { VueCropper },props: {url: {type: String,default: ""},},data() {return {// 是否显示弹出层open: false,// 是否显示croppervisible: false,// 弹出层标题title: "修改头像",options: {img: '',  //裁剪图片的地址autoCrop: true,             // 是否默认生成截图框autoCropWidth: 162,         // 默认生成截图框宽度autoCropHeight: 200,        // 默认生成截图框高度fixedBox: true,             // 固定截图框大小 不允许改变outputType:"png",           // 默认生成截图为PNG格式filename: 'avatar'          // 文件名称},previews: {},resizeHandler: null}},mounted() {this.options.img= this.url?(process.env.VUE_APP_BASE_API +this.url):''},methods: {// 编辑头像editCropper() {this.open = true},// 打开弹出层结束时的回调modalOpened() {this.visible = trueif (!this.resizeHandler) {this.resizeHandler = debounce(() => {this.refresh()}, 100)}window.addEventListener("resize", this.resizeHandler)},// 刷新组件refresh() {this.$refs.cropper.refresh()},// 覆盖默认的上传行为requestUpload() {},// 向左旋转rotateLeft() {this.$refs.cropper.rotateLeft()},// 向右旋转rotateRight() {this.$refs.cropper.rotateRight()},// 图片缩放changeScale(num) {num = num || 1this.$refs.cropper.changeScale(num)},// 上传预处理beforeUpload(file) {if (file.type.indexOf("image/") == -1) {this.$modal.msgError("文件格式错误,请上传图片类型,如:JPG,PNG后缀的文件。")} else {const reader = new FileReader()reader.readAsDataURL(file)reader.onload = () => {this.options.img = reader.resultthis.options.filename = file.name}}},// 上传图片uploadImg() {this.$refs.cropper.getCropBlob(data => {let formData = new FormData()formData.append("file", data, this.options.filename)uploadCommonImg(formData).then(response => {this.open = falsethis.options.img = process.env.VUE_APP_BASE_API + response.fileNameconsole.log('this.options.img',this.options.img)this.$emit('outUrl', response.fileName)this.visible = false})})},// 实时预览realTime(data) {this.previews = data},// 关闭窗口closeDialog() {// this.options.img =''this.visible = falsewindow.removeEventListener("resize", this.resizeHandler)}}
}
</script>
<style scoped lang="scss">
.user-info-head {position: relative;display: inline-block;height: 120px;
}.user-info-head:hover:after {content: '+';position: absolute;left: 0;right: 0;top: 0;bottom: 0;color: #eee;background: rgba(0, 0, 0, 0.5);font-size: 24px;font-style: normal;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;cursor: pointer;line-height: 110px;//border-radius: 50%;text-align: center;
}
</style>
4.第四步,父级页面引入该子组件
 //其中url是父组件进行子组件的初始化传值  outUrl是接收子组件传递过来的参数 <imgCrop @outUrl="getUrl" :url="form.peoImage"/>
5.第五步 接收子组件传递过来的参数
 getUrl(url) {this.form.peoImage = url},

因为我用的若依系统,ruoyi.css中集成了上述组件中的样式 ,粘贴如下:

/**
* 通用css样式布局处理
* Copyright (c) 2019 ruoyi
*//** 基础通用 **/
.pt5 {padding-top: 5px;
}.pr5 {padding-right: 5px;
}.pb5 {padding-bottom: 5px;
}.mt5 {margin-top: 5px;
}.mr5 {margin-right: 5px;
}.mb5 {margin-bottom: 5px;
}.mb8 {margin-bottom: 8px;
}.ml5 {margin-left: 5px;
}.mt10 {margin-top: 10px;
}.mr10 {margin-right: 10px;
}.mb10 {margin-bottom: 10px;
}
.ml10 {margin-left: 10px;
}.mt20 {margin-top: 20px;
}.mr20 {margin-right: 20px;
}.mb20 {margin-bottom: 20px;
}
.ml20 {margin-left: 20px;
}.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 {font-family: inherit;font-weight: 500;line-height: 1.1;color: inherit;
}.el-message-box__status + .el-message-box__message{word-break: break-word;
}.el-dialog:not(.is-fullscreen) {margin-top: 6vh !important;
}.el-dialog__wrapper.scrollbar .el-dialog .el-dialog__body {overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;
}.el-table {.el-table__header-wrapper, .el-table__fixed-header-wrapper {th {word-break: break-word;background-color: #f8f8f9;color: #515a6e;height: 40px;font-size: 13px;}}.el-table__body-wrapper {.el-button [class*="el-icon-"] + span {margin-left: 1px;}}
}/** 表单布局 **/
.form-header {font-size: 15px;color: #6379bb;border-bottom: 1px solid #ddd;margin: 8px 10px 25px 10px;padding-bottom: 5px
}/** 表格布局 **/
.pagination-container {display: flex;justify-content: flex-end;margin-top: 20px;
}/* tree border */
.tree-border {margin-top: 5px;border: 1px solid #e5e6e7;background: #FFFFFF none;border-radius: 4px;
}@media (max-width: 768px) {.pagination-container .el-pagination > .el-pagination__jump {display: none !important;}.pagination-container .el-pagination > .el-pagination__sizes {display: none !important;}
}.el-table .fixed-width .el-button--mini {padding-left: 0;padding-right: 0;width: inherit;
}/** 表格更多操作下拉样式 */
.el-table .el-dropdown-link,.el-table .el-dropdown-selfdefine {cursor: pointer;margin-left: 5px;
}.el-table .el-dropdown, .el-icon-arrow-down {font-size: 12px;
}.el-tree-node__content > .el-checkbox {margin-right: 8px;
}.list-group-striped > .list-group-item {border-left: 0;border-right: 0;border-radius: 0;padding-left: 0;padding-right: 0;
}.list-group {padding-left: 0px;list-style: none;
}.list-group-item {border-bottom: 1px solid #e7eaec;border-top: 1px solid #e7eaec;margin-bottom: -1px;padding: 11px 0px;font-size: 13px;
}.pull-right {float: right !important;
}.el-card__header {padding: 14px 15px 7px;min-height: 40px;
}.el-card__body {padding: 15px 20px 20px 20px;
}.card-box {margin-bottom: 10px;
}/* button color */
.el-button--cyan.is-active,
.el-button--cyan:active {background: #20B2AA;border-color: #20B2AA;color: #FFFFFF;
}.el-button--cyan:focus,
.el-button--cyan:hover {background: #48D1CC;border-color: #48D1CC;color: #FFFFFF;
}.el-button--cyan {background-color: #20B2AA;border-color: #20B2AA;color: #FFFFFF;
}/* text color */
.text-navy {color: #1ab394;
}.text-primary {color: inherit;
}.text-success {color: #1c84c6;
}.text-info {color: #23c6c8;
}.text-warning {color: #f8ac59;
}.text-danger {color: #ed5565;
}.text-muted {color: #888888;
}/* image */
.img-circle {border-radius: 50%;
}.img-lg {width: 120px;height: 120px;
}.avatar-upload-preview {position: relative;top: 50%;left: 50%;transform: translate(-50%, -50%);width: 200px;height: 200px;border-radius: 50%;box-shadow: 0 0 4px #ccc;overflow: hidden;
}
.avatar-upload-preview-update {position: relative;top: 50%;left: 50%;transform: translate(-50%, -50%);width:162px;height: 200px;//border-radius: 50%;box-shadow: 0 0 4px #ccc;overflow: hidden;
}
.swiper-upload-preview-update {position: relative;top: 50%;left: 50%;transform: translate(-50%, -50%);width:352px;height: 150px;//border-radius: 50%;box-shadow: 0 0 4px #ccc;overflow: hidden;
}
/* 拖拽列样式 */
.sortable-ghost {opacity: .8;color: #fff !important;background: #42b983 !important;
}.top-right-btn {position: relative;float: right;
}/* 分割面板样式 */
.splitpanes.default-theme .splitpanes__pane {background-color: #fff!important;
}

6.至此完结。

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

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

相关文章

后台管理系统-5-vue3之子路由渲染首页及卡片容器和表格容器实现

文章目录 1 子路由的实现 1.1 router/index.js 1.2 views/Home.vue(首页) 1.3 Main.vue 2 左上方的卡片 2.1 分栏间隔(Layout布局) 2.2 卡片容器(el-card) 2.3 整体代码Home.vue 3 左下方的table(静态实现) 3.1 准备数据 3.2 渲染表格(el-table) 3.3 整体代码Home.vue 4 附录 子…

在CentOS系统中查询已删除但仍占用磁盘空间的文件

在CentOS系统中查询已删除但仍占用磁盘空间的文件在CentOS系统中查询已删除但仍占用磁盘空间的文件1. 检查磁盘整体使用情况2. 查找被删除但仍被进程占用的文件3. 释放磁盘空间4. 替代方案&#xff08;不终止进程&#xff09;注意事项补充工具在CentOS系统中查询已删除但仍占用…

正点原子【第四期】Linux之驱动开发学习笔记-1.1 Linux驱动开发与裸机开发的区别

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子【第四期】手把手教你学Linux系列课程之 Linux驱动开发篇”视频的学习笔记&#xff0c;该课程配套开发板为正点原子alpha/mini Linux开发板。在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内…

Android SystemServer 中 Service 的创建和启动方式

今天导师给我将讲了一些如何新建一个系统服务&#xff0c;以及如何去初始化。 Android SystemServer 中 Service 的创建和启动方式 在 Android 系统中&#xff0c;SystemServer 是系统服务的核心进程&#xff0c;负责启动和管理各种系统服务。以下是 SystemServer 中服务创建和…

SQL SERVER中位数

有11家门店数据&#xff0c;要求每天所有门店的各个指标的中位数1.第一种做法&#xff0c;使用PERCENTILE_CONT&#xff08;&#xff09; 函数 SQL SERVER 2012 版本及以上PERCENTILE_CONT 函数简介PERCENTILE_CONT 是 SQL 中的窗口函数&#xff0c;用于计算连续百分位数&#…

【java中springboot引入geotool】

学习目标&#xff1a; 在Spring Boot项目中引入GeoTools库&#xff0c;可以按照以下步骤进行&#xff1a;理解GeoTools库的基本信息和用途 GeoTools是一个开源的Java库&#xff0c;用于处理地理信息系统&#xff08;GIS&#xff09;数据。它提供了对空间数据的读取、写入、查询…

多项目开发环境:如何使用update-alternatives管理多版本Java JDK?(Windows、Mac、Ubuntu)

如何使用update-alternatives管理多版本Java JDK&#xff1f;&#xff08;Windows、Mac、Ubuntu&#xff09; &#x1f4d6; 摘要 在实际开发中&#xff0c;往往会遇到既要维护老项目又要跟进新特性的场景&#xff0c;这就需要在一台机器上同时安装并切换多个Java JDK版本。本…

力扣57:插入区间

力扣57:插入区间题目思路代码题目 给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束&#xff0c;并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval […

KVM虚拟化技术解析:从企业应用到个人创新的开源力量

1 .KVM&#xff1a;开源虚拟化的核心引擎 KVM&#xff08;Kernel-based Virtual Machine&#xff09;作为Linux内核原生集成的开源虚拟化模块&#xff0c;彻底改变了现代数据中心的虚拟化格局。它通过将Linux内核转变为Type-1型虚拟机监控器&#xff08;Hypervisor&#xff09;…

28.Linux :通过源代码编译安装lamp

Linux &#xff1a;通过源代码编译安装lamp 区别特性源代码编译安装yum 安装安装方式从源代码编译构建预编译的二进制包自定义程度高度可定制有限定制性能优化可针对特定硬件优化通用优化依赖管理手动解决依赖关系自动解决依赖安装复杂度复杂&#xff0c;需技术经验简单&#x…

应用控制技术

一、 应用特征识别技术1.传统行为检测技术1.1 五元组检测原理1.2 配置思路1.3 效果展示需求背景21.4 传统行为检测的缺陷无法识别应用层内容&#xff1a;若应用更换端口&#xff08;如QQ改用随机端口&#xff09;或伪装协议&#xff08;如HTTPS加密&#xff09;&#xff0c;传统…

当MySQL的int不够用了

关于int的长度很多时候看到int(8)这样的定义&#xff0c;其实这是工具导出的不专业。int是范围&#xff0c;不是长度。在开发有了共识&#xff08;知道这个长度不算数&#xff0c;要看范围&#xff09;以后&#xff0c;上来就是所有的类型都是bigint。int的范围int的取值范围是…

让AI学会“边做边想“:ReAct的实战指南

小智的求职困境有个叫小智的AI助手&#xff0c;它刚从"大语言模型大学"毕业&#xff0c;满怀信心地去应聘一家咨询公司的智能助理职位。面试官问&#xff1a;"北京和上海哪个城市人口更多&#xff1f;"小智立刻回答&#xff1a;"根据我的知识&#xf…

vue优化有哪些手段?

vue本身存在的方法 v-if 和v-show 的合理运用,频繁使用的组件使用v-show,不频繁的使用v-if,来减少dom的渲染路由懒加载 采用()>import(index.vue)当路由被访问的时候才回去加载使用keep-alive缓存页面,减少没必要的重复渲染同时也可以减少服务器的压力使用computed缓存数据,…

【图像算法 - 14】精准识别路面墙体裂缝:基于YOLO12与OpenCV的实例分割智能检测实战(附完整代码)

摘要&#xff1a; 裂缝是结构健康的重要隐患&#xff0c;传统人工巡检耗时耗力且易遗漏。本文将带您利用当前最先进的YOLO12实例分割模型&#xff0c;构建一个高效、准确、更高精度的裂缝检测系统。我们将从数据准备、模型训练到结果可视化&#xff0c;手把手实现一个完整的项目…

“让机器人更智慧 让具身体更智能”北京世界机器人大会行业洞察

2025年8月8日&#xff0c;世界机器人大会在北京盛大开幕。本届大会以“让机器人更智慧 让具身体更智能”为主题&#xff0c;由中国电子学会、世界机器人合作组织主办&#xff0c;包括开幕式、闭幕式、论坛等。同期举办世界机器人博览会、世界机器人大赛等活动&#xff0c;打造了…

PHP如何使用JpGraph生成折线图?

JpGraph是一个功能强大的PHP图表库&#xff0c;它通过封装GD库函数&#xff0c;为开发者提供了简单高效的数据可视化解决方案。作为专门用于绘制统计图的面向对象库&#xff0c;JpGraph支持创建折线图、柱状图、饼图等20余种图表类型&#xff0c;并能自动处理坐标轴、刻度、图例…

超级云平台:重构数字生态的“超级连接器“

在数字经济浪潮席卷全球的今天,企业数字化转型已从"选择题"变为"必答题"。然而,传统云服务模式因技术壁垒高、资源分散、协同效率低等问题,让许多企业在数字化转型中陷入"上云易、用云难"的困境。 在此背景下,一种以"全域资源整合+智能…

https如何保证传递参数的安全

HTTPS 并非直接“加密参数”&#xff0c;而是通过一整套加密传输机制&#xff0c;确保客户端与服务器之间所有通信内容&#xff08;包括 URL 参数、表单数据、Cookie 等&#xff09;在传输过程中不被窃听、篡改或伪造。其核心安全保障来自以下技术实现&#xff1a; 一、核心加密…

OpenHarmony之打造全场景智联基座的“分布式星链 ”WLAN子系统

1. 技术架构概览 无线局域网(Wireless Local Area Networks,WLAN),是通过无线电、红外光信号或者其他技术发送和接收数据的局域网,用户可以通过WLAN实现结点之间无物理连接的网络通讯。常用于用户携带可移动终端的办公、公众环境中。 WLAN组件子系统为用户提供WLAN基础功…