博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
点赞功能的设计
阅读量:6579 次
发布时间:2019-06-24

本文共 5475 字,大约阅读时间需要 18 分钟。

点赞功能的设计

每一次点赞,需要记录:

(1)谁点的赞;

(2)为哪篇文章(Convention)点的赞;

(3)点赞时间

(4)是否已经取消点赞

 

数据表设计

点赞记录表

列名

数据类型

说明

id

N

数据表id

user_id

N

用户id

vote_time

S

点赞时间,格式”2016-02-22 12:01:45”

bbs_id

N

被点赞帖子id

status

N

状态:有效或取消

 

继续讨论E-R关系

点赞记录表与用户是多对1关系

点赞记录表与帖子也是多对1关系

实体类:

package com.girltest.entity;import java.util.List;import javax.persistence.*;import org.hibernate.annotations.Fetch;import org.hibernate.annotations.FetchMode;/** * Created by huangweii on 2016/2/21. */@Entity@Table(name = "t_vote_log")public class VoteLog {    private int id;    private User user;    /**     * 点赞的时间     */private String voteTime;    private int status;   /**    * 帖子    */private Convention convention;        @Id    @GeneratedValuepublic int getId() {      return id;   }   public void setId(int id) {      this.id = id;   }   @ManyToOne   @JoinColumn (name="userId")   public User getUser() {      return user;   }   public void setUser(User user) {      this.user = user;   }   @Column(name = "vote_time")   public String getVoteTime() {      return voteTime;   }   public void setVoteTime(String voteTime) {      this.voteTime = voteTime;   }   public int getStatus() {      return status;   }   public void setStatus(int status) {      this.status = status;   }   @ManyToOne   @JoinColumn (name="conventionId")   public Convention getConvention() {      return convention;   }   public void setConvention(Convention convention) {      this.convention = convention;   }}

 

 投票的控制器:

Java代码  
  1. package com.girltest.web.controller;  
  2.   
  3. import com.common.dict.Constant2;  
  4. import com.common.util.SystemHWUtil;  
  5. import com.girltest.dao.ConventionDao;  
  6. import com.girltest.dao.Test2BoyDao;  
  7. import com.girltest.dao.VoteLogDao;  
  8. import com.girltest.entity.Convention;  
  9. import com.girltest.entity.User;  
  10. import com.girltest.entity.VoteLog;  
  11. import com.io.hw.json.HWJacksonUtils;  
  12. import com.time.util.TimeHWUtil;  
  13. import oa.util.AuthenticateUtil;  
  14. import oa.web.controller.base.BaseController;  
  15. import org.springframework.stereotype.Controller;  
  16. import org.springframework.ui.Model;  
  17. import org.springframework.web.bind.annotation.RequestMapping;  
  18. import org.springframework.web.bind.annotation.ResponseBody;  
  19.   
  20. import javax.annotation.Resource;  
  21. import javax.servlet.http.HttpServletRequest;  
  22. import javax.servlet.http.HttpSession;  
  23. import java.io.IOException;  
  24. import java.util.HashMap;  
  25. import java.util.Map;  
  26.   
  27. @Controller  
  28. @RequestMapping("/vote")  
  29. public class VoteController extends BaseController<VoteLog> {  
  30.     private VoteLogDao voteLogDao;  
  31.     private ConventionDao conventionDao;  
  32.     private Test2BoyDao test2BoyDao;  
  33.   
  34.   
  35.     public VoteLogDao getVoteLogDao() {  
  36.         return voteLogDao;  
  37.     }  
  38.   
  39.     @Resource  
  40.     public void setVoteLogDao(VoteLogDao voteLogDao) {  
  41.         this.voteLogDao = voteLogDao;  
  42.     }  
  43.   
  44.     @Override  
  45.     protected void beforeAddInput(Model model) {  
  46.     }  
  47.   
  48.     @Override  
  49.     protected void errorDeal(Model model) {  
  50.     }  
  51.   
  52.     @Override  
  53.     public String getJspFolder() {  
  54.         return null;  
  55.     }  
  56.   
  57.     /*** 
  58.      * @param model 
  59.      * @param conventionId 
  60.      * @param testBoyId 
  61.      * @param session 
  62.      * @param request 
  63.      * @param callback 
  64.      * @return :result:2--未登录;3--已经投票过 
  65.      * @throws IOException 
  66.      */  
  67.     @ResponseBody  
  68.     @RequestMapping(value = "/vote", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)  
  69.     public String jsonVote(Model model, int conventionId, int testBoyId, HttpSession session,  
  70.                            HttpServletRequest request, String callback) throws IOException {  
  71.         User user2 = (User) session.getAttribute(Constant2.SESSION_KEY_LOGINED_USER);  
  72.         Map map = new HashMap();  
  73.         if (!AuthenticateUtil.isLogined(session)) {  
  74.             map.put(Constant2.LOGIN_RESULT_KEY, Constant2.MODIFY_PASS_RESULT_NOT_LOGINED_YET);//没有登录  
  75.             return HWJacksonUtils.getJsonP(map, callback);  
  76.         }  
  77.         VoteLog voteLogTmp = this.voteLogDao.get("user.id", user2.getId(), "convention.id", conventionId);  
  78.   
  79.   
  80.         if (voteLogTmp == null) {
    //说明还没有点赞  
  81.             Convention convention = conventionDao.get(conventionId);  
  82.             VoteLog voteLog = new VoteLog();  
  83.             voteLog.setConvention(convention);  
  84.             voteLog.setUser(user2);  
  85.             voteLog.setVoteTime(TimeHWUtil.getCurrentFormattedTime());  
  86.             this.voteLogDao.save(voteLog);  
  87.             int stars = convention.getStars();  
  88.             conventionDao.updateSpecail(conventionId, "stars", stars + 1);  
  89.             test2BoyDao.updateTime(testBoyId);  
  90. //          map.put("voteCount", voteCount);  
  91.   
  92.             map.put(Constant2.LOGIN_RESULT_KEY, Constant2.LOGIN_RESULT_SUCCESS);  
  93.         } else {  
  94.             //查询投票数  
  95.             /*Vote vote=this.voteDao.get("type", type, "houseBuilding.id", houseBuildingIdInt); 
  96.             map.put("voteCount", vote==null?0:vote.getVoteCount());*/  
  97.             map.put(Constant2.LOGIN_RESULT_KEY, 3);//已经投票过  
  98.         }  
  99.         return HWJacksonUtils.getJsonP(map, callback);  
  100.     }  
  101.   
  102.      
  103.   
  104.     public ConventionDao getConventionDao() {  
  105.         return conventionDao;  
  106.     }  
  107.   
  108.     @Resource  
  109.     public void setConventionDao(ConventionDao conventionDao) {  
  110.         this.conventionDao = conventionDao;  
  111.     }  
  112.   
  113.     public Test2BoyDao getTest2BoyDao() {  
  114.         return test2BoyDao;  
  115.     }  
  116.   
  117.     @Resource  
  118.     public void setTest2BoyDao(Test2BoyDao test2BoyDao) {  
  119.         this.test2BoyDao = test2BoyDao;  
  120.     }  
  121. }  

 

ajax调用投票接口:

Js代码  
  1. var voteConvention= function (self,conventionId,testBoyId) {  
  2.     var options = {  
  3.         url: server_url + "/vote/vote?conventionId=" + conventionId +'&testBoyId='+testBoyId,  
  4.         type: "POST",  
  5.         dataType: 'json',  
  6.         success: function (json2) {  
  7.             if (json2.result==1) {  
  8.                 $(self).parent().text("已赞");  
  9.                 //alert("点赞成功");  
  10.             }else if (json2.result==3) {  
  11.                 alert("您已经点过赞")  
  12.             }  
  13.         },  
  14.         error: function (er) {  
  15.             console.log(er)  
  16.         }  
  17.     };  
  18.     $.ajax(options);  
  19. };  

 

界面如下:

 
 

查询时需要知道点赞的数量:

点赞的数量(总数)就是Convention的成员变量stars,每次点赞时都会更新

 

还需要判断当前用户是否已经点过赞:

 

 

 总结:

(1)点赞记录和用户是多对一的关系,即一个用户可以有多个点赞记录,但是一个点赞记录不可能属于多个用户;

(2)点赞的总记录存储在Convention中,而不是通过点赞记录查询到的,也就是说有两种方式获取一个帖子点了多少赞:

方式一:通过Convention中的stars;

方式二:查询点赞记录表

理论上,两种方式的结果是相同的.这里存在信息的冗余,冗余的目的是节约查询成本

 

数据表结构如下:

 

 

转载地址:http://atbno.baihongyu.com/

你可能感兴趣的文章
删除浏览器浏览器删除cookie方法
查看>>
Unity 3D学习笔记(三)——关于脚本
查看>>
说借钱
查看>>
微软URLRewriter.dll的url重写的简单使用(实现伪静态)
查看>>
基于XMPP实现的Openfire的配置安装+Android客户端的实现
查看>>
提高编程技能最有效的方法(转载)
查看>>
leetcode -- Combination Sum II
查看>>
mina高并发短连接导致java.io.IOException: Too many open files解决方案
查看>>
mount nfs 经常出错信息总结(转)
查看>>
[ubuntu] ubuntu13.04安装rabbitcvs管理svn
查看>>
【驱动笔记10】再谈IRP
查看>>
vector中的find
查看>>
〖Windows〗zigbee实验之cygwin编译tinyos.jar编译出错的解决方法
查看>>
1z0-052 q209_7
查看>>
PIN码计算锦集
查看>>
SharePoint 2013 自定义扩展菜单(二)
查看>>
[Unity3D]再次点击以退出程序
查看>>
架构师的97种习惯
查看>>
PHP 开发 APP 接口 学习笔记与总结 - XML 方式封装通信接口
查看>>
《区域经理》笔记
查看>>