7.3置顶、加精、删除

功能实现
(1)点击置顶,修改帖子的类型。
(2)点击“加精”、“删除”,修改帖子的状态。
  权限管理
(1)版主可以执行“置顶”、“加精”操作
(2)管理员可以执行“删除”操作。
  按钮显示
(1)版主可以看到“置顶”、“加精”按钮。
(2)管理员可以看到“删除”按钮。
thymeleaf支持security,但是要升级到在thymeleaf-extras-springsecurity。
在github中搜索thymeleaf-extras-springsecurity可以查看相关文档。
mvn库里搜thymeleaf springsecurity5,粘贴到pom.xml。

实现这三个功能的基本逻辑

DAO

在DiscussPostMapper接口类里,添加

      int updateType(int id,int type);
    
    int updateStatus(int id ,int status);

    <update id="updateType">
        update discuss_post set type = #{type} where id = #{id};
    </update>

    <update id="updateStatus">
        update discuss_post set status = #{status} where id = #{id};
    </update>

Service

      public int updateType(int id,int type){
        return discussPostMapper.updateType(id,type);
    }

    public int updateStatus(int id,int status){
        return discussPostMapper.updateStatus(id,status);
    }

Controller

    //置顶,异步的
    @RequestMapping(path = "/top",method = RequestMethod.POST)
    @ResponseBody
    public String setTop(int id){
        discussPostService.updateType(id,1);

        //把信息同步到es服务器中
        //触发发帖事件,把新发布的帖子存到es服务器中
        Event event = new Event()
                .setTopic(TOPIC_PUBLISH)
                .setUserId(hostHolder.getUser().getId())
                .setEntityType(ENTITY_TYPE_POST)
                .setEntityId(id);/*如果不修正mapper.xml中的keyproperty,这里就会有问题*/

        eventProducer.fireEvent(event);//发布事件

        return CommunityUtil.getJSONString(0);

    }

    //加精
    @RequestMapping(path = "/wonderful",method = RequestMethod.POST)
    @ResponseBody
    public String setWonderful(int id){
        discussPostService.updateStatus(id,1);

        //把信息同步到es服务器中
        //触发发帖事件,把新发布的帖子存到es服务器中
        Event event = new Event()
                .setTopic(TOPIC_PUBLISH)
                .setUserId(hostHolder.getUser().getId())
                .setEntityType(ENTITY_TYPE_POST)
                .setEntityId(id);/*如果不修正mapper.xml中的keyproperty,这里就会有问题*/

        eventProducer.fireEvent(event);//发布事件

        return CommunityUtil.getJSONString(0);

    }

    //删除
    @RequestMapping(path = "/delete",method = RequestMethod.POST)
    @ResponseBody
    public String setDelete(int id){
        discussPostService.updateStatus(id,2); //0-正常; 1-精华; 2-删除;

        //从es服务器中删除
        //触发删帖事件
        Event event = new Event()
                .setTopic(TOPIC_DELETE)
                .setUserId(hostHolder.getUser().getId())
                .setEntityType(ENTITY_TYPE_POST)
                .setEntityId(id);/*如果不修正mapper.xml中的keyproperty,这里就会有问题*/

        eventProducer.fireEvent(event);//发布事件

        return CommunityUtil.getJSONString(0);

    }

对于删除操作,要新增event的消费事件

    //消费删帖事件
    @KafkaListener(topics = {TOPIC_DELETE})
    public void handleDeleteMessage(ConsumerRecord record){
        if (record == null || record.value() == null){
            logger.error("消息的内容为空");
            return;
        }
        Event event = JSONObject.parseObject(record.value().toString(),Event.class);
        if (event == null){
            logger.error("消息的格式错误");
            return;
        }

        //删除帖子
        elasticsearchService.deleteDiscussPost(event.getEntityId());
    }

前端页面

					<div class="float-right">
						<input type="hidden" id="postId" th:value="${post.id}">
						<button type="button" class="btn btn-danger btn-sm" id="topBtn"
								th:disabled="${post.type==1}">置顶</button>
						<button type="button" class="btn btn-danger btn-sm" id="wonderfulBtn"
								th:disabled="${post.status==1}">加精</button>
						<button type="button" class="btn btn-danger btn-sm" id="deleteBtn"
								th:disabled="${post.status==2}">删除</button>
					</div>

js:

$(function () {
   // 调用三个按钮的方法
   $("#topBtn").click(setTop); 
   $("#wonderfulBtn").click(setWonderful); 
   $("#deleteBtn").click(setDelete); 
});
//置顶
function setTop() {
    $.post(
        CONTEXT_PATH+"/discuss/top",
        {"id":$("#postId").val()},
        function (data) {
            data = $.parseJSON(data);
            if (data.code==0){
                $("#topBtn").attr("disabled","disabled");//置顶完把按钮隐藏
            }else {
                alert(data.msg);
            }
        }
    )
}


//加精
function setWonderful() {
    $.post(
        CONTEXT_PATH+"/discuss/wonderful",
        {"id":$("#postId").val()},
        function (data) {
            data = $.parseJSON(data);
            if (data.code==0){
                $("#wonderfulBtn").attr("disabled","disabled");//删除完把按钮隐藏
            }else {
                alert(data.msg);
            }
        }
    )
}

//删除
function setDelete() {
    $.post(
        CONTEXT_PATH+"/discuss/delete",
        {"id":$("#postId").val()},
        function (data) {
            data = $.parseJSON(data);
            if (data.code==0){
               //删除完直接跳转到首页
                location.href = CONTEXT_PATH+"/index";
            }else {
                alert(data.msg);
            }
        }
    )
}

删除的逻辑是如果状态为2(删除状态的)在DAO层就不给你,那么就不能传入前端的model中

<!--    List是Java自带的类型所以不用写,只要写DiscussPost-->
    <select id="selectDiscussPosts" resultType="DiscussPost">
        select <include refid="selectFields"></include>
        from discuss_post
--         如果状态为2(删除状态的)就不能传入
        where status != 2 
        <if test="userId!=0">
            and user_id = #{userId}
        </if>
         order by type desc ,create_time desc
         limit #{offset},#{limit}
    </select>

Security

SecurityConfig里面添加设置

.antMatchers(
                        "/discuss/top",
                        "/discuss/wonderful"
                )
                .hasAnyAuthority(
                        AUTHORITY_MODERATOR
                )
                .antMatchers(
                        "/discuss/delete"
                )
                .hasAnyAuthority(
                        AUTHORITY_ADMIN
                )

在这里插入图片描述

按钮显示

新增命名空间在detail页面。影响对应权限的用户是否能看到按钮

 xmlns:sec="http://www.thymeleaf.org/extras/spring-security"

					<div class="float-right">
						<input type="hidden" id="postId" th:value="${post.id}">
						<button type="button" class="btn btn-danger btn-sm" id="topBtn"
								th:disabled="${post.type==1}" sec:authorize="hasAnyAuthority('moderator')">置顶</button>
						<button type="button" class="btn btn-danger btn-sm" id="wonderfulBtn"
								th:disabled="${post.status==1}" sec:authorize="hasAnyAuthority('moderator')">加精</button>
						<button type="button" class="btn btn-danger btn-sm" id="deleteBtn"
								th:disabled="${post.status==2}" sec:authorize="hasAnyAuthority('admin')">删除</button>
					</div>

后续

自己搞个取消置顶的功能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值