SSM框架项目【米米商城】55-69 单个删除、批量删除

开始时间:2022-03-06
课程链接:米米商城

商品删除工作

单个商品删除

按照惯例,先写service里面

   @Override
    public int delete(int pid) {
        return productInfoMapper.deleteByPrimaryKey(pid);
    }

再写controller
delete

   @RequestMapping("/delete")
    public String delete(int pid, HttpServletRequest request) {
        int num = -1;
        try {
            num = productInfoService.delete(pid);
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (num > 0) {
            request.setAttribute("msg", "删除成功");
        } else {
            request.setAttribute("msg", "删除失败");
        }
        //删除结束后跳到分页显示
        return "forward:/prod/deleteAjaxSplit.action";
    }

按理说应该直接返回Ajax翻页的功能,但我们在删除时,一定要弹出提示信息,删除成功就要弹窗告诉删除成功,删除失败也要告诉用户,不然对用户使用很不友好
也就是说,我们要把得到的提示信息也通过作用域返回到前端去
那么下面的代码就不适用了

   //Ajax翻页处理
    @ResponseBody
    @RequestMapping("/ajaxSplit")
    public void ajaxSplit(int page, HttpSession session) {
        PageInfo info = productInfoService.splitPage(page, PAGE_SIZE);
        //刷新时session中携带的info
        session.setAttribute("info", info);
    }

因此考虑换一个写法

    @ResponseBody
    @RequestMapping(value = "/deleteAjaxSplit", produces = "text/html;charset=UTF-8")
    public Object deleteAjaxSplit(HttpServletRequest request) {
        //取得第一页的数据,删除后返回到第一页
        PageInfo pageInfo = productInfoService.splitPage(1, PAGE_SIZE);
        request.getSession().setAttribute("info", pageInfo);
        return request.getAttribute("msg");
    }

将提示信息返回过去

对应前端界面product.jsp
通过主键来删除

<button type="button" class="btn btn-warning" id="mydel"
         onclick="del(${p.pId})">删除
</button>

链接到的就是我们写的delete.action

function del(pid){
        if(confirm("您确定删除吗?")){
           $.ajax({
               url:"${pageContext.request.contextPath}/prod/delete.action",
               data:{"pid":pid},
               type:"post",
               dataType:"text",
               success:function(msg){
                   alert(msg);
                   $("#table").load("http://localhost:8080/mimi_SSM/admin/product.jsp #table")
               }
           })
        }
    }

看看效果

在这里插入图片描述
在这里插入图片描述

批量删除功能的实现

实现全选复选框和单个复选框的关联
在这里插入图片描述
全选勾上的时候,下面五个也勾上
全选取消,下面五个也取消
可以通过全选按钮是否选中,再将其选中状态赋值给下面五个复选框
而下面五个复选框,通过其name属性进行定位,再改变其checked状态

function allClick() {
        //取得全选复选框的选中/未选中状态
        //这个prop方法源于jQuery包
        var flag = $("#all").prop("checked");

        //将此状态赋值给每个商品列表里的复选框,五个复选框的name属性都是ck
        //然后给每一个复选框赋值
        $("input[name=ck]").each(function () {
            this.checked = flag;
        });
    }

那我们还要实现一个功能
下面五个复选框,都处于选中时,全选框也变为选中,有一个没选中时,那全选框就是未选中状态
我们可以通过获取被选中的数量,与总共的复选框的数量进行对比,如果两者相等,就选中全选框的checked,否则不选中

    function ckClick() {
        //取得所有name=ck的被选中的复选框
        var length = $("input[name=ck]:checked").length;
        //取得所有name=ck的复选框
        var len = $("input[name=ck]").length;
        //比较
        if (len == length) {
            $("#all").prop("checked", true);
        } else {
            $("#all").prop("checked", false);
        }
    }

Mapper文件的配置
因为之前Mapper文件里面没有提供批量删除的接口,所以得自己补充上去

    //批量删除商品
    int deleteBatch(String []ids);
    <!--  //批量删除商品-->
    <!--  int deleteBatch(String []ids);  1,4,5  -->
    <delete id="deleteBatch">
        delete from product_info where p_id in
        //通过,来实现分割
        <foreach collection="array" item="pid" separator="," open="(" close=")">
            #{pid}
        </foreach>
    </delete>

批量删除的controller
删除都要给提示信息的

//加了这个注解,表示最后要从这里进行返回
    @ResponseBody
    @RequestMapping(value = "/deleteAjaxSplit", produces = "text/html;charset=UTF-8")
    public Object deleteAjaxSplit(HttpServletRequest request) {
        //取得第一页的数据,删除后返回到第一页
        PageInfo pageInfo = productInfoService.splitPage(1, PAGE_SIZE);
        request.getSession().setAttribute("info", pageInfo);
        return request.getAttribute("msg");
    }
@RequestMapping("/deleteBatch")
    public String deleBatch(String pids, HttpServletRequest request) {
        String[] ps = pids.split(",");

        try {
            //将字符串转为字符数组,再放进批量删除方法里面
            int num = productInfoService.deleteBatch(ps);
            if (num > 0) {
                request.setAttribute("msg", "批量删除成功");
            } else {
                request.setAttribute("msg", "批量删除失败");
            }
        } catch (Exception e) {
            request.setAttribute("msg", "当前商品不可删除");
        }
        return "forward:/prod//deleteAjaxSplit.action";
    }

这时候回到product.jsp中补充
将“批量删除”绑定事件

  <input type="button" class="btn btn-warning" id="btn1"
   value="批量删除" onclick="deleteBatch()">
<script type="text/javascript">
    function mysubmit() {
        $("#myform").submit();
    }

获取删除 商品的id,并在删除时给出提示
如果没有选中任何商品,则提示要选择需要删除的商品

    //批量删除
    function deleteBatch() {

        //取得所有被选中删除商品的pid
        var deleteBatchChecks = $("input[name=ck]:checked");
        var str = "";
        var pid = "";
        if (deleteBatchChecks.length == 0) {
            alert("请选择将要删除的商品!");
        } else {
            // 有选中的商品,则取出每个选 中商品的ID,拼提交的ID的数据
            if (confirm("您确定删除" + deleteBatchChecks.length + "条商品吗?")) {
                //拼接ID
                $.each(deleteBatchChecks, function () {

                    pid = $(this).val(); //22 33

                    //进行非空判断
                    if (pid != null)
                        str += pid + ",";  //22,33,44,
                    //这里的拼接不影响后面,因为传过去转为数据的时候
                    //是转成[22,33,44]的
                }); 

再通过Ajax异步上传进行转发到deleteBatch.action

                $.ajax({
                    url: "${pageContext.request.contextPath}/prod//deleteBatch.action",
                    //拼好的主键id
                    data: {"pids": str},
                    type: "post",
                    dataType: "text",
                    success: function (msg) {
                        alert(msg);
                        $("#table").load("http://localhost:8080/mimi_SSM/admin/product.jsp #table")
                    }
                })         
            }
        }
    }

看看效果
在这里插入图片描述
在这里插入图片描述

结束时间:2022-03-07

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值