top-notice.vue 3.5 KB

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