专栏首页Java系列教程Java单体应用 - 项目实战(后台) - 03.后台账户管理 - 08.批量删除
原创

Java单体应用 - 项目实战(后台) - 03.后台账户管理 - 08.批量删除

批量删除

请参照如上章节导航进行阅读

1.概述

接下来实现 账户列表 页面的 批量删除 操作,预期实现的画面效果如下:

批量选择

批量删除选择 - 光束云 - work100.net

删除确认

批量删除操作确认 - 光束云 - work100.net

2.列表复选框

样式引入

复选框的样式需要使用 icheck-bootstrap 插件,在 resources_head.jsp 文件中引入:

<link rel="stylesheet" href="/static/assets/plugins/icheck-bootstrap/icheck-bootstrap.min.css">

表头复选框

注意命名,代码如下:

<th>
    <div class="icheck-primary d-inline">
        <input type="checkbox" id="checkAll" name="checkAll" />
        <label for="checkAll" />
    </div>
</th>

行复选框

注意命名,代码如下:

<td>
    <div class="icheck-primary d-inline">
        <input type="checkbox" id="checkItem_${authManager.userKey}" name="checkItem" value="${authManager.userKey}" />
        <label for="checkItem_${authManager.userKey}" />
    </div>
</td>

3.全选与反选

提取通用

列表的 全选与反选 功能是通用功能,下面我们将常用方法提取到公用文件 table-utils.js 中,代码如下:

let Table = function() {

    const checkAll = $('#checkAll');
    const checkItems = $('input[name="checkItem"]');

    /**
     * CheckBox 全选与取消全选
     */
    let handleInitCheckboxClick = function() {
        checkAll.click(function() {
            if ($(this).prop('checked')) {
                // 全选
                checkItems.prop('checked', true);
            } else {
                // 取消全选
                checkItems.prop('checked', false);
            }
        });
    }

    /**
     * 获取 CheckBox 选择值
     * @returns {any[]}
     */
    let handleGetCheckboxCheckedValues = function() {
        let arrCheckedValues = new Array();
        checkItems.each(function() {
            if ($(this).prop('checked')) {
                arrCheckedValues.push($(this).val())
            }
        })
        return arrCheckedValues;
    }

    return {
        init: function() {
            handleInitCheckboxClick();
        },

        getCheckboxCheckedValues: function() {
            return handleGetCheckboxCheckedValues();
        }
    }
}();

$(function() {
    Table.init();
});

使用

使用时只需将 table-utils.js 文件引入,代码如下:

<script src="/static/assets/js/table-utils.js"></script>

4.实现批量删除功能

4.1.视图页面脚本代码

// 批量删除
function multiDelete() {
    let userKeys = Table.getCheckboxCheckedValues();
    if (userKeys.length == 0) {
        Message.showFail('请至少选择一条记录');
        return;
    }
    ModalDialog.showConfirm('multi-delete-confirm', '操作确认', '批量删除后数据不可恢复,您确认要操作吗?', multiDelete_callback, userKeys);
}

function multiDelete_callback(userKeys) {
    $.ajax({
        'url': '/auth/manager/multi-delete',
        'type': 'POST',
        'data': { 'userKeys': userKeys.toString() },
        'dataType': 'JSON',
        'success': function(ret) {
            if (ret.status === 200) {
                location.href = '/auth/manager/list';
                // Message.showSuccess(ret.message);
            } else {
                Message.showFail(ret.message);
            }
        }
    });
}

脚本中使用模态确认弹框,所以需要引入 modal-dialog-utils.js 公用文件。

4.2.为批量删除按钮添加事件

<a class="dropdown-item" href="#" onclick="multiDelete()">批量删除</a>

4.3.为AuthManagerMapper.xml增加语句

增加 multiDelete 语句定义,代码如下:

<delete id="multiDelete">
    DELETE FROM auth_manager
    <if test="array != null and array.length > 0">
        WHERE user_key IN
        <foreach collection="array" open="(" close=")" item="userKey" separator=",">
            #{userKey}
        </foreach>
    </if>
    <if test="array == null or array.length == 0">
        WHERE 1 = 2
    </if>
</delete>

4.4.修改AuthManagerDao接口

增加 multiDelete 方法定义,代码如下:

/**
 * 批量删除
 *
 * @param userKeys
 */
void multiDelete(String[] userKeys);

4.5.修改AuthManagerService接口

增加 multiDelete 方法定义,代码如下:

/**
 * 批量删除
 *
 * @param userKeys
 */
void multiDelete(String[] userKeys);

4.6.修改AuthManagerServiceImpl实现

增加 multiDelete 方法定义,代码如下:

@Override
public void multiDelete(String[] userKeys) {
    authManagerDao.multiDelete(userKeys);
}

4.7.修改ManagerController控制器

增加 multiDelete 方法,代码如下:

@ResponseBody
@RequestMapping(value = "multi-delete", method = RequestMethod.POST)
public BaseResult multiDelete(String userKeys) {
    try {
        String[] arrUserKeys = userKeys.split(",");
        if (arrUserKeys == null || arrUserKeys.length <= 0) {
            return BaseResult.fail("请至少选择一条记录");
        }
        for (String userKey : arrUserKeys) {
            if ("8c41b9a54b2e2a4180cc1271b4672779".equals(userKey)) {
                return BaseResult.fail("不能删除默认管理员账号:xiaojun.liu");
            }
        }
        authManagerService.multiDelete(arrUserKeys);
        return BaseResult.success("操作成功");
    } catch (Exception ex) {
        return BaseResult.fail("未知错误");
    }
}

5.测试验证

重启 Tomcat 测试验证功能效果。

6.实例源码

实例源码已经托管到如下地址:

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java入门 - 语言基础 - 10.条件语句

    原文地址:http://www.work100.net/training/java-if-else.html

    光束云
  • Java单体应用 - 项目实战(后台) - 02.首页布局

    原文地址:http://www.work100.net/training/monolithic-project-iot-cloud-admin-index.ht...

    光束云
  • Java入门 - 高级教程 - 02.集合

    原文地址:http://www.work100.net/training/java-collection.html

    光束云
  • 聊聊storm tuple的序列化

    storm-2.0.0/storm-client/src/jvm/org/apache/storm/executor/ExecutorTransfer.java

    codecraft
  • 聊聊storm tuple的序列化

    storm-2.0.0/storm-client/src/jvm/org/apache/storm/executor/ExecutorTransfer.java

    codecraft
  • CentOS7 搭建以太坊私有链

    这里要注意下 最新的golang 1.10 和go-ethereum-1.7.3 不太兼容

    王小明_HIT
  • 百度推出完全端到端的并行音频波形生成模型,比WaveNet快千倍 | 论文

    最近,百度硅谷人工智能实验室的研究员提出的ClariNet(合成语音展示),是一种全新的基于WaveNet的并行音频波形(raw audio waveform)...

    量子位
  • Hadoop文件系统支持释疑之S3

      Hadoop版本提供了对多种文件系统的支持,但是这些文件系统是以何种方式实现的,其实现原理是什么以前并没有深究过。今天正好有人咨询我这个问题:Hadoop对...

    数据饕餮
  • python_web(四)模拟HTTP客户端进阶版(内含测试函数)

    星辉
  • javascript sort 函数用法

    简单的说,sort() 在没有参数时,返回的结果是按升序来排列的。即字符串的Unicode码位点(code point)排序

    Krry

扫码关注云+社区

领取腾讯云代金券