diff --git a/QuestionLibraryMQConsumer/Entities/Book.cs b/QuestionLibraryMQConsumer/Entities/Book.cs index 48d5b7f..67a1d60 100644 --- a/QuestionLibraryMQConsumer/Entities/Book.cs +++ b/QuestionLibraryMQConsumer/Entities/Book.cs @@ -13,6 +13,11 @@ namespace QuestionLibraryMQConsumer.Entities [SugarTable("book")] public partial class Book : SqlSugarBaseEntity { + public Book() + { + + + } /// /// Desc:主键id /// Default: @@ -34,7 +39,7 @@ namespace QuestionLibraryMQConsumer.Entities /// Default: /// Nullable:False /// - [SugarColumn(ColumnName = "totalpage")] + [SugarColumn(ColumnName = "totalPage")] public int TotalPage { get; set; } /// @@ -42,7 +47,7 @@ namespace QuestionLibraryMQConsumer.Entities /// Default: /// Nullable:False /// - [SugarColumn(ColumnName = "verifypage")] + [SugarColumn(ColumnName = "verifyPage")] public int VerifyPage { get; set; } /// @@ -58,7 +63,7 @@ namespace QuestionLibraryMQConsumer.Entities /// Default: /// Nullable:True /// - [SugarColumn(ColumnName = "pdfurl")] + [SugarColumn(ColumnName = "pdfUrl")] public string PdfUrl { get; set; } /// @@ -106,7 +111,7 @@ namespace QuestionLibraryMQConsumer.Entities /// Default: /// Nullable:True /// - [SugarColumn(ColumnName = "backcover")] + [SugarColumn(ColumnName = "backCover")] public string BackCover { get; set; } /// @@ -114,7 +119,7 @@ namespace QuestionLibraryMQConsumer.Entities /// Default: /// Nullable:True /// - [SugarColumn(ColumnName = "pdfpreviewurl")] + [SugarColumn(ColumnName = "pdfPreviewUrl")] public string PdfPreviewUrl { get; set; } /// @@ -130,7 +135,7 @@ namespace QuestionLibraryMQConsumer.Entities /// Default: /// Nullable:True /// - [SugarColumn(ColumnName = "downloadbookpagepdfname")] + [SugarColumn(ColumnName = "downloadBookPagePdfName")] public string Downloadbookpagepdfname { get; set; } /// @@ -138,7 +143,7 @@ namespace QuestionLibraryMQConsumer.Entities /// Default:b'0' /// Nullable:False /// - [SugarColumn(ColumnName = "is_deleted")] + [SugarColumn(ColumnName = "isDeleted")] public bool IsDeleted { get; set; } /// @@ -146,7 +151,7 @@ namespace QuestionLibraryMQConsumer.Entities /// Default: /// Nullable:True /// - [SugarColumn(ColumnName = "created_by")] + [SugarColumn(ColumnName = "createdBy")] public long? CreatedBy { get; set; } /// @@ -154,7 +159,7 @@ namespace QuestionLibraryMQConsumer.Entities /// Default: /// Nullable:False /// - [SugarColumn(ColumnName = "created_time")] + [SugarColumn(ColumnName = "createdTime")] public DateTime CreatedTime { get; set; } /// @@ -162,7 +167,7 @@ namespace QuestionLibraryMQConsumer.Entities /// Default: /// Nullable:True /// - [SugarColumn(ColumnName = "updated_by")] + [SugarColumn(ColumnName = "updatedBy")] public long? UpdatedBy { get; set; } /// @@ -170,7 +175,7 @@ namespace QuestionLibraryMQConsumer.Entities /// Default: /// Nullable:True /// - [SugarColumn(ColumnName = "updated_time")] + [SugarColumn(ColumnName = "updatedTime")] public DateTime? UpdatedTime { get; set; } /// @@ -194,7 +199,8 @@ namespace QuestionLibraryMQConsumer.Entities /// Default: /// Nullable:True /// - [SugarColumn(ColumnName = "source_id")] + [SugarColumn(ColumnName = "sourceId")] public long SourceId { get; set; } + } } diff --git a/QuestionLibraryMQConsumer/Entities/OtherSystem.cs b/QuestionLibraryMQConsumer/Entities/OtherSystem.cs index 5c5f1b6..8cb74f9 100644 --- a/QuestionLibraryMQConsumer/Entities/OtherSystem.cs +++ b/QuestionLibraryMQConsumer/Entities/OtherSystem.cs @@ -11,7 +11,7 @@ namespace QuestionLibraryMQConsumer.Entities ///其他系统 /// [SugarTable("other_system")] - public partial class OtherSystem : SqlSugarBaseEntity + public partial class OtherSystem { /// /// Desc:主键id diff --git a/QuestionLibraryMQConsumer/Handlers/BookCreatedHandler.cs b/QuestionLibraryMQConsumer/Handlers/BookCreatedHandler.cs index 7bdd759..3add96d 100644 --- a/QuestionLibraryMQConsumer/Handlers/BookCreatedHandler.cs +++ b/QuestionLibraryMQConsumer/Handlers/BookCreatedHandler.cs @@ -1,4 +1,6 @@ -using QuestionLibraryMQConsumer.Data; +using Microsoft.Extensions.Options; +using QuestionLibraryMQConsumer.Configuration; +using QuestionLibraryMQConsumer.Data; using QuestionLibraryMQConsumer.Entities; using QuestionLibraryMQConsumer.Models; using QuestionLibraryMQConsumer.Services; @@ -6,6 +8,7 @@ using RabbitMQ.Client; using System; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Text; using System.Text.Json; using System.Threading.Tasks; @@ -22,19 +25,26 @@ namespace QuestionLibraryMQConsumer.Handlers private readonly ILogger _logger; private readonly QuestionLibraryDb _db; private readonly IOssService _ossService; + private readonly string _routingKey; - public string RoutingKey => "questionLibrary.book.created"; + public string RoutingKey => _routingKey; public Type MessageType => typeof(BookCreatedMessage); public bool RequiresManualAck => false; public BookCreatedHandler( ILogger logger, QuestionLibraryDb db, - IOssService ossService) + IOssService ossService, + IOptions rabbitMqOptions) { _logger = logger; _db = db; _ossService = ossService; + + var handlerTypeName = nameof(BookCreatedHandler); + _routingKey = rabbitMqOptions.Value.Queues + .FirstOrDefault(q => q.HandlerType == handlerTypeName) + ?.RoutingKey ?? string.Empty; } public async Task HandleJsonAsync(string messageJson, CancellationToken cancellationToken) @@ -86,17 +96,20 @@ namespace QuestionLibraryMQConsumer.Handlers if (!string.IsNullOrEmpty(pdfUrl)) { - copyTasks.Add(CopyUrlAsync("PdfUrl", pdfUrl, otherSystem, newUrl => pdfUrl = newUrl, cancellationToken)); + var pdfExt = Path.GetExtension(pdfUrl); + copyTasks.Add(CopyUrlAsync("PdfUrl", pdfUrl, $"book/{message.BookId}/book{pdfExt}", otherSystem, newUrl => pdfUrl = newUrl, cancellationToken)); } if (!string.IsNullOrEmpty(coverUrl)) { - copyTasks.Add(CopyUrlAsync("CoverUrl", coverUrl, otherSystem, newUrl => coverUrl = newUrl, cancellationToken)); + var coverExt = Path.GetExtension(coverUrl); + copyTasks.Add(CopyUrlAsync("CoverUrl", coverUrl, $"book/{message.BookId}/cover{coverExt}", otherSystem, newUrl => coverUrl = newUrl, cancellationToken)); } if (!string.IsNullOrEmpty(backCoverUrl)) { - copyTasks.Add(CopyUrlAsync("BackCoverUrl", backCoverUrl, otherSystem, newUrl => backCoverUrl = newUrl, cancellationToken)); + var backCoverExt = Path.GetExtension(backCoverUrl); + copyTasks.Add(CopyUrlAsync("BackCoverUrl", backCoverUrl, $"book/{message.BookId}/backCover{backCoverExt}", otherSystem, newUrl => backCoverUrl = newUrl, cancellationToken)); } if (copyTasks.Count > 0) @@ -130,11 +143,11 @@ namespace QuestionLibraryMQConsumer.Handlers _logger.LogInformation("书籍 {BookId} 创建成功", message.BookId); } - private async Task CopyUrlAsync(string fieldName, string originalPath, OtherSystem otherSystem, Action setNewPath, CancellationToken cancellationToken) + private async Task CopyUrlAsync(string fieldName, string originalPath, string targetPath, OtherSystem otherSystem, Action setNewPath, CancellationToken cancellationToken) { try { - var newPath = await _ossService.CopyToOwnBucketAsync(originalPath, otherSystem.BucketName, cancellationToken); + var newPath = await _ossService.CopyToOwnBucketAsync(originalPath, otherSystem.BucketName, targetPath, cancellationToken); setNewPath(newPath); _logger.LogInformation("{FieldName} OSS复制成功: {OriginalPath} -> {NewPath}", fieldName, originalPath, newPath); } diff --git a/QuestionLibraryMQConsumer/Services/IOssService.cs b/QuestionLibraryMQConsumer/Services/IOssService.cs index 9e9df8f..849a675 100644 --- a/QuestionLibraryMQConsumer/Services/IOssService.cs +++ b/QuestionLibraryMQConsumer/Services/IOssService.cs @@ -9,5 +9,5 @@ public interface IOssService /// 源bucket名称 /// 取消令牌 /// 复制后的新URL - Task CopyToOwnBucketAsync(string sourcePath, string sourceBucket, CancellationToken cancellationToken = default); + Task CopyToOwnBucketAsync(string sourcePath, string sourceBucket, string targetPath, CancellationToken cancellationToken = default); } diff --git a/QuestionLibraryMQConsumer/Services/OssService.cs b/QuestionLibraryMQConsumer/Services/OssService.cs index 55a7f81..679671e 100644 --- a/QuestionLibraryMQConsumer/Services/OssService.cs +++ b/QuestionLibraryMQConsumer/Services/OssService.cs @@ -18,7 +18,7 @@ public class OssService : IOssService _ossOptions = ossOptions.Value; } - public async Task CopyToOwnBucketAsync(string sourcePath, string sourceBucket, CancellationToken cancellationToken = default) + public async Task CopyToOwnBucketAsync(string sourcePath, string sourceBucket, string targetPath, CancellationToken cancellationToken = default) { if (string.IsNullOrEmpty(sourcePath)) { @@ -34,13 +34,13 @@ public class OssService : IOssService var client = new OssClient(_ossOptions.Endpoint, _ossOptions.AccessKeyID, _ossOptions.AccessKeySecret); // 执行跨bucket复制 - var request = new CopyObjectRequest(sourceBucket, objectKey, _ossOptions.BucketName, objectKey); + var request = new CopyObjectRequest(sourceBucket, objectKey, _ossOptions.BucketName, targetPath); var result = client.CopyObject(request); _logger.LogInformation("OSS跨bucket复制成功: {SourceBucket}/{ObjectKey} -> {TargetBucket}/{TargetKey}, ETag: {ETag}", - sourceBucket, objectKey, _ossOptions.BucketName, objectKey, result.ETag); + sourceBucket, objectKey, _ossOptions.BucketName, targetPath, result.ETag); - return objectKey; + return targetPath; } catch (Exception ex) { diff --git a/QuestionLibraryMQConsumer/appsettings.json b/QuestionLibraryMQConsumer/appsettings.json index 1e1384f..fc8ed78 100644 --- a/QuestionLibraryMQConsumer/appsettings.json +++ b/QuestionLibraryMQConsumer/appsettings.json @@ -10,25 +10,10 @@ "PrefetchCount": 10, "Queues": [ { - "QueueName": "questionLibrary.book.created.queue", - "ExchangeName": "icr.direct", - "RoutingKey": "questionLibrary.book.created", - "Durable": true, - "Exclusive": false, - "AutoDelete": false - }, - { - "QueueName": "questionLibrary.book.created.queue", - "ExchangeName": "question.library.exchange.dev", - "RoutingKey": "questionLibrary.book.created", - "Durable": true, - "Exclusive": false, - "AutoDelete": false - }, - { - "QueueName": "questionLibrary.book.created.queue", - "ExchangeName": "question.library.exchange", - "RoutingKey": "questionLibrary.book.created", + "QueueName": "mq.book.push", + "ExchangeName": "ex.book.direct", + "RoutingKey": "rk.book.push", + "HandlerType": "BookCreatedHandler", "Durable": true, "Exclusive": false, "AutoDelete": false