点赞功能的设计

简介:

点赞功能的设计

每一次点赞,需要记录:

(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;

方式二:查询点赞记录表

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

 

数据表结构如下:



 

 

相关文章
|
7月前
|
Web App开发 JavaScript 前端开发
python实现QQ空间自动点赞功能
python实现QQ空间自动点赞功能
123 0
|
存储 设计模式 缓存
通用点赞设计思路
点赞作为一个高频率的操作,如果每次操作都读写数据库会增加数据库的压力,所以采用缓存+定时任务来实现。点赞数据是在redis中缓存半小时,同时定时任务是每隔5分钟执行一次,做持久化存储,这里的缓存时间和任务执行时间可根据项目情况而定。
2310 2
|
小程序
云开发(微信-小程序)笔记(十四)---- 收藏,点赞(上)
云开发(微信-小程序)笔记(十四)---- 收藏,点赞(上)
123 0
|
2月前
|
缓存 Java 数据库连接
随处可见的缓存思想(有补充的欢迎留言交流)
本文介绍了多种缓存技术及其应用场景,包括面向对象编程中的对象缓存、String对象池、浏览器缓存、CPU指令寄存器、数据库连接池、库表内存化、线程池、JIT即时编译器、字符串常量池以及MyBatis的一级和二级缓存,旨在提高程序的性能和效率。
38 3
|
7月前
|
缓存 数据处理 UED
【Uniapp 专栏】Uniapp 开发中的疑难问题解决与进阶策略
【5月更文挑战第17天】在 Uniapp 开发中,解决页面间数据传递、网络请求异常、屏幕适配及性能优化等问题至关重要。利用路由参数传递复杂数据,如`uni.navigateTo`和`JSON.stringify`;处理网络请求异常时,添加错误处理机制增强健壮性;使用响应式设计和缓存策略优化布局和性能。针对组件问题,需排查依赖和配置,而平台差异则需定制化处理。通过不断学习和实践,提升开发技能,确保项目成功实施。
104 2
【Uniapp 专栏】Uniapp 开发中的疑难问题解决与进阶策略
30行代码实现微信朋友圈自动点赞
首先祝大家新年快乐,过年了,允许我水一篇博客。不知道大家都回老家了没,不过我是没有回去,晚上吃完年夜饭看到很多人发朋友圈,为了增进和大家的友谊,于是就想着给大家点个赞,无奈内容太多了,就搞个自动化脚本,原理和前两天我写的30行代码实现蚂蚁森林自动偷能量一样,这里不再赘述,直接上代码。
160 1
|
前端开发 安全 数据挖掘
点赞做任务系统如何开发?[点赞做任务系统模式开发搭建流程]
点赞做任务系统如何开发?[点赞做任务系统模式开发搭建流程]
|
小程序 数据库
云开发(微信-小程序)笔记(十五)---- 收藏,点赞(下)
云开发(微信-小程序)笔记(十五)---- 收藏,点赞(下)
128 0
|
存储 JSON API
1.5项目点赞与分享功能的设置|学习笔记(二)
快速学习1.5项目点赞与分享功能的设置
1.5项目点赞与分享功能的设置|学习笔记(二)
|
JSON API 数据格式
1.5项目点赞与分享功能的设置|学习笔记(一)
快速学习1.5项目点赞与分享功能的设置
1.5项目点赞与分享功能的设置|学习笔记(一)