zoukankan      html  css  js  c++  java
  • 实现实体评论服务

    • 评论中心的实现

     
     
    • 评论中心
    需要评论的各种场景服务:
    评论中心的设计:统一的评论服务,覆盖所有的实体,可以进行评论
    通用的模块开发流程
    1. Database Column
    2. Model:模型定义,和数据库相匹配
    3. DAO:数据读取
    4. Service:服务包装
    5. Controller:业务入口
    6. Test
    站内信开发流程
    1. Database Column
    id
    content
    entity_id ->questionId/commentId //表示任意实体的id;
    entity_type question/comment //表示评论的对象
    created_date
    user_id
    2. Model:模型定义,和数据库相匹配
    package com.nowcoder.model;
     
    import java.util.Date;
     
    /**
    * @Author liguo
    * @Description
    * @Data 2018-09-06 7:50
    */
    public class Comment {
    private int id;
    private int userId;
    private int entityId;
    private int entityType;
    private String content;
    private Date createdDate;
    private int status;
     
    public int getId() {
    return id;
    }
     
    public void setId(int id) {
    this.id = id;
    }
     
    public int getUserId() {
    return userId;
    }
     
    public void setUserId(int userId) {
    this.userId = userId;
    }
     
    public int getEntityId() {
    return entityId;
    }
     
    public void setEntityId(int entityId) {
    this.entityId = entityId;
    }
     
    public int getEntityType() {
    return entityType;
    }
     
    public void setEntityType(int entityType) {
    this.entityType = entityType;
    }
     
    public String getContent() {
    return content;
    }
     
    public void setContent(String content) {
    this.content = content;
    }
     
    public Date getCreatedDate() {
    return createdDate;
    }
     
    public void setCreatedDate(Date createdDate) {
    this.createdDate = createdDate;
    }
     
    public int getStatus() {
    return status;
    }
     
    public void setStatus(int status) {
    this.status = status;
    }
    }
     
    3. DAO:数据读取
     
    //数据库接口的crud
    @Mapper
    public interface CommentDAO {
    String TABLE_NAME = " comment ";
    String INSERT_FIELDS = " user_id, content, created_date, entity_id, entity_type, status ";
    String SELECT_FIELDS = " id, " + INSERT_FIELDS;
     
    @Insert({"insert into ", TABLE_NAME, "(", INSERT_FIELDS,
    ") values (#{userId},#{content},#{createdDate},#{entityId},#{entityType},#{status})"})
    int addComment(Comment comment);
     
    @Select({"select ", SELECT_FIELDS, " from ", TABLE_NAME, " where id=#{id}"})
    Comment getCommentById(int id);
     
    @Select({"select ", SELECT_FIELDS, " from ", TABLE_NAME,
    " where entity_id=#{entityId} and entity_type=#{entityType} order by created_date desc"})
    List<Comment> selectCommentByEntity(@Param("entityId") int entityId, @Param("entityType") int entityType);
     
    @Select({"select count(id) from ", TABLE_NAME, " where entity_id=#{entityId} and entity_type=#{entityType}"})
    int getCommentCount(@Param("entityId") int entityId, @Param("entityType") int entityType);
     
    @Update({"update comment set status=#{status} where id=#{id}"})
    int updateStatus(@Param("id") int id, @Param("status") int status);
     
    @Select({"select count(id) from ", TABLE_NAME, " where user_id=#{userId}"})
    int getUserCommentCount(int userId);
     
    4. Service:服务包装
    package com.LG.service;
     
    import com.LG.dao.CommentDAO;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.util.HtmlUtils;
     
    import java.util.List;
     
    /**
    * @Author liguo
    * @Description
    * @Data 2018-09-06 8:54
    */
     
    @Service
    public class CommentService {
    @Autowired
    CommentDAO commentDAO;
     
    @Autowired
    SensitiveService sensitiveService;
     
    public List <Comment> getCommentsByEntity(int entityId, int entityType) {
    return commentDAO.selectCommentByEntity( entityId, entityType );
    }
    //过滤敏感词后进行插入
    public int addComment(Comment comment) {
    comment.setContent( HtmlUtils.htmlEscape( comment.getContent() ) );
    comment.setContent( sensitiveService.filter( comment.getContent() ) );
    return commentDAO.addComment( comment ) > 0 ? comment.getId() : 0;
    }
     
    public int getCommentCount(int entityId, int entityType) {
    return commentDAO.getCommentCount( entityId, entityType );
    }
     
    public int getUserCommentCount(int userId) {
    return commentDAO.getUserCommentCount( userId );
    }
     
    public boolean deleteComment(int commentId) {
    return commentDAO.updateStatus( commentId, 1 ) > 0;
    }
     
    public Comment getCommentById(int id) {
    return commentDAO.getCommentById( id );
    }
     
    }
    5. Controller:业务入口
    package com.LG.controller;
     
    import com.LG.async.EventModel;
    import com.LG.async.EventProducer;
    import com.LG.async.EventType;
    import com.LG.model.EntityType;
    import com.LG.model.HostHolder;
    import com.LG.service.QuestionService;
    import com.LG.util.WendaUtil;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    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.RequestParam;
     
    import java.util.Date;
     
    /**
    * @Author liguo
    * @Description
    * @Data 2018-09-06 8:53
    */
     
    @Controller
    public class CommentController {
    private static final Logger logger = LoggerFactory.getLogger(CommentController.class);
    @Autowired
    HostHolder hostHolder;
     
    @Autowired
    CommentService commentService;
     
    @Autowired
    QuestionService questionService;
     
    @Autowired
    EventProducer eventProducer;
     
     
    @RequestMapping(path = {"/addComment"}, method = {RequestMethod.POST})
    public String addComment(@RequestParam("questionId") int questionId,
    @RequestParam("content") String content) {
    try {
    Comment comment = new Comment();
    comment.setContent(content);
    if (hostHolder.getUser() != null) {
    comment.setUserId(hostHolder.getUser().getId());
    } else {
    comment.setUserId( WendaUtil.ANONYMOUS_USERID );
    // return "redirect:/reglogin";
    }
    comment.setCreatedDate(new Date());
    comment.setEntityType( EntityType.ENTITY_QUESTION );
    comment.setEntityId(questionId);
    commentService.addComment(comment);
     
    int count = commentService.getCommentCount(comment.getEntityId(), comment.getEntityType());
    questionService.updateCommentCount(comment.getEntityId(), count);
     
    eventProducer.fireEvent( new EventModel( EventType.COMMENT ).setActorId( comment.getUserId() )
    .setEntityId(questionId));
     
    } catch (Exception e) {
    logger.error("增加评论失败" + e.getMessage());
    }
    return "redirect:/question/" + questionId;
    }
    }
    }
     
     
     
     

  • 相关阅读:
    一起谈.NET技术,ASP.NET MVC3 Service Location 狼人:
    一起谈.NET技术,大型高性能ASP.NET系统架构设计 狼人:
    一起谈.NET技术,.NET 4 并行(多核)编程系列之二 从Task开始 狼人:
    一起谈.NET技术,Silverlight 游戏开发小技巧:动感小菜单 狼人:
    一起谈.NET技术,打包Asp.Net 网站成为一个exe方便快捷的进行客户演示 狼人:
    一起谈.NET技术,ASP.NET Eval如何进行数据绑定 狼人:
    一起谈.NET技术,ASP.NET MVC开发人员必备的五大工具 狼人:
    一起谈.NET技术,写出优雅简明代码的论题集 Csharp(C#)篇[2] 狼人:
    mysql数据库解除外键
    JSF页面组件化
  • 原文地址:https://www.cnblogs.com/liguo-wang/p/9597750.html
Copyright © 2011-2022 走看看