diff --git a/thrones/src/main/webapp/static/lib/forum/jForum.js b/thrones/src/main/webapp/static/lib/forum/jForum.js index 6b085e73cfa083845a1e721d2236d556b4a942fb..a3029b9d1e363740a45d4efbef844a34eb335ace 100644 --- a/thrones/src/main/webapp/static/lib/forum/jForum.js +++ b/thrones/src/main/webapp/static/lib/forum/jForum.js @@ -137,6 +137,8 @@ var jForum = (function ($) { }).trigger('initEvent'); //member jForum.member.init(); + jForum.threads.init(); + jForum.message.init(); //ajax $('[data-result="loader.jsonp"]').on('loadDataEvent', function (e) { //topic/move var _b = $(e.target); diff --git a/thrones/src/main/webapp/static/lib/forum/jForum.member.js b/thrones/src/main/webapp/static/lib/forum/jForum.member.js index abdf3f43be95b80e9af377da99f45e71a79f875a..b054ee07e43cb0b0f3ab0025413c40709f69b03d 100644 --- a/thrones/src/main/webapp/static/lib/forum/jForum.member.js +++ b/thrones/src/main/webapp/static/lib/forum/jForum.member.js @@ -48,6 +48,8 @@ jForum.member = (function ($) { setMemberVerify(data.verify); //[HMP]生成会员面板 jForum.template.drawMemberPanel(data, _mp); //怎么显示由drawMemberPanel负责 + //开始消息通知 + $('#notification').bind('initDataEvent', noticeHandler).trigger('initDataEvent'); } } }); @@ -91,6 +93,8 @@ jForum.member = (function ($) { jForum.template.drawMemberInfo(responseMsg, $('#right_member_info')); // 重新设置客户端缓存的标记 setMemberVerify(responseMsg.verify); + //开始消息通知 + $('#notification').bind('initDataEvent', noticeHandler).trigger('initDataEvent'); } return; }; @@ -117,5 +121,35 @@ jForum.member = (function ($) { var verify = Cookies.get('msa') || -1; return verify; }; + var noticeHandler = function(e){ + try{ + //$('#header_member_panel').letterSocket({"callFunctionExp": 'updateUnReadMessages', 'remote': $('#topmenu').attr('data-socket-uri')}, 30000); + var s = new jForum.socket($('#topmenu').attr('data-socket-uri'), $('#header_member_panel'), { + sendDataFun : function(jqEle){ + var data = {}; + data.id = jqEle.attr('data-ux'); + data.cmd = 1; + data.ux = jqEle.attr('data-ux'); + return data; + }, + callbackFun : updateUnReadMessages + }); + s.init('letterNotice'); + s.start(30000); + }catch(e){ console.log('letter socket file lost');} + }; + function updateUnReadMessages(sockplaindata){ + var json = $.parseJSON(sockplaindata); + if(jQuery.isEmptyObject(json)){ + return; + } + if(parseInt(json.result)>0){ + $('#notification').removeClass('d-none'); + $('#notification').html(json.result); + }else{ + $('#notification').addClass('d-none'); + } + $('#header_member_panel').attr('data-ux', getUnixStamp()); + }; return { init: init, get:getCurrentActiveMemberInfo }; })(jQuery); diff --git a/thrones/src/main/webapp/static/lib/forum/jForum.message.js b/thrones/src/main/webapp/static/lib/forum/jForum.message.js index 087229f28bd5104840bd16de40f99ca211c6a232..a0890010f7846c4773dfeeaeb7be72c3bfdab319 100644 --- a/thrones/src/main/webapp/static/lib/forum/jForum.message.js +++ b/thrones/src/main/webapp/static/lib/forum/jForum.message.js @@ -1,5 +1,7 @@ jForum.message = (function($){ function init(){ + var template = jForum.template; + var util = jForum.utils; // 收件箱内容页中的加载更多 $('.letter-more-action').on('click', function(){ var pbx = $(this).parents('.letter-item-collect'); @@ -10,21 +12,23 @@ jForum.message = (function($){ // var self = $(this); self.addClass('disabled').html('正在玩命加载'); - $.getJSON(rawdata.uri+'&p='+rawdata.page, function( data ){ - //self是否显示 - if(jQuery.isEmptyObject(data)){ - return; - } - //遍历data.result - $.each(data.result, function(index, item){ - jForum.template.drawLetterHistoryMessage(item, rawdata.ele); - }); - pbx.attr('data-page', rawdata.page).scrollTop(); - var letter = $.parseJSON(data.letter); - if(letter.more){ - self.removeClass('disabled').html('更多历史消息'); - }else{ - self.hide(); + jForum.xhr.jsonGet(rawdata.uri+'&p='+rawdata.page, { + jsonCallback : function(data){ + //self是否显示 + if(jQuery.isEmptyObject(data)){ + return; + } + //遍历data.result + $.each(data.result, function(index, item){ + template.drawLetterHistoryMessage(item, rawdata.ele); + }); + pbx.attr('data-page', rawdata.page).scrollTop(); + var letter = $.parseJSON(data.letter); + if(letter.more){ + self.removeClass('disabled').html('更多历史消息'); + }else{ + self.hide(); + } } }); }); @@ -32,29 +36,28 @@ jForum.message = (function($){ $('.send-message-action').on('click', function(e){ var self = $(this); var callFun = self.attr('data-function') || 'drawMessageItem'; - var requestParam = parseQueryJson(self.attr('data-query')); + var requestParam = util.parseQueryJson(self.attr('data-query')); requestParam.content = self.parents('form').find('.form-control').val(); - if(isBlank(requestParam.content)){ + if(util.isBlank(requestParam.content)){ self.parents('form').find('.form-control').focus(); return false; } self.addClass('disabled'); - $.ajax({ - url: self.attr('data-handler'), - dataType: 'json', - method: 'POST', - data: requestParam - }).done(function (response) { - window[callFun].call(this, response, self); - }).fail(function(jqXHR, textStatus, errorThrown){ - if(textStatus === 'error'){ - var err = $.parseJSON(jqXHR.responseText); - if(err.level && err.level ==='err'){ - return errorMessage(err.message); + jForum.xhr.jsonPost(self.attr('data-handler'), { + data : requestParam, + jsonCallback : function(response){ + template[callFun].call(this, response, self); + }, + failCallback : function(jqXHR, textStatus, errorThrown){ + if(textStatus === 'error'){ + var err = $.parseJSON(jqXHR.responseText); + if(err.level && err.level ==='err'){ + return util.errorMessage(err.message); + } } + util.errorMessage('当前操作因错误而异外中止'); } - errorMessage('当前操作因错误而异外中止'); }); return false; }); @@ -62,24 +65,27 @@ jForum.message = (function($){ $('body').on('click', '#suggest-btn', function(e){ var self = $('#suggest-uid'); var p = self.parents('.form-group'); - if(isBlank(self.val())){ + if(util.isBlank(self.val())){ self.attr('placeholder', '输入收件人的UID').focus(); return; } self.attr("disabled","disabled"); - $.getJSON(self.attr('data-handler'), 'value='+self.val(), function( data ){ - if(data.level ==='acc'){ - uidDetectionHandler(data.message, p); - }else{ - $('input[name=snames]').val(''); - self.addClass('is-invalid').removeAttr("disabled").focus(); + jForum.xhr.jsonGet(self.attr('data-handler'), { + data : {'value' : self.val()}, + jsonCallback : function(data){ + if(data.level ==='acc'){ + uidDetectionHandler(data.message, p); + }else{ + $('input[name=snames]').val(''); + self.addClass('is-invalid').removeAttr("disabled").focus(); + } } }); }); //会员主页的发送消息|话题会员弹出层的消息[NW] $('body').on('click', '.message-transmit', function(e){ //在线吗 - var cam = getCurrentActiveMemberInfo(); + var cam = jForum.member.get(); if(jQuery.isEmptyObject(cam) || parseInt(cam.id) < 1){ return errorMessage('暂不支持游客发送消息'); } @@ -95,28 +101,24 @@ jForum.message = (function($){ btnClass: 'btn-blue', action: function () { var content = this.$content.find('textarea[name=content]').val(); - if(isBlank(content)){ + if(util.isBlank(content)){ this.$content.find('textarea[name=content]').focus(); return false; } var requestParam={}; - requestParam.content=content; - - $.ajax({ - url: requestURI, - dataType: 'json', - method: 'POST', - data: requestParam - }).done(function (response) { - transmitMessageResult(response); - }).fail(function(jqXHR, textStatus, errorThrown){ - if(textStatus === 'error'){ - var err = $.parseJSON(jqXHR.responseText); - if(err.level && err.level ==='err'){ - return errorMessage(err.message); + requestParam.content=content; + jForum.xhr.jsonPost(requestURI, { + data : requestParam, + jsonCallback : transmitMessageResult, + failCallback : function(jqXHR, textStatus, errorThrown){ + if(textStatus === 'error'){ + var err = $.parseJSON(jqXHR.responseText); + if(err.level && err.level ==='err'){ + return util.errorMessage(err.message); + } } + util.errorMessage('当前操作因错误而异外中止'); } - errorMessage('当前操作因错误而异外中止'); }); } } @@ -137,5 +139,17 @@ jForum.message = (function($){ jqEle.find('input[name=uid]').removeAttr("disabled").removeClass('is-invalid'); $('#suggest-uid').parents('form').find('input[name=snames]').val(nickname); }; + //私信的响应 + function transmitMessageResult(json){ + if(jQuery.isEmptyObject(json)){ + jForum.utils.errorMessage("操作因异常而中止"); + return; + } + if(parseInt(json.id)>0){ + jForum.utils.tipDialog({"message":"发送成功", "level":"acc", "refresh" : false}); + return; + } + jForum.utils.errorMessage("消息发送失败"); + }; return { init: init }; })(jQuery); \ No newline at end of file diff --git a/thrones/src/main/webapp/static/lib/forum/jForum.pagination.js b/thrones/src/main/webapp/static/lib/forum/jForum.pagination.js index 8d54d0f921666671bbe68b83c03aa9964547dc1e..ed822b2a91b9b2057f29f10d32d1297eec4cd15f 100644 --- a/thrones/src/main/webapp/static/lib/forum/jForum.pagination.js +++ b/thrones/src/main/webapp/static/lib/forum/jForum.pagination.js @@ -76,7 +76,7 @@ jForum.pagination = (function ($) { _curIns.config.ajaxComplete(xhr, textStatus); } //记入历史 - //recordHistory(page, pageSize); + recordHistory(page, postData.pageSize); console.log('[pagination] ajax is complete'); }; $.ajax(formatAjaxParams); diff --git a/thrones/src/main/webapp/static/lib/forum/jForum.socket.js b/thrones/src/main/webapp/static/lib/forum/jForum.socket.js index 19dcf1a6c6a3761193f14e38723480ebbbe8e960..27c99fba056a3efa07e5b92cfd6b90ffc4a12a1c 100644 --- a/thrones/src/main/webapp/static/lib/forum/jForum.socket.js +++ b/thrones/src/main/webapp/static/lib/forum/jForum.socket.js @@ -1,3 +1,44 @@ -jForum.socket = (function () { - -})(); \ No newline at end of file +jForum.socket = (function ($) { + class ForumSocket { + constructor(reqUri, jqEle, option) { + this.sock = new SockJS(reqUri); + this.requestDataFun = option.sendDataFun || null; + this.messageCallback = option.callbackFun || null; + this.jqEle = jqEle; + } + init(name){ + var t = name || '20201005'; + this.sock.onopen = function() { + console.log(t+' Socket opened!'); + }; + + this.sock.onmessage = function(e) { + if ($.isFunction(this.messageCallback)){ + this.messageCallback(e.data); + } + }; + + this.sock.onclose = function() { + console.log(t+' Socket close'); + }; + this.sock.onerror = function(e) { + console.log(t+' Socket has Error: '+e); + }; + } + _send(){ + if (!$.isFunction(this.requestDataFun)){ + return; + } + var jsonData = this.requestDataFun(this.jqEle); + var t = JSON.stringify(jsonData); + this.sock.send(t); //消息数量, + } + start(loopUnit){ + var _curIns = this; + setInterval(function(){ + _curIns._send(); + }, loopUnit); //毫秒 + } + } + return ForumSocket; +})(jQuery); \ No newline at end of file diff --git a/thrones/src/main/webapp/static/lib/forum/jForum.template.js b/thrones/src/main/webapp/static/lib/forum/jForum.template.js index 089d08eecc5f72062f02e541c687c04a8d86d10a..65ac63f283105db309a6da286a67c6dfa579b471 100644 --- a/thrones/src/main/webapp/static/lib/forum/jForum.template.js +++ b/thrones/src/main/webapp/static/lib/forum/jForum.template.js @@ -774,6 +774,53 @@ jForum.template = (function ($) { }); jqEle.popover('show'); }; + //快速回复的异步回调函数 + tmp.quickReplyFillPosts = function(json){ + var T='' + +'
' + +'
' + +'
' + +'
' + +'
' + +' ' + +' User avatar' + +' ' + +'
' + +' {authorNames}' + +'
' + +'
{authorGroup}
' + +' {#master}
楼主
{/master}' + +'
' + +'
' + +'
' + +' ' + +'

' + +' {authorNames} @u{author}  »   ' + +' {date}' + +'

' + +'
' + +' {&content}' + +'
' + +' ' + +' ' + +'
' + +'
' + +'
{authorSignature}
' + +'
' + +'
' + +'
' + +'
'; + Mustache.parse(T, ['{', '}']); + var rs = $.extend(json, {"APP":BASE}); + $('#topic_posts_collect').append(Mustache.render(T, rs)); + //图片的懒加载 + $('#posts-'+json.id).find('img.lazyload').lazyload(); + }; tmp.poperNotice = function(json){ if(jQuery.isEmptyObject(json)){ return; diff --git a/thrones/src/main/webapp/static/lib/forum/jForum.threads.js b/thrones/src/main/webapp/static/lib/forum/jForum.threads.js index 69aa38f3551ee19f414c7db85ab737f42a416192..cc086f09d87f5eaf59055f96b38bfeed0b0d2283 100644 --- a/thrones/src/main/webapp/static/lib/forum/jForum.threads.js +++ b/thrones/src/main/webapp/static/lib/forum/jForum.threads.js @@ -1,59 +1,67 @@ jForum.threads = (function ($) { function init() { + var template = jForum.template; + var util = jForum.utils; //话题内容页中会员信息弹出菜单 $('body').on('click', 'a.poper-member-menu', function (e) { e.preventDefault(); var self = $(this); var rawdata = {}; - rawdata.uri = self.parents('.topic_posts_item_left').attr('data-handler'); - //本地缓存命中 - rawdata.member = $.url(rawdata.uri).param('id'); + rawdata.uri = self.parents('.topic_posts_item_left').attr('data-handler'); + //本地缓存命中 + rawdata.member = $.url(rawdata.uri).param('id'); var cacheData = store.get('member_profile#' + rawdata.member); //本人的不缓存[20200118] if (!jQuery.isEmptyObject(cacheData)) { - buildMemberProfileMenu(cacheData, self); + template.buildMemberProfileMenu(cacheData, self); return; } // console.log('[MP]不存在缓存去拉取数据'); - $.getJSON(rawdata.uri, function (data) { - store.set('member_profile#' + rawdata.member, data); - buildMemberProfileMenu(data, self); + jForum.xhr.jsonGet(rawdata.uri, { + jsonCallback : function(data){ + store.set('member_profile#' + rawdata.member, data); + template.buildMemberProfileMenu(data, self); + } }); }); //引用回复@20200506 $('body').on('click', '.post-action-quote', function () { var self = $(this); - var options = parseQueryJson(self.attr('data-query')); - $.getJSON(self.attr('data-handler'), 'id=' + options.id, function (json) { - if (jQuery.isEmptyObject(json)) { - return errorMessage('读取原文内容失败'); - } - if (json.level === 'err') { - return errorMessage(json.message); - } - if (json.infoTip) { - insertEditorHtml(''); - $('#reply-tip-message').html('提示! ' + json.infoTip); - //插入到表单中@20200506 - $('#quick_reply_form').find('input[name=quote]').val(json.quote); - $('#quick_reply_form').find('input[name=scale]').val(json.scale); - } - }).fail(function (jqXHR, textStatus, errorThrown) { - if (textStatus === 'error') { - var err = $.parseJSON(jqXHR.responseText); - if (err.level && err.level === 'err') { - return errorMessage(err.message); + var options = util.parseQueryJson(self.attr('data-query')); + jForum.xhr.jsonGet(self.attr('data-handler'), { + data : {'id' : options.id}, + jsonCallback : function(json){ + if (jQuery.isEmptyObject(json)) { + return util.errorMessage('读取原文内容失败'); } + if (json.level === 'err') { + return util.errorMessage(json.message); + } + if (json.infoTip) { + util.insertEditorHtml(''); + $('#reply-tip-message').html('提示! ' + json.infoTip); + //插入到表单中@20200506 + $('#quick_reply_form').find('input[name=quote]').val(json.quote); + $('#quick_reply_form').find('input[name=scale]').val(json.scale); + } + }, + failCallback : function(jqXHR, textStatus, errorThrown){ + if (textStatus === 'error') { + var err = $.parseJSON(jqXHR.responseText); + if (err.level && err.level === 'err') { + return util.errorMessage(err.message); + } + } + util.errorMessage('当前操作因错误而异外中止'); } - errorMessage('当前操作因错误而异外中止'); }); return false; }); //举报回复[NW] $('body').on('click', '.post-action-report', function () { var self = $(this); - var requestParam = parseQueryJson(self.attr('data-query')); + var requestParam = util.parseQueryJson(self.attr('data-query')); // $.confirm({ title: '', @@ -77,29 +85,27 @@ jForum.threads = (function ($) { btnClass: 'btn-blue', action: function () { var reason = this.$content.find('textarea[name=reason]').val(); - if (isBlank(reason)) { + if (util.isBlank(reason)) { this.$content.find('textarea[name=reason]').focus(); return false; } requestParam.reason = reason; requestParam.type = this.$content.find("select[name=type]").val(); - - $.ajax({ - url: self.attr('data-handler'), - dataType: 'json', - method: 'POST', - data: requestParam - }).done(function (response) { - response.refresh = false; - tipDialog(response); - }).fail(function (jqXHR, textStatus, errorThrown) { - if (textStatus === 'error') { - var err = $.parseJSON(jqXHR.responseText); - if (err.level && err.level === 'err') { - return errorMessage(err.message); + jForum.xhr.jsonPost(self.attr('data-handler'), { + data : requestParam, + jsonCallback : function(response){ + response.refresh = false; + util.tipDialog(response); + }, + failCallback : function(jqXHR, textStatus, errorThrown){ + if(textStatus === 'error'){ + var err = $.parseJSON(jqXHR.responseText); + if(err.level && err.level ==='err'){ + return util.errorMessage(err.message); + } } + util.errorMessage('当前操作因错误而异外中止'); } - errorMessage('当前操作因错误而异外中止'); }); } } @@ -128,39 +134,38 @@ jForum.threads = (function ($) { } catch (e) { requestData.content = $(this).find('input[name=content]').val(); } - if (isBlank(requestData.content)) { + if (util.isBlank(requestData.content)) { $.alert('请输入回复的内容'); return false; } // 同步操作 - $.ajax({ - type: 'POST', - url: self.attr('action'), - data: requestData, - dataType: 'json' - }).done(function (response) { - if (response.level === 'err' && !isBlank(response.message)) { - //出错了 - response.refresh = false; - tipDialog(response); - } else { - quickReplyFillPosts(response); - //清空表单的元素 - self.find('input[name=content]').val(''); - self.find('input[name=quote]').val(''); - self.find('input[name=scale]').val(''); - $('#reply-tip-message').html(''); - //清空编辑器的内容 - CKEDITOR.instances['content'].setData(''); - } - }).fail(function (jqXHR, textStatus, errorThrown) { - if (textStatus === 'error') { - var err = $.parseJSON(jqXHR.responseText); - if (err.level && err.level === 'err') { - return errorMessage(err.message); + jForum.xhr.jsonPost(self.attr('action'), { + data : requestData, + jsonCallback : function(response){ + if (response.level === 'err' && !util.isBlank(response.message)) { + //出错了 + response.refresh = false; + util.tipDialog(response); + } else { + template.quickReplyFillPosts(response); + //清空表单的元素 + self.find('input[name=content]').val(''); + self.find('input[name=quote]').val(''); + self.find('input[name=scale]').val(''); + $('#reply-tip-message').html(''); + //清空编辑器的内容 + CKEDITOR.instances['content'].setData(''); + } + }, + failCallback : function(jqXHR, textStatus, errorThrown){ + if(textStatus === 'error'){ + var err = $.parseJSON(jqXHR.responseText); + if(err.level && err.level ==='err'){ + return util.errorMessage(err.message); + } } + util.errorMessage('当前操作因错误而异外中止'); } - errorMessage('当前操作因错误而异外中止'); }); return false; });