如何使用redis实现动态点赞和反对

效果图

点赞和反对所需的redis方法

package cn.itcast.biz;

import java.util.Set;

import org.apache.catalina.connector.Request;

import redis.clients.jedis.Jedis;

public class ZanBiz {
	Jedis js = new Jedis("127.0.0.1",6379);//登录redis
	
	/**
	 * 点赞功能
	 * @param topicid  主题id
	 * @param uid  用户id
	 * @param flag true就添加进去 false就删除
	 */
	public void dianZan(String topicid,String uid,boolean flag){
		
		if(flag){//点赞加入
			js.set(topicid+":"+uid, "1");
		
		}else{//去赞删除
			js.del(topicid+":"+uid);
		}
	}
	
	/**
	 * 获取特定主题的点赞总数
	 * @param topicid
	 * @return
	 */
	
	public long getCount(String topicid){
		Set<String> set = js.keys(topicid+":*");
	
		return set.size();
	}
	
	/**
	 * 反对功能
	 * @param topicid
	 * @param uid
	 * @param flag true就添加进去 false就删除
	 */
	public void dianZanx(String topicid,String uid,boolean flag){
		
		if(flag){//反对加入
			js.set(topicid+"|"+uid, "1");
		
		}else{//反对删除
			js.del(topicid+"|"+uid);
		}
	}
	
	/**
	 * 获取特定主题的反对总数
	 * @param topicid
	 * @return
	 */
	
	public long getCountx(String topicid){
		Set<String> set = js.keys(topicid+"|*");
	
		return set.size();
	}
	
	/**
	 * 判断登陆顾客是否在特定主题上点赞[detail.jsp]
	 * @param topicid
	 * @param uid
	 * @return
	 */
	public int judge(Object topicid,Integer uid){
		
		Set<String> set = js.keys(""+topicid+":"+uid);
		return set.size();
	}
	
	/**
	 * 判断登陆顾客是否在特定主题上反对数[detail.jsp]
	 * @param topicid
	 * @param uid
	 * @return
	 */
	public int judgex(Object topicid,Integer uid){
		
		Set<String> set = js.keys(""+topicid+"|"+uid);
		return set.size();
	}
	
}

Servlet与jsp的操作

Servlet操作

package cn.itcast.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.bean.UserBean;
import cn.itcast.biz.ZanBiz;

@WebServlet("/zan.s")
public class ZanServlet extends BasicServlet {

	ZanBiz zbiz = new ZanBiz();
	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String op = request.getParameter("op");
		if("love".equals(op)){
			doZan(request, response);
		}else if("dislove".equals(op)){
			doFan(request, response);
		}
	
		
	}
	/**
	 * 从ajax接收数据并返回该登录用户是否反对  1表示反对 0表示不反对
	 * @param request
	 * @param response
	 */
	private void doFan(HttpServletRequest request, HttpServletResponse response) {
		// TODO Auto-generated method stub
		String topicid = request.getParameter("topicid");//获取主题id
		String flag = request.getParameter("flag");//判断是否反对
		UserBean user = (UserBean) request.getSession().getAttribute("logineduser");//获取当前登录用户的实例
		
		if(user != null){//说明用户已登录
			zbiz.dianZanx(topicid, ""+user.getUid(), "true".equals(flag));//反对则将其加入到redis数据库中 未反对则将其从数据库中删除
			try {
				send(response, "1");//返回给jsp "1"
			} catch (InstantiationException | IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{//说明用户未登录
			try {
				send(response, "0");//返回给jsp "0"
			} catch (InstantiationException | IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	/**
	 * 从ajax接收数据并返回该登录用户是否点赞 1表示点赞 0表示不点赞
	 * @param request
	 * @param response
	 */
	public void doZan(HttpServletRequest request, HttpServletResponse response) {
		String topicid = request.getParameter("topicid");//获取主题id
		String flag = request.getParameter("flag");//判断是否点赞
		UserBean user = (UserBean) request.getSession().getAttribute("logineduser");//获取当前登录用户的实例
		
		if(user != null){//说明用户已登录
			zbiz.dianZan(topicid, ""+user.getUid(), "true".equals(flag));//点赞则将其加入到redis数据库中 未点赞则将其从数据库中删除
			try {
				send(response, "1");//返回给jsp "1"
			} catch (InstantiationException | IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{//说明用户未登录
			try {
				send(response, "0");//返回给jsp "0"
			} catch (InstantiationException | IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

jsp中与点赞和反对相关的代码 

<script type="text/javascript">
	/**
	 * 实现点赞功能
	 */
	function change(img,topicid,y){
		var flag = (img.src.indexOf('image/zan_no.jpg')>0);//判断当前图标 若为未点赞则为true 否则false
		var span = document.getElementById("love"+y);//获取控制点赞数目的span标签并用变量名span表示
		/*
		*/
		/*
			jQuery调用ajax请求
		*/
		var c = "\"1\"";
		
		$.post(
				"zan.s",
				{
					"op": "love",
					"topicid" : topicid,//传给Servlet的主题id
					"flag" : flag//传给Servlet的图标 若为未点赞则为true 否则false
				},function(data){
					
					if(data == c){//若点击图标则会改变图标  (点赞图标点击之后变成未点赞  未点赞图标点击之后变成点赞)
						
						if(flag){
							img.src = 'image/zan_on.jpg';//改图标为点赞
							span.innerHTML = parseInt(span.innerHTML)+1;//利用js实现动态点赞数目
						}else{
							img.src = 'image/zan_no.jpg';//改图标为未点赞
							span.innerHTML = parseInt(span.innerHTML)-1;//利用js实现动态点赞数目
						}
					}else{
						alert('请先登录系统');//未登录用户会提示
					}
				});
		
		
	}
	
	/**
	 * 实现反对功能
	 */
	function changex(img,topicid,y){
		var flag = (img.src.indexOf('image/fan_no.jpg')>0);//判断当前图标 若为未反对则为true 否则false
		console.log(y);
		var span = document.getElementById("dislove"+y);//获取控制反对数目的span标签并用变量名span表示
		/*
		*/
		/*
			jQuery调用ajax请求
		*/
		var c = "\"1\"";
		
		$.post(
				"zan.s",
				{
					"op": "dislove",
					"topicid" : topicid,//传给Servlet的主题id
					"flag" : flag //传给Servlet的图标 若为未反对则为true 否则false
				},function(data){
					
					if(data == c){
						
						if(flag){
							img.src = 'image/fan_on.jpg';//改图标为反对
							span.innerHTML = parseInt(span.innerHTML)+1;//利用js实现动态点赞数目
						}else{
							img.src = 'image/fan_no.jpg';//改图标为未反对
							span.innerHTML = parseInt(span.innerHTML)-1;//利用js实现动态点赞数目
						}
					}else{
						alert('请先登录系统');//未登录用户会提示
					}
				});
		
		
	}
</script>
	<%
		int y = 0;
		for(Map<String, Object> map:list){
			String name = (String)map.get("uname");
			int num = zbiz.judge( map.get("topicid") , user.getUid());//判断当前登录用户是否之前有点赞
			int num1 = zbiz.judgex( map.get("topicid") , user.getUid());//判断当前登录用户是否之前有反对
			y++;
	%>
<DIV class="t">
		<TABLE style="BORDER-TOP-WIDTH: 0px; TABLE-LAYOUT: fixed" cellSpacing="0" cellPadding="0" width="100%">
点赞数:<span id="love<%=y%>"><%= (map.get("zan") !=  null) ? map.get("zan") : "0" %></span><!-- 获取的点赞总数 -->
					<img alt="" src="<%=(num == 0) ?"image/zan_no.jpg":"image/zan_on.jpg" %>"><!-- 之前点过显示点赞图标 否则显示未点赞图标  -->
					 onclick="change(this,<%=map.get("topicid") %>,<%=y%>)" height="20px">
					 反对数:<span id="dislove<%=y%>"><%= (map.get("fan") !=  null) ? map.get("fan") : "0" %></span><!-- 之前点过显示反对图标 否则显示未反对图标  --><!-- 获取的反对总数 -->
					<img alt="" src="<%=(num1 == 0) ?"image/fan_no.jpg":"image/fan_on.jpg" %>"<!-- 之前点过显示反对图标 否则显示未反对图标  -->

					 onclick="changex(this,<%=map.get("topicid") %>,<%=y%>)" height="20px"><br/>
	</TR>
		</TABLE>
	</DIV>
    <%
		}
	%>

在jsp中需要显示的点赞或者反对的总数有关的代码

/**
	 * 查询主贴和跟帖(detail.jsp)
	 * @param tid
	 * @return
	 */
	public List<Map<String,Object>> selectTopicAndReplay(Integer tid,Integer page,Integer rows){
		if(page == null){
			page = 1;
		}
		if(rows == null){
			rows = 10;
		}
		List<Map<String,Object>> list = rdao.selectTopicAndReplay(tid,page,rows);
		
		long count = 0;
		
		for(int i = 0;i<list.size();i++){
			count = zbiz.getCount(""+list.get(i).get("topicid"));//在你进入界面时显示相应的点赞总数所需
			list.get(i).put("zan", count);
			count = zbiz.getCountx(""+list.get(i).get("topicid"));//在你进入界面时显示相应的反对总数所需
			list.get(i).put("fan", count);
		}
		
		return list;
	}

猜你喜欢

转载自blog.csdn.net/qq_35654259/article/details/81315810
今日推荐