SSM虾米音乐项目6--后台专辑模块的修改和删除

news2024/12/19 5:46:56

删除操作

删除的前端界面

删除的前端代码

<button data-toggle="button" class="btn btn-sm btn-warning" aid="${album.aid}" pic="${album.pic}"> 删除 </button></td>

点击删除按钮,会调用JS中的AJAX请求

//删除
$(".btn-warning").click(function () {//通过类选择器给删除按钮绑定事件
    var aid = $(this).attr("aid");//获取当前专辑的aid
    var pic = $(this).attr("pic");//获取当前专辑的pic值
    //弹出一个确认对话框,内容为“是否确认删除?”。
    layer.confirm('是否确认删除?', {icon: 3, title:'提示'}, function(index){
        $.ajax({
            url: "/album/delAlbum",//访问后端的delAlum方法
            type: "post",
            data: {
                aid:aid,//将参数传递给后端
                pic:pic
            },
            dataType: "text",
            success: function (text) {
                if (text == "success") {
                    layer.msg("删除成功");
                    layer.close(index);
                    $("#pageNo").val(1);
                    //页面刷新
                    $("#txForm").submit();
                }
            }
        })
    });
});

访问后端的方法,根据传递的aid的值和pic的值进行删除,删除数据库表中的记录以及服务器上传的专辑封面

后端方法实现代码

/**
 * 删除对应ID的专辑信息
 * @param aid
 * @return
 */
@ResponseBody
@PostMapping("/delAlbum")
public String delAlbum(Integer aid,String pic){
    System.out.println(pic);
    //删除服务器上的pic  专辑封面
    String pre="(文件服务器的端口)";
    String realPath=pre+pic;
    System.out.println(realPath);
    Client client=Client.create();
    WebResource resource=client.resource(realPath);
    resource.delete();
    //删除数据库中的AID对应的专辑
    albumService.deleteByPrimaryKey(aid);
    return "success";
}

如果删除成功,就像前端传递text文本 ”success“,前端通过判断,显示”删除成功“

访问数据库的Mapper层 SQL语句

Mapper层代码

<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
  delete from album
  where AID = #{aid,jdbcType=INTEGER}
</delete>

修改操作

首先要在弹窗中回显该专辑原本的数据,在对内容进行编辑,修改

前端的修改弹窗

修改弹窗对应的实现代码

弹出弹窗的操作

首先通过点击”修改按钮“,弹出弹窗

修改按钮

<button class="btn btn-sm btn-primary" type="button" modify aid="${album.aid}" > 修改 </button>

通过选择器给按钮绑定事件,发送AJAX请求

var pop1;
$("[modify]").click(function () {
    var aid = $(this).attr("aid");
    var address="文件服务器端口";
    $.ajax({
        url: "/album/getAlbum",
        type: "post",
        data: {
            aid:aid
        },
        dataType: "json",
        success: function (jsonObj) {
            $("#aid").val(jsonObj.aid);
            $("#paname").val(jsonObj.aname);
            $("#pcompany").val(jsonObj.company);
            $("#updatePdate").val(jsonObj.pdate);
            $("#plang").val(jsonObj.lang);
            $("#albumImg1").attr("src",address+jsonObj.pic);
            $("#lastImg1").val(address+jsonObj.pic);
            $("#pic1").val(jsonObj.pic);
        }
    })

    pop1 = layer.open({
        type: 1,
        area:[900, 650],
        content: $('#albumPop1')
    });

})

访问后端的getAlum方法,根据前端传递过来的aid信息,查询对应的专辑信息

//根据ID查询
@ResponseBody
@PostMapping("/getAlbum")
public Album getMtype(int aid){
    Album album=albumService.selectByPrimaryKey(aid);
    return album;
}

 

并将数据以json格式返回给前端,进行数据的回显,并且弹出弹窗

进行修改

修改对应的前端代码

<%--修改弹窗--%>
<div id="albumPop1" style="margin-right: 50px;margin-top: 50px; display: none">
    <form id="updateAlbumForm" class="layui-form" method="post" action="/album/updateAlbum" enctype="multipart/form-data" lay-filter="example">
        <input type="hidden" name="aid" id="aid">
        <div class="layui-form-item" >
            <label class="layui-form-label" style="width:100px">专辑名字</label>
            <div class="layui-input-block">
                <input id="paname" type="text" name="aname" style="color: black; border-color: lightgray;background-color: white"  lay-verify="paname" autocomplete="off" placeholder="请输入专辑名" class="layui-input">
            </div>
        </div>


        <div class="layui-form-item" >
            <label class="layui-form-label" style="width:100px">发行公司</label>
            <div class="layui-input-block">
                <input id="pcompany" type="text" name="company" style="color: black; border-color: lightgray;background-color: white"  lay-verify="pcompany" autocomplete="off" placeholder="请输入公司名" class="layui-input">
            </div>
        </div>

        <div class="layui-form-item" >
            <label class="layui-form-label" style="width:100px">发行时间</label>
            <div class="layui-input-block">
                <input type="text" id="updatePdate"  name="pdate" style="color: black; border-color: lightgray;background-color: white"  lay-verify="pdate1" autocomplete="off" placeholder="请输入发行时间" class="layui-input">
            </div>
        </div>
        <div class="layui-form-item">
            <label  class="layui-form-label" style="width:100px">图片</label>
            <div class="controls form-group">
                <div class="col-sm-4 col-md-2">
                    <div class="image-row">
                        <div class="image-set">
                            <a class="example-image-link" href="../../img/gallery-photo/image-3.jpg" data-lightbox="example-set" title="Click on the right side of the image to move forward.">
                                <img id="albumImg1" class="example-image"  src="../../img/gallery-photo/thumb-3.jpg"  alt="Plants: image 1 0f 4 thumb" width="150" height="150" />
                            </a>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <div class="layui-form-item">
            <label for="i-file1" class="layui-form-label" style="width:100px">选择文件</label>
            <!--<div class="col-sm-4 control-label">选择文件</div>-->
            <div id="examples1" class="section examples-section">
                <div class="col-sm-6">
                    <div class="input-group">
                        <input id='location1' class="form-control" onclick="$('#i-file1').click();">
                        <label class="input-group-btn">
                            <input  type="button" id="i-check1" value="修改封面" class="btn btn-primary" onclick="$('#i-file1').click();">
                        </label>
                    </div>
                </div>
                <input type="hidden" id="pic1" name="pic" lay-verify="pic1">
                <input type="hidden" id="lastImg1" name="lastImg">
                <input type="file" name="picfile" id='i-file1'  accept=".jpg, .png" onchange="submitFile1()" style="border-color: lightgray;background-color: lightgray;display: none">
            </div>
        </div>

        <div class="layui-form-item" >
            <label for="lang1" class="layui-form-label " style="width:100px">语种</label>
            <div class="layui-input-block">
                <input id="plang"  type="text" name="lang" style="color: black; border-color: lightgray;background-color: white"  lay-verify="plang" autocomplete="off" placeholder="请输入语种" class="layui-input">
            </div>
        </div>

        <div class="layui-form-item">
            <div class="layui-input-block">
                <button class="layui-btn layui-btn-normal layui-btn-radius" lay-submit="" lay-filter="demo2">修改专辑</button>
            </div>
        </div>
    </form>
</div>
重名检查

进行对应的修改时,JS会对修改的内容进行检查

form1.verify({
    paname: function(value, item){ //value:表单的值、item:表单的DOM对象
        if(!new RegExp("^[a-zA-Z0-9\u4e00-\u9fa5]{1,20}$").test(value)){
            return '必须是中英文或数字字符,长度1-20';
        }
        var flag = "false";
        var aid=$('#aid').val();
        $.ajax({
            url: "/album/isSameName",
            type: "post",
            data: {
                aname:value,
                aid:aid
            },
            async:false,
            dataType: "text",
            success: function (text) {
                flag = text;
            }
        })
        if(flag == "true"){
            return "专辑名已存在";
        }

    },
    //我们既支持上述函数式的方式,也支持下述数组的形式
    //数组的两个值分别代表:[正则匹配、匹配不符时的提示文字]
    pcompany: [/^[a-zA-Z0-9\u4e00-\u9fa5]{1,20}$/,'必须是中英文或数字字符,长度1-20'],
    pdate1: [/^.+$/,'请选择发现日期'],
    pic1: [/^.+$/,'亲不要忘记上传专辑封面喔'],
    plang: [/^[\u4e00-\u9fa5]{1,10}$/,'请输入中文的语种']
});

注意此时的重名判断,传递两个参数 aid aName,后端应该查询除了本专辑之外,和其他专辑是否重名

是否重名的后端实现代码

//判断是否重名
@ResponseBody
@PostMapping("/isSameName")
public String isSameName(String aname,Integer aid){
    Album album=new Album();
    album.setAid(aid);
    album.setAname(aname);
    System.out.println(album);
    Integer count=albumService.isSameName(album);
    if(count==1){
        return "true";
    }else {
        return "false";
    }
}

对应的查询的SQL语句

<select id="isSameName" parameterType="com.qcby.model.Album" resultType="java.lang.Integer">
  select
  count(*)
  from album t
  <where>
    <if test="aname != null and aname != ''">
      t.aname=#{aname}
    </if>
    <if test="aid !=null">
      and t.aid!=#{aid}
    </if>
  </where>
</select>

此时一定要有aid!=#{aid]的操作,否则无法顺利进行修改专辑名的操作

文件修改

文件修改,应该判断专辑封面是否被修改,如果修改的话,需要将旧的封面从服务器删除

前端实现代码

function  submitFile1(){
    var lastImg=$("#lastImg1").val();
    alert("修改 "+lastImg);
    $("#location1").val($("#i-file1").val());
    $("#updateAlbumForm").ajaxSubmit({
        url:"/upload/uploadFile",
        data:{
            fileType:"pic",
            update:"true"
        },
        dataType:"json",
        success:function (json) {
            $("#albumImg1").attr("src",json.realPath);
            $("#lastImg1").val(json.realPath);
            $("#pic1").val(json.relativePath);
        }
    })
}

后端实现代码

@RequestMapping("/uploadFile")
    public void uploadFile(HttpServletRequest request, HttpServletResponse response, MultipartFile picfile, String fileType, String lastImg,String update) throws IOException {

        // 后续现有代码逻辑
        // 1.获取前端传递过来的所有有关于文件上传的参数
        // MultipartHttpServletRequest mr=(MultipartHttpServletRequest) request;

        //2.获取存储文件的相关内容
        // Map<String,MultipartFile> fileMap=mr.getFileMap();

        //3.获取文件
//        MultipartFile file=fileMap.get("picfile");

        //4.获取该文件的字节数组 方便上传
        byte[] bytes=picfile.getBytes();

        //5.获取文件名称
        String originalFilename=picfile.getOriginalFilename();
        //vhjbh.jpg
        //6.获取文件名的后缀 产生新的名字  .jpg(.exe)
        String suffix=originalFilename.substring(originalFilename.lastIndexOf("."));

        //7.定义一个新的名字  abscjsdc.jpg
        String fileName= UUID.randomUUID().toString();
        fileName=fileName+suffix;

        //8.上传  获取文件的上传位置  图片服务器的位置 
        String filePath="文件服务器的端口";
        //绝对路径 
        String realPath=filePath+"/"+fileType+"/"+fileName;
        //相对路径 /pic/05.jpg
        String relativePath="/"+fileType+"/"+fileName;
        //9.jersy客户端进行上传
        Client client= Client.create();

        //判断是否为修改换封面
        if(update.equals("false")){
            if(lastImg!=null&&!"".equals(lastImg)){
                WebResource resource=client.resource(lastImg);
                resource.delete();
            }
        }
        //10.获取web资源
        WebResource resource=client.resource(realPath);
        //11.上传
        resource.put(bytes);
        //返回前端进行页面渲染
        JSONObject jo=new JSONObject();
        jo.put("realPath",realPath);
        jo.put("relativePath",relativePath);
        //响应对象的原始方式返回
        response.getWriter().write(jo.toString());

    }
修改操作的实现

通过提交form表单的形式实现修改操作

var form1 = layui.form;
//监听提交
form1.on('submit(demo2)', function (data) {
    //layer.msg(JSON.stringify(data.field));
    $.ajax({
        url: "/album/updateAlbum",
        type: "post",
        data: data.field,
        dataType: "text",
        success: function (text) {
            if (text == "success") {
                layer.msg("修改成功");
                layer.close(pop1);
                $("#pageNo").val(1);
                //页面刷新
                $("#txForm").submit();
            }
        }
    });

    return false;
});

后端实现修改

//修改专辑信息
@ResponseBody
@PostMapping("/updateAlbum")
public String updateAlbum(Album al){
    albumService.updateByPrimaryKeySelective(al);
    return "success";
}

实现修改的Mapper层动态SQL语句

<update id="updateByPrimaryKeySelective" parameterType="com.qcby.model.Album">
  update album
  <set>
    <if test="aname != null">
      ANAME = #{aname,jdbcType=VARCHAR},
    </if>
    <if test="pic != null">
      PIC = #{pic,jdbcType=VARCHAR},
    </if>
    <if test="company != null">
      COMPANY = #{company,jdbcType=VARCHAR},
    </if>
    <if test="pdate != null">
      PDATE = #{pdate,jdbcType=DATE},
    </if>
    <if test="lang != null">
      LANG = #{lang,jdbcType=VARCHAR},
    </if>
  </set>
  where AID = #{aid,jdbcType=INTEGER}
</update>

修改操作实现之后,需要刷新界面,重新提交一下查询的表单

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2261972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【潜意识Java】了解并详细分析Java与AIGC的结合应用和使用方式

目录 一、AIGC技术概述 二、Java与AIGC结合的价值 三、实现Java与AIGC结合&#xff1a;基于OpenAI的API进行智能文本生成 1. 环境准备 2. Java代码实现 3. 代码解析 4. 运行效果 四、进一步优化与扩展 五、总结 随着人工智能&#xff08;AI&#xff09;的飞速发展&…

基于容器的云原生,让业务更自由地翱翔云端

无论是要构建一个应用或开发一个更庞大的解决方案&#xff0c;在技术选型时&#xff0c;技术的开放性和可移植性已经成为很多企业优先考虑的问题之一。毕竟没人希望自己未来的发展方向和成长速度被自己若干年前选择使用的某项技术所限制或拖累。 那么当你的业务已经上云&#x…

二叉树_堆

目录 一. 树(非线性结构&#xff09; 1.1 树的概念与结构 1.2 树的表示 二. 二叉树 2.1 二叉树的概念与结构 2.2 特殊的二叉树 2.3 二叉树的存储结构 三. 实现顺序结构的二叉树 3.1 堆的概念与结构 一. 树(非线性结构&#xff09; 1.1 树的概念与结构 概念&#xff…

linux0.11源码分析第一弹——bootset.s内容

&#x1f680;前言 本系列主要参考的《linux源码趣读》&#xff0c;也结合之前《一个64位操作系统的设计与实现》的内容结合起来进行整理成本系列博客。在这一篇博客对应的是《linux源码趣读》第一~四回 目录 &#x1f680;前言&#x1f3c6;启动后的第一步&#x1f4c3;启动区…

设计模式之桥接模式:抽象与实现之间的分离艺术

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 桥接模式概述与角色组成 想象一下你家里的电视遥控器&#xff0c;无论是索尼还是三星的电视机&#xff0c;遥控器的按键功能都差不多&#xff1…

【从零开始入门unity游戏开发之——C#篇17】C#面向对象的封装——类(Class)和对象、成员变量和访问修饰符、成员方法

文章目录 一、类和对象1、什么是类和对象&#xff1f;2、例子说明2.1 例子1&#xff1a;(1) **类的定义&#xff1a;**(2) **创建对象&#xff1a;**(3) **类和对象的关系&#xff1a;** 2.2 例子2&#xff1a;**类的比喻&#xff1a;****对象的比喻&#xff1a;**代码实例&…

在Ubuntu 22.04 LTS中使用PyTorch深度学习框架并调用多GPU时遇到indexSelectLargeIndex相关的断言失败【笔记】

在Ubuntu 22.04 LTS系统中&#xff0c;已安装配置好CUDA 12.4、cuDNN 9.1.1以及PyTorch环境 export CUDA_VISIBLE_DEVICES0,1,2,3,4,5,6,7 在PyTorch深度学习框架训练调用多GPU时&#xff0c;提示 indexSelectLargeIndex: block: [x, 0, 0], thread: [x, 0, 0] Assertion src…

FutureCompletableFuture实战

1. Callable&Future&FutureTask介绍 直接继承Thread或者实现Runnable接口都可以创建线程&#xff0c;但是这两种方法都有一个问题就是&#xff1a;没有返回值&#xff0c;也就是不能获取执行完的结果。因此java1.5就提供了Callable接口来实现这一场景&#xff0c;而Fu…

[论文阅读笔记]-PalmTree: 学习一个用于指令嵌入的汇编语言模型

深度学习已在众多二进制分析任务中展示了其优势&#xff0c;包括函数边界检测、二进制代码搜索、函数原型推理、值集分析等。现有方案忽略了复杂的指令内结构&#xff0c;主要依赖于控制流&#xff0c;其中上下文信息是嘈杂的&#xff0c;并且可能受到编译器优化的影响。为了解…

CH582F BLE5.3 蓝牙核心板开发板 60MHz RAM:32KB ROM:448KB

CH582F BLE5.3 蓝牙核心板开发板 60MHz RAM:32KB ROM:448KB 是一款基于南京沁恒&#xff08;WCH&#xff09;推出的高性能、低功耗无线通信芯片CH582F的开发板。以下是该开发板的功能和参数详细介绍&#xff1a; 主要特性 双模蓝牙支持&#xff1a; 支持蓝牙5.0标准&#xff0…

数字IC后端设计实现篇之TSMC 12nm TCD cell(Dummy TCD Cell)应该怎么加?

TSMC 12nm A72项目我们需要按照foundary的要求提前在floorplan阶段加好TCD Cell。这个cell是用来做工艺校准的。这个dummy TCD Cell也可以等后续Calibre 插dummy自动插。但咱们项目要求提前在floorplan阶段就先预先规划好位置。 TSCM12nm 1P9M的metal stack结构图如下图所示。…

《网络对抗技术》Exp9 Web安全基础

实验目标 理解常用网络攻击技术的基本原理。 实验内容 Webgoat实践下相关实验。 实验环境 macOS下Parallels Desktop虚拟机中&#xff08;网络源均设置为共享网络模式&#xff09;&#xff1a; Kali Linux - 64bit&#xff08;攻击机&#xff0c;IP为10.211.55.10&#xff09;…

Chrome 132 版本开发者工具(DevTools)更新内容

Chrome 132 版本开发者工具&#xff08;DevTools&#xff09;更新内容 一、使用 Gemini 调试 Network、Source 和 Performance Chrome 131 可以使用 Gemini 调试 CSS&#xff0c;现在可以调试更多模块了 与元素面板中的右键菜单类似&#xff0c;要打开 AI 辅助面板并开始与 …

消息系统之 Kafka

什么是消息系统 消息系统是专用的中间件&#xff0c;负责将数据从一个应用传递到另外一个应用。使应用只需关注于数据&#xff0c;无需关注数据在两个或多个应用间是如何传递的。 消息系统一般基于可靠的消息队列来实现&#xff0c;使用点对点模式或发布订阅模式。数据实时在…

Intel-ECI之Codesys PLC + Ethercat 远端IO + Codesys IDE编程

目录 一、 准备工作 二、安装Codesys 软件 PLC 三、 使用Codesys IDE 编程测试 CODESYS* 是领先的独立于制造商的 IEC 61131-3 自动化软件&#xff0c;适用于工程控制系统。它用于 Intel Edge Controls for Industrial&#xff08;Intel ECI 或 ECI&#xff09;&#xff0c;…

[2015~2024]SmartMediaKit音视频直播技术演进之路

技术背景 2015年&#xff0c;因应急指挥项目需求&#xff0c;我们实现了RTMP推送音视频采集推送&#xff08;采集摄像头和麦克风数据&#xff09;模块&#xff0c;在我们做好了RTMP推送模块后&#xff0c;苦于没有一个满足我们毫秒级延迟诉求的RTMP播放器&#xff0c;于是第一…

Ubuntu24.04 安装 visual studio code

# 导入软件包密钥 wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg# 添加官方库 echo "deb [arch…

docker 搭建自动唤醒UpSnap工具

1、拉取阿里UpSnap镜像 docker pull crpi-k5k93ldwfc7o75ip.cn-hangzhou.personal.cr.aliyuncs.com/upsnap/upsnap:4 2、创建docker-compose.yml文件&#xff0c;进行配置&#xff1a; version: "3" services:upsnap:container_name: upsnapimage: crpi-k5k93ldwf…

已解决:elasticsearch创建索引失败

报错信息 具体报错&#xff1a; org.elasticsearch.ElasticsearchStatusException: Elasticsearch exception [typeillegal_argument_exception, reasonunknown setting [index.mappings.properties.category.analyzer] please check that any required plugins are installed…

PHPstudy中的数据库启动不了

法一 netstat -ano |findstr "3306" 查看占用该端口的进程号 taskkill /f /pid 6720 杀死进程 法二 sc delete mysql