框架为:http://ruoyi.vip/

效果为:

代码为:

<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org" xmlns:shiro="http://www.pollix.at/thymeleaf/shiro">
<head>
    <th:block th:include="include :: header('表格行内编辑')"/>
    <th:block th:include="include :: bootstrap-editable-css"/>
</head>
<body class="gray-bg">
<div class="row">
    <div class="col-sm-12 search-collapse">
        <form id="form1">
            <div class="select-list">
                <ul>
                    <li>
                        用户名称:<input type="text" name="userName"/>
                    </li>
                    <li>
                        <a class="btn btn-primary btn-rounded btn-sm"
                           onclick="$.table.search('form1', 'bootstrap-table1')"><i
                                class="fa fa-search"></i> 搜索</a>
                        <a class="btn btn-warning btn-rounded btn-sm"
                           onclick="$.form.reset('form1', 'bootstrap-table1')"><i class="fa fa-refresh"></i> 重置</a>
                    </li>
                </ul>
            </div>
        </form>
    </div>
    <div class="container-div">
        <div class="btn-group-sm" id="toolbar" role="group">
            <a class="btn btn-success" onclick="insertRow()">
                <i class="fa fa-plus"></i> 新增行
            </a>
            <a class="btn btn-info" onclick="getSelections()">
                <i class="fa fa-search"></i> 查询选择数据
            </a>
            <a class="btn btn-primary" onclick="getData()">
                <i class="fa fa-search"></i> 获取所有数据
            </a>
        </div>
        <div class="row">
            <div class="col-sm-12 select-table table-striped">
                <table id="bootstrap-table"
                       data-use-row-attr-func="true"
                       data-reorderable-rows="true"></table>
            </div>
        </div>
    </div>

    <th:block th:include="include :: footer"/>
    <th:block th:include="include :: bootstrap-table-editable-js"/>
    <th:block th:include="include :: bootstrap-table-reorder-js"/>
