zoukankan      html  css  js  c++  java
  • 使用Ajax轮询模拟简单的站内信箱(消息管理)功能

    前一段时间项目需要写一个类似于站内信箱的消息管理的功能,由于对前端不是很熟悉,刚开始不知道怎么做,后来看了网上的方案,现模拟一个非常简单的消息管理。

    我们首先看一下最终效果的样式,就是非常简单的一个样子,如下所示:

    我这边暂时只写了三个类型的消息,订单、上下架、审核。不同的消息推送过来会显示在不同类型上,消息管理上显示的是三种类型的消息总数量。

    好,接下来介绍一下代码。首先是数据库的设计,共有七个字段,分别是一个自增字段id,消息类型type,消息标题title,消息具体内容detail,消息状态status,创建时间time以及用户userId。如下所示:

    然后我们看推送消息的后台代码PullMsgServlet,分别有四个方法,分别是获取所有消息的历史记录,获取某人的未读消息,获取未读消息的总数,还有获取某种类型的未读消息总数。

     1 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     2         String operateType = Base64Util.decode(request.getParameter("operateType"));
     3         msgDao = new MessageDao();
     4         switch (operateType) {
     5             case "showHistory":
     6                 showHistory(request, response);
     7                 break;
     8             case "showPending":
     9                 showPending(request, response);
    10                 break;
    11             case "showCount":
    12                 showCount(request,response);
    13                 break;
    14             case "showCountByType":
    15                 showCountByType(request, response);
    16                 break;
    17             default:
    18                 break;
    19         }
    20         response.setCharacterEncoding("utf-8");
    21         response.setContentType("text/html;charset=UTF-8");
    22         response.getWriter().print(Base64Util.encode(result.toString()));
    23     }
    24 
    25     /**
    26      * 所有消息的历史记录
    27      * @param request
    28      * @param response
    29      * @throws ServletException
    30      * @throws IOException
    31      */
    32     private void showHistory(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    33         HttpSession session = request.getSession();
    34         userId = session.getAttribute("userId").toString();
    35         List<Object> historyList = msgDao.getMsgByUserId(userId);
    36         HttpResultList result = new HttpResultList();
    37         result.setResult(historyList.size()>0);
    38         result.setDatas(historyList);
    39     }
    40 
    41     /**
    42      * 某人的未读消息
    43      * @param request
    44      * @param response
    45      * @throws ServletException
    46      * @throws IOException
    47      */
    48     private void showPending(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    49         HttpSession session = request.getSession();
    50         userId = session.getAttribute("userId").toString();
    51         List<Object> pendingList = msgDao.getUnreadMsg();
    52         HttpResultList result = new HttpResultList();
    53         result.setResult(pendingList.size()>0);
    54         result.setDatas(pendingList);
    55     }
    56 
    57     /**
    58      * 某人未读消息的总数
    59      * @param request
    60      * @param response
    61      * @throws ServletException
    62      * @throws IOException
    63      */
    64     private void showCount(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    65         String number = msgDao.getMsgNum()+"";
    66         result = new JSONObject();
    67         result.put("result", number);
    68     }
    69 
    70     /**
    71      * 某人某种类型的未读消息总数
    72      * @param request
    73      * @param response
    74      * @throws ServletException
    75      * @throws IOException
    76      */
    77     private void showCountByType(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    78         Map<String, Integer> map = msgDao.getTypeNum();
    79         //获得返回的type
    80         List<String> keyList = new ArrayList<>();
    81         for (String key : map.keySet()) {
    82             keyList.add(key);
    83         }
    84         //获得返回type的个数
    85         List<Integer> valueList = new ArrayList<>();
    86         for (Integer value : map.values()) {
    87             valueList.add(value);
    88         }
    89         result = new JSONObject();
    90         JSONObject content = new JSONObject();
    91         content.put("type", JSONArray.fromObject(keyList));
    92         content.put("typeNum", JSONArray.fromObject(valueList));
    93         result.put("result", content);
    94     }

    接下来我们看前端代码,这边使用了setInterval定时器,设置的js代码每5秒轮询后台一次,请求后台servlet从数据库里面获取的数据,如下所示:

     1 setInterval(function(){
     2     getType();
     3 },5000);
     4 
     5 /**
     6  * 得到某个类型的消息数量
     7  */
     8 function getType(){
     9     var lis = document.getElementById("type").getElementsByTagName("li");
    10     var msgType = "";
    11     for(var i=0; i<lis.length; i++){
    12         msgType = lis[i].innerText;
    13     }
    14     $.ajax({
    15         type:"POST",
    16         url:"PullMsgServlet",
    17         dataType:'json',
    18         processData:false,
    19         data: {
    20             operateType: "showCountByType"
    21         },
    22         success:function(data){
    23             var result = data.result;
    24             var type = "";
    25             if(result){
    26                 for(var i=0; i<result.type.length; i++){
    27                     type = result.type[i];
    28                     if(type == "订单"){
    29                         $("#order").html(result.typeNum[i]);
    30                     }else if(type == "上下架"){
    31                         $("#shelf").html(result.typeNum[i]);
    32                     }else if(type == "审核"){
    33                         $("#review").html(result.typeNum[i]);
    34                     }
    35                 }
    36             }
    37         },
    38         error: function () {
    39             // alert("error...");
    40         }
    41     });
    42 }

    这样前端每隔5秒就轮询一次PullMsgServlet,查询数据库里是否有未读的消息,如果有,就显示在前端页面上。这样,一个最简单的消息推送以及显示功能就有了,只是我还没有写前端历史列表的查看,等以后写了再更新。。。。

  • 相关阅读:
    第一个只出现一次的字符
    把数组排成最小的数
    整数中1出现的次数
    连续子数组的最大和
    最小的K个数
    数组中出现次数超过一半的数字
    字符串的排列
    二叉搜索树与双向链表
    numpy中ravel()和flatten()
    复杂链表的复制
  • 原文地址:https://www.cnblogs.com/Lynette/p/9449983.html
Copyright © 2011-2022 走看看