功能实现 (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 discuss_post set type = #{type} where id = #{id};
update discuss_post set status = #{status} where id = #{id};
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());
}
前端页面
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中
select
from discuss_post
-- 如果状态为2(删除状态的)就不能传入
where status != 2
and user_id = #{userId}
order by type desc ,create_time desc
limit #{offset},#{limit}
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"
后续
自己搞个取消置顶的功能