top-notice.vue 5.5 KB

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