3.开发社区核心功能


项目源码可以在 https://gitee.com/ShayneC/community获取

开发社区核心功能

1. 过滤敏感词

  • 前缀树
    • 名称:Trie、字典树、查找树
    • 特点:查找效率高,消耗内存大
    • 应用:字符串检索、词频统计、字符串排序等
  • 敏感词过滤器
    • 定义前缀树
    • 根据敏感词,初始化前缀树
    • 编写过滤敏感词的方法

2. 发布帖子

  • AJAX
    • Asynchronous JavaScript and XML
    • 异步的JavaScript与XML,不是一门新技术,只是一个新的术语。
    • 使用AJAX,网页能够将增量更新呈现在页面上,而不需要刷新整个页面。
    • 虽然X代表XML,但目前JSON的使用比XML更加普遍。
    • https://developer.mozilla.org/zh-CN/docs/Web/Guide/AJAX
  • 示例
    • 使用jQuery发送AJAX请求。

在CommunityUtil中新建获取json数据的getJSONString方法

public static String getJSONString(int code, String msg, Map<String, Object> map) {
   
    JSONObject json = new JSONObject();
    json.put("code", code);
    json.put("msg", msg);
    if (map != null) {
   
        for (String key : map.keySet()) {
   
            json.put(key, map.get(key));
        }
    }
    return json.toJSONString();
}

public static String getJSONString(int code, String msg) {
   
    return getJSONString(code, msg, null);
}

public static String getJSONString(int code) {
   
    return getJSONString(code, null, null);
}

在HelloController中添加ajax得到请求方法

// ajax示例
@RequestMapping(path = "/ajax", method = RequestMethod.POST)
@ResponseBody
public String testAjax(String name, int age) {
   
    System.out.println(name);
    System.out.println(age);
    return CommunityUtil.getJSONString(0, "操作成功");
}

src/main/resources/static目录下新建testAjax.html,并访问http://localhost:8888/community/testAjax.html点击发送。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>testAjax</title>
</head>
<body>
    <p>
      <input type="button" value="发送" onclick="send();">
    </p>

    <script src="https://code.jquery.com/jquery-3.3.1.min.js" crossorigin="anonymous"></script>
    <script>
      function send() {
     
        $.post(
                "/community/ajax",
                {
     "name":"张三", "age":23},
                function (data) {
     
                    console.log(typeof data);
                  console.log(data);
                  data = $.parseJSON(data);
                  console.log(data);
                    console.log(typeof data);
                    console.log(data.code);
                  console.log(data.msg);
                }
        )
      }
    </script>
</body>
</html>
  • 实践
    • 采用AJAX请求,实现发布帖子的功能。

新增DiscussPostController用于发布帖子

package com.nowcoder.community.controller;

import com.nowcoder.community.entity.DiscussPost;
import com.nowcoder.community.entity.User;
import com.nowcoder.community.service.DiscussPostService;
import com.nowcoder.community.util.CommunityUtil;
import com.nowcoder.community.util.HostHolder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Date;

@Controller
@RequestMapping("/discuss")
public class DiscussPostController {
   

    @Autowired
    private DiscussPostService discussPostService;

    @Autowired
    private HostHolder hostHolder;

    @RequestMapping(path = "/add", method = RequestMethod.POST)
    @ResponseBody
    public String addDiscussPost(String title, String content) {
   
        User user = hostHolder.getUser();
        if (user == null) {
   
            return CommunityUtil.getJSONString(403, "你还没有登录哦");
        }
        DiscussPost post = new DiscussPost();
        post.setUserId(user.getId());
        post.setTitle(title);
        post.setContent(content);
        post.setCreateTime(new Date());
        discussPostService.addDiscussPost(post);

        // 报错的情况将来统一处理
        return CommunityUtil.getJSONString(200, "发布成功");
    }
}

在discusspost-mapper.xml中添加插入贴子的语句

<sql id="insertFields">
    user_id, title, content, type, status, create_time, comment_count, score
</sql>
<insert id="insertDiscussPost" parameterType="DiscussPost">
    insert into discuss_post(<include refid="insertFields"></include>)
    values(#{userId}, #{title}, #{content}, #{type}, #{status}, #{createTime}, #{commentCount}, #{score})
</insert>

在DiscussPostService中添加发布帖子的业务,同时过滤敏感词

public int addDiscussPost(DiscussPost post) {
   
    if (post == null) {
   
        throw new IllegalArgumentException("参数不能为空");
    }

    // 转移html标记
    post.setTitle(HtmlUtils.htmlEscape(post.getTitle()));
    post.setContent(HtmlUtils.htmlEscape(post.getContent()));

    // 过滤敏感词
    post.setTitle(sensitiveFilter.filter(post.getTitle()));
    post.setContent(sensitiveFilter.filter(post.getContent()));

    return discussPostMapper.insertDiscussPost(post);
}

并修改index.js用于发送异步请求

$(function(){
   
	$("#publishBtn").click(publish);
});

function publish() {
   
	$("#publishModal").modal("hide");

	// 获取标题和内容
	var title = $("#recipient-name").val();
	var content = $("#message-text").val();
	// 发送异步请求
	$.post(
		CONTEXT_PATH + "/discuss/add",
		{
   "title":title, "content":content},
		function (data) {
   
			data = $.parseJSON
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值