You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel绘图项目保存按钮实现:输入值获取与返回处理问询

Laravel绘图网站保存功能实现方案

1. 调整路由与请求方式

原GET路由不适合携带用户动态输入的表单数据,建议改用POST路由(符合RESTful创建资源的规范):

// web.php
Route::post('canvas/save', [CustomAuthController::class, 'SaveDrawing'])->name('canvas.save');

2. 前端传递画布名称与尺寸

方法一:表单提交(简单直接)

将输入框与保存按钮包裹在表单中,同时传递画布尺寸:

<form action="{{ route('canvas.save') }}" method="POST">
    @csrf
    <!-- 隐藏字段传递画布尺寸 -->
    <input type="hidden" name="size" value="{{ $size }}">
    <!-- 画布名称输入框 -->
    <input oninput="ChangeInput(this.value)" value="Canvas" type="text" name="title" id="title">
    <!-- 保存按钮 -->
    <button type="submit">保存画布</button>
</form>

点击提交按钮时,表单会自动将title和size字段POST到后端。

方法二:AJAX提交(无刷新体验)

如果想要避免页面刷新,用AJAX提交更合适:

<input oninput="ChangeInput(this.value)" value="Canvas" type="text" name="title" id="title">
<button onclick="saveCanvas()">保存画布</button>

<script>
function saveCanvas() {
    const title = document.getElementById('title').value;
    const size = {{ $size }}; // 假设$size是后端传递到视图的变量

    fetch("{{ route('canvas.save') }}", {
        method: 'POST',
        headers: {
            'X-CSRF-TOKEN': "{{ csrf_token() }}",
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
            title: title,
            size: size
        })
    })
    .then(response => response.json())
    .then(data => {
        if (data.success) {
            // 插入弹窗视图到页面
            document.body.insertAdjacentHTML('beforeend', data.html);
        }
    })
    .catch(error => console.error('保存失败:', error));
}
</script>

3. 后端获取参数并保存数据

修改SaveDrawing方法,通过请求实例获取参数,同时替换硬编码的用户ID:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

public function SaveDrawing(Request $request) {
    // 可选:验证参数合法性
    $request->validate([
        'title' => 'required|string|max:255',
        'size' => 'required|string|max:255', // 根据你的size类型调整规则
    ]);

    $name = $request->input('title');
    $size = $request->input('size');
    $userId = Auth::id(); // 获取当前登录用户ID,替代硬编码的1

    $drawing = $this->createDrawing($name, $size, $userId);

    // 根据请求类型返回响应
    if ($request->wantsJson()) {
        // AJAX请求返回JSON,携带弹窗HTML
        return response()->json([
            'success' => true,
            'html' => view('partials.save-success-modal', compact('drawing'))->render()
        ]);
    } else {
        // 表单提交返回原页面,存入成功提示
        session()->flash('success', '画布保存成功!');
        return back();
    }
}

4. 实现弹窗局部视图

创建局部视图resources/views/partials/save-success-modal.blade.php:

<div class="modal-overlay" onclick="this.remove()">
    <div class="modal">
        <h3>保存成功!</h3>
        <p>你的画布 "{{ $drawing->name }}" 已保存。</p>
        <button onclick="this.closest('.modal-overlay').remove()">关闭</button>
    </div>
</div>

<style>
.modal-overlay {
    position: fixed;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    background: rgba(0,0,0,0.5);
    display: flex;
    justify-content: center;
    align-items: center;
}
.modal {
    background: white;
    padding: 2rem;
    border-radius: 8px;
    text-align: center;
}
</style>

如果是表单提交,在主视图中添加以下代码显示弹窗:

@if(session('success'))
    <div class="modal-overlay" onclick="this.remove()">
        <div class="modal">
            <h3>保存成功!</h3>
            <p>{{ session('success') }}</p>
            <button onclick="this.closest('.modal-overlay').remove()">关闭</button>
        </div>
    </div>
@endif

内容的提问来源于stack exchange,提问作者Christian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 10:30:45