top-notice.vue 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  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">
  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. export default {
  32. name: "top-notice",
  33. data () {
  34. return {
  35. activeName: 'unread',
  36. intercept: 'unread',
  37. option: {
  38. props: {
  39. img: 'img',
  40. title: 'messageBody',
  41. subtitle: 'createTime',
  42. tag: 'tag',
  43. status: 'messageType'
  44. },
  45. },
  46. data: [],
  47. unreadData: [], // 未读的
  48. readData: [], // 已读的
  49. path:"",
  50. socket:"",
  51. badge:'',
  52. loading: false
  53. }
  54. },
  55. created () {
  56. // this.webSocket();
  57. },
  58. mounted() {
  59. //60秒轮训消息
  60. window.setInterval(() => {
  61. setTimeout(() => {
  62. this.assistMessage()
  63. },0)
  64. },60000)
  65. this.path = "wss://trade.tubaosoft.com/api/blade-client/websocket?user=" + this.$store.getters.userInfo.user_id
  66. this.init();
  67. },
  68. methods: {
  69. //初始化
  70. init(){
  71. this.loading = true
  72. getMsgLogs().then(res=>{
  73. this.afterData(res.data.data)
  74. this.loading = false
  75. })
  76. if(typeof(WebSocket) === "undefined"){
  77. alert("您的浏览器不支持socket")
  78. }else{
  79. // 实例化socket
  80. this.socket = new WebSocket(this.path)
  81. // 监听socket连接
  82. this.socket.onopen = this.open
  83. // 监听socket错误信息
  84. this.socket.onerror = this.error
  85. // 监听socket消息
  86. this.socket.onmessage = this.getMessage
  87. this.assistMessage()
  88. }
  89. },
  90. open() {
  91. // console.log("socket连接成功")
  92. },
  93. error() {
  94. console.log("连接错误")
  95. },
  96. getMessage(msg){
  97. let msgData = JSON.parse(msg);
  98. if(msgData.data.unRead){
  99. this.badge = msgData.data.unReadNum
  100. }else{
  101. this.badge = ''
  102. }
  103. },
  104. send() {
  105. // this.socket.send(params)
  106. },
  107. close() {
  108. console.log("socket已经关闭")
  109. },
  110. assistMessage(){
  111. //辅助消息接口
  112. getMessage().then(res=>{
  113. this.getMessage(JSON.stringify(res))
  114. })
  115. },
  116. goUrl(row){
  117. if(row.url){
  118. this.$router.push({
  119. path: row.url,
  120. query: {params:row.parameter},
  121. });
  122. }
  123. getMsgDetail(row.id).then(res=>{
  124. this.$set(row,"isRead",res.data.data.isRead)
  125. this.afterData(this.data)
  126. this.assistMessage()
  127. })
  128. },
  129. afterData(data){
  130. if(data.length === 0 ) return this.data = []
  131. if (this.activeName == 'unread') {
  132. this.unreadData = data.filter(item => item.isRead == 0)
  133. this.unreadData.forEach(item => {
  134. item.tag = "未读"
  135. item.messageType = 1//状态 0 灰色 1 蓝色 2 橙色 3 红色 4 绿色
  136. })
  137. this.data = this.unreadData
  138. } else {
  139. this.readData = data.filter(item => item.isRead != 0)
  140. this.readData.forEach(item => {
  141. item.tag = "已读"
  142. item.messageType = 0
  143. })
  144. this.data = this.readData
  145. }
  146. // this.data = data.map(item =>{
  147. // if(item.isRead == 0){
  148. // item.tag = "未读"
  149. // item.messageType = 1//状态 0 灰色 1 蓝色 2 橙色 3 红色 4 绿色
  150. // }else{
  151. // item.tag = "已读"
  152. // item.messageType = 0
  153. // }
  154. // return item
  155. // })
  156. },
  157. pageChange (page, done) {
  158. },
  159. tabsHandle(data) {
  160. if (this.intercept == data.name) return
  161. this.intercept = data.name
  162. this.loading = true;
  163. getMsgLogs().then(res=>{
  164. this.afterData(res.data.data)
  165. this.loading = false;
  166. })
  167. }
  168. }
  169. };
  170. </script>
  171. <style lang="scss" scoped>
  172. ::v-deep .avue-notice__more {
  173. display: none;
  174. }
  175. ::v-deep .avue-notice__title {
  176. display: flex;
  177. align-items: center;
  178. }
  179. ::v-deep .avue-notice__tag {
  180. margin-left: 15px;
  181. }
  182. </style>