人称外号大脸猫

Vue3 + UEditorPlus + Laravel 全栈富文本编辑器集成指南

UEditorPlus 简介

UEditorPlus 是百度 UEditor 的现代化升级版,提供丰富的富文本编辑功能:

  • 支持图片/视频/文件上传
  • 表格、代码块、公式编辑
  • 多平台兼容
  • 完善的API接口

前端集成步骤(Vue3)

安装依赖

npm i vue-ueditor-wrap@3.x

目录结构准备

复制 UEditorPlus 的 public 到项目静态资源目录:

public/
  └── static/
       └── UEditorPlus/
            ├── ueditor.config.js
            ├── ueditor.all.js
            └── ...其他资源文件

Vue组件实现

<template>
  <vue-ueditor-wrap
    v-model="content"
    :config="editorConfig"
    :editor-id="editorId"
    @ready="onEditorReady"
  />
</template>

<script setup>
import { ref } from 'vue';

const content = ref('');
const editorId = ref(`editor_${Date.now()}`);

const editorConfig = {
  serverUrl: `${import.meta.env.VITE_API_BASE}/admin/ueditor`,
  serverHeaders: { 
    Authorization: `Bearer ${localStorage.getItem('token')}` 
  },
  UEDITOR_HOME_URL: '/static/UEditorPlus/',
  initialFrameHeight: 500,
  autoHeightEnabled: false,
  // 其他配置...
};
</script>

关键配置说明

配置项 说明 示例值
serverUrl 后端接口地址 /api/ueditor
UEDITOR_HOME_URL 编辑器资源路径 /static/UEditorPlus/
initialFrameHeight 编辑器初始高度 500
autoHeightEnabled 是否自动增高 false
serverHeaders 上传请求头(用于身份验证) { Authorization: 'Bearer...'}

Laravel后端实现

控制器核心方法

public function index(Request $request)
{
    $actions = [
        'config' => 'getConfig',
        'upload' => 'handleUpload',
        'crawl' => 'handleCrawl',
        'listImage' => 'listImages'
    ];
    
    $action = $request->input('action');
    return $actions[$action]($request);
}

// 获取编辑器配置
private function getConfig()
{
    return response()->json([
        'imageMaxSize' => 10 * 1024 * 1024,
        'imageAllowFiles' => ['.png', '.jpg', '.jpeg'],
        'videoAllowFiles' => ['.mp4'],
        // ...其他配置
    ]);
}

// 文件上传处理
private function handleUpload(Request $request)
{
    $file = $request->file('file');
    $type = $request->input('action'); // image/video/file
    
    $path = $file->store("ueditor/{$type}/".date('Ym'));
    $url = Storage::url($path);

    return response()->json([
        'state' => 'SUCCESS',
        'url' => $url,
        'title' => basename($path),
        'original' => $file->getClientOriginalName()
    ]);
}

// 涂鸦图片处理
private function handleCrawl(Request $request)
{
    $base64 = $request->input('file');
    $image = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $base64));
    
    $filename = 'scrawl_'.time().'.png';
    Storage::put("ueditor/scrawl/{$filename}", $image);
    
    return response()->json([
        'state' => 'SUCCESS',
        'url' => Storage::url("ueditor/scrawl/{$filename}")
    ]);
}

路由设置

Route::any('/admin/ueditor', [UEditorController::class, 'index']);

安全增强方案

文件类型验证

$allowTypes = [
    'image' => ['jpg', 'png', 'jpeg', 'gif'],
    'video' => ['mp4', 'mov'],
    'file' => ['pdf', 'doc', 'xlsx']
];

if (!in_array($ext, $allowTypes[$type])) {
    return ['state' => '文件类型不允许'];
}

大小限制

$maxSize = [
    'image' => 10 * 1024 * 1024, // 10MB
    'video' => 100 * 1024 * 1024 // 100MB
];

if ($file->getSize() > $maxSize[$type]) {
    return ['state' => '文件大小超过限制'];
}

XSS过滤

// 前端提交时过滤危险标签
editor.addListener('beforeSubmit', () => {
    const content = editor.getContent();
    const clean = content.replace(/<script.*?>.*?<\/script>/gi, '');
    editor.setContent(clean);
});

常见问题解决

编辑器不显示

  • 检查 UEDITOR_HOME_URL 路径是否正确
  • 确认浏览器控制台是否有404资源错误

上传失败

  • 检查后端路由是否可访问
  • 验证请求头Authorization是否正确传递
  • 查看Laravel日志中的错误信息

跨域问题

在Laravel中配置CORS:

// config/cors.php
'paths' => ['api/*', 'admin/ueditor'],
'allowed_origins' => ['*'],

图片管理扩展

private function listImages(Request $request)
{
    $files = Storage::files('ueditor/images');
    $list = array_map(fn($file) => [
        'url' => Storage::url($file),
        'mtime' => Storage::lastModified($file)
    ], $files);

    return [
        'state' => 'SUCCESS',
        'list' => $list,
        'start' => 0,
        'total' => count($list)
    ];
}

总结

通过本文方案可实现:

  • Vue3项目无缝集成UEditorPlus编辑器 ✅
  • Laravel后端统一处理文件上传 ✅
  • 完整的身份验证和文件管理 ✅
  • 响应式设计适配多设备 ✅
copyright ©2025 ahimu.com all rights reserved 皖ICP备19021547号-1