Browse Source

修改聊天记录

zs 1 year ago
parent
commit
4471f63033

+ 66 - 0
package-lock.json

@@ -23,6 +23,7 @@
         "@midwayjs/swagger": "^3.13.7",
         "@midwayjs/typegoose": "^3.0.0",
         "@midwayjs/validate": "^3.12.0",
+        "@midwayjs/ws": "^3.15.8",
         "@typegoose/typegoose": "^9.0.0",
         "crypto-js": "^4.2.0",
         "dayjs": "^1.11.10",
@@ -2347,6 +2348,38 @@
       "integrity": "sha512-6lBJYkyKPOZKJwa1LzytUItQmNKEDqLkoQoQrnNJirtEKaSh1ajJcIAOaJ9YITBwNc2qEyn/J40H2hKfH4PQHw==",
       "dev": true
     },
+    "node_modules/@midwayjs/ws": {
+      "version": "3.15.8",
+      "resolved": "https://registry.npmmirror.com/@midwayjs/ws/-/ws-3.15.8.tgz",
+      "integrity": "sha512-Q8wBs5OwFbXpRi34cVShJrNCgAM2UIFe1KybNBJCmUGQSyc3Kj+mMz7Y/cKne1jP8cTZhFNwmt8iMG88yZfFaA==",
+      "dependencies": {
+        "@types/ws": "8.5.10",
+        "ws": "8.16.0"
+      },
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/@midwayjs/ws/node_modules/ws": {
+      "version": "8.16.0",
+      "resolved": "https://registry.npmmirror.com/ws/-/ws-8.16.0.tgz",
+      "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "peerDependencies": {
+        "bufferutil": "^4.0.1",
+        "utf-8-validate": ">=5.0.2"
+      },
+      "peerDependenciesMeta": {
+        "bufferutil": {
+          "optional": true
+        },
+        "utf-8-validate": {
+          "optional": true
+        }
+      }
+    },
     "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
       "version": "3.0.2",
       "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz",
@@ -3461,6 +3494,14 @@
         "@types/webidl-conversions": "*"
       }
     },
+    "node_modules/@types/ws": {
+      "version": "8.5.10",
+      "resolved": "https://registry.npmmirror.com/@types/ws/-/ws-8.5.10.tgz",
+      "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
     "node_modules/@types/yargs": {
       "version": "17.0.32",
       "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.32.tgz",
@@ -12179,6 +12220,23 @@
       "integrity": "sha512-6lBJYkyKPOZKJwa1LzytUItQmNKEDqLkoQoQrnNJirtEKaSh1ajJcIAOaJ9YITBwNc2qEyn/J40H2hKfH4PQHw==",
       "dev": true
     },
+    "@midwayjs/ws": {
+      "version": "3.15.8",
+      "resolved": "https://registry.npmmirror.com/@midwayjs/ws/-/ws-3.15.8.tgz",
+      "integrity": "sha512-Q8wBs5OwFbXpRi34cVShJrNCgAM2UIFe1KybNBJCmUGQSyc3Kj+mMz7Y/cKne1jP8cTZhFNwmt8iMG88yZfFaA==",
+      "requires": {
+        "@types/ws": "8.5.10",
+        "ws": "8.16.0"
+      },
+      "dependencies": {
+        "ws": {
+          "version": "8.16.0",
+          "resolved": "https://registry.npmmirror.com/ws/-/ws-8.16.0.tgz",
+          "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
+          "requires": {}
+        }
+      }
+    },
     "@msgpackr-extract/msgpackr-extract-darwin-arm64": {
       "version": "3.0.2",
       "resolved": "https://registry.npmmirror.com/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.2.tgz",
@@ -13133,6 +13191,14 @@
         "@types/webidl-conversions": "*"
       }
     },
+    "@types/ws": {
+      "version": "8.5.10",
+      "resolved": "https://registry.npmmirror.com/@types/ws/-/ws-8.5.10.tgz",
+      "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
+      "requires": {
+        "@types/node": "*"
+      }
+    },
     "@types/yargs": {
       "version": "17.0.32",
       "resolved": "https://registry.npmmirror.com/@types/yargs/-/yargs-17.0.32.tgz",

+ 1 - 0
package.json

@@ -18,6 +18,7 @@
     "@midwayjs/swagger": "^3.13.7",
     "@midwayjs/typegoose": "^3.0.0",
     "@midwayjs/validate": "^3.12.0",
+    "@midwayjs/ws": "^3.15.8",
     "@typegoose/typegoose": "^9.0.0",
     "crypto-js": "^4.2.0",
     "dayjs": "^1.11.10",

+ 4 - 0
src/config/config.default.ts

@@ -26,4 +26,8 @@ export default {
       },
     },
   },
+  webSocket: {
+    serverHeartbeatInterval: 30000,
+    enableServerHeartbeatCheck: true,
+  },
 } as MidwayConfig;

+ 4 - 2
src/configuration.ts

@@ -5,6 +5,7 @@ import * as info from '@midwayjs/info';
 import { join } from 'path';
 import * as FreeFrame from 'free-midway-component';
 import * as jwt from '@midwayjs/jwt';
+import * as ws from '@midwayjs/ws';
 import { VerifyTokenInit } from './decorator/verifyToken.decorator';
 import { CheckPermissionCodeInit } from './decorator/checkPermissionCode';
 import * as swagger from '@midwayjs/swagger';
@@ -23,6 +24,7 @@ import { DBService } from './service/db.service';
     validate,
     FreeFrame,
     jwt,
+    ws,
     redis,
     i18n,
     bull,
@@ -56,7 +58,7 @@ export class MainConfiguration {
   async onServerReady?(container: IMidwayContainer, app: IMidwayApplication) {
     // 初始化es
     const esService = await container.getAsync(ElasticsearchService);
-    await esService.preparMapping();
-    await container.getAsync(DBService);
+    // await esService.preparMapping();
+    // await container.getAsync(DBService);
   }
 }

+ 10 - 1
src/controller/platform/chat.controller.ts

@@ -1,7 +1,7 @@
 import { Body, Controller, Del, Get, Inject, Param, Post, Query } from '@midwayjs/decorator';
 import { BaseController } from 'free-midway-component';
 import { ChatService } from '../../service/platform/chat.service';
-import { CDTO_chat, CVO_chat, FVO_chat, QDTO_chat, QVO_chat, UDTO_chat, UVAO_chat } from '../../interface/platform/chat.interface';
+import { CDTO_chat, CVO_chat, FVO_chat, QVO_chat, UDTO_chat, UVAO_chat } from '../../interface/platform/chat.interface';
 import { ApiResponse, ApiTags, ApiQuery } from '@midwayjs/swagger';
 import { Validate } from '@midwayjs/validate';
 @ApiTags(['聊天记录'])
@@ -16,8 +16,10 @@ export class ChatController extends BaseController {
   async create(@Body() data: CDTO_chat) {
     const dbData = await this.service.create(data);
     const result = new CVO_chat(dbData);
+    await this.service.createAfter(result);
     return result;
   }
+
   @Get('/')
   @ApiQuery({ name: 'query' })
   @ApiResponse({ type: QVO_chat })
@@ -26,6 +28,13 @@ export class ChatController extends BaseController {
     return list;
   }
 
+  @Get('/read')
+  @ApiQuery({ name: 'query' })
+  async user(@Query() filter: any) {
+    const result = await this.service.read(filter);
+    return result;
+  }
+
   @Get('/chat')
   @ApiQuery({ name: 'query' })
   async chat(@Query() filter) {

+ 29 - 0
src/service/platform/chat.service.ts

@@ -1,4 +1,6 @@
 import { Provide } from '@midwayjs/decorator';
+import { App } from '@midwayjs/core';
+import { Application } from '@midwayjs/ws';
 import { InjectEntityModel } from '@midwayjs/typegoose';
 import { ReturnModelType } from '@typegoose/typegoose';
 import { BaseService } from 'free-midway-component';
@@ -11,9 +13,22 @@ export class ChatService extends BaseService<modelType> {
   @InjectEntityModel(Chat)
   model: modelType;
 
+  @App('webSocket')
+  wsApp: Application;
+
   @InjectEntityModel(User)
   uModel: ReturnModelType<typeof User>;
 
+  // 实时发送消息
+  async createAfter(body) {
+    const sender = await this.uModel.findById(body.sender_id).lean();
+    const receiver = await this.uModel.findById(body.receiver_id).lean();
+    const data = { sender_url: get(sender, 'icon'), sender_name: get(sender, 'nick_name'), receiver_url: get(receiver, 'icon'), receiver_name: get(receiver, 'nick_name'), ...body };
+    this.wsApp.clients.forEach(ws => {
+      ws.send(JSON.stringify(data));
+    });
+  }
+
   // 聊天
   async chat(filter) {
     const user = this.ctx.user;
@@ -34,6 +49,7 @@ export class ChatService extends BaseService<modelType> {
           send_time: val.send_time,
           content: val.content,
           type: val.type,
+          is_read: val.is_read,
         });
       }
     }
@@ -66,4 +82,17 @@ export class ChatService extends BaseService<modelType> {
     }
     return data;
   }
+
+  // 该用户全部已读
+  async read(filter) {
+    const { sender_id, receiver_id } = filter;
+    const list: any = await this.model.find({ $or: [{ $and: [{ sender_id }, { receiver_id }] }, { $and: [{ sender_id: receiver_id }, { receiver_id: sender_id }] }] }).lean();
+    const chat = list.map(i => {
+      return i._id;
+    });
+    for (const val of chat) {
+      await this.model.updateOne({ _id: val }, { is_read: '1' });
+    }
+    return 'ok';
+  }
 }

+ 19 - 0
src/socket/socket.controller.ts

@@ -0,0 +1,19 @@
+import { WSController, OnWSConnection, OnWSMessage, Inject } from '@midwayjs/core';
+import { Context } from '@midwayjs/ws';
+import * as http from 'http';
+
+@WSController()
+export class SocketController {
+  @Inject()
+  ctx: Context;
+
+  @OnWSConnection()
+  async onConnectionMethod(socket: Context, request: http.IncomingMessage) {
+    console.log(`namespace / got a connection ${this.ctx.readyState}`);
+  }
+
+  @OnWSMessage('message')
+  async gotMessage(data) {
+    return { name: '检测心跳', result: data };
+  }
+}