Message.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. const template=`
  2. <el-popover placement="bottom" :width="310" trigger="hover" @show="readMessage()">
  3. <template #reference>
  4. <div class="toolBar-dropdown" style="padding: 0 15px;">
  5. <el-badge :value="total" class="font-size-icon" :hidden="total===0">
  6. <i :class="['fa','fa-bell',total>0?'hava-message':'']"></i>
  7. </el-badge>
  8. </div>
  9. </template>
  10. <el-tabs v-model="activeName" v-if="list" @tab-change="changeTabs">
  11. <template v-for="(item,index) in list">
  12. <el-tab-pane :label="item.title+'('+item.list.length+')'" :name="index.toString()">
  13. <div class="message-list" v-if="item.list.length>0">
  14. <div class="message-item" v-for="msg in item.list" :style="formateStyle(msg.style)">
  15. <i :class="msg.icon+' message-icon'"></i>
  16. <div class="message-content">
  17. <span class="message-title">{{msg.content}}</span>
  18. <div class="message-bottom">
  19. <span @click="showMessage(msg)" class="message-show" v-if="msg.action">查看详情</span>
  20. <span class="message-date">{{formateTime(msg.createtime)}}</span>
  21. </div>
  22. </div>
  23. <div class="message-tag">
  24. <el-tag type="success" v-if="msg.is_read"><i class="fa fa-check"></i> 已读</el-tag>
  25. <el-tag type="danger" v-else><i class="fa fa-key"></i> 未读</el-tag>
  26. </div>
  27. </div>
  28. </div>
  29. <div class="message-empty" v-else>
  30. <img :src="imgFolder+'notdata.png'" alt="notData" />
  31. <div>暂无消息</div>
  32. </div>
  33. </el-tab-pane>
  34. </template>
  35. </el-tabs>
  36. </el-popover>
  37. `;
  38. import {rand} from '../../util.js'
  39. export default {
  40. name: "Message",
  41. data: function () {
  42. return {
  43. imgFolder:'',
  44. //消息总数
  45. total:0,
  46. activeName:'0',
  47. list:'',
  48. }
  49. },
  50. created:function (){
  51. this.imgFolder='/assets/img/';
  52. },
  53. mounted:function (){
  54. this.getMessage();
  55. },
  56. props:{
  57. },
  58. template:template,
  59. methods:{
  60. changeTabs:function (){
  61. this.readMessage();
  62. },
  63. readMessage:function (msg=''){
  64. //点击的时候之间阅读普通消息
  65. let ids=[];
  66. if(!msg){
  67. this.list[parseInt(this.activeName)].list.forEach(res=>{
  68. if(!res.action){
  69. res.is_read=true;
  70. ids.push(res.id);
  71. }
  72. });
  73. }else{
  74. msg.is_read=true;
  75. ids.push(msg.id);
  76. }
  77. if(ids.length===0){
  78. return;
  79. }
  80. Yunqi.ajax.post('ajax/message',{ids:ids},false,false).then(res=>{
  81. this.countMessage();
  82. });
  83. },
  84. //每5分钟执行一次
  85. getMessage:function (){
  86. Yunqi.ajax.get('ajax/message').then(res=>{
  87. this.list=res;
  88. this.countMessage();
  89. setTimeout(()=>{
  90. this.getMessage();
  91. },60*1000*5)
  92. });
  93. },
  94. showMessage:function (msg){
  95. if(msg.action=='link'){
  96. window.open(msg.url,"_blank");
  97. }
  98. if(msg.action=='tab'){
  99. Yunqi.api.addtabs(msg.options);
  100. }
  101. if(msg.action=='layer'){
  102. Yunqi.api.open(msg.options);
  103. }
  104. this.readMessage(msg);
  105. },
  106. countMessage:function (){
  107. let r=0;
  108. this.list.forEach(tab=>{
  109. tab.list.forEach(msg=>{
  110. if(msg.is_read==undefined){
  111. r++;
  112. }
  113. });
  114. });
  115. this.total=r;
  116. },
  117. formateStyle:function (style){
  118. return `color:var(--el-color-${style})`;
  119. },
  120. formateTime:function(timestamp) {
  121. timestamp=(new Date(timestamp+':00')).getTime();
  122. const now = new Date().getTime();
  123. const seconds = Math.floor((now - timestamp) / 1000);
  124. let interval = Math.floor(seconds / 31536000);
  125. if (interval >= 1) {
  126. return `${interval}年前`;
  127. }
  128. interval = Math.floor(seconds / 2592000);
  129. if (interval >= 1) {
  130. return `${interval}月前`;
  131. }
  132. interval = Math.floor(seconds / 86400);
  133. if (interval >= 1) {
  134. return `${interval}天前`;
  135. }
  136. interval = Math.floor(seconds / 3600);
  137. if (interval >= 1) {
  138. return `${interval}小时前`;
  139. }
  140. interval = Math.floor(seconds / 60);
  141. if (interval >= 1) {
  142. return `${interval}分钟前`;
  143. }
  144. return `${Math.floor(seconds)}秒前`;
  145. }
  146. }
  147. };