仿牛客社区——7.5置顶、加精、删除

实现功能

功能实现

点击 置顶,修改帖子的类型

点击“加精”、“删除”,修改帖子的状态

权限管理

版主可以执行“置顶“、“取消置顶”、“加精”、“取消加精”操作。

管理员可以执行“删除”操作。

按钮显示

“加精”按钮版主可以看到“置顶“、“加精”按钮

管理员可以看到“删除”按钮。

新增常量

/**
 * 主题:删帖
 */

String TOPIC_DELETE="delete";

Controller

	//置顶与取消置顶
	@RequestMapping(value = "/top",method = RequestMethod.POST)
	@ResponseBody //结果返回为json字符串
	public String setTop(int id){
		//获取帖子
		DiscussPost post = discussPostService.findDiscussPostById(id);
		//int type = post.getType();  //获取帖子置顶状态
		//if(type==0){
		//	type=1;
		//}else{
		//	type=0;
		//}
		/**也可采取异或方式*/
		// 获取置顶状态,1为置顶,0为正常状态,1^1=0 0^1=1
		int type = post.getType()^1;
		//置顶与取消置顶(更改帖子类型
		discussPostService.updateType(id,type);
		//将返回的结果
		Map map=new HashMap<>();
		map.put("type",type);


		//更改完帖子后,要同步更新elasticsearch中的结果
		//触发发帖事件
		Event event=new Event()
				.setTopic(TOPIC_PUBLISH)
				.setUserId(hostHolder.getUser().getId())
				.setEntityId(id)
				.setEntityType(ENTITY_TYPE_POST);

		eventProducer.fireEvent(event);

		return CommunityUtil.getJsonString(0,null,map);
	}

	//加精
	@RequestMapping(value = "/wonderful",method = RequestMethod.POST)
	@ResponseBody //结果返回为json字符串
	public String setWonderful(int id){
		DiscussPost post = discussPostService.findDiscussPostById(id);
		// 1为加精,0为正常, 1^1=0, 0^1=1
		int status = post.getStatus()^1;
		//更改帖子状态
		discussPostService.updateStatus(id,status);
		//将返回的结果
		Map map=new HashMap<>();
		map.put("status",status);


		//更改完帖子后,要同步更新elasticsearch中的结果
		//触发发帖事件
		Event event=new Event()
				.setTopic(TOPIC_PUBLISH)
				.setUserId(hostHolder.getUser().getId())
				.setEntityId(id)
				.setEntityType(ENTITY_TYPE_POST);

		eventProducer.fireEvent(event);

		return CommunityUtil.getJsonString(0,null,map);
	}

	//删除
	@RequestMapping(value = "/delete",method = RequestMethod.POST)
	@ResponseBody //结果返回为json字符串
	public String setDelete(int id){
		//更改帖子状态
		discussPostService.updateStatus(id,2);

		//更改完帖子后,要同步更新elasticsearch中的结果
		//触发删帖事件
		Event event=new Event()
				.setTopic(TOPIC_DELETE)
				.setUserId(hostHolder.getUser().getId())
				.setEntityId(id)
				.setEntityType(ENTITY_TYPE_POST);

		eventProducer.fireEvent(event);

		return CommunityUtil.getJsonString(0);
	}

service

 //置顶:更改类型为1
    public int updateType(int id,int type){
        return discussPostMapper.updateType(id,type);
    }

    //加精:更改状态为1
    public int updateStatus(int id,int status){
        return discussPostMapper.updateStatus(id,status);
    }

dao

  //置顶:更改类型为1
    int updateType(int id,int type);

    //加精:更改状态为1
    int updateStatus(int id ,int status);

mapper.xml

 
    
    
        update discuss_post
        set type=#{type}
        where id=#{id}
    

    
    
    
        update discuss_post
        set status=#{status}
        where id=#{id}
    

consumer

此处新增了删帖事件,发帖事件在之前的笔记中有给出