</div>
<script th:inline="javascript">
    var prefix = ctx + "demo/table";
    var datas = [[${@dict.getType('sys_normal_disable')}]];

    $(function () {
        var options = {
            url: prefix + "/list",
            showSearch: false,
            showRefresh: false,
            showToggle: false,
            showColumns: false,
            showPageGo: true,
            height: 600,
            // fixedColumns: true,
            // fixedNumber: 1,
            onEditableSave: onEditableSave,
            onReorderRow: function (data) {
                //当拖拽结束后,data为整个表格的数据
                console.log('拖拽结束' + JSON.stringify(data));
                return false;
            },
            columns: [{
                checkbox: true
            },
                {
                    field: 'userId',
                    title: '用户ID',
                    titleTooltip: 'wwqwq'
                },
                {
                    field: 'userCode',
                    title: '用户编号',
                    editable: true
                },
                {
                    field: 'userName',
                    title: '用户姓名',
                    editable: {
                        type: 'text',
                        title: '名称',
                        emptytext: "【名称】为空",
                        validate: function (value) {
                            if (value.length > 30) {
                                return '名称不能超过30个字符';
                            }
                            if (value.length == 0) {
                                return '名称不能为空';
                            }
                        }
                    }
                },
                {
                    field: 'userPhone',
                    title: '用户手机'
                },
                {
                    field: 'userEmail',
                    title: '用户邮箱'
                },
                {
                    field: 'userBalance',
                    title: '用户余额'
                },
                {
                    field: 'status',
                    title: '用户状态',
                    align: 'center',
                    editable: {
                        type: 'select',
                        title: '状态',
                        source: [{
                            value: 0,
                            text: "正常"
                        }, {
                            value: 1,
                            text: "停用"
                        }]
                    }
                },
                {
                    title: '操作',
                    align: 'center',
                    formatter: function (value, row, index) {
                        var actions = [];
                        actions.push('<a rel="nofollow" class="btn btn-success btn-xs" href="#"><i class="fa fa-edit"></i>编辑</a> ');
                        actions.push('<a rel="nofollow" class="btn btn-danger btn-xs" href="#"><i class="fa fa-remove"></i>删除</a>');
                        actions.push('<a rel="nofollow" class="btn btn-danger btn-xs" href="#" onclick="insertRow(\'' + row.userId + '\')"><i class="fa fa-remove"></i>新增表格行</a>');
                        actions.push('<a class="fa fa-arrow-circle-up fa-5" style="font-size: 20px; cursor: pointer;" data-toggle="tooltip" data-html="true" th:title="上移步骤" onclick="upsteps(this)"></a>');
                        actions.push('<a class="fa fa-arrow-circle-down fa-5" style="font-size: 20px; cursor: pointer;" data-toggle="tooltip" data-html="true" th:title="下移步骤" onclick="downsteps(this)"></a>');
                        return actions.join('');
                    }
                }]
        };
        $.table.init(options);
    });

    function onEditableSave(field, row, oldValue, $el) {
        alert("字段名:" + field + ",当前值:" + row[field] + ",旧值:" + oldValue);
    }

    /* 查询表格所有数据值 */
    function getData() {
        var data = $("#" + table.options.id).bootstrapTable('getData');
        alert(JSON.stringify(data))
    }

    /* 查询表格选择行数据值 */
    function getSelections() {
        var data = $("#" + table.options.id).bootstrapTable('getSelections');
        alert(JSON.stringify(data))
    }

    /* 新增表格行 */
    function insertRow() {
        var randomId = 100 + ~~(Math.random() * 100)
        $("#" + table.options.id).bootstrapTable('insertRow', {
            index: 0, // 你想插入到哪,0表示第一行
            row: {
                userId: randomId,
                userCode: 2000000 + randomId,
                userName: '测试' + randomId,
                userPhone: '1588888888',
                userEmail: 'ry1@qq.com',
                userBalance: 10 + randomId,
            }
        })
    }

    //根据点击新增
    function insertRow(id) {
        var randomId = 100 + ~~(Math.random() * 100)
        $("#" + table.options.id).bootstrapTable('insertRow', {
            index: id, // 你想插入到哪,0表示第一行
            row: {
                userId: "",
                userCode: "2000000 + randomId",
                userName: '测试' + randomId,
                userPhone: '1588888888',
                userEmail: 'ry1@qq.com',
                userBalance: "10 + randomId",
            }
        })
    }


    /***
     * 向上移动
     */
    function upsteps(obj) {
        if (obj === null) return;
        var parentTD = obj.parentNode; //parentNode是父标签的意思,如果你的TD里用了很多div控制格式,要多调用几次parentNode
        var parentTR = parentTD.parentNode;
        var oTable = document.getElementById("bootstrap-table");
				let number = parentTR.sectionRowIndex;
        if (number== 0) {
            $.modal.msgWarning("只有一个步骤,无需上移");
            return;
        } else {
            swapTr(parentTR, oTable.rows[parentTR.sectionRowIndex]);

        }
    }

    /***
     * 向下移动
     */
    function downsteps(obj) {
        if (obj === null) return;
        var parentTD = obj.parentNode; //parentNode是父标签的意思,如果你的TD里用了很多div控制格式,要多调用几次parentNode
        var parentTR = parentTD.parentNode;
        var oTable = document.getElementById("bootstrap-table");
        var $tr = $(this).parents("tr");
        if ($tr.index() == oTable.rows.length - 1) {
            $.modal.msgWarning("只有一个步骤,无需下移");
            return;
        } else {
            swapTr(parentTR, oTable.rows[parentTR.sectionRowIndex + 2]);

        }
    }

    /**交换tr1和tr2的位置*/
    function swapTr(tr1, tr2) {
        if (null == tr2 || null == tr1) {
            $.modal.msgWarning("只有一个步骤,无需下移");
            return;
        }
        var target = (tr1.rowIndex < tr2.rowIndex) ? tr2.nextSibling : tr2;
        var tBody = tr1.parentNode;
        tBody.replaceChild(tr2, tr1);
        tBody.insertBefore(tr1, target);
    }


</script>
</body>
</html>