点赞功能的设计
每一次点赞,需要记录:
(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;
方式二:查询点赞记录表
理论上,两种方式的结果是相同的.这里存在信息的冗余,冗余的目的是节约查询成本
数据表结构如下:
相关推荐
在本文中,我们将深入探讨如何使用uni-app框架来实现一个冒泡点赞功能。uni-app是一个基于Vue.js的多端开发框架,它允许开发者编写一次代码,就能运行在H5、微信小程序、支付宝小程序、百度小程序等多个平台。我们将...
总结起来,微信小程序实现点赞、取消点赞功能涉及到了前端页面的设计和交互逻辑,同时需要后端服务的支持以保证数据的一致性和实时性。开发者在实现该功能时,需要掌握微信小程序的开发框架和API,同时也要对前端...
在前端开发中,点赞功能是网站互动性的重要组成部分,它为用户提供了一种简单直观的反馈方式,表达对内容的认可或支持。"超棒的jquery点赞功能"标题所提及的,显然是一个利用jQuery库实现的高效点赞系统。jQuery是一...
点赞是我们现在经常见到的一个效果,如朋友圈、微博都有点赞的效果,下面这篇文章主要跟大家分享了基于redis实现的点赞功能设计思路的相关资料,文中介绍的非常详细,对大家实现点赞功能具有一定的参考学习价值,...
8. **UI设计**:良好的用户界面设计可以使点赞功能更具吸引力。考虑使用清晰的图标,以及合适的颜色和布局,以直观地表示点赞状态。同时,确保交互反馈及时,如改变按钮颜色、显示提示信息等。 9. **性能优化**:...
在网页开发中,实现文章的点赞和取消点赞功能已经成为一种常见的交互设计,它能提高用户的参与度和互动性。这个“jQuery+CSS3网页文章支持点赞取消点赞功能代码”就是一个典型的示例,它结合了JavaScript的高效处理...
在iOS应用开发中,点赞功能是一项常见的用户交互设计,它允许用户表达对内容的喜爱或支持。这个"iOS点赞功能"的实现通常涉及到多个技术层面,包括用户界面(UI)设计、数据存储、网络请求以及状态管理。下面我们将...
本项目通过Java与Redis的集成,实现了点赞功能模块,特别适用于社交网络、论坛或博客等互动性强的平台。 首先,`application.properties`是Spring Boot应用的配置文件,其中会包含Redis的相关配置,例如Redis服务器...
映客是一款知名的直播应用,其点赞功能设计独特,用户点击点赞后,点赞图标会从屏幕底部升起,形成全屏的视觉效果,增加了互动性和趣味性。下面我们将详细探讨如何实现这一功能。 首先,我们需要理解Android界面的...
在IT行业中,用户体验是至关重要的一个方面,而点赞功能作为社交网络和互动平台常见的交互元素,它的设计和实现直接影响到用户对应用的满意度。本文将深入探讨如何利用`UIControl`来实现点赞的动画效果。 首先,...
在这个场景中,我们关注的是如何实现一个类似CSDN的点赞功能,它允许用户对多个独立的评论进行点赞,同时每个点赞动作都有动画效果。下面将详细阐述这个功能的实现原理和涉及的技术点。 首先,HTML(HyperText ...
综上所述,实现ASP.NET中的点赞功能涉及多个层面的技术,包括数据库设计、ORM操作、HTTP API接口设计以及前端交互。通过合理的设计和编程实践,我们可以构建出高效且用户体验良好的点赞系统。在实际开发过程中,还应...
在IT行业中,点赞功能是许多社交媒体、博客平台和互动应用不可或缺的部分。这篇“点赞代码(干货)”很可能是提供了一套实现点赞功能的源代码,旨在帮助开发者快速理解和构建自己的点赞系统。源码通常包含了实现特定...
在Android开发中,抖音的点赞功能是一个非常吸引用户眼球的设计,它通过动态的动画效果提升了用户的交互体验。本文将深入探讨如何实现类似抖音的点赞动画效果。 首先,我们需要理解点赞功能的基本逻辑。当用户点击...
本教程将深入探讨如何利用jQuery实现一个动态的点赞功能,这个功能可以无缝地融入到网页设计中,并且允许用户对内容进行点赞,同时显示实时的点赞数。 一、jQuery基础 在开始之前,确保你的项目已经引入了jQuery库...
在Spring Boot框架中实现点赞功能需要涉及后端数据库交互、前端界面设计以及接口设计。以下是对点赞功能详解的深入讨论。 首先,我们需要为点赞功能创建数据库模型。在这个例子中,我们看到一个名为`Praise`的实体...
这个"jQuery点赞功能代码.zip"压缩包提供了一种实现用户互动点赞功能的方法,常见于社交媒体、博客和论坛等网站。下面将详细介绍如何使用jQuery来创建一个基本的点赞功能。 首先,我们需要在HTML页面中创建一个表示...
写了一个点赞功能 主要内容是实现一个用户对同一文章只能点赞一次,第二次是取消赞 思路: 1.首先通过aid和uid遍历点赞表great。 2.若不能够查找到符合的great,则文章的great值+1;若能够查找到符合的...
在IT行业中,尤其是在移动应用开发领域,"朋友圈点赞实现"是一...总的来说,实现朋友圈点赞功能涉及到了前端用户体验、后端逻辑处理、数据库设计、安全性和性能优化等多个层面的技术知识,是社交应用开发中的重要一环。