//消费者消费删帖事件--->同步到elasticsearch中
	@KafkaListener(topics = TOPIC_DELETE)
	public void handleDelete(ConsumerRecord record){
		//先进行判断record是否为空:未发事件或者发送的事件为空
		if(record==null|| record.value()==null){
			logger.error("发送的消息为空!");
			return;
		}

		//事件不为空:将事件转换为Event对象
		Event event= JSONObject.parseObject(record.value().toString(),Event.class);
		//判断对象是否为空
		if(event==null){
			logger.error("消息格式错误!");
			return;
		}

		elasticsearchService.deleteDiscussPost(event.getEntityId());
	}

securityConfig

//授权相关配置(对现有路径权限配置
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests()
				.antMatchers(
						"/comment/add/**",
						"/discuss/add",
						"/follow",
						"/unfollow",
						"/like",
						"/letter/**",
						"/user/setting",
						"/user/upload",
						"/notice/**"
				)
				.hasAnyAuthority(
						AUTHORITY_ADMIN,
						AUTHORITY_MODERATOR,
						AUTHORITY_USER
				)
				.antMatchers(
						"/discuss/top",
						"/discuss/wonderful"
				)
				.hasAnyAuthority(
						AUTHORITY_MODERATOR
				)
				.antMatchers(
						"/discuss/delete"
				)
				.hasAnyAuthority(
						AUTHORITY_ADMIN
				)
				.anyRequest().permitAll(); //除了这些请求以外任何请求都是允许访问的
				//.and().csrf().disable();   //不启用防止CSRF攻击

html

js

$(function(){  //在刚初始化完html页面时加载该方法
    $("#topBtn").click(setTop);
    $("#wonderfulBtn").click(setWonderful);
    $("#deleteBtn").click(setDelete);
});


//置顶与取消置顶
function setTop(){
 //发送Ajax请求之前,提前将CSRF令牌设置到请求的消息头中
    	var token=$("meta[name='_csrf']").attr("content");
    	var header=$("meta[name='_csrf_header']").attr("content");
    	//在发送请求之前对页面进行设置   xhr:发送异步请求的核心对象
    	$(document).ajaxSend(function(e,xhr,options){
    	    xhr.setRequestHeader(header,token);  //设置请求头
    	});
    $.post(
        CONTEXT_PATH+"/discuss/top",
        {"id":$("#postId").val()},
        function(data){
            data=$.parseJSON(data);
            if(data.code==0){
                $("#topBtn").text(data.type==1?'取消置顶':'置顶');
            }else{
                alert(data.msg);
            }
        }

    );
}

//加精与取消加精
function setWonderful(){
 //发送Ajax请求之前,提前将CSRF令牌设置到请求的消息头中
    	var token=$("meta[name='_csrf']").attr("content");
    	var header=$("meta[name='_csrf_header']").attr("content");
    	//在发送请求之前对页面进行设置   xhr:发送异步请求的核心对象
    	$(document).ajaxSend(function(e,xhr,options){
    	    xhr.setRequestHeader(header,token);  //设置请求头
    	});
    $.post(
        CONTEXT_PATH+"/discuss/wonderful",
        {"id":$("#postId").val()},
        function(data){
            data=$.parseJSON(data);
            if(data.code==0){
                $("#wonderfulBtn").text(data.status==1?'取消加精':'加精');
            }else{
                alert(data.msg);
            }
        }

    );
}

//删除
function setDelete(){
 //发送Ajax请求之前,提前将CSRF令牌设置到请求的消息头中
    	var token=$("meta[name='_csrf']").attr("content");
    	var header=$("meta[name='_csrf_header']").attr("content");
    	//在发送请求之前对页面进行设置   xhr:发送异步请求的核心对象
    	$(document).ajaxSend(function(e,xhr,options){
    	    xhr.setRequestHeader(header,token);  //设置请求头
    	});
    $.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);
            }
        }

    );
}

你可能感兴趣的:(项目,java,springsecurity,elasticsearch,kafka,springboot)