基于Spring+SpringMVC+MyBatis开发书评网用户对于某本书的阅读状态的查询与更新功能实现

Posted 被雨遗忘的夏天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于Spring+SpringMVC+MyBatis开发书评网用户对于某本书的阅读状态的查询与更新功能实现相关的知识,希望对你有一定的参考价值。

目录

概要

一、 查询

1.1 BookController

1.2 MemberServiceImpl

二、 更新

2.1  MemberController

2.2 MemberServiceImpl

三、 前端渲染


概要

用户登录成功后,点击某本书,显示用户的阅读状态。首先是查询该用户的阅读状态,没点开过、想看或者看过,点击后需要更新点击后的。

查询阅读状态功能放在书本控制器,因为点击开来后,就要显示阅读状态了。

更新放在用户控制器下即可。

一、 查询

1.1 BookController

// URL绑定,使用springMVC路径变量进行捕获
    @GetMapping("/book/{id}")
    // @PathVariable: 路径变量
    public ModelAndView showDetail(@PathVariable("id") Long id, HttpSession session) {
        // 通过selectById(id)获取图书对象
        Book book = bookService.selectById(id);

        // 把具体的id传入,得到评论列表
        List<Evaluation> evaluationList = evaluationService.selectByBookId(id);

        // 当用户点开一本书时,就要查询该用户对于这本书的阅读状态
        Member member = (Member)session.getAttribute("loginMember");

        // 跳转到名字为detail的freemaker页面
        ModelAndView mav = new ModelAndView("/detail");

        if(member != null){
            // 获取会员阅读状态
            MemberReadState memberReadState = memberService.selectMemberReadState(member.getMemberId(), id);
            mav.addObject("memberReadState", memberReadState);
        }

        // 将查询到的对象放入到ModelAndView中
        mav.addObject("book", book);
        mav.addObject("evaluationList", evaluationList);

        // 返回mav结果给前端(处理器适配器)
        return mav;
    }

1.2 MemberServiceImpl

/**
     * 获取阅读状态
     *
     * @param memberId 会员编号
     * @param bookId   图书编号
     * @return 阅读状态对象
     */
    @Transactional(propagation = Propagation.NOT_SUPPORTED,readOnly = true)
    public MemberReadState selectMemberReadState(Long memberId, Long bookId) {
        // 1、 传入参数,组织查询条件
        QueryWrapper<MemberReadState> queryWrapper = new QueryWrapper();
        queryWrapper.eq("book_id", bookId);
        queryWrapper.eq("member_id", memberId);

        // 2、 查询
        MemberReadState memberReadState = memberReadStateMapper.selectOne(queryWrapper);
        return memberReadState;
    }

二、 更新

2.1  MemberController

/**
     * 更新想看/看过阅读状态
     * @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;
    }

2.2 MemberServiceImpl

/**
     * 更新阅读状态
     *
     * @param memberId  会员编号
     * @param bookId    图书编号
     * @param readState 阅读状态
     * @return 阅读状态对象
     */
    public MemberReadState updateMemberReadState(Long memberId, Long bookId, Integer readState) {
        // 1、 构建查询条件
        QueryWrapper<MemberReadState> queryWrapper = new QueryWrapper<MemberReadState>();
        queryWrapper.eq("book_id", bookId);
        queryWrapper.eq("member_id", memberId);

        // 2、 执行查询
        MemberReadState memberReadState = memberReadStateMapper.selectOne(queryWrapper);

        // 3、 无则新增,有则更新
        if (memberReadState == null) {
            // 新增
            memberReadState = new MemberReadState();
            memberReadState.setMemberId(memberId);
            memberReadState.setBookId(bookId);
            memberReadState.setReadState(readState);
            memberReadState.setCreateTime(new Date());
            // 插入新数据
            memberReadStateMapper.insert(memberReadState);
        } else {
            // 已经存在,更改State即可
            memberReadState.setReadState(readState);
            memberReadStateMapper.updateById(memberReadState);
        }

        return memberReadState;
    }

三、 前端渲染

$(function () {
            <#if memberReadState ??>
            // 重选阅读状态
            $("*[data-read-state='${memberReadState.readState}']").addClass("highlight");
            </#if>
            <#if !loginMember ??>
            $("*[data-read-state],#btnEvaluation,*[data-evaluation-id]").click(function(){
                // 未登录情况下提示"需要登录"
                $("#exampleModalCenter").modal("show");
            })
            </#if>

            <#if loginMember ??>
            /**
             * 更新会员阅读状态
             */
            $("*[data-read-state]").click(function () {
                // 会员阅读状态
                var readState = $(this).data("read-state");
                // 发送请求
                $.post("/update_read_state", {
                    memberId:${loginMember.memberId},
                    bookId:${book.bookId},
                    readState: readState
                }, function (json) {
                    if (json.code == "0") {
                        $("*[data-read-state]").removeClass("highlight");
                        $("*[data-read-state='" + readState + "']").addClass("highlight");
                    }
                }, "json")
            });

以上是关于基于Spring+SpringMVC+MyBatis开发书评网用户对于某本书的阅读状态的查询与更新功能实现的主要内容,如果未能解决你的问题,请参考以下文章

spring与mybati整合方法

自己开发的音乐视频网站

Spring Boot整合Mybati之逆向工程

抽奖活动啦!5本SpringMVC+MyBatis相关3本Android Studio相关6本Kafka相关

spring+mybati java config配置引起的bean相互引用日志报警告问题

Spring基于注解及SpringMVC