`

点赞功能的设计

    博客分类:
  • Java
阅读更多

点赞功能的设计

每一次点赞,需要记录:

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

 

 投票的控制器:

package com.girltest.web.controller;

import com.common.dict.Constant2;
import com.common.util.SystemHWUtil;
import com.girltest.dao.ConventionDao;
import com.girltest.dao.Test2BoyDao;
import com.girltest.dao.VoteLogDao;
import com.girltest.entity.Convention;
import com.girltest.entity.User;
import com.girltest.entity.VoteLog;
import com.io.hw.json.HWJacksonUtils;
import com.time.util.TimeHWUtil;
import oa.util.AuthenticateUtil;
import oa.web.controller.base.BaseController;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Controller
@RequestMapping("/vote")
public class VoteController extends BaseController<VoteLog> {
    private VoteLogDao voteLogDao;
    private ConventionDao conventionDao;
    private Test2BoyDao test2BoyDao;


    public VoteLogDao getVoteLogDao() {
        return voteLogDao;
    }

    @Resource
    public void setVoteLogDao(VoteLogDao voteLogDao) {
        this.voteLogDao = voteLogDao;
    }

    @Override
    protected void beforeAddInput(Model model) {
    }

    @Override
    protected void errorDeal(Model model) {
    }

    @Override
    public String getJspFolder() {
        return null;
    }

    /***
     * @param model
     * @param conventionId
     * @param testBoyId
     * @param session
     * @param request
     * @param callback
     * @return :result:2--未登录;3--已经投票过
     * @throws IOException
     */
    @ResponseBody
    @RequestMapping(value = "/vote", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)
    public String jsonVote(Model model, int conventionId, int testBoyId, HttpSession session,
                           HttpServletRequest request, String callback) throws IOException {
        User user2 = (User) session.getAttribute(Constant2.SESSION_KEY_LOGINED_USER);
        Map map = new HashMap();
        if (!AuthenticateUtil.isLogined(session)) {
            map.put(Constant2.LOGIN_RESULT_KEY, Constant2.MODIFY_PASS_RESULT_NOT_LOGINED_YET);//没有登录
            return HWJacksonUtils.getJsonP(map, callback);
        }
        VoteLog voteLogTmp = this.voteLogDao.get("user.id", user2.getId(), "convention.id", conventionId);


        if (voteLogTmp == null) {//说明还没有点赞
            Convention convention = conventionDao.get(conventionId);
            VoteLog voteLog = new VoteLog();
            voteLog.setConvention(convention);
            voteLog.setUser(user2);
            voteLog.setVoteTime(TimeHWUtil.getCurrentFormattedTime());
            this.voteLogDao.save(voteLog);
            int stars = convention.getStars();
            conventionDao.updateSpecail(conventionId, "stars", stars + 1);
            test2BoyDao.updateTime(testBoyId);
//			map.put("voteCount", voteCount);

            map.put(Constant2.LOGIN_RESULT_KEY, Constant2.LOGIN_RESULT_SUCCESS);
        } else {
            //查询投票数
            /*Vote vote=this.voteDao.get("type", type, "houseBuilding.id", houseBuildingIdInt);
			map.put("voteCount", vote==null?0:vote.getVoteCount());*/
            map.put(Constant2.LOGIN_RESULT_KEY, 3);//已经投票过
        }
        return HWJacksonUtils.getJsonP(map, callback);
    }

   

    public ConventionDao getConventionDao() {
        return conventionDao;
    }

    @Resource
    public void setConventionDao(ConventionDao conventionDao) {
        this.conventionDao = conventionDao;
    }

    public Test2BoyDao getTest2BoyDao() {
        return test2BoyDao;
    }

    @Resource
    public void setTest2BoyDao(Test2BoyDao test2BoyDao) {
        this.test2BoyDao = test2BoyDao;
    }
}

 

ajax调用投票接口:

var voteConvention= function (self,conventionId,testBoyId) {
    var options = {
        url: server_url + "/vote/vote?conventionId=" + conventionId +'&testBoyId='+testBoyId,
        type: "POST",
        dataType: 'json',
        success: function (json2) {
            if (json2.result==1) {
                $(self).parent().text("已赞");
                //alert("点赞成功");
            }else if (json2.result==3) {
                alert("您已经点过赞")
            }
        },
        error: function (er) {
            console.log(er)
        }
    };
    $.ajax(options);
};

 

界面如下:



 

 

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

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

 

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



 

 

 总结:

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

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

方式一:通过Convention中的stars;

方式二:查询点赞记录表

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

 

数据表结构如下:



 

 

  • 大小: 71.3 KB
  • 大小: 91.4 KB
  • 大小: 11.7 KB
  • 大小: 54.7 KB
  • 大小: 68.2 KB
5
3
分享到:
评论
3 楼 railsbug 2017-10-27  
写的十分详细
我反复看了好几遍
很难得把知识讲的如此详尽 表结构都贴出来了
感谢~!
2 楼 低调的江湖小生 2017-09-29  
1 楼 ssm44124412 2016-02-26  

相关推荐

    uni-app实现冒泡点赞功能

    在本文中,我们将深入探讨如何使用uni-app框架来实现一个冒泡点赞功能。uni-app是一个基于Vue.js的多端开发框架,它允许开发者编写一次代码,就能运行在H5、微信小程序、支付宝小程序、百度小程序等多个平台。我们将...

    微信小程序实现点赞、取消点赞功能

    总结起来,微信小程序实现点赞、取消点赞功能涉及到了前端页面的设计和交互逻辑,同时需要后端服务的支持以保证数据的一致性和实时性。开发者在实现该功能时,需要掌握微信小程序的开发框架和API,同时也要对前端...

    超棒的jquery点赞功能

    在前端开发中,点赞功能是网站互动性的重要组成部分,它为用户提供了一种简单直观的反馈方式,表达对内容的认可或支持。"超棒的jquery点赞功能"标题所提及的,显然是一个利用jQuery库实现的高效点赞系统。jQuery是一...

    基于redis实现的点赞功能设计思路详解

    点赞是我们现在经常见到的一个效果,如朋友圈、微博都有点赞的效果,下面这篇文章主要跟大家分享了基于redis实现的点赞功能设计思路的相关资料,文中介绍的非常详细,对大家实现点赞功能具有一定的参考学习价值,...

    listview实现点赞功能

    8. **UI设计**:良好的用户界面设计可以使点赞功能更具吸引力。考虑使用清晰的图标,以及合适的颜色和布局,以直观地表示点赞状态。同时,确保交互反馈及时,如改变按钮颜色、显示提示信息等。 9. **性能优化**:...

    jQuery+CSS3网页文章支持点赞取消点赞功能代码

    在网页开发中,实现文章的点赞和取消点赞功能已经成为一种常见的交互设计,它能提高用户的参与度和互动性。这个“jQuery+CSS3网页文章支持点赞取消点赞功能代码”就是一个典型的示例,它结合了JavaScript的高效处理...

    iOS点赞功能

    在iOS应用开发中,点赞功能是一项常见的用户交互设计,它允许用户表达对内容的喜爱或支持。这个"iOS点赞功能"的实现通常涉及到多个技术层面,包括用户界面(UI)设计、数据存储、网络请求以及状态管理。下面我们将...

    redis实现点赞功能模块.rar

    本项目通过Java与Redis的集成,实现了点赞功能模块,特别适用于社交网络、论坛或博客等互动性强的平台。 首先,`application.properties`是Spring Boot应用的配置文件,其中会包含Redis的相关配置,例如Redis服务器...

    仿映客点赞 点赞上升 全屏点赞

    映客是一款知名的直播应用,其点赞功能设计独特,用户点击点赞后,点赞图标会从屏幕底部升起,形成全屏的视觉效果,增加了互动性和趣味性。下面我们将详细探讨如何实现这一功能。 首先,我们需要理解Android界面的...

    点赞效果及功能代码

    在IT行业中,用户体验是至关重要的一个方面,而点赞功能作为社交网络和互动平台常见的交互元素,它的设计和实现直接影响到用户对应用的满意度。本文将深入探讨如何利用`UIControl`来实现点赞的动画效果。 首先,...

    HTML jQuery点赞功能,可以实现分别给多个评论点赞,动画样式同CSDN

    在这个场景中,我们关注的是如何实现一个类似CSDN的点赞功能,它允许用户对多个独立的评论进行点赞,同时每个点赞动作都有动画效果。下面将详细阐述这个功能的实现原理和涉及的技术点。 首先,HTML(HyperText ...

    asp.net 实现点赞功能

    综上所述,实现ASP.NET中的点赞功能涉及多个层面的技术,包括数据库设计、ORM操作、HTTP API接口设计以及前端交互。通过合理的设计和编程实践,我们可以构建出高效且用户体验良好的点赞系统。在实际开发过程中,还应...

    点赞代码(干货)

    在IT行业中,点赞功能是许多社交媒体、博客平台和互动应用不可或缺的部分。这篇“点赞代码(干货)”很可能是提供了一套实现点赞功能的源代码,旨在帮助开发者快速理解和构建自己的点赞系统。源码通常包含了实现特定...

    android 抖音点赞功能

    在Android开发中,抖音的点赞功能是一个非常吸引用户眼球的设计,它通过动态的动画效果提升了用户的交互体验。本文将深入探讨如何实现类似抖音的点赞动画效果。 首先,我们需要理解点赞功能的基本逻辑。当用户点击...

    jquery动态点赞功能

    本教程将深入探讨如何利用jQuery实现一个动态的点赞功能,这个功能可以无缝地融入到网页设计中,并且允许用户对内容进行点赞,同时显示实时的点赞数。 一、jQuery基础 在开始之前,确保你的项目已经引入了jQuery库...

    点赞功能详解1

    在Spring Boot框架中实现点赞功能需要涉及后端数据库交互、前端界面设计以及接口设计。以下是对点赞功能详解的深入讨论。 首先,我们需要为点赞功能创建数据库模型。在这个例子中,我们看到一个名为`Praise`的实体...

    jQuery点赞功能代码.zip

    这个"jQuery点赞功能代码.zip"压缩包提供了一种实现用户互动点赞功能的方法,常见于社交媒体、博客和论坛等网站。下面将详细介绍如何使用jQuery来创建一个基本的点赞功能。 首先,我们需要在HTML页面中创建一个表示...

    JavaWeb 实现点赞功能

    写了一个点赞功能  主要内容是实现一个用户对同一文章只能点赞一次,第二次是取消赞  思路:  1.首先通过aid和uid遍历点赞表great。  2.若不能够查找到符合的great,则文章的great值+1;若能够查找到符合的...

    朋友圈点赞实现

    在IT行业中,尤其是在移动应用开发领域,"朋友圈点赞实现"是一...总的来说,实现朋友圈点赞功能涉及到了前端用户体验、后端逻辑处理、数据库设计、安全性和性能优化等多个层面的技术知识,是社交应用开发中的重要一环。

Global site tag (gtag.js) - Google Analytics