点赞功能的设计

点赞功能的设计

每一次点赞,需要记录:

(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
    @GeneratedValue
public 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;

方式二:查询点赞记录表

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

 

数据表结构如下:


 

 

时间: 2024-09-16 21:40:17

点赞功能的设计的相关文章

Axure RP 8怎么设计图片点赞功能的网页原型?

  Axure RP 8怎么设计图片点赞功能的网页原型?         1.打开Axure RP 8软件,在元件库中找到图片元件,拖一个到画布上,如下图所示: 2.在"Icons"中找到手形向上和手形向下的图标,并拖动到图片元件下方,如下图所示: 3.选中图片元件,导入外部图片到图片元件里;修改两个手形填充色,分别为绿色和红色,如下图所示: 4.在两个手形图标附近添加两个输入框,调整输入框宽度和位置,如下图所示: 5.选中手形向上的图标,添加鼠标单击时用例;设置一个全局变量addDa

java-JAVA实现点赞功能 if语句

问题描述 JAVA实现点赞功能 if语句 在Goods表中有以下属性 id goods(赞数) news_id(新闻id) user_id()用户id想在后台做一个判断对于同样的新闻news_id,不能有同样的用户user_id点赞if语句该如何写? 解决方案 Goods表设计的有问题啊 goods(赞数)应该在新闻表里goods表只要存id news_id(新闻id) user_id(用户id)发sql查是否已点赞的时候where条件判断news_id 和 user_idselect coun

webapi点赞功能疑惑

问题描述 各位,我有个问题,最近在设计点赞功能,打算是用webapi来实现,webapi项目是放在api.xxx.com里的,主站www.xxx.com的页面ajax点击然后调用api.xxx.com里的点赞方法,现在问题是怎么限制点赞次数,登录账户还好控制,就是想控制游客的点此次数,想控制在一天一次,但发现api.xxx.com的webapi项目里貌似记录不了cookie,还有就是觉得webapi使用cookie貌似有违restful的风格. 解决方案 解决方案二:点赞应该有记录的吧?有记录就

服务器-安卓如何实现点赞功能呢

问题描述 安卓如何实现点赞功能呢 安卓实现点赞功能 是直接请求服务器 还是存储在数据库 .这个数据库是后台创建还是 解决方案 这个根据自己的项目要求设计吧 解决方案二: 关于点赞的数据库在服务器端是肯定要有的,因为在Android端发请求到服务器端要记录这个点赞数,这样做其他能上网的用户都可以看到,而要不要在本地做数据库我觉得没有必要,考虑到没网的情况的话只需要要在有网的时候获取到这个最新的点赞数,可以使用SharedPreference键值对的方式进行储存. 解决方案三: 当然要放在服务器上,

基于UIControl控件实现ios点赞功能_IOS

在开发当中,可能很多时候都需要做个点赞的需求,如果用按钮实现,按钮作为一个系统复合控件,外部是一个 View-->UIControl的容器,内部包含了UILabel和UIImage,以及一些排版规则.用UIButton就很难去做一些在"赞"和"取消赞"切换时的效果. 可是我们又很需要UIButton似的事件响应机制. 怎么办? 对! 就是使用UIControl. UIControl在这里有两个突出的优势: 1.作为UIButton的父控件,具有UIButton

交互设计实例:基本的注册功能如何设计

前几天光耀童鞋喷了一篇<谈网站注册.登录过程>,今天我们在与小爬童鞋梳理购买流程的时候也谈到了这部分内容.其实注册作为一个网站基本功能再普通不过,但提供不同产品服务的网站对于注册的要求不尽相同,也不是每个网站都有一个体验良好的注册流程.本座在这里简单聊下在不考虑运营指标和商业目的的前提下,基本的注册功能如何设计. 注册页面的信息架构注册页面的信息架构力求清晰简洁,注册表单作为信息主体,除了logo,帮助信息以及一些必要的返回链接,避免其他一切会干扰注册的信息,全力保障用户专心走完注册流程. 注

android 点赞功能如何实现

问题描述 android 点赞功能如何实现 android上开发APP,想实现点赞功能,点击""赞""图片之后,旁边显示的已点击数增加了一个,并且记录到数据库里.应该如何实现? 解决方案 数据库字段里面应该有个"赞"的字段,当用户点击该图片,onclick事件内进行数据库操作:每次点击就添加+1,后Update该对应的ID的"赞"字段 解决方案二: * > ## # __Android源码分享交流 259182457``

android-现在进行一个类似今日头条的安卓开发,需要在详情页实现类似微信点赞功能,求指导。(有数据同步的)

问题描述 现在进行一个类似今日头条的安卓开发,需要在详情页实现类似微信点赞功能,求指导.(有数据同步的) 现在进行一个类似今日头条的安卓开发,需要在详情页实现类似微信点赞功能,求指导.(有json数据传输的) 解决方案 http://blog.csdn.net/zhaizu/article/details/48103351 解决方案二: android 点赞功能 http://www.apkbus.com/android-173249-1-1.html 解决方案三: http://blog.cs

C++汽车店4s销售管理系统,主菜单调用子菜单的功能怎么设计?必须要用函数么?

问题描述 C++汽车店4s销售管理系统,主菜单调用子菜单的功能怎么设计?必须要用函数么? C++汽车店4s销售管理系统,主菜单调用子菜单的功能怎么设计?必须要用函数么? 解决方案 用函数或者循环都可以,函数比较好,各个功能独立出来.