目录
导入thymeleaf-spring包
置顶加精和删除帖子的时候都需要发布帖子更新事件和删除帖子事件,主要是为了同步数据库和es服务器中的帖子数据
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>
DiscussPostService
public int updateType(int id, int type){
return discussPostMapper.updateType(id, type);
}
public int updateStatus(int id, int status){
return discussPostMapper.updateStatus(id, status);
}
DiscussPostController
//加精
@RequestMapping(path = "/wonderful", method = RequestMethod.POST)
@ResponseBody
public String setWonderful(int id){
discussPostService.updateStatus(id, 1);
//触发发帖事件,把数据重新同步到es服务器中去
Event event = new Event()
.setTopic(TOPIC_PUBLISH)
.setUserId(hostHolder.getUser().getId())
.setEntityType(ENTITY_TYPE_POST)
.setEntityId(id);
eventProducer.fireEvent(event);
//计算帖子分数
String redisKey = RedisKeyUtil.getPostScoreKey();
redisTemplate.opsForSet().add(redisKey, id);
return CommunityUtil.getJSONString(0);
}
//删除
@RequestMapping(path = "/delete", method = RequestMethod.POST)
@ResponseBody
public String setDelete(int id){
discussPostService.updateStatus(id, 2);
//触发删帖事件
Event event = new Event()
.setTopic(TOPIC_DELETE)
.setUserId(hostHolder.getUser().getId())
.setEntityType(ENTITY_TYPE_POST)
.setEntityId(id);
eventProducer.fireEvent(event);
return CommunityUtil.getJSONString(0);
}
在删除帖子的时候触发了删帖事件,增加一个消费删帖事件的方法
//消费删帖事件
@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());
}
discuss.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);
console.log(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){
//直接跳转到首页就可以了
window.location.href=CONTEXT_PATH + "/index";
}else{
alert(data.msg);
}
}
);
}
<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>
配置权限SecurityConfig
.antMatchers(
"/discuss/top",
"/discuss/wonderful"
)
.hasAnyAuthority(
AUTHORITY_MODERATOR
)
.antMatchers(
"/discuss/delete",
"/data/**"
)
.hasAnyAuthority(
AUTHORITY_ADMIN
)
两点:
- (1)服务端能真正过滤掉没有访问权限的用户
- (2)界面友好,没有权限的话,就不应该显示对应的内容