top-notice.vue 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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()
  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(){
  112. // 判断是否有token
  113. if (getToken() !== undefined) {
  114. //辅助消息接口
  115. getMessage().then(res=>{
  116. this.getMessage(JSON.stringify(res))
  117. })
  118. }
  119. },
  120. goUrl(row){
  121. if(row.url){
  122. this.$router.push({
  123. path: row.url,
  124. query: {params:row.parameter},
  125. });
  126. // this.$router.push({name:'委托',params:row.parameter})
  127. }
  128. getMsgDetail(row.id).then(res=>{
  129. this.$set(row,"isRead",res.data.data.isRead)
  130. this.afterData(this.data)
  131. this.assistMessage()
  132. })
  133. },
  134. afterData(data){
  135. if(data.length === 0 ) return this.data = []
  136. if (this.activeName == 'unread') {
  137. this.unreadData = data.filter(item => item.isRead == 0)
  138. this.unreadData.forEach(item => {
  139. item.tag = "未读"
  140. item.messageType = 1//状态 0 灰色 1 蓝色 2 橙色 3 红色 4 绿色
  141. })
  142. this.data = this.unreadData
  143. } else {
  144. this.readData = data.filter(item => item.isRead != 0)
  145. this.readData.forEach(item => {
  146. item.tag = "已读"
  147. item.messageType = 0
  148. })
  149. this.data = this.readData
  150. }
  151. // this.data = data.map(item =>{
  152. // if(item.isRead == 0){
  153. // item.tag = "未读"
  154. // item.messageType = 1//状态 0 灰色 1 蓝色 2 橙色 3 红色 4 绿色
  155. // }else{
  156. // item.tag = "已读"
  157. // item.messageType = 0
  158. // }
  159. // return item
  160. // })
  161. },
  162. pageChange (page, done) {
  163. },
  164. tabsHandle(data) {
  165. if (this.intercept == data.name) return
  166. this.intercept = data.name
  167. this.loading = true;
  168. getMsgLogs().then(res=>{
  169. this.afterData(res.data.data)
  170. this.loading = false;
  171. })
  172. }
  173. }
  174. };
  175. </script>
  176. <style lang="scss" scoped>
  177. ::v-deep .avue-notice__more {
  178. display: none;
  179. }
  180. ::v-deep .avue-notice__title {
  181. display: flex;
  182. align-items: center;
  183. }
  184. ::v-deep .avue-notice__tag {
  185. margin-left: 15px;
  186. }
  187. </style>