top-notice.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <template>
  2. <el-popover placement="bottom"
  3. width="350"
  4. trigger="click">
  5. <el-tabs v-model="activeName" style="align-items: center" @tab-click="tabsHandle">
  6. <el-tab-pane label="未读"
  7. name="unread">
  8. </el-tab-pane>
  9. <el-tab-pane label="已读"
  10. name="read">
  11. </el-tab-pane>
  12. </el-tabs>
  13. <el-scrollbar style="height:300px">
  14. <avue-notice :data="data"
  15. :option="option"
  16. @click="goUrl"
  17. @page-change="pageChange"
  18. v-loading="loading"
  19. >
  20. </avue-notice>
  21. </el-scrollbar>
  22. <div slot="reference" @click="init">
  23. <el-badge :value="badge>99?'99+':badge">
  24. <i class="el-icon-bell"></i>
  25. </el-badge>
  26. </div>
  27. </el-popover>
  28. </template>
  29. <script>
  30. import { getMsgLogs , getMsgDetail,getMessage } from "@/api/logs";
  31. import { getToken } from "@/util/auth";
  32. export default {
  33. name: "top-notice",
  34. data () {
  35. return {
  36. activeName: 'unread',
  37. intercept: 'unread',
  38. option: {
  39. props: {
  40. img: 'img',
  41. title: 'messageBody',
  42. subtitle: 'createTime',
  43. tag: 'tag',
  44. status: 'messageType'
  45. },
  46. },
  47. data: [],
  48. unreadData: [], // 未读的
  49. readData: [], // 已读的
  50. path:"",
  51. socket:"",
  52. badge:'',
  53. loading: false
  54. }
  55. },
  56. created () {
  57. // this.webSocket();
  58. },
  59. mounted() {
  60. //60秒轮训消息
  61. window.setInterval(() => {
  62. setTimeout(() => {
  63. this.assistMessage(true)
  64. },0)
  65. },60000)
  66. this.path = "wss://trade.tubaosoft.com/api/blade-client/websocket?user=" + this.$store.getters.userInfo.user_id
  67. this.init();
  68. },
  69. methods: {
  70. //初始化
  71. init(){
  72. this.loading = true
  73. getMsgLogs().then(res=>{
  74. this.afterData(res.data.data)
  75. this.loading = false
  76. })
  77. if(typeof(WebSocket) === "undefined"){
  78. alert("您的浏览器不支持socket")
  79. }else{
  80. // 实例化socket
  81. this.socket = new WebSocket(this.path)
  82. // 监听socket连接
  83. this.socket.onopen = this.open
  84. // 监听socket错误信息
  85. this.socket.onerror = this.error
  86. // 监听socket消息
  87. this.socket.onmessage = this.getMessage
  88. this.assistMessage()
  89. }
  90. },
  91. open() {
  92. // console.log("socket连接成功")
  93. },
  94. error() {
  95. console.log("连接错误")
  96. },
  97. getMessage(msg){
  98. let msgData = JSON.parse(msg);
  99. if(msgData.data.unRead){
  100. this.badge = msgData.data.unReadNum
  101. }else{
  102. this.badge = ''
  103. }
  104. },
  105. send() {
  106. // this.socket.send(params)
  107. },
  108. close() {
  109. console.log("socket已经关闭")
  110. },
  111. assistMessage(type){
  112. // 判断是否有token
  113. if (getToken() !== undefined) {
  114. //辅助消息接口
  115. getMessage().then(res=>{
  116. if (type && res.data.unRead){
  117. this.onAudio()
  118. }
  119. this.getMessage(JSON.stringify(res))
  120. })
  121. }
  122. },
  123. onAudio() {
  124. let audio = new Audio(require('@/file/newNews.mp3'));
  125. audio.play();
  126. },
  127. goUrl(row){
  128. if(row.url){
  129. this.$router.push({
  130. path: row.url,
  131. query: {params:row.parameter},
  132. });
  133. // this.$router.push({name:'委托',params:row.parameter})
  134. }
  135. getMsgDetail(row.id).then(res=>{
  136. this.$set(row,"isRead",res.data.data.isRead)
  137. this.afterData(this.data)
  138. this.assistMessage()
  139. })
  140. },
  141. afterData(data){
  142. if(data.length === 0 ) return this.data = []
  143. if (this.activeName == 'unread') {
  144. this.unreadData = data.filter(item => item.isRead == 0)
  145. this.unreadData.forEach(item => {
  146. item.tag = "未读"
  147. item.messageType = 1//状态 0 灰色 1 蓝色 2 橙色 3 红色 4 绿色
  148. })
  149. this.data = this.unreadData
  150. } else {
  151. this.readData = data.filter(item => item.isRead != 0)
  152. this.readData.forEach(item => {
  153. item.tag = "已读"
  154. item.messageType = 0
  155. })
  156. this.data = this.readData
  157. }
  158. // this.data = data.map(item =>{
  159. // if(item.isRead == 0){
  160. // item.tag = "未读"
  161. // item.messageType = 1//状态 0 灰色 1 蓝色 2 橙色 3 红色 4 绿色
  162. // }else{
  163. // item.tag = "已读"
  164. // item.messageType = 0
  165. // }
  166. // return item
  167. // })
  168. },
  169. pageChange (page, done) {
  170. },
  171. tabsHandle(data) {
  172. if (this.intercept == data.name) return
  173. this.intercept = data.name
  174. this.loading = true;
  175. getMsgLogs().then(res=>{
  176. this.afterData(res.data.data)
  177. this.loading = false;
  178. })
  179. }
  180. }
  181. };
  182. </script>
  183. <style lang="scss" scoped>
  184. ::v-deep .avue-notice__more {
  185. display: none;
  186. }
  187. ::v-deep .avue-notice__title {
  188. display: flex;
  189. align-items: center;
  190. }
  191. ::v-deep .avue-notice__tag {
  192. margin-left: 15px;
  193. }
  194. </style>