lrf 1 년 전
부모
커밋
6c900852ca

+ 4 - 0
package.json

@@ -11,11 +11,14 @@
     "@midwayjs/jwt": "^3.8.0",
     "@midwayjs/koa": "^3.12.0",
     "@midwayjs/logger": "^2.14.0",
+    "@midwayjs/rabbitmq": "^3.12.3",
     "@midwayjs/redis": "^3.9.0",
     "@midwayjs/swagger": "^3.12.7",
     "@midwayjs/typegoose": "^3.0.0",
     "@midwayjs/validate": "^3.12.0",
     "@typegoose/typegoose": "^9.0.0",
+    "amqp-connection-manager": "^4.1.14",
+    "amqplib": "^0.10.3",
     "free-midway-component": "^1.0.43",
     "lodash": "^4.17.21",
     "mongoose": "^6.0.7"
@@ -23,6 +26,7 @@
   "devDependencies": {
     "@midwayjs/cli": "^2.0.0",
     "@midwayjs/mock": "^3.12.0",
+    "@types/amqplib": "^0.10.3",
     "@types/jest": "^29.2.0",
     "@types/jsonwebtoken": "^8.5.9",
     "@types/koa": "^2.13.4",

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

@@ -34,4 +34,7 @@ export default {
       db: 4,
     },
   },
+  rabbitmq: {
+    url: 'amqp://visit:visit@127.0.0.1/visit',
+  },
 } as MidwayConfig;

+ 4 - 4
src/configuration.ts

@@ -9,6 +9,7 @@ import * as redis from '@midwayjs/redis';
 import * as swagger from '@midwayjs/swagger';
 import * as jwt from '@midwayjs/jwt';
 import { VerifyTokenInit } from './decorator/verifyToken.decorator';
+import * as rabbitmq from '@midwayjs/rabbitmq';
 // 控制器执行前函数
 import { CheckTokenMiddleware } from './middleware/checkToken.middleware';
 @Configuration({
@@ -18,6 +19,7 @@ import { CheckTokenMiddleware } from './middleware/checkToken.middleware';
     FreeFrame,
     redis,
     jwt,
+    rabbitmq,
     {
       component: swagger,
       enabledEnvironment: ['local'],
@@ -35,12 +37,10 @@ export class MainConfiguration {
   @Inject()
   decoratorService: MidwayDecoratorService;
   async onReady() {
-    // add middleware
+    // 中间件
     this.app.useMiddleware([ReportMiddleware]);
     this.app.getMiddleware().insertFirst(CheckTokenMiddleware);
-    // add filter
-    // this.app.useFilter([NotFoundFilter, DefaultErrorFilter]);
-    // this.initVerifyTokenDecorator();
+    // 注解
     VerifyTokenInit(this.decoratorService);
   }
 }

+ 1 - 0
src/controller/chat.controller.ts

@@ -24,6 +24,7 @@ export class ChatController extends BaseController {
   @ApiResponse({ type: CVO_chat })
   async create(@Body() data: CDTO_chat) {
     const dbData = await this.service.create(data);
+    await this.service.sendMq(dbData);
     const result = new CVO_chat(dbData);
     return result;
   }

+ 1 - 1
src/controller/home.controller.ts

@@ -12,7 +12,7 @@ export class HomeController {
   utilService: UtilService;
   @Post('/util')
   async util(@Body() body: any) {
-    const res = await this.utilService.checkAccountIsSame('test', LoginType.ADMIN);
+    const res = await this.utilService.checkAccountIsSame('test', LoginType.Admin);
     return res;
   }
 }

+ 2 - 2
src/controller/menus.controller.ts

@@ -1,7 +1,7 @@
-import { Body, Controller, Del, Get, Inject, Param, Post, Query } from '@midwayjs/decorator';
+import { Body, Controller, Del, Get, Inject, Param, Post } from '@midwayjs/decorator';
 import { BaseController } from 'free-midway-component';
 import { MenusService } from '../service/menus.service';
-import { CDTO_menus, CVO_menus, FVO_menus, QDTO_menus, QVO_menus, UDTO_menus, UVAO_menus } from '../interface/menus.interface';
+import { CDTO_menus, CVO_menus, FVO_menus, QVO_menus, UDTO_menus, UVAO_menus } from '../interface/menus.interface';
 import { ApiResponse, ApiTags, ApiQuery } from '@midwayjs/swagger';
 import { Validate } from '@midwayjs/validate';
 import { verifyToken } from '../decorator/verifyToken.decorator';

+ 13 - 1
src/service/chat.service.ts

@@ -1,14 +1,26 @@
-import { Provide } from '@midwayjs/decorator';
+import { Inject, Provide } from '@midwayjs/decorator';
 import { InjectEntityModel } from '@midwayjs/typegoose';
 import { ReturnModelType } from '@typegoose/typegoose';
 import { BaseService, PageOptions, SearchBase } from 'free-midway-component';
 import { Chat } from '../entity/chat.entity';
 import { cloneDeep, get, head } from 'lodash';
+import { ChatMqService } from './chatMq.service';
 type modelType = ReturnModelType<typeof Chat>;
 @Provide()
 export class ChatService extends BaseService<modelType> {
   @InjectEntityModel(Chat)
   model: modelType;
+  @Inject()
+  chatMqService: ChatMqService;
+
+  async sendMq(data) {
+    // 队列: /${群组id}/${患者id}
+    const { group, patient } = data;
+    // 没有群组&患者id直接返回,无法构成队列
+    if (!(group && patient)) return;
+    const routingKey = `${group}_${patient}`;
+    await this.chatMqService.sendExMsg(routingKey, JSON.stringify(data));
+  }
 
   async query(filter: SearchBase, pageOptions: PageOptions = {}): Promise<Array<any>> {
     const dup = cloneDeep(filter.getFilter());

+ 52 - 0
src/service/chatMq.service.ts

@@ -0,0 +1,52 @@
+import { Provide, Scope, ScopeEnum, Init, Autoload, Destroy, Config } from '@midwayjs/core';
+import * as amqp from 'amqp-connection-manager';
+
+@Autoload()
+@Provide()
+@Scope(ScopeEnum.Singleton)
+export class ChatMqService {
+  private connection: amqp.AmqpConnectionManager;
+  private channelWrapper;
+  chName = 'chat';
+  exName = 'chatEx';
+
+  @Config('rabbitmq')
+  mqConfig;
+  @Init()
+  async connect() {
+    // 创建连接,你可以把配置放在 Config 中,然后注入进来
+    this.connection = await amqp.connect(this.mqConfig.url);
+    // 创建 channel
+    this.channelWrapper = this.connection.createChannel({
+      json: true,
+      setup: channel =>
+        Promise.all([
+          // 创建队列&交换机; 绑定他俩
+          channel.assertQueue(this.chName, { durable: true }),
+          channel.assertExchange(this.exName, 'direct', { durable: true }),
+          channel.bindQueue(this.chName, this.exName, '*'),
+          // channel.consume(this.chName, msg => this.reciveMsg(msg), { noAck: true }),
+        ]),
+    });
+  }
+
+  // 发送消息
+  public async sendToQueue(queueName: string, data: any) {
+    return this.channelWrapper.sendToQueue(queueName, data);
+  }
+
+  // 向交换机发送消息
+  async sendExMsg(routingKey: string, data: any) {
+    this.channelWrapper.publish(this.exName, routingKey, Buffer.from(data));
+  }
+  // 测试,自产自销,前端使用前,连消费者也产生出来,看看好不好使,好使了在注释掉.
+  async reciveMsg(msg) {
+    console.log(msg);
+  }
+
+  @Destroy()
+  async close() {
+    await this.channelWrapper.close();
+    await this.connection.close();
+  }
+}