<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    wuxiren123

    如何給FineReport設置自定義消息提醒工具

    FineReport設計器有自動的消息推送功能可設置報表定時推送和常規的日報周報推送。官方有自己的消息推送的接口,不過有些用戶旺旺希望自己開發,符合自己需求的推送界面。

    下面這個方案就從邏輯層面簡單闡述一個通訊類應該怎么實現。

    廢話不多說直接上代碼,為了保證新手能夠看懂,這個代碼基本上只需要了解JS和JQ的常規寫法就行。

    ;

    (
    function($){

            
    /*定義一個工具對象,所有的工具以后都放進去*/

            HG 
    = {};

            
    /*定義我們第一個基礎類OBJ*/

            HG.OBJ 
    = function(options){

                    
    //保證子類能夠繼承父類的默認成員變量

                    
    this.options = $.extend(this._defaultOptions(), options);

                    
    //初始化對象

                    
    this._init();

            }
    ;

            $.extend(HG.OBJ.prototype, 
    {

                    _defaultOptions: 
    function () {

                            
    return {classType:"OBJ"};

                    }
    ,

                    _init:
    function(){}

            }
    );

            
    /*定義用于生成子類的方法*/

            HG.extend
    =function(parent,options){

                    
    var son = $.extend(parent,{});

                    son.prototype 
    = $.extend(parent.prototype,options);

                    
    return son;

            }
    ;

            
    /*第一個就是要構建我們的通訊對象*/

            
    /****定義一些通訊用的私有成員和方法*****/

            
    //發送通道的狀態,為了減輕服務器壓力,采取單通道發送

            
    var status = true;

            
    var sendMsgList = [];

            
    var receiveMsgList = [];

            
    var server = null;

            
    var sendType = null;

            
    var dataType = null;

            
    //最終發送消息的方法

            
    var send=function(msg,onReceive,onComplete,onFailed){

                    
    if(!msg.inList){

                            msg.inList 
    = true;

                            sendMsgList.push(msg);

                    }


                    
    if(status){

                            status 
    = false;

                            
    var tempSendMsgList = sendMsgList;

                            sendMsgList 
    = [];

                            FR.ajax(
    {  

                                    url: server,  

                                    type: sendType, 

                                    dataType:dataType,

                                    data:
    {msgList:tempSendMsgList}

                                    success : 
    function(receiveMsgList){

                                            status 
    = true;

                                            onReceive(receiveMsgList);

                                    }
    ,

                                    complete: 
    function(XMLHttpRequest,textStatus){

                                            status 
    = true;

                                            onComplete(XMLHttpRequest,textStatus);

                                    }
    ,

                                    error: 
    function(XMLHttpRequest, textStatus, errorThrown){

                                            status 
    = true;

                                            onFailed(XMLHttpRequest, textStatus, errorThrown);

                                    }


                            }
    );

                    }
    else{

                            setTimeout(
    function(){

                                    send(msg,onReceive,onComplete,onFailed);

                            }
    ,1000);

                    }


            }
    ;

            
    var formatDate = function(date){

                    
    var d = new Date(date);

                    
    return d.getFullYear()+"-"+d.getMonth()+"-"+d.getDate()+"  "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds();

            }
    ;

            
    //通訊類,可以自己重寫onReceive的方法來實現自己的消息工具,消息的內容為JSON格式,自己定義就好了

            HG.CommunicationClient 
    = HG.extend(HG.OBJ,{

                    _defaultOptions: 
    function () {

                            
    return {

                                    classType:
    "CommunicationClient",

                                    
    //默認只跟當前的服務器進行聯絡

                                    server:FR.servletURL
    +"?op=msgserver",

                                    sendType:
    "POST",

                                    dataType:
    "JSON",

                                    
    //輪詢的頻率,默認3秒1次,越快服務器和客戶端壓力越大

                                    pollingRate:
    3000

                            }
    ;

                    }
    ,

                    _init:
    function(){

                            server 
    = this.options.server;

                            sendType 
    = this.options.sendType;

                            dataType 
    = this.options.dataType;

                            
    this.polling4Receive();

                    }
    ,

                    send:
    function(msg){

                            
    var self = this;

                            send(msg,self.onReceive, self.onComplete, self.onFailed);

                    }
    ,

                    
    //給某個用戶發文本消息

                    sendText:
    function(toUserId,text){

                            
    this.send({action:"send",userId:toUserId,time:new Date().getTime(),content:{text:text}})

                    }
    ,

                    onReceive:
    function(msg){

                            
    if(msg.length>0){

                                    
    forvar i=0; i<msg.length; i++ ){

                                            console.info(formatDate(msg[i].time)
    +"  "+msg[i].name+" "+decodeURI("%E8%AF%B4%EF%BC%9A")+" "+msg[i].content.text);

                                    }


                            }


                    }
    ,

                    onFailed:
    function(XMLHttpRequest, textStatus, errorThrown){

                    }
    ,

                    onComplete:
    function(XMLHttpRequest, textStatus){

                    }
    ,

                    
    /*向服務器輪詢,檢查是否有自己的消息*/

                    polling4Receive:
    function(){

                            
    var self = this;

                            self.send(
    {action:"findMessage",inList:false});

                            setTimeout(
    function(){

                                    self.polling4Receive();

                            }
    ,self.options.pollingRate);

                    }


            }
    );

            
    //先生成一個對話工具

            HG.Talk 
    = new HG.CommunicationClient();

    }
    )(jQuery);

    在任意一個你需要的系統或者界面引入這段JS,

    然后最基本的文本消息發送

                                                    HG.Talk.sendText(接收者的用戶名,文本消息的內容);

    當然,我們實際需求中需要的遠遠不止是發個文本這么簡單,對于任意消息的發送該怎么搞呢?

    有兩種方法:

    繼承HG.CommunicationClient實現新的自己的通訊類,或者重寫 HG.Talk的方法,兩種方式都是修改onReceive方法,上面的代碼中是把消息直接顯示到控制臺當中的。

    你可以根據你自己的需要發送任意JSON格式的msg并在onReceive中去實現你想要的展現方法。當然如果你想真正的了解它是怎么運作的,可以花5分鐘看一遍代碼就清楚了

    下面看看后臺,因為暫時只說邏輯,所以很多東西都不考慮,后臺就會非常的簡單,只需要有點JAVA基礎,并且了解FineReport的service接口就應該能看懂.

    package com.hg.plugin.plate.msgutils;

     

    import java.io.PrintWriter;

    import java.util.ArrayList;

    import java.util.Date;

    import java.util.HashMap;

    import java.util.List;

    import java.util.Map;

     

    import javax.servlet.http.HttpServletRequest;

    import javax.servlet.http.HttpServletResponse;

     

    import com.fr.fs.control.UserControl;

    import com.fr.fs.web.service.ServiceUtils;

    import com.fr.json.JSONArray;

    import com.fr.json.JSONObject;

    import com.fr.stable.fun.Service;

    import com.fr.web.utils.WebUtils;

     

    public class MessageServer implements Service {

            

            
    class Message{

                    
    private long time = -1;

                    
    private String fuserId = "";

                    
    private String tuserId = "";

                    
    private JSONObject content = JSONObject.create();

                    

                    
    public Message(String fromUserId,String toUserId,JSONObject content){

                            
    this.fuserId = fromUserId;

                            
    this.tuserId = toUserId;

                            
    this.content = content;

                            time 
    = new Date().getTime();

                    }


                    

                    
    public JSONObject toJSON() throws Exception{

                            JSONObject jo 
    = JSONObject.create();

                            jo.put(
    "userId", fuserId);

                            jo.put(
    "name", UserControl.getInstance().getByUserName(fuserId).getRealname());

                            jo.put(
    "content", content);

                            jo.put(
    "time", time);

                            
    return jo;

                    }


            }


            

            
    private static Map<String,List<Message>> messageStore = new HashMap<String,List<Message>>();

            

            @Override

            
    public String actionOP() {

                    
    return "msgserver";

            }


            

            @Override

            
    public void process(HttpServletRequest req, HttpServletResponse res,String op, String sessionID) throws Exception {

                    String msgListStr 
    = WebUtils.getHTTPRequestParameter(req, "msgList");

                    JSONArray msgListJa 
    = new JSONArray(msgListStr);

                    List
    <JSONObject> msgList = sortMessageList(msgListJa);

                    String fromUserId 
    = ServiceUtils.getCurrentUserName(req);

                    
    //投遞給別人的信件

                    
    for(JSONObject msg : msgList){

                            String tuserId 
    = msg.getString("userId");

                            
    if(!messageStore.containsKey(tuserId)){

                                    messageStore.put(tuserId, 
    new ArrayList<Message>());

                            }


                            messageStore.get(tuserId).add(
    new Message(fromUserId,tuserId,msg.getJSONObject("content")));

                    }


                    
    //查看是否有自己的信件

                    
    if(!messageStore.containsKey(fromUserId)){

                            messageStore.put(fromUserId, 
    new ArrayList<Message>());

                    }


                    List
    <Message> sendList = messageStore.get(fromUserId);

                    JSONArray result 
    = JSONArray.create();

                    
    for(Message msg : sendList){

                            result.put(msg.toJSON());

                    }


                    messageStore.put(fromUserId, 
    new ArrayList<Message>());

                    res.setContentType(
    "text/html;charset=UTF-8");

                    res.setCharacterEncoding(
    "UTF-8");

                    PrintWriter  write 
    = res.getWriter();

                    write.write(result.toString());

                    write.flush();

                    write.close();

            }


            

            
    private static List<JSONObject> sortMessageList(JSONArray msgListJa) throws Exception{

                    List
    <JSONObject> result = new ArrayList<JSONObject>();

                    
    for(int i=0; i<msgListJa.length(); i++){

                            JSONObject msgJo 
    = msgListJa.getJSONObject(i);

                            
    //去除輪詢的請求

                            
    if("findMessage".equals(msgJo.getString("action"))){

                                    
    continue;

                            }


                            
    if(result.size()==0){

                                    result.add(msgJo);

                            }
    else{

                                    
    boolean add = false;

                                    
    for(int j=0;j<result.size();j++){

                                            JSONObject tempMsgJo 
    = result.get(j);

                                            
    if(tempMsgJo.getLong("time")>=msgJo.getLong("time")){

                                                    result.add(j, msgJo);

                                                    add 
    = true;

                                                    
    break;

                                            }


                                    }


                                    
    if(!add){

                                            result.add(msgJo);

                                    }


                            }


                    }


                    
    return result;

            }


    }


    邏輯是什么呢?這么說你就懂了,在還是寫信通訊的年代,負責通訊的就是郵局,郵局是怎么處理事務的呢?

    發件人把信投遞到郵局,郵局根據收件人地址進行分類,然后由不同的郵遞員分別送到各個收件人的家里,

    這里情況比較特殊,就是當某些地方郵局不派送信件的地方,當地人怎么取信呢?當有同村的進城的時候就拜托他到郵局看看有沒有自己的信件有的話就帶回來。

    我們上面的代碼就是類似后面這種特俗情況。

    每個客戶端,每隔一段時間都發送一個請求到服務器詢問有沒有自己的信件,有的話就打包全部接收進來。

    每次發送信件出去也是一樣,可能有多個信息同時被投遞,交給服務器去分類保存。

    這個代碼實在沒啥說的~基本上邏輯一目了然~

    然后怎么用呢?編譯后注冊成為插件就可以使用了~當然要用到項目中需要自己對消息隊列進行持久化和線程同步互斥的管理,不然并發多了隊列可能就會混亂的喲~~

    posted on 2016-12-22 14:17 喝水居然長肉 閱讀(162) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 亚洲中文字幕无码av永久| 毛片a级三毛片免费播放| 亚洲综合精品一二三区在线| 五月亭亭免费高清在线| 亚洲AV噜噜一区二区三区| 中文字幕亚洲一区| 国产电影午夜成年免费视频| 在线播放亚洲精品| 亚洲视频在线免费观看| 国产又粗又长又硬免费视频 | 亚洲精品午夜国产va久久| 亚洲JIZZJIZZ中国少妇中文| 日本免费在线观看| 激情无码亚洲一区二区三区| 亚洲AV永久无码精品| 日韩a在线观看免费观看| 久久精品国产免费一区| 亚洲heyzo专区无码综合| 亚洲高清在线视频| 国产性生交xxxxx免费| 99国产精品视频免费观看| 亚洲丁香色婷婷综合欲色啪| 日韩免费视频网站| 久久久久久国产精品免费免费男同 | 亚洲精品无码AV人在线播放 | 久久综合日韩亚洲精品色| 日本高清免费中文字幕不卡| 免费国产黄网站在线观看视频| 羞羞漫画在线成人漫画阅读免费| 亚洲色欲www综合网| 区久久AAA片69亚洲| 国产无遮挡吃胸膜奶免费看视频| 亚洲精品免费在线| a毛片在线还看免费网站| 黄页视频在线观看免费| 国产AV旡码专区亚洲AV苍井空| 67pao强力打造67194在线午夜亚洲 | 视频免费在线观看| 人妻仑乱A级毛片免费看| 亚洲人成网站免费播放| 亚洲国产美女精品久久|