数局访问层代码编写
package com.nowcoder.community.dao; import com.nowcoder.community.entity.DiscussPost; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface DiscussPostMapper { List<DiscussPost> selectDiscussPosts(int userId, int offset, int limit); // @Param注解用于给参数取别名, // 如果只有一个参数,并且在<if>里使用,则必须加别名. int selectDiscussPostRows(@Param("userId") int userId); int insertDiscussPost(DiscussPost discussPost); }
discusspost-mapper.xml
<insert id="insertDiscussPost" parameterType="DiscussPost"> insert into discuss_post(<include refid="insertFields"></include>) values(#{userId},#{title},#{content},#{type},#{status},#{createTime},#{commentCount},#{score}) </insert>
业务层service
package com.nowcoder.community.service; import com.nowcoder.community.dao.DiscussPostMapper; import com.nowcoder.community.entity.DiscussPost; import com.nowcoder.community.util.SensitiveFilter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.util.HtmlUtils; import java.util.List; @Service public class DiscussPostService { @Autowired private DiscussPostMapper discussPostMapper; @Autowired private SensitiveFilter sensitiveFilter; 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); } }
controller
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(0, "发布成功!"); } }
页面(视图)
index.html
发布新帖按钮
<button type="button" class="btn btn-primary btn-sm position-absolute rt-0" data-toggle="modal" data-target="#publishModal" th:if="${loginUser!=null}">我要发布</button>
发布新帖表单
<!-- 弹出框 --> <div class="modal fade" id="publishModal" tabindex="-1" role="dialog" aria-labelledby="publishModalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="publishModalLabel">新帖发布</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-body"> <form> <div class="form-group"> <label for="recipient-name" class="col-form-label">标题:</label> <input type="text" class="form-control" id="recipient-name"> </div> <div class="form-group"> <label for="message-text" class="col-form-label">正文:</label> <textarea class="form-control" id="message-text" rows="15"></textarea> </div> </form> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button> <button type="button" class="btn btn-primary" id="publishBtn">发布</button> </div> </div> </div> </div> <!-- 提示框 --> <div class="modal fade" id="hintModal" tabindex="-1" role="dialog" aria-labelledby="hintModalLabel" aria-hidden="true"> <div class="modal-dialog modal-lg" role="document"> <div class="modal-content"> <div class="modal-header"> <h5 class="modal-title" id="hintModalLabel">提示</h5> </div> <div class="modal-body" id="hintBody"> 发布完毕! </div> </div> </div> </div>
表单提交相关js代码
index.js
$(function(){ $("#publishBtn").click(publish); }); function publish() { $("#publishModal").modal("hide"); // 获取标题和内容 var title = $("#recipient-name").val(); var content = $("#message-text").val(); // 发送异步请求(POST) $.post( CONTEXT_PATH + "/discuss/add", {"title":title,"content":content}, function(data) { data = $.parseJSON(data); // 在提示框中显示返回消息 $("#hintBody").text(data.msg); // 显示提示框 $("#hintModal").modal("show"); // 2秒后,自动隐藏提示框 setTimeout(function(){ $("#hintModal").modal("hide"); // 刷新页面 if(data.code == 0) { window.location.reload(); } }, 2000); } ); }
测试效果
数据表
/*列信息*/----------- Field Type Collation Null Key Default Extra Privileges Comment ------------- ------------ --------------- ------ ------ ------- -------------- ------------------------------- ------------------------------- id int(11) (NULL) NO PRI (NULL) auto_increment select,insert,update,references user_id varchar(45) utf8_general_ci YES MUL (NULL) select,insert,update,references title varchar(100) utf8_general_ci YES (NULL) select,insert,update,references content text utf8_general_ci YES (NULL) select,insert,update,references type int(11) (NULL) YES (NULL) select,insert,update,references 0-普通; 1-置顶; status int(11) (NULL) YES (NULL) select,insert,update,references 0-正常; 1-精华; 2-拉黑; create_time timestamp (NULL) YES (NULL) select,insert,update,references comment_count int(11) (NULL) YES (NULL) select,insert,update,references score double (NULL) YES (NULL) select,insert,update,references
/*索引信息*/-------------- Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment ------------ ---------- ------------- ------------ ----------- --------- ----------- -------- ------ ------ ---------- ------- --------------- discuss_post 0 PRIMARY 1 id A 1 (NULL) (NULL) BTREE discuss_post 1 index_user_id 1 user_id A 1 (NULL) (NULL) YES BTREE