# 发布帖子 --- ## Util 工具类:将服务端返回的消息封装成 JSON 格式的字符串 ```java /** * 将服务端返回的消息封装成 JSON 格式的字符串 * @param code 状态码 * @param msg 提示消息 * @param map 业务数据 * @return 返回 JSON 格式字符串 */ public static String getJSONString(int code, String msg, Map 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(); } // 重载 getJSONString 方法,服务端方法可能不返回业务数据 public static String getJSONString(int code, String msg) { return getJSONString(code, msg, null); } // 重载 getJSONString 方法,服务端方法可能不返回业务数据和提示消息 public static String getJSONString(int code) { return getJSONString(code, null, null); } /** * 测试 * @param args */ public static void main(String[] args) { Map map = new HashMap<>(); map.put("name", "Jack"); map.put("age", 18); // {"msg":"ok","code":0,"name":"Jack","age":18} System.out.println(getJSONString(0, "ok", map)); } ``` ## DAO `DiscussPostMapper` ```java /** * 插入/添加帖子 * @param discussPost * @return */ int insertDiscussPost(DiscussPost discussPost); ``` 对应的 `mapper.xml` ```xml insert into discuss_post () values(#{userId}, #{title}, #{content}, #{type}, #{status}, #{createTime}, #{commentCount}, #{score}) ``` ## Service ```java /** * 添加帖子 * @param discussPost * @return */ public int addDiscussPost(DiscussPost discussPost) { if (discussPost == null) { throw new IllegalArgumentException("参数不能为空"); } // 转义 HTML 标记,防止在 HTML 标签中注入攻击语句 discussPost.setTitle(HtmlUtils.htmlEscape(discussPost.getTitle())); discussPost.setContent(HtmlUtils.htmlEscape(discussPost.getContent())); // 过滤敏感词 discussPost.setTitle(sensitiveFilter.filter(discussPost.getTitle())); discussPost.setContent(sensitiveFilter.filter(discussPost.getContent())); return discussPostMapper.insertDiscussPost(discussPost); } ``` 转义 HTML 标记,防止在 HTML 标签中注入攻击语句,比如 `` ## Controller ```java @Controller @RequestMapping("/discuss") public class DiscussPostController { @Autowired private DiscussPostSerivce discussPostSerivce; @Autowired private HostHolder hostHolder; /** * 添加帖子(发帖) * @param title * @param content * @return */ @PostMapping("/add") @ResponseBody public String addDiscussPost(String title, String content) { User user = hostHolder.getUser(); if (user == null) { return CommunityUtil.getJSONString(403, "您还未登录"); } DiscussPost discussPost = new DiscussPost(); discussPost.setUserId(user.getId()); discussPost.setTitle(title); discussPost.setContent(content); discussPost.setCreateTime(new Date()); discussPostSerivce.addDiscussPost(discussPost); // 报错的情况将来会统一处理 return CommunityUtil.getJSONString(0, "发布成功"); } } ``` ## 前端 ```java ``` 对应的 js: ```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) { // String -> Json 对象 data = $.parseJSON(data); // 在提示框 hintBody 显示服务端返回的消息 $("#hintBody").text(data.msg); // 显示提示框 $("#hintModal").modal("show"); // 2s 后自动隐藏提示框 setTimeout(function(){ $("#hintModal").modal("hide"); // 刷新页面 if (data.code == 0) { window.location.reload(); } }, 2000); } ) } ``` ```js var title = $("#recipient-name").val(); ``` 获取选择框 id = recipient-name 里面的值