如何給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){
-
for( var 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;
-
}
- }
發件人把信投遞到郵局,郵局根據收件人地址進行分類,然後由不同的郵遞員分別送到各個收件人的家裡,
這裡情況比較特殊,就是當某些地方郵局不派送信件的地方,當地人怎麼取信呢?當有同村的進城的時候就拜託他到郵局看看有沒有自己的信件有的話就帶回來。
我們上面的程式碼就是類似後面這種特俗情況。
每個客戶端,每隔一段時間都傳送一個請求到伺服器詢問有沒有自己的信件,有的話就打包全部接收進來。
每次傳送信件出去也是一樣,可能有多個資訊同時被投遞,交給伺服器去分類儲存。
這個程式碼實在沒啥說的~基本上邏輯一目瞭然~
然後怎麼用呢?編譯後註冊成為外掛就可以使用了~當然要用到專案中需要自己對訊息佇列進行持久化和執行緒同步互斥的管理,不然併發多了佇列可能就會混亂的喲~~
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21472864/viewspace-2131203/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 如何在Mac上設定自定義鎖屏訊息?Mac
- 如何在丟失的Mac上設定自定義鎖屏訊息Mac
- FineReport如何手動推送APP訊息APP
- 自定義訊息獲取訊息(轉)
- 如何開發FineReport的自定義控制元件?控制元件
- 自定義訊息和對訊息的理解
- 企業微信hook,自定義工具,收發訊息Hook
- 自定義NSNotification訊息中心
- 給Debian設定自定義快捷鍵
- FineReport中如何用JavaScript自定義地圖示籤JavaScript地圖
- VC增加自定義訊息 (轉)
- ros|自定義訊息型別ROS型別
- 自定義事件提醒程式事件
- VC自定義訊息postmessage用法(訊息響應函式)函式
- 寶塔皮膚如何設定自定義404
- MacBook Pro如何自定義設定快捷鍵?Mac
- WIN32傳送自定義訊息Win32
- Jquery實現自定義訊息彈窗jQuery
- 用 Go 寫一個簡單訊息佇列(一):定義訊息和基礎工具Go佇列
- 使用「即刻」APP建立自定義提醒APP
- 二、自定義垂直ViewGroup如何設定marginView
- 形形色色的自定義訊息(上) (轉)
- 形形色色的自定義訊息(下) (轉)
- Mac使用技巧_蘋果鎖屏介面如何自定義鎖屏訊息?Mac蘋果
- 使用SignalR實現訊息提醒SignalR
- iOS: 教你給UI控制元件新增Badge(訊息提醒小圓點)iOSUI控制元件
- Delphi重定義的訊息結構
- 如何自定義 3/4 層 DDoS 保護設定
- 如何設定 GNOME 顯示自定義幻燈片
- springmvc 自定義訊息轉換器完整例子SpringMVC
- ROS2/C++ 自定義訊息型別ROSC++型別
- Laravel 5.5 Validator 自定義錯誤返回訊息Laravel
- 基於tcp的應用層訊息邊界如何定義TCP
- Laravel 使用 Easywechat 書寫自定義模板訊息丶廣播訊息頻道Laravel
- 360安全衛士如何設定自定義安全防護
- win10如何自定義主題_win10怎麼設定自定義主題Win10
- WIN10如何設定通知中心不顯示訊息 WIN10通知中心不顯示訊息設定方法Win10
- win10桌面佈局設定成自定義_windows10桌面圖示如何自定義Win10Windows