hall.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <template>
  2. <div class="mainBox">
  3. <!--大厅 start------------------------------------------------------------>
  4. <div class="layerBox">
  5. <el-container style="height: 100vh;">
  6. <el-aside width="300px" style="background: #f2f2f2;">
  7. <el-menu>
  8. <div class="conversation-list">会话记录(100)</div>
  9. <el-menu-item
  10. v-for="conversation in conversations"
  11. :key="conversation.session_id"
  12. @click="selectConversation(conversation)"
  13. :class="{ 'is-active': activeConversation && activeConversation.session_id === conversation.session_id }">
  14. <div v-if="conversation.talk_type==1">
  15. <el-avatar :src=conversation.user_avatar>{{ conversation.nickname }}</el-avatar> {{ conversation.nickname }}
  16. </div>
  17. <div v-if="conversation.talk_type==2">
  18. <el-avatar :src=conversation.group_avatar>{{ conversation.group_name }}</el-avatar> {{ conversation.group_name }}
  19. </div>
  20. </el-menu-item>
  21. </el-menu>
  22. </el-aside>
  23. <el-container>
  24. <el-main style="padding: 20px;">
  25. <div v-if="activeConversation">
  26. <div v-for="(message, index) in activeConversation.messages" :key="index" class="message">
  27. <div v-if="message.is_me==1" :class="{'is_me':message.is_me==1}">
  28. {{ message.content }} <el-avatar :src=message.user_avatar>{{ message.nickname }}</el-avatar>
  29. </div>
  30. <div v-else>
  31. <el-avatar :src=message.user_avatar>{{ message.nickname }}</el-avatar>{{ message.content }}
  32. </div>
  33. </div>
  34. </div>
  35. <div v-else>
  36. 请选择一个会话
  37. </div>
  38. </el-main>
  39. <el-footer height="60px" style="padding: 10px; background: #fff;">
  40. <el-input
  41. v-model="newMessage"
  42. placeholder="输入消息..."
  43. @keyup.enter="sendMessage"
  44. style="width: calc(100% - 100px); margin-right: 10px;">
  45. </el-input>
  46. <el-button @click="sendMessage" type="primary">发送</el-button>
  47. </el-footer>
  48. </el-container>
  49. </el-container>
  50. </div>
  51. <!--大厅 end------------------------------------------------------------>
  52. </div>
  53. </template>
  54. <script>
  55. //引入公用样式
  56. import '@/styles/global.less';
  57. // 引入baseUrl
  58. import URL from '@/utils/baseUrl';
  59. export default {
  60. data() {
  61. return {
  62. activeConversation: null,
  63. newMessage: '',
  64. conversations: [
  65. ],
  66. ws: null
  67. };
  68. },
  69. methods: {
  70. selectConversation(conversation) {
  71. this.activeConversation = conversation;
  72. },
  73. sendMessage() {
  74. if (this.newMessage.trim() !== '') {
  75. //msg_type 消息类型 talk_type:聊天类型 1单聊 2群聊
  76. const message = {
  77. msg_type:1,
  78. talk_type:this.activeConversation.talk_type,
  79. content:this.newMessage,
  80. session_id:this.activeConversation.session_id,
  81. msg_type:1,
  82. receiver_id:this.activeConversation.user_id?this.activeConversation.user_id:this.activeConversation.group_id
  83. };
  84. // this.activeConversation.messages.push(message);
  85. console.log("发送消息",this.ws,WebSocket.OPEN)
  86. if (this.ws && this.ws.readyState === WebSocket.OPEN) {
  87. this.ws.send(JSON.stringify(message));
  88. }
  89. this.newMessage = '';
  90. }
  91. },
  92. handleIncomingMessage(event) {
  93. const message = JSON.parse(event.data);
  94. console.log("监听消息:",message)
  95. const conversation = this.conversations.find(conv => conv.session_id === message.session_id); // 假设所有消息都发送给Alice
  96. if (conversation) {
  97. conversation.messages.push(message);
  98. }
  99. },
  100. //获取会话列表
  101. getTalkSessionList(){
  102. let parames = {
  103. 'page':1,
  104. 'pageSize':10
  105. }
  106. // this.$api.chat.getTalkSessionList(parames).then(res=>{
  107. // this.conversations = res.data.row
  108. // });
  109. this.$store.dispatch('chat/getTalkSessionList',parames).then(res=> {
  110. this.conversations = res.data.row
  111. }).catch(() => {
  112. this.$message({
  113. type: 'info',
  114. message: '获取聊天记录失败!'
  115. });
  116. })
  117. },
  118. },
  119. mounted() {
  120. //1.获取admin-token
  121. const adminToken = document.cookie.split('; ').find(row => row.startsWith('Admin-Token=')).split('=')[1];
  122. //console.log("Admin-Token:", adminToken);
  123. //2.连接websocket
  124. let websocketNewUrl = URL.WebsocketUrl +"?token=" + adminToken;
  125. this.ws = new WebSocket(websocketNewUrl);
  126. this.ws.addEventListener('message', this.handleIncomingMessage);
  127. this.ws.addEventListener('close', function (event) {
  128. // 连接关闭时执行的操作
  129. console.log("关闭链接",event)
  130. });
  131. this.getTalkSessionList()
  132. },
  133. beforeDestroy() {
  134. if (this.ws) {
  135. this.ws.removeEventListener('message', this.handleIncomingMessage);
  136. this.ws.close();
  137. }
  138. }
  139. };
  140. </script>
  141. <style scoped lang="less">
  142. .layerBoxNoBg {
  143. padding: 30px 0 0 0;
  144. }
  145. //表单微调 start------------------------------------------------------------>*/
  146. ::v-deep .custom-form-item > .el-form-item__label {
  147. line-height: 140px !important;
  148. }
  149. ::v-deep .custom-textarea .el-textarea__inner {
  150. resize: none; /* 禁止用拖拽调整大小 */
  151. }
  152. ::v-deep .custom-align-right .el-form-item__label {
  153. text-align: right; /* 设置标签文字右对齐 */
  154. }
  155. ::v-deep .el-select-group__title {
  156. color: #909399;
  157. }
  158. ::v-deep .el-select {
  159. width: 100% !important;
  160. }
  161. </style>