JavaWeb - 黑马旅游网(番外3):取消收藏

1 功能描述

接上篇黑马旅游网(番外2):用户收藏分页展示,在本篇博客中,我将实现另一个与收藏相关的功能:取消收藏

原始的旅游详情页面只有一个 点击收藏 的按钮。在我的实现方式中:在 点击收藏 旁边添加了一个 取消收藏 的按钮,两个按钮的样式相反。当用户没有登录或登录后没有收藏此线路,则 点击收藏 为红色且可点击,取消收藏 为灰色且不可点击;反之亦然。

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

2 功能分析

2.1 前端

实现取消收藏,前端的重点在于对两个按钮状态的切换。在黑马旅游网(8):旅游线路收藏中,添加收藏 按钮的状态切换是采用 AJAX 方式实现,这种方式避免跳转页面,我在进一步开发时也是基于之前的代码:为 取消收藏 绑定单击事件,采用对仗的方式补充了取消收藏的代码。但是功能开发完毕后,这种异步请求只能满足一次请求有效,再次请求就必须刷新页面。例如:当点击 添加收藏 时,利用 AJAX 将两个按钮的状态做一次切换,但是再次点击请求失效。在此处,我的解决方式是每次单击事件结束前都刷新一次页面,保证添加和取消动作的连贯性。其它读者要是有更好的实现方式的话,欢迎私信/评论分享和讨论。

2.2 后端

相比前端,后端的执行逻辑比较清晰和简单了。在 Servlet 层获取 uidrid,然后依次传入 Service 层和 Dao 层执行具体的数据库删除业务即可。前台通过重新查询的方式更新页面,调用之前定义的相关代码即可。

3 代码实现

在这里插入图片描述

3.1 后端

3.1.1 Servlet

RouteServlet.java

/**
 * 取消收藏
 */
public void removeFavorite(HttpServletRequest request, HttpServletResponse response) {
    // 1.获取线路id
    String rid = request.getParameter("rid");
    // 2.获取用户id
    User user = (User) request.getSession().getAttribute("user");
    if (user == null) return;   // 未登录无法收藏,直接跳出方法
    int uid = user.getUid();
    // 3.调用service执行添加收藏
    favoriteService.remove(rid, uid);
}

3.1.2 Service

FavoriteServiceImpl.java

/**
 * 取消收藏路线
 * @param rid 旅游路线id
 * @param uid 用户id
 */
@Override
public void remove(String rid, int uid) {
    favoriteDao.remove(Integer.parseInt(rid), uid);
}

3.1.3 Dao

FavoriteDaoImpl.java

/**
 * 删除收藏路线
 * @param rid 旅游路线id
 * @param uid 用户id
 */
@Override
public void remove(int rid, int uid) {
    String sql = "DELETE FROM tab_favorite WHERE rid = ? AND uid = ?";
    template.update(sql, rid, uid);
}

3.2 前端

前端的改动比较大,主要体现在页面加载以及两个按钮的单击事件处理上。

route_detail.html

  • 页面加载
    /**
     * 发送请求,判断用户是否收藏过该线路
     */
    $(function fun () {
        let rid = getParameter("rid");
        $.get("route/isFavorite", {rid: rid}, function (flag) {
            if (flag) {     // 用户已收藏
                // 设置收藏按钮样式 <a  class="btn already" disabled="disabled">
                let favor_selector = $("#favorite");
                favor_selector.addClass("already");
                favor_selector.attr("disabled", "disabled");
                favor_selector.removeAttr("onclick");       // 删除按钮点击事件
                let cancel_favor_selector = $("#cancel_favorite");
                cancel_favor_selector.removeClass("already");
                cancel_favor_selector.removeAttr("disabled");
                cancel_favor_selector.attr("onclick");
            } else {        // 用户未收藏
                // 设置收藏按钮样式 <a  class="btn already" disabled="disabled">
                let favor_selector = $("#favorite");
                favor_selector.removeClass("already");
                favor_selector.removeAttr("disabled", "disabled");
                favor_selector.attr("onclick");       // 删除按钮点击事件
                let cancel_favor_selector = $("#cancel_favorite");
                cancel_favor_selector.addClass("already");
                cancel_favor_selector.attr("disabled");
                cancel_favor_selector.removeAttr("onclick");
            }
        });
    });
    
  • 点击收藏
    /**
     * 点击收藏按钮触发方法
     */
    function addFavorite() {
        let rid = getParameter("rid");
        // 1.判断用户是否登陆
        $.get("user/findOne", {}, function (user) {
            if (user) {     // 用户登陆
                $.get("route/addFavorite", {rid: rid}, function () { });
                // 按钮渲染更新方式1:刷新页面
                // location.reload();
                // 按钮渲染更新方式2:发送一个异步请求
                $.get("route/isFavorite", {rid: rid}, function (flag) {
                    if (flag) {     // 用户已收藏
                        // 设置收藏按钮样式 <a  class="btn already" disabled="disabled">
                        let favor_selector = $("#favorite");
                        favor_selector.addClass("already");
                        favor_selector.attr("disabled", "disabled");
                        favor_selector.removeAttr("onclick");       // 删除按钮点击事件
                        let cancel_favor_selector = $("#cancel_favorite");
                        cancel_favor_selector.removeClass("already");
                        cancel_favor_selector.removeAttr("disabled");
                        cancel_favor_selector.attr("onclick");
                    } else {        // 用户未收藏
                        // 设置收藏按钮样式 <a  class="btn already" disabled="disabled">
                        let favor_selector = $("#favorite");
                        favor_selector.removeClass("already");
                        favor_selector.removeAttr("disabled", "disabled");
                        favor_selector.attr("onclick");       // 删除按钮点击事件
                        let cancel_favor_selector = $("#cancel_favorite");
                        cancel_favor_selector.addClass("already");
                        cancel_favor_selector.attr("disabled");
                        cancel_favor_selector.removeAttr("onclick");
                    }
                });
                $.get("route/findOne", {rid: rid}, function (route) {
                    $("#favoriteCount").html("已收藏" + route.count + "次");  // 设置收藏次数
                });
                location.reload();      // AJAX只能保证一次请求是有效的,不刷一下的话无法保证动作的连贯性
            } else {        // 用户未登录
                alert("您尚未登陆,请登录");
                location.href = "http://localhost/travel/login.html";
            }
        })
    }
    
  • 取消收藏
    /**
     * 取消收藏按钮触发方法
     */
    function removeFavorite () {
        let rid = getParameter("rid");
        // 1.判断用户是否登陆
        $.get("user/findOne", {}, function (user) {
            if (user) {     // 用户登陆
                $.get("route/removeFavorite", {rid: rid}, function () { });
                // 按钮渲染更新方式1:刷新页面
                // location.reload();
                // 按钮渲染更新方式2:发送一个异步请求
                $.get("route/isFavorite", {rid: rid}, function (flag) {
                    if (flag) {     // 用户已收藏
                        // 设置收藏按钮样式 <a  class="btn already" disabled="disabled">
                        let favor_selector = $("#favorite");
                        favor_selector.addClass("already");
                        favor_selector.attr("disabled", "disabled");
                        favor_selector.removeAttr("onclick");       // 删除按钮点击事件
                        let cancel_favor_selector = $("#cancel_favorite");
                        cancel_favor_selector.removeClass("already");
                        cancel_favor_selector.removeAttr("disabled");
                        cancel_favor_selector.attr("onclick");
                    } else {        // 用户未收藏
                        // 设置收藏按钮样式 <a  class="btn already" disabled="disabled">
                        let favor_selector = $("#favorite");
                        favor_selector.removeClass("already");
                        favor_selector.removeAttr("disabled", "disabled");
                        favor_selector.attr("onclick");       // 删除按钮点击事件
                        let cancel_favor_selector = $("#cancel_favorite");
                        cancel_favor_selector.addClass("already");
                        cancel_favor_selector.attr("disabled");
                        cancel_favor_selector.removeAttr("onclick");
                    }
                });
                $.get("route/findOne", {rid: rid}, function (route) {
                    $("#favoriteCount").html("已收藏" + route.count + "次");  // 设置收藏次数
                });
                location.reload();      // AJAX只能保证一次请求是有效的,不刷一下的话无法保证动作的连贯性
            } else {        // 用户未登录
                alert("您尚未登陆,请登录");
                location.href = "http://localhost/travel/login.html";
            }
        });
    };
    

4 相关链接

项目课程链接:https://www.bilibili.com/video/BV1CE411E7h4
完整课程连接:https://www.bilibili.com/video/BV1uJ411k7wy
《黑马旅游网》系列博客及笔者源码传送门:https://blog.csdn.net/xing123456jl/article/details/109173068

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>cn.itcast.parent</groupId> <artifactId>itcast-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <groupId>cn.itcast</groupId> <artifactId>travel</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> <!-- 连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> <!-- Jackson Json处理工具包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <dependency> <groupId>jstl</groupId> <artifactId>jstl</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jsp-api</artifactId> </dependency> </dependencies> <build> <plugins> <!-- 配置Tomcat插件 --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <port>8080</port> <path>/</path> </configuration> </plugin> </plugins> </build> </project>
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值