# 置顶、加精、删除 --- ![](https://gitee.com/veal98/images/raw/master/img/20210130202241.png) ## 功能实现 service 和 DAO 就不列出来了,比较简单 ### Controller 置顶、加精帖子同时也需要触发发帖事件,修改 Elasticsearch 服务器的数据 `DiscusspostController`: ```java /** * 置顶帖子 * @param id * @return */ @PostMapping("/top") @ResponseBody public String setTop(int id) { discussPostSerivce.updateType(id, 1); // 触发发帖事件,通过消息队列将其存入 Elasticsearch 服务器 Event event = new Event() .setTopic(TOPIC_PUBLISH) .setUserId(hostHolder.getUser().getId()) .setEntityType(ENTITY_TYPE_POST) .setEntityId(id); eventProducer.fireEvent(event); return CommunityUtil.getJSONString(0); } ``` 删除帖子时将数据库中的状态修改为拉黑 2(这里我们没有写删除帖子的方法,而是将其状态设置为拉黑,重构的时候考虑一下将这个改为直接删除),并触发删帖事件, 删除 Elasticsearch 服务器中的数据 EventConsumer: ```java /** * 消费删帖事件 */ @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()); } ``` DiscusspostController: ```java /** * 删除帖子 * @param id * @return */ @PostMapping("/delete") @ResponseBody public String setDelete(int id) { discussPostSerivce.updateStatus(id, 2); // 触发删帖事件,通过消息队列更新 Elasticsearch 服务器 Event event = new Event() .setTopic(TOPIC_DELETE) .setUserId(hostHolder.getUser().getId()) .setEntityType(ENTITY_TYPE_POST) .setEntityId(id); eventProducer.fireEvent(event); return CommunityUtil.getJSONString(0); } ``` ### 前端 input 隐藏框的作用是方便给后端那几个方法传递参数值 post.id button 的 id 是方便在 js 中进行调用 ```html ``` 对应的 discuss.js:(我发现只是要异步请求就需要在 js 文件中写逻辑,非异步请求不需要,不知道是否正确,后续重构的时候再看) ```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); // 方法返回的结果是 json 类型,我们将其转为 object if (data.code == 0) { // 置顶成功后,将置顶按钮设置为不可用 $("#topBtn").attr("disabled", "disable") } 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); } } ) } ``` ## 权限管理 在 SecurityConfig 中加上这么一段即可: ![](https://gitee.com/veal98/images/raw/master/img/20210130215025.png) ## 按钮显示 不同的权限显示不同的按钮这个功能,需要通过 Thymeleaf SpringSecurity5 实现,导入依赖: ```xml org.thymeleaf.extras thymeleaf-extras-springsecurity5 ``` 在文件头添加引用 `xmlns:sec="http://www.thymeleaf.org/extra/spring-security"`: ```html ``` ![](https://gitee.com/veal98/images/raw/master/img/20210130215201.png)