SSM开发书评网24:更新会员阅读状态;

 说明:

(1)本篇博客开发内容:前面我们实现了会员注册和登录功能;那么会员登录后,就开始介绍与会员交互有关的功能;第一个功能就是【想看/看过的阅读状态变更】;

然后,本篇博客的主要内容就是更新会员状态:即,某个会员登录后,该会员点击查看某本图书的详情;当该会员点击【想看】或者【看过】按钮后:如果原先没有阅读状态,就创建一条;如果原先有阅读状态,就更新原先的阅读状态;

(2)一点说明:SSM开发很多细节,在本专栏前面的几篇博客中都详细介绍了;自本篇博客开始,如果没有遇到新的内容或者需要强调的内容,那么就不再重复啰嗦说明了;

(3.1)本篇博客特别需要说明的一个点:

(3.2)由(3.1)就引出了一个问题:【前端的一个请求,到底使用哪个Controller去接收;;;Controller要调用的处理逻辑,到底要写在哪个Service中;;;;某个Dao层方法,到底在哪个Service中被调用;】:

          ● 对于这个问题,能感觉到,如果自己开发,自己有能力严格按照规范开发,是没问题的;;;只是,这样做,项目可能会显得死板、臃肿;

          ● (3)中也提到了所谓的灵活性();;;;自己能够感觉到,要想做到很好的灵活性,【深入理解业务,合理规划程序、模块结构】是很重要的;;;虽然觉得这个能力也不是那么遥不可及,但需要自己留意并逐渐加强;

          ● 有一点澄清:整个项目肯定要严格按照规范,可能只有个别地方需要灵活性;

(4)前端的部分,目前没必要过于深究;能看懂,能基本上手,就可以了;

目录

零:点击【想看】或【看过】时:需要先检测,会员是否已登录;

1.在页面就绪函数中,编写代码:点击【想看】或【看过】时,如果没有登录,就弹出提示登录的提示框;

2.启动Tomcat,测试观察效果; 

3.【给短评点赞】和【写短评】也需要登录;所以,顺手也给这两个功能上也添加这个判断逻辑吧;

一:接下里就是任务就是,会员登录后,更新阅读状态;

1.在MemberService接口中,定义更新阅读状态的方法:updateMemberReadState()方法;

2.在MemberServiceImpl实现类中,去实现更新阅读状态的方法:updateMemberReadState()方法;

3.在MemberController类中,创建更新阅读状态的方法:updateReadState();

4.在detail.ftl前端页面中,向【MemberController类中的updateReadState()方法】,发起ajax请求;

5.启动Tomcat,观察效果;


零:点击【想看】或【看过】时:需要先检测,会员是否已登录;

更新阅读状态的操作,其前提得是会员登录的状态下;所以,我们正式开始前,需要先检查下,当前是否有会员登录;

1.在页面就绪函数中,编写代码:点击【想看】或【看过】时,如果没有登录,就弹出提示登录的提示框;

在detail.ftl的<head>中的<script>中的页面就绪函数中,编写代码;其作用是,如果当前没有会员登录,如果点击了【想看】或【看过】按钮,就弹出提示框,提示要先去登录;

            <!--更新会员阅读状态前,登录检查-->
            <#if !loginMember ??>
                $("*[data-read-state]").click(function () {
                    $("#exampleModalCenter").modal("show");
                })
            </#if>

说明:

(1)如果没有登录的话,在页面就绪函数中,编写【想看】和【看过】按钮的单机事件:如果单击了这两个按钮,就弹出请登录的提示;

(上图有个书写错误,不是JavaScript选择器,而是jQuery选择器)

(2)弹出请登录的提示;我们是通过Bootstrap来实现的;

2.启动Tomcat,测试观察效果; 

启动Tomcat,观察效果:可以看到,没有登录的时候,点击【想看】或【看过】按钮时,会弹出提示登录的弹出框;

如果登录的时候,点击【想看】或【看过】按钮时,就不会弹出提示登录的弹出框;

3.【给短评点赞】和【写短评】也需要登录;所以,顺手也给这两个功能上也添加这个判断逻辑吧;

说明:前后变化;

这样以后,在没有登录的情况下,点击写短评的按钮或者点赞短评时,也会弹出提示登录的弹出框;

……………………………………………………

重启Tomcat,观察效果;

没有登录的时候,点击写短评的按钮或者点赞短评时,会弹出提示登录的弹出框;

登录的时候,点击写短评的按钮或者点赞短评时,就不会弹出提示登录的弹出框; 


一:接下里就是任务就是,会员登录后,更新阅读状态;

1.在MemberService接口中,定义更新阅读状态的方法:updateMemberReadState()方法;

    /**
     * 更新阅读状态
     * @param memberId 会员id
     * @param bookId 图书id
     * @param readState 阅读状态
     * @return
     */
    public MemberReadState updateMemberReadState(Long memberId, Long bookId, Integer readState);

说明:

(1)在MemberService接口中,定义updateMemberReadState()方法;

(2)已经知道,为了操作member_read_state,我们前面已经定义了MemberReadStateMapper接口;那么,为什么一个涉及到操作member_read_state表的逻辑,要定义在MemberService接口中;而不是创建MemberReadStateService接口,然后在这个接口中定义逻辑嘞?:这其中的原因,估计就是在本篇博客一开头时的说明中写的那样,这就是在【深入理解业务,合理规划程序、模块结构】的基础上,不死板,灵活处理的表现;;;;;;;(好吧,我承认我在胡扯;;;;但是,这条对于目前的自己来说,还是比较重要的;)

2.在MemberServiceImpl实现类中,去实现更新阅读状态的方法:updateMemberReadState()方法;

/**
     * 更新阅读状态
     *
     * @param memberId  会员id
     * @param bookId    图书id
     * @param readState 阅读状态
     * @return
     */
    public MemberReadState updateMemberReadState(Long memberId, Long bookId, Integer readState) {
        //首先,要查询;当前用户针对这本书的阅读状态
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("member_id", memberId);
        queryWrapper.eq("book_id", bookId);
        MemberReadState memberReadState = memberReadStateMapper.selectOne(queryWrapper);
        // 如果这个会员针对这本书,没有阅读状态:那么我们需要做的是新建一条阅读状态,保存到member_read_state表;
        if (memberReadState == null) {
            memberReadState = new MemberReadState();
            memberReadState.setBookId(bookId);
            memberReadState.setMemberId(memberId);
            memberReadState.setReadState(readState);
            memberReadState.setCreateTime(new Date());
            memberReadStateMapper.insert(memberReadState);
        } else {        // 如果这个会员针对这本书,已经有了阅读状态:那么我们需要做的是更新这条阅读状态;
            memberReadState.setReadState(readState);
            memberReadStateMapper.updateById(memberReadState);
        }
        return memberReadState;
    }

说明:

(1)聪明如我,在前面我们就设置了MemberServiceImpl类的方法,默认开启事务了;

一个笔误的地方,上图中,我们写了两次setBookId(),忘记了serMemberId()方法;

(2)这个方法的逻辑很简单,看下代码注释;

(3)还是那个点,在啰嗦一遍:如下图

(插)把MemberServiceImpl类中的,selectMemberReadState()查询阅读状态的方法,设置为不开启事务;

这儿算是一个临时的补充;

3.在MemberController类中,创建更新阅读状态的方法:updateReadState();

    /**
     * 更新阅读状态
     * @param memberId 会员id
     * @param bookId 图书id
     * @param readState 阅读状态
     * @return
     */
    @PostMapping("/update_read_state")
    @ResponseBody
    public Map updateReadState(Long memberId, Long bookId, Integer readState) {
        Map result = new HashMap();
        try {
            memberService.updateMemberReadState(memberId, bookId, readState);
            result.put("code", "0");
            result.put("msg", "success");
        } catch (BussinessException ex) {
            ex.printStackTrace();
            result.put("code", ex.getCode());
            result.put("msg", ex.getMsg());
        }
        return result;
    }

说明:

(1)一点说明;

(2)接下来,我们就需要detail.ftl前端文件中编写逻辑了,具体是:在页面就绪函数中,编写点击【想看】,,待写………………

4.在detail.ftl前端页面中,向【MemberController类中的updateReadState()方法】,发起ajax请求;

有关jQuery中ajax请求的内容可以参考【jQuery中Ajax函数:$.ajax()、$.post()、$.get()的使用、区别;】 

5.启动Tomcat,观察效果;

 前端看起来是没问题的:无论是修改已有的图书状态,还是创建新的图书状态,都没问题;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值