msgbuoy.js 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. /**
  2. *
  3. * 浮漂msg消息公用方法
  4. * 插入dom节点方式运,为了兼容 三端,采用元素js 操作 dom + css
  5. * @param type
  6. * @returns {Object|*}
  7. */
  8. var getMsgBuoyActive = {
  9. // 版本号
  10. version: '0.0.2',
  11. platform: '', // work_bench、wx、app、pc
  12. msgids: '',
  13. floatDOM: '',
  14. messageList: [],
  15. messageInfo: {},
  16. textmas: '剑鱼标讯-招标信息查询_全国招标采购信息订阅推送_专业招标大数据服务平台',
  17. init: function () {
  18. // 初始化平台计算
  19. this.getPlatform()
  20. // 限制初始化页面
  21. if (this.platform === 'app' || this.platform === 'wx') {
  22. if (this.checkNowInMobileHomePage()) {
  23. this.getBuoyMsgAjax()
  24. }
  25. } else {
  26. this.listenNotification()
  27. this.getBuoyMsgAjax()
  28. }
  29. },
  30. /**
  31. * 检查当前是否是 移动端首页 页面
  32. * @returns {boolean}
  33. */
  34. checkNowInMobileHomePage () {
  35. var Pages = [
  36. '/jyapp/jylab/mainSearch',
  37. '/jylab/mainSearch',
  38. '/jy_mobile/tabbar/home'
  39. ]
  40. return Pages.some(function (v) {
  41. return location.href.indexOf(v) > -1
  42. })
  43. },
  44. getPlatform: function () {
  45. this.platform = this.platformOS()
  46. },
  47. initDOMNode: function () {
  48. // 判断是否存在,需要先移除dom
  49. var oldNode = $('.msggroup')
  50. if (oldNode && typeof oldNode.remove === 'function') {
  51. oldNode.remove()
  52. }
  53. // 没有消息时退出执行
  54. if (!(this.messageList && this.messageList.length)) {
  55. return
  56. }
  57. var message = this.messageList[0]
  58. var textmas = this.textmas
  59. if (message) {
  60. textmas = message.buoyDetail
  61. this.msgids = message.id
  62. }
  63. let scanHTML = `<div class="msggroup" style="display:none;">
  64. <div class="msgbox">
  65. <div id="msg_content" class="msg_content">
  66. <span class="text-content">${textmas}</span>
  67. </div>
  68. </div>
  69. <div class="msg_close">
  70. </div>
  71. </div>`
  72. var scanDOM = $(scanHTML)
  73. this.floatDOM = scanDOM.show()
  74. scanDOM.find('#msg_content').html(`<span class="text-content">${textmas}</span>`)
  75. if (this.platform === 'pc') {
  76. $('#public-nav .iner').append(scanDOM)
  77. } else if (this.platform === 'work_bench') {
  78. // 插入节点
  79. $('.el-header > .navbar-group').append(scanDOM)
  80. } else {
  81. $('body').append(scanDOM)
  82. }
  83. // 初始化样式表
  84. this.createStyle()
  85. // 初始化监听事件
  86. this.addEventClick()
  87. // 初始化样式表style
  88. this.scroll()
  89. },
  90. getBuoyMsgAjax: function () {
  91. var _this = this
  92. $.ajax({
  93. url: '/jyapi/messageCenter/GetBuoyMsg',
  94. type: 'POST',
  95. }).done(function (res) {
  96. if (res && res.error_code === 0 && res.data) {
  97. try {
  98. _this.messageList = res.data
  99. if (res.data && res.data.length) {
  100. _this.messageInfo = _this.messageList[0]
  101. _this.initDOMNode()
  102. }
  103. } catch (error) {
  104. console.warn(error)
  105. }
  106. }
  107. })
  108. },
  109. istoReaded: function (ids, url) {
  110. // 消息盒子 消失
  111. // 效果彩蛋 ~~ 1200ms逐渐消失
  112. $(".msggroup").fadeOut(1200);
  113. $(".msggroup").fadeTo("1200", 0.6);
  114. $.ajax({
  115. type: 'POST',
  116. url: '/jymessageCenter/markRead',
  117. async: false,
  118. data: {
  119. msgId: ids
  120. },
  121. success: function (res) {
  122. if (res.error_code === 0 && res.data) {
  123. console.log(res);
  124. }
  125. }
  126. })
  127. },
  128. // 监听点击事件 行为
  129. addEventClick: function (praume) {
  130. var _this = this
  131. // 直接使用选择器进行绑定监听
  132. this.floatDOM.find('.msg_content').on('click', function () {
  133. _this.floatDOM.find('.msg_close').trigger('click')
  134. const ua = window.navigator.userAgent.toLocaleLowerCase()
  135. const isIos = /iphone|ipad|ipod/.test(ua)
  136. const isAndroid = /android/.test(ua)
  137. try {
  138. // 跳转链接
  139. switch (getMsgBuoyActive.platformOS()) {
  140. case 'pc':
  141. location.href = _this.messageInfo.pcUrl ? _this.messageInfo.pcUrl : '/swordfish/frontPage/messageCenter/sess/index'
  142. break;
  143. case 'work_bench':
  144. window.open(_this.messageInfo.pcUrl ? _this.messageInfo.pcUrl : '/swordfish/frontPage/messageCenter/sess/index')
  145. break;
  146. case 'wx': {
  147. location.href = _this.messageInfo.weChatUrl ? _this.messageInfo.weChatUrl :'/weixin/frontPage/messageCenter/sess/index'
  148. break;
  149. }
  150. case 'app': {
  151. if(isIos && _this.messageInfo.iosUrl){
  152. location.href = _this.messageInfo.iosUrl
  153. } else if(isAndroid && _this.messageInfo.androidUrl) {
  154. location.href = _this.messageInfo.androidUrl
  155. } else {
  156. _this.isAppH5Jump()
  157. }
  158. break;
  159. }
  160. default:
  161. break;
  162. }
  163. } catch (e) {
  164. console.log(e);
  165. }
  166. })
  167. // 关闭消息
  168. this.floatDOM.find('.msg_close').on('click', function (e) {
  169. getMsgBuoyActive.istoReaded(getMsgBuoyActive.msgids)
  170. })
  171. },
  172. isAppH5Jump: function(){
  173. // H5 环境支持跳转
  174. if (window.utilsEnv && window.utilsEnv.platformEnvs.platform === 'h5') {
  175. location.href = '/jy_mobile/tabbar/message'
  176. } else {
  177. try {
  178. // app跳转到消息中心tab
  179. JyObj.skipAppointTab('message')
  180. } catch (error) {
  181. console.log('error')
  182. }
  183. }
  184. },
  185. scroll: function () {
  186. // 可视窗口宽度 \
  187. let windowWidth = document.body.offsetWidth, Pc_Topstyle
  188. var floatDOM = this.floatDOM
  189. // 设置每个弹框相对位置定位style - 根据平台
  190. // pc 和移动端 定位盒子
  191. // Pc_Topstyle = getMsgBuoyActive.platformOS() === 'pc'
  192. // ? `width:315px;right:${Number(windowWidth - 1200)/2}px;top:80px;`
  193. // : `width:92%;right: 4%; bottom: 17vw;`
  194. switch (getMsgBuoyActive.platformOS()) {
  195. case 'pc':
  196. floatDOM.addClass('message-float-pc')
  197. break;
  198. case 'work_bench':
  199. Pc_Topstyle = `width:315px;right:186px;top:80px;`
  200. break;
  201. case 'app':
  202. floatDOM.addClass('message-float-mobile')
  203. Pc_Topstyle = `bottom: 8vw;`
  204. break;
  205. case 'wx':
  206. floatDOM.addClass('message-float-mobile')
  207. Pc_Topstyle = `bottom: calc(8vw + 9.33vw);`
  208. break;
  209. default:
  210. break;
  211. }
  212. floatDOM.show()
  213. floatDOM[0].style = `display:block;${Pc_Topstyle}`
  214. if (getMsgBuoyActive.platformOS() === 'app') {
  215. floatDOM.find('.msg_close')[0].style = `background: #000;`
  216. }
  217. var content = floatDOM.find('.msg_content')[0],
  218. box = floatDOM[0],
  219. contentWidth = content.offsetWidth,
  220. boxWidth = box.offsetWidth
  221. box.style.setProperty('animation', '5s')
  222. var _this = this
  223. if (!contentWidth || !boxWidth) {
  224. setTimeout(function () {
  225. _this.scroll()
  226. }, 200)
  227. return
  228. }
  229. if (contentWidth <= boxWidth) {
  230. // 内容宽度小于盒子宽度,停止滚动
  231. content.style.setProperty('animation', '5s');
  232. } else {
  233. var computedContentWidth = contentWidth * 2 + 20
  234. // 根据宽度设置滚动距离和动画时长,复制实现无缝滚动
  235. content.style.setProperty('animation', 'move ' + computedContentWidth / 50 + 's linear infinite');
  236. $(content).append($(".msg_content .text-content").clone())
  237. // // 修改@keyframes的值
  238. // const frame = `@Keyframes move {
  239. // from {
  240. // transform: translate(0);
  241. // }
  242. // to {
  243. // transform: translateX(-${contentWidth - boxWidth}px)
  244. // }
  245. // }`;
  246. // // 找到对应的css样式表,先删除再新增
  247. // let sheets = document.styleSheets;
  248. // for (let i = 0; i < sheets.length; ++i) {
  249. // const item = sheets[i];
  250. // if (item.cssRules[0] && item.cssRules[0].name && item.cssRules[0].name === 'move') {
  251. // item.deleteRule(0);
  252. // item.insertRule(frame, 0)
  253. // }
  254. // }
  255. }
  256. },
  257. // 动态创建样式==
  258. createStyle: function () {
  259. var frame = `
  260. @Keyframes move {
  261. from {
  262. transform: translate(0);
  263. }
  264. to {
  265. transform: translateX(-50%)
  266. }
  267. }
  268. .msggroup {
  269. position: absolute;
  270. width: 351px;
  271. height: 44px;
  272. right: 3%;
  273. background: linear-gradient(180deg, #E8FFFF 0%, #FFFFFF 100%);
  274. box-shadow: 0px 4px 16px rgb(8 31 38 / 8%);
  275. border-radius: 8px;
  276. border: 0.5px solid;
  277. border-image-source: linear-gradient(163deg, #1a1c1d 0%, rgba(42, 190, 209, 0) 100%);
  278. z-index: 7;
  279. line-height: 44px;
  280. font-size: 13px;
  281. padding: 0 5px;
  282. background-size: 100% 100%;
  283. background-image: url(data:image/png;base64,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);
  284. background-repeat: no-repeat;
  285. }
  286. .msgbox {
  287. width: 100%;
  288. overflow: hidden;
  289. white-space: nowrap;
  290. }
  291. .msg_content {
  292. animation: move 5s linear infinite;
  293. display: inline-block;
  294. cursor: pointer;
  295. }
  296. .msg_content .text-content {
  297. padding: 0 10px;
  298. }
  299. .msg_close {
  300. position: absolute;
  301. width: 18px;
  302. height: 18px;
  303. right: -6px;
  304. top: -10px;
  305. cursor: pointer;
  306. background: #2ABED1;
  307. opacity: 0.8;
  308. /*background:url('/images/close_pc_msg.png') 0 0;
  309. background-size: cover;*/
  310. -moz-border-radius: 50px;
  311. -webkit-border-radius: 50px;
  312. border-radius: 50px;
  313. }
  314. .msg_close img {
  315. width:100%;
  316. height:100%;
  317. }
  318. .msg_close:before,
  319. .msg_close:after {
  320. content: "";
  321. position: absolute;
  322. height: 1.3px;
  323. width: 65%;
  324. top: 50%;
  325. left: 20%;
  326. margin-top: -1px;
  327. background: #fff;
  328. }
  329. .msg_close:before {
  330. -webkit-transform: rotate(45deg);
  331. -moz-transform: rotate(45deg);
  332. -ms-transform: rotate(45deg);
  333. -o-transform: rotate(45deg);
  334. transform: rotate(45deg);
  335. }
  336. .msg_close:after {
  337. -webkit-transform: rotate(-45deg);
  338. -moz-transform: rotate(-45deg);
  339. -ms-transform: rotate(-45deg);
  340. -o-transform: rotate(-45deg);
  341. transform: rotate(-45deg);
  342. }
  343. `
  344. frame += this.addPlatformStyle()
  345. // 创建style标签
  346. const style = document.createElement('style');
  347. style.type = 'text/css';
  348. style.innerHTML = frame;
  349. document.getElementsByTagName('head')[0].appendChild(style);
  350. },
  351. addPlatformStyle: function () {
  352. var text = ''
  353. if (this.platform === 'pc') {
  354. text = `
  355. .msggroup.message-float-pc {
  356. right: 0;
  357. bottom: -10px;
  358. transform: translate(0, 100%);
  359. }
  360. `
  361. } else if (this.platform === 'wx' || this.platform === 'app') {
  362. text = `
  363. .msggroup.message-float-mobile {
  364. position: fixed;
  365. width: calc(100% - 8vw);
  366. /* width:315px; */
  367. left: 50%;
  368. bottom: 0;
  369. z-index: 9;
  370. transform: translate(-50%, 0);
  371. }
  372. `
  373. }
  374. return text
  375. },
  376. // 判断平台环境,用于定位样式
  377. platformOS: function () {
  378. let ua = navigator.userAgent || window.navigator.userAgent,
  379. IsWeChatBrowser = ua.toLowerCase().indexOf('micromessenger') !== -1,
  380. androidOrIOS = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua),
  381. isAndroid = /(?:Android)/.test(ua),
  382. isPad = /(?:iPad|PlayBook)/.test(ua) || (isAndroid && !/(?:Mobile)/.test(ua)),
  383. isPhone = /(?:iPhone)/.test(ua) && !isPad,
  384. isPc = !isPhone && !isAndroid && !IsWeChatBrowser && !androidOrIOS,
  385. iswork_bench = /work-bench|dashboard|workspace/i.test(location.href)
  386. if (IsWeChatBrowser) {
  387. return 'wx'
  388. } else if (iswork_bench) {
  389. return 'work_bench'
  390. } else if (androidOrIOS) {
  391. return 'app'
  392. } else if (isPc) {
  393. return 'pc'
  394. } else if (isPhone) {
  395. return 'ios'
  396. } else if (isAndroid) {
  397. return 'Android'
  398. }
  399. },
  400. /**
  401. * @date 2023/1/4 消息通知改为 webscoket 获取并调用浏览器消息通知
  402. */
  403. listenNotification () {
  404. /**
  405. * 进行浏览器通知,判断上次通知是否与当前一致,一致则不进行重复通知
  406. * @param datas - 信息数据
  407. */
  408. function sendNotification (datas) {
  409. var waitShowMessageId = localStorage.getItem('notification-login-clear-info') || -1
  410. if (waitShowMessageId === datas.id) {
  411. return console.warn('重复消息ID,不进行重复通知')
  412. }
  413. try {
  414. Notification.requestPermission(function(status) {
  415. var notifyStatus = Notification.permission || status
  416. if(notifyStatus === 'granted'){
  417. localStorage.setItem('notification-login-clear-info', datas.id)
  418. var notify = new Notification(datas.title,{
  419. icon: '/images/t3_new.jpg',
  420. body: datas.show_content || datas.content || ''
  421. })
  422. // 点击时桌面消息时触发
  423. notify.onclick = function () {
  424. try {
  425. getMsgBuoyActive.istoReaded(datas.id)
  426. notify.close()
  427. switch (getMsgBuoyActive.platformOS()) {
  428. case 'pc':
  429. location.href = '/swordfish/frontPage/messageCenter/sess/index'
  430. break;
  431. case 'work_bench':
  432. window.open('/swordfish/frontPage/messageCenter/sess/index')
  433. break;
  434. }
  435. } catch (e) {
  436. console.warn(e)
  437. }
  438. }
  439. } else {
  440. Notification.requestPermission(function () {
  441. sendNotification(datas)
  442. })
  443. }
  444. })
  445. } catch (e) {
  446. console.warn('不支持通知')
  447. }
  448. }
  449. // 定义 scoket 信息
  450. var pushMessageScoket = {
  451. url: "ws"+(!isIE9&&"https:"==document.location.protocol?"s":"")+"://"+window.location.host,
  452. init: function () {
  453. if (typeof CommonWebScoket === 'function') {
  454. this._scoket = new CommonWebScoket(this.url + '/webscoket/getBuoyMsg', '', {
  455. ajaxReq: function() {},
  456. reconnect: function (commom) {
  457. commom.isOver = true
  458. commom.over()
  459. },
  460. complete: function (data, type) {
  461. try {
  462. var pushMessage = JSON.parse(data)
  463. if (pushMessage.id) {
  464. sendNotification(pushMessage)
  465. }
  466. } catch (e) {
  467. console.warn(e)
  468. }
  469. }
  470. }).init()
  471. }
  472. }
  473. }
  474. // 初始化
  475. pushMessageScoket.init()
  476. }
  477. }
  478. // 初始化
  479. $(function () {
  480. try {
  481. // 尝试判断是否在iframe中
  482. if (!goTemplateData.inIframe) {
  483. getMsgBuoyActive.init()
  484. }
  485. } catch (error) {
  486. getMsgBuoyActive.init()
  487. }
  488. })