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

vue3.2使用@wangeditor/editor-for-vue实现富文本编辑器,后端使用thinkphp上传图片

Vue 组件代码

npm i @wangeditor/editor-for-vue
<template><div style="border: 1px solid #ccc;height:600px;"><Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" :mode="mode" /><Editor style="height: 500px; overflow-y: hidden;" v-model="editorValueHtml" :defaultConfig="editorConfig":mode="mode" @onCreated="handleCreated" /></div>
</template><script setup lang="ts">
import { ref, Ref, onMounted, onBeforeUnmount, shallowRef, reactive } from 'vue'
import '@wangeditor/editor/dist/css/style.css' // 引入 css
import { Editor, Toolbar } from '@wangeditor/editor-for-vue'// 编辑器实例,必须用 shallowRef
const editorRef = shallowRef()const mode: Ref = ref('default') // 'default' 或 'simple'// editor HTML
const editorValueHtml = ref('<p>hello</p>')
// 工具栏配置
const toolbarConfig = {}// 初始化配置
const editorConfig: any = {MENU_CONF: {}
}editorConfig.placeholder = '请输入内容...'
editorConfig.MENU_CONF['uploadImage'] = {server: '上传图片接口',timeout: 5 * 1000, // 5sfieldName: 'image',// meta: { token: 'xxx', a: 100 },metaWithUrl: false, // join params to urlheaders: { Accept: 'text/x-json' },allowedFileTypes: ['image/*'],maxFileSize: 5 * 1024 * 1024, // 5Mbase64LimitSize: 5 * 1024, // insert base64 format, if file's size less than 5kbonBeforeUpload(file: any) {console.log('onBeforeUpload', file)return file // will upload this file// return false // prevent upload},onProgress(progress: any) {console.log('onProgress', progress)},onSuccess(file: any, res: any) {console.log('onSuccess', file, res)},onFailed(file: any, res: any) {alert(res.message)console.log('onFailed', file, res)},onError(file: any, err: any, res: any) {alert(err.message)console.error('onError', file, err, res)},
}onMounted(() => {setTimeout(() => {editorValueHtml.value = '<p>模拟 Ajax 异步设置内容</p>'}, 1500)
})// 组件销毁时,也及时销毁编辑器
onBeforeUnmount(() => {const editor = editorRef.valueif (editor == null) returneditor.destroy()
})// 创建实例
const handleCreated = (editor: any) => {editorRef.value = editor // 记录 editor 实例,重要!
}
</script>

thinkphp上传图片接口

<?php
declare (strict_types = 1);namespace app\api\controller;use think\facade\Request;
use think\Validate;class Upload
{public function uploadImage(){// 获取表单上传文件$file = Request::file('image');if ($file) {// 手动验证文件扩展名$validate = new Validate(['ext' => 'jpg,png,gif,jpeg',]);// 获取文件名和扩展名$fileName = $file->getOriginalName();$ext = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));// 验证文件扩展名if (!$validate->check(['ext' => $ext])) {return json(['errno' => 1, 'message' => '文件格式不正确']);}// 定义保存目录$saveDir = './uploads/';  // 将文件保存到 public/uploads 目录// 确保保存目录存在if (!is_dir($saveDir)) {mkdir($saveDir, 0777, true);}// 生成文件的唯一名称,防止文件名重复$uniqueFileName = uniqid() . '-' . $fileName;$savePath = $saveDir . $uniqueFileName;// 移动文件到指定目录if ($file->move($saveDir, $uniqueFileName)) {$url = Request::domain() . '/uploads/' . $uniqueFileName;// 返回图片 URLreturn json(['errno' => 0, 'data' => ['url' => $url]]);} else {// 上传失败获取错误信息return json(['errno' => 1, 'message' => $file->getError()]);}} else {return json(['errno' => 1, 'message' => '没有上传文件']);}}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 父子组件的传参问题,一方改变,另一方随之改变
  • JQuery+HTML+JavaScript:实现地图位置选取和地址模糊查询
  • 图片上传成功却无法显示:静态资源路径配置问题解析
  • GUL图形化界面操作(上部)
  • 大厂面试官问我:两个1亿行的文件怎么求交集?【后端八股文十五:场景题合集】
  • 基于jeecgboot-vue3的Flowable流程-自定义业务表单流程历史信息显示
  • nginx漏洞修复 ngx_http_mp4_module漏洞(CVE-2022-41742)【低可信】 nginx版本升级
  • C++之栈和队列使用及模拟实现
  • 【讲解下iCloud如何高效利用】
  • React前端面试每日一试 3.状态(State)和属性(Props)的区别是什么?
  • Golang | Leetcode Golang题解之第264题丑数II
  • html+css 边框滑动按钮效果
  • [用AI日进斗金系列③]用CodeFlying在企微接单自动生成一个固定资产管理系统
  • Delphi5实现鱼C屏幕保护程序
  • 35_YOLOX网络详解
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • gf框架之分页模块(五) - 自定义分页
  • iOS编译提示和导航提示
  • Iterator 和 for...of 循环
  • js如何打印object对象
  • Linux后台研发超实用命令总结
  • SQL 难点解决:记录的引用
  • Terraform入门 - 1. 安装Terraform
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 初识 beanstalkd
  • 那些被忽略的 JavaScript 数组方法细节
  • 前端代码风格自动化系列(二)之Commitlint
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 应用生命周期终极 DevOps 工具包
  • 源码安装memcached和php memcache扩展
  • 在electron中实现跨域请求,无需更改服务器端设置
  • ​​​【收录 Hello 算法】10.4 哈希优化策略
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (a /b)*c的值
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)3D模板阴影原理
  • (转)shell调试方法
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .bat批处理(十一):替换字符串中包含百分号%的子串
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Core 版本不支持的问题
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net 开发怎么实现前后端分离_前后端分离:分离式开发和一体式发布
  • .net下的富文本编辑器FCKeditor的配置方法
  • /dev/VolGroup00/LogVol00:unexpected inconsistency;run fsck manually
  • @31省区市高考时间表来了,祝考试成功
  • @ResponseBody