使用ThinkPHP6和Vue3实现表单防止重复提交的方法

dafenqi
2023-12-30 / 0 评论 / 18 阅读 / 正在检测是否收录...

使用ThinkPHP6和Vue3实现表单防止重复提交的方法

在Web应用程序开发中,表单重复提交是一个常见的问题。当用户多次点击提交按钮时,应用程序可能会收到多个重复的请求,导致数据的重复插入或其他不良后果。为了解决这个问题,我们可以通过使用ThinkPHP6和Vue3来实现一个表单防止重复提交的机制。本文将详细介绍这个方法,包括代码逻辑和示例代码,帮助您理解并应用这一机制。

一、思路和逻辑

1.1 前端逻辑

在Vue3中,我们可以通过点击提交按钮时禁用按钮来防止重复提交。我们可以使用v-bind动态绑定按钮的disabled属性,以便在提交请求期间禁用按钮。此外,可以使用v-on指令将一个点击事件绑定到提交按钮,以便在点击按钮时发出请求。

1.2 后端逻辑

在ThinkPHP6中,我们可以使用Token来防止表单重复提交。Token是一个唯一的随机字符串,由后端生成并嵌入到表单中。在提交表单时,前端将Token一同发送给后端进行验证。如果后端接收到的Token与生成的Token不一致,那么说明可能是重复提交,应该拒绝请求。

二、代码实现

2.1 前端代码

下面是一个使用Vue3实现的前端代码示例:

<template>
  <div>
    <form @submit.prevent="submitForm">
      <input type="text" v-model="name" placeholder="请输入姓名" />
      <input type="email" v-model="email" placeholder="请输入邮箱" />
      <button :disabled="submitting" type="submit">提交</button>
    </form>
  </div>
</template>

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

export default {
  setup() {
    const name = ref('');
    const email = ref('');
    const submitting = ref(false);

    const submitForm = async () => {
      if (!submitting.value) {
        submitting.value = true;
        // 发送请求并处理响应
        // 这里使用Axios发送POST请求
        const response = await Axios.post('/submit-form', {
          name: name.value,
          email: email.value,
        });
        // 根据响应结果做出相应处理
        if (response.data.success) {
          alert('提交成功!');
        } else {
          alert('提交失败,请重试!');
        }
        // 重置表单和按钮状态
        name.value = '';
        email.value = '';
        submitting.value = false;
      }
    };

    return {
      name,
      email,
      submitting,
      submitForm,
    };
  },
};
</script>

在上述代码中,我们定义了三个响应式变量name、email和submitting。name和email分别用于绑定输入框的值,submitting用于表示是否正在提交表单。在点击提交按钮时,我们判断submitting是否为false,如果是则将submitting设置为true以禁用提交按钮,之后发送请求并处理响应。最后,无论请求是否成功,我们都重置表单和submitting状态。

2.2 后端代码

下面是一个使用ThinkPHP6实现的后端代码示例:

public function submitForm(Request $request)
{
    $postData = $request->post();
    // 判断Token是否一致
    if ($postData['_token'] !== session('_token')) {
        return json(['success' => false, 'message' => '重复提交,请重试!']);
    }
    // 保存表单数据并返回结果
    // 这里假设使用Eloquent模型来保存数据
    $result = Form::create($postData);

    if ($result) {
        return json(['success' => true]);
    } else {
        return json(['success' => false, 'message' => '提交失败,请重试!']);
    }
}

在上述代码中,我们首先获取请求中的POST数据。之后,我们从session中获取之前生成的Token,然后判断请求中的Token是否与session中的Token一致。如果不一致,说明可能是重复提交,返回相应的错误消息。如果一致,我们将POST数据保存到数据库中,并根据保存结果返回相应的成功或失败消息。

2.3 Token生成与验证

为了生成唯一的Token并将其嵌入到表单中,我们可以使用中间件来处理。以下是一个用于生成和验证Token的中间件示例:

namespace app\middleware;

use think\facade\Session;
use Closure;

class TokenMiddleware
{
    public function handle($request, Closure $next)
{
        $token = uniqid();
        Session::set('_token', $token);

        $response = $next($request);

        $response->header('X-CSRF-Token', $token);

        return $response;
    }
}

在上述代码中,我们首先生成一个唯一的Token并将其存储在session中。之后,我们通过$response对象将Token作为响应头的一部分返回给前端。这样,前端在每次提交请求时都会将Token一同发送给后端进行验证。

三、总结

通过使用ThinkPHP6和Vue3,我们可以轻松实现表单防止重复提交的机制。前端通过禁用提交按钮来防止用户多次点击,后端通过Token来验证请求的唯一性。这种方法可以避免数据的重复插入或其他不良后果。希望本文对您在实现表单防止重复提交中有所帮助。如有疑问或改进意见,请随时提出。

0

Deprecated: strtolower(): Passing null to parameter #1 ($string) of type string is deprecated in /www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php on line 1032

评论 (0)

取消