如何根据图书可用数量自动切换状态开关

大雪吖_4151

大雪吖_4151

2026-10-24

546人浏览

原创

如何根据图书可用数量自动切换状态开关

本文介绍在 laravel 项目中,使用 bootstrap toggle 开关组件时,根据“可用图书数”动态控制开关状态的完整实现方案:当可用数量为 0 时强制设为 inactive(不可用),否则设为 active,并同步更新 ui 与后端。

本文介绍在 laravel 项目中,使用 bootstrap toggle 开关组件时,根据“可用图书数”动态控制开关状态的完整实现方案:当可用数量为 0 时强制设为 inactive(不可用),否则设为 active,并同步更新 ui 与后端。

在实际业务中,图书的状态(Active/Inactive)不应仅由用户手动切换决定,而需受业务规则约束——例如:当可借阅数量为 0 时,该图书应自动禁用,禁止被借阅;一旦有库存恢复,则允许重新启用。这既保障数据一致性,也提升用户体验。

要实现这一逻辑,关键在于在用户触发开关前,先读取当前行的可用数量(Available: X),并据此覆盖用户的操作意图。以下是优化后的完整前端逻辑:

@foreach($booksData as $book)
<td id="total">
    {{ $book->number_books }}
    <br><h6 class="text-success" data-id="{{ $book->id }}">
        Available: {{ max(0, $book->number_books - $book->number_borrowedbooks) }}
    </h6>
</td>
<td style="width: 25px;">
    <input type="checkbox" class="toggle-class" data-id="{{ $book->id }}" data-forwhat="books" data-onstyle="success" data-offstyle="danger" data-toggle="toggle" data-on="Active" data-off="Inactive">number_books - $book->number_borrowedbooks) > 0 ? ($book->status ? 'checked' : '') : '' }}>
</td>
@endforeach

✅ 注意:初始渲染时,若 Available ≤ 0,则不添加 checked 属性,确保开关默认处于 Inactive 状态。

接着,更新 JavaScript 逻辑,在 AJAX 请求前插入可用性校验:

jQuery(document).ready(function ($) {
    console.log('jQuery and Bootstrap Toggle are loaded!');

    $('.toggle-class').change(function () {
        const $toggle = $(this);
        const id = $toggle.data('id');
        const forwhat = $toggle.data('forwhat') || 'books';
        const token = $('meta[name="csrf-token"]').attr('content');

        // ? 提取当前行“Available: N”中的数字
        const $availabilityEl = $toggle.closest('tr').find('.text-success') || 
                                $toggle.closest('td').prev().find('.text-success');
        const availableText = $availabilityEl.text();
        const availableMatch = availableText.match(/Available:\s*(\d+)/i);
        const available = availableMatch ? parseInt(availableMatch[1], 10) : 0;

        let status;
        if (available === 0) {
            status = 0;
            $toggle.bootstrapToggle('off'); // 强制视觉关闭
            console.warn(`Book ID ${id}: Available = 0 → auto-disabled`);
        } else {
            status = 1;
            $toggle.bootstrapToggle('on'); // 强制视觉开启
        }

        // ? 发起状态更新请求(后端仍需做二次校验!)
        $.ajax({
            type: "POST", // 建议改为 POST,更符合 REST 规范
            dataType: "json",
            url: '/changeStatus',
            data: {
                status,
                id,
                forwhat,
                _token: token,
                _method: 'PATCH' // 若路由定义为 resourceful,建议用 PATCH
            },
            success: function (data) {
                console.log('Status updated:', data.message || 'Success');
                // 可选:显示 Toast 提示
                // toastr.success(data.message || 'Status updated successfully');
            },
            error: function (xhr) {
                console.error('Update failed:', xhr.responseJSON?.message || xhr.statusText);
                // 恢复开关至原状态(防止 UI 与服务端不一致)
                $toggle.bootstrapToggle(status ? 'on' : 'off');
            }
        });
    });
});

? 重要注意事项:

  • 服务端必须重复校验:前端逻辑可被绕过,因此 /changeStatus 接口务必再次检查 available 并拒绝非法激活请求;
  • DOM 定位健壮性:使用 $toggle.closest('tr').find(...) 更可靠(假设表格结构为 <tr> <td>...</td> <td>...</td> </tr>),避免因 HTML 结构微调导致选择器失效;
  • 初始状态一致性:模板中已通过 {{ ($book->number_books - $book->number_borrowedbooks) > 0 ? ... }} 控制默认 checked,确保首屏渲染即符合业务规则;
  • 用户体验优化:可在 available === 0 时禁用开关($toggle.prop('disabled', true)),并添加 Tooltip 提示“库存为 0,无法启用”。

✅ 总结:该方案通过「前端实时校验 + 后端兜底防护」双保险机制,在不改变原有交互习惯的前提下,无缝嵌入业务强约束,是 Laravel 中状态联动控制的典型实践。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
js获取数组长度的方法
js获取数组长度的方法

在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

2023.06.20

5146

5

js刷新当前页面
js刷新当前页面

js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

2023.07.04

1269

3

js四舍五入
js四舍五入

js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

2023.07.04

5064

6

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

2023.09.01

980

4

JavaScript转义字符
JavaScript转义字符

JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.04

1916

5

js生成随机数的方法
js生成随机数的方法

js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

2023.09.04

3625

4

如何启用JavaScript
如何启用JavaScript

JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

2023.09.12

4713

6

Js中Symbol类详解
Js中Symbol类详解

javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

2023.09.20

3080

5

java访问控制修饰符介绍
java访问控制修饰符介绍

java访问控制修饰符有四种,分别是public、protected、private、默认访问修饰符。详细介绍:1、public,public是最宽松的访问控制修饰符,被修饰的类、方法和变量可以被任何其他类访问,当一个类、方法或变量被声明为public时,它们可以在任何地方被访问,无论是同一个包中的类还是不同包中的类;2、protected修饰符等等。

2023.09.20

988

7

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.9万人学习