`

点赞功能的设计

    博客分类:
  • 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  

相关推荐

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

    点赞其实是一个很有意思的功能。基本的设计思路有大致两种, 一种自然是用mysql等 数据库直接落地存储, 另外一种就是利用点赞的业务特征来扔到redis(或memcache)中, 然后离线刷回mysql等。 直接写入Mysql 直接写入...

    JavaWeb 实现点赞功能

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

    基于微信小程序电脑入门交流学习设计与实现 .docx

    4.3 微信小程序点赞功能设计 20 4.4 微信小程序的发布功能设计 21 4.5 微信小程序评论功能设计 22 4.6 微信小程序的打分功能设计 23 4.7 高手榜页面展示 24 4.8 爬虫抓取流行电脑的信息 25 4.9 微信小程序后台界面...

    jquery开发点赞特效

    这是一个非常有趣味的jquery点赞功能的特效,通过HTML5的序列帧完成图片轮播实现动态点赞功能。

    基于PHP的校园生活系统

    论坛排序算法,基于时间和点赞赞数量进行hackerNew计算 论坛点赞功能设计中 计划使用redis来存储点赞人的ID,从而减轻对服务器的负担 ##1月10日 TP5中不支持redis的set(高效存取) 选择使用redis扩展库,TP5...

    jQuery+CSS3实现的文章大拇指点赞功能特效源码.zip

    jQuery+CSS3实现的文章大拇指点赞功能特效源码.zip

    赞:高并发点赞的详情解决方案

    为了解决高并发请求下,点赞功能同步处理所带来的服务器压力(Redis缓存的压力或数据库压力等),我们发布MQ消息中间件进行异步处理,用户每次点赞都会推动消息到MQ服务器并同时返回,这样用户的点赞请求就及时结束...

    小程序云开发教程如何使用云函数实现点赞功能

    本文我们就要使用高大上的云函数了,实现点赞功能 什么是云函数? 云函数 云函数即在云端(服务器端)运行的函数。 在物理设计上,一个云函数可由多个文件组成,占用一定量的CPU 内存等计算资源;各云函数完全独立;...

    基于MySQL和Eclipse的人力资源管理系统毕业设计实现

    本系统采用模块化设计思想,各功能模块之间松耦合,方便功能的扩展。系统界面友好,操作简单,便于用户使用。系统具有较强的实用性,可广泛应用于各类企业和机构的人力资源管理工作中。 本系统的研发对于企业实现人力资源...

    基于Android+SQLServer的视频分享系统的设计与实现【100011360】

    视频上传功能、视频下载功能、视频浏览功能、视频评论功能、视频转发功能、视频点赞功能; 在本次毕业设计的实现过程中由于对用户的管理和对视频信息的管理,还需要如下功能: 用户登录功能、用户注册功能、用户...

    基于Java+SSM的茗茶文化网毕业设计(源码+说明+数据库).zip

    基于Java+SSM的茗茶文化...前端:(1)用户登录注册(2)搜索功能(3)收藏功能(4)点赞功能(5)评论功能(6)上传功能(7)关注功能 后端:(10)轮播图管理(11)首页展示内容信息管理(12)文章管理(13)视频管理

    SSM+Vue项目实战-茗茶文化网的Java毕业设计(源码+说明+数据库).zip

    前端:(1)用户登录注册(2)搜索功能(3)收藏功能(4)点赞功能(5)评论功能(6)上传功能(7)关注功能 后端:(10)轮播图管理(11)首页展示内容信息管理(12)文章管理(13)视频管理。

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

    在开发当中,可能很多时候都需要做个点赞的需求,如果用按钮实现,按钮作为一个系统复合控件,外部是一个 View–》UIControl的容器,内部包含了UILabel和UIImage,以及一些排版规则。用UIButton就很难去做一些在“赞...

    基于java+三层mvc的仿微博系统

    2.1. 个人主页模块的功能设计 好友页面、关注功能、私聊功能、点赞、取赞、转发、评论、回复功能、删除评论、删除回复、删除微博动态。 2.2. 微博动态模块的功能设计 推荐功能、热门话题、@功能、点赞、转发、评论、...

    基于安卓的视频分享系统APP论文(31页9061字数).doc

    摘要: 1 Abstract  1 1 绪论 2 1.1研究背景 2 1.2主要工作和方法 2 1.3本文结构 2 2 相关知识 3 2.1开发工具类 3 ...4.2.5管理视频和转发、评论、点赞功能 18 4.2.6修改个人资料功能 20 4.2.7封装成App 21 5

    安卓仿微信朋友圈动态数据加载(包括评论和点赞,以及动态详情页)

    基本实现了微信朋友圈所有的功能,包括点赞,评论,我的动态列表,动态详情的数据处理,希望可以帮助大家好好学习!zip

    基于PHP 校内网代码站的毕业设计,MySQL数据库、Bootstrap前端框架、jQuery作为JavaScript库、MVC

    3. 评论和点赞功能 4. 搜索功能 ## 设计思路 本毕设的设计思路如下: 1. 使用PHP语言作为后端语言,使用MySQL作为数据库 2. 使用Bootstrap作为前端框架,使用jQuery作为JavaScript库 3. 采用MVC架构,将程序分为...

    点餐系统源代码

    点餐系统毕业设计源代码C# 。

Global site tag (gtag.js) - Google Analytics