This commit is contained in:
xiaolipro 2025-07-03 16:23:45 +08:00
parent 9555a41107
commit d30bb18514
11 changed files with 252 additions and 11 deletions

View File

@ -1,16 +1,19 @@
FROM mcr.microsoft.com/dotnet/sdk:8.0.303 AS base
# 使用 SDK 镜像进行构建
FROM mcr.microsoft.com/dotnet/sdk:8.0.303 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY . /src
RUN dotnet restore "src/InterfaceForward.Api/InterfaceForward.Api.csproj"
WORKDIR "/src/src/InterfaceForward.Api"
RUN dotnet build "InterfaceForward.Api.csproj" -c $BUILD_CONFIGURATION -o /app/build
FROM base AS publish
ARG BUILD_CONFIGURATION=Release
# 仅复制必要的文件
COPY src/InterfaceForward.Api/InterfaceForward.Api.csproj src/InterfaceForward.Api/
RUN dotnet restore "src/InterfaceForward.Api/InterfaceForward.Api.csproj"
# 复制其余文件并进行构建
COPY . .
WORKDIR "/src/src/InterfaceForward.Api"
RUN dotnet publish "InterfaceForward.Api.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
FROM base AS final
# 使用运行时镜像
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "InterfaceForward.Api.dll"]
COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "InterfaceForward.Api.dll"]

View File

@ -1,5 +1,7 @@
using FreeRedis;
using Newtonsoft.Json;
using Serilog;
namespace InterfaceForward.Application.Helpers;
public static class RedisHelper
@ -24,7 +26,7 @@ public static class RedisHelper
_client.Serialize = obj => JsonConvert.SerializeObject(obj);
_client.Deserialize = (json, type) => JsonConvert.DeserializeObject(json, type);
if (showLogInfo)
_client.Notice += (s, e) => Console.WriteLine(Environment.NewLine + e.Log);
_client.Notice += (s, e) => Log.Information(Environment.NewLine + e.Log);
}
}
}

View File

@ -4,8 +4,11 @@ using Fake.EventBus.RabbitMQ;
using Fake.Modularity;
using Fake.ObjectMapping.AutoMapper;
using Fake.RabbitMQ;
using FreeRedis;
using InterfaceForward.Application.Contracts;
using InterfaceForward.Application.Helpers;
using InterfaceForward.Repositories;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace InterfaceForward.Application;
@ -28,6 +31,11 @@ public class InterfaceForwardApplicationModule:FakeModule
context.Services.Configure<InterfaceRelayOptions>(configuration.GetSection("InterfaceRelay"));
var options = configuration.GetSection("Redis").Get<ConnectionStringBuilder>();
if (options == null)
throw new FakeException("未找到Redis相关配置请检查配置文件中是否包含名为Redis的节点");
RedisHelper.Init(options, showLogInfo: System.Diagnostics.Debugger.IsAttached);
// 预热
NatashaInitializer.Preheating();

View File

@ -53,6 +53,18 @@ public class ServiceProviderInterfaceService : ApplicationService
return tree;
}
/// <summary>
/// 服务商接口分页列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("Interface/ServiceProviderInterfacePaginatedList")]
public async Task<PagedResult<ServiceProviderInterfacePaginatedOutputValueObject>>
ServiceProviderInterfacePaginatedListAsync(ServiceProviderInterfacePaginatedInputObjectValue input)
{
return await InterfaceRepository.GetServiceProviderInterfacePaginatedListAsync(input);
}
/// <summary>
/// 获取服务商接口下拉列表

View File

@ -45,6 +45,19 @@ public class SystemInterfaceService : ApplicationService
}
#endregion
/// <summary>
/// 系统接口分页列表
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("Interface/SystemInterfacePaginatedList")]
public async Task<PagedResult<SystemInterfacePaginatedOutputValueObject>>
SystemInterfacePaginatedListAsync(SystemInterfacePaginatedInputObjectValue input)
{
return await _interfaceRepository.GetSystemInterfacePaginatedListAsync(input);
}
/// <summary>
/// 系统接口树形列表

View File

@ -46,5 +46,8 @@ namespace InterfaceForward.Repositories.Interface.Services
/// <param name="spId"></param>
/// /// <returns></returns>
Task<string> GetCurrentCodeBySpId(int spId);
Task<PagedResult<SystemInterfacePaginatedOutputValueObject>> GetSystemInterfacePaginatedListAsync(SystemInterfacePaginatedInputObjectValue input);
Task<PagedResult<ServiceProviderInterfacePaginatedOutputValueObject>> GetServiceProviderInterfacePaginatedListAsync(ServiceProviderInterfacePaginatedInputObjectValue input);
}
}

View File

@ -131,4 +131,65 @@ public class InterfaceRepository : BasicRepository<InterfaceEntity>, IInterfaceR
return code;
}
/// <inheritdoc />
public async Task<PagedResult<SystemInterfacePaginatedOutputValueObject>>
GetSystemInterfacePaginatedListAsync(SystemInterfacePaginatedInputObjectValue input)
{
// t_interface驱动t_interface_map数据量上来可以在t_interface_map UpStreamId字段建立索引
var query = AsQueryable()
.LeftJoin<DictionaryEntity>((a, c) => a.Category == c.Id)
.LeftJoin<DictionaryEntity>((a, c, d) => (int)a.RequestProtocol == d.Id)
.LeftJoin<DictionaryEntity>((a, c, d, e) => a.RequestMethod == e.Id)
.Where(a => a.IsUpStream)
;
var keyword = input.NameOrCode?.Trim();
query.WhereIF(input.Category != 0, a => a.Category == input.Category) // 默认“请选择”对应0数据源在数据库字典中配置
.WhereIF(!string.IsNullOrEmpty(keyword), a => a.Name.Contains(keyword)
|| a.Code.Contains(keyword)) // 默认为空,支持模糊搜索
;
return await query.Select((a, c, d, e) => new SystemInterfacePaginatedOutputValueObject
{
Id = a.Id,
Category = c.Name,
Name = a.Name,
Code = a.Code,
RequestProtocol = d.Name,
Description = a.Description,
MapCount = SqlFunc.Subqueryable<InterfaceMapEntity>().Where(x => x.UpStreamId == a.Id && !x.IsDeleted)
.DistinctCount(x => x.ServiceProviderId),
UpdateTime = a.UpdateTime,
}).OrderByDescending(a => a.UpdateTime).ToPagedListAsync(input.PageIndex, input.PageSize);
}
/// <inheritdoc />
public async Task<PagedResult<ServiceProviderInterfacePaginatedOutputValueObject>>
GetServiceProviderInterfacePaginatedListAsync(ServiceProviderInterfacePaginatedInputObjectValue input)
{
var query = AsQueryable()
.LeftJoin<DictionaryEntity>((a, b) => (int)a.RequestProtocol == b.Id)
.LeftJoin<DictionaryEntity>((a, b, c) => a.RequestMethod == c.Id)
.Where(a => !a.IsUpStream)
.Where(a => a.ServiceProviderId == input.ServiceProviderId);
query
.WhereIF(!string.IsNullOrEmpty(input.Name), a => a.Name.Contains(input.Name!)) // 默认为空,支持模糊搜索
.WhereIF(!string.IsNullOrEmpty(input.Code), a => a.Code.Contains(input.Code!)) // 默认为空,支持模糊搜索
;
return await query.Select((a, b, c) => new ServiceProviderInterfacePaginatedOutputValueObject
{
Id = a.Id,
Name = a.Name,
Code = a.Code,
RequestProtocol = b.Name,
RequestMethod = c.Name,
RequestAddress = a.RequestAddress,
Description = a.Description,
UpdateTime = a.UpdateTime,
})
.OrderByDescending(a => a.UpdateTime)
.ToPagedListAsync(input.PageIndex, input.PageSize);
}
}

View File

@ -0,0 +1,24 @@
using InterfaceForward.Domain.Shared.Dtos;
namespace InterfaceForward.Repositories.Interface.ValueObjects;
/// <summary>
/// 服务商接口分页
/// </summary>
public class ServiceProviderInterfacePaginatedInputObjectValue : PagedQueryInput
{
/// <summary>
/// 服务商Id
/// </summary>
public int ServiceProviderId { get; set; }
///<summary>
/// 接口名
///</summary>
public string? Name { get; set; }
///<summary>
/// 接口代码
///</summary>
public string? Code { get; set; }
}

View File

@ -0,0 +1,47 @@
namespace InterfaceForward.Repositories.Interface.ValueObjects;
/// <summary>
///
/// </summary>
public class ServiceProviderInterfacePaginatedOutputValueObject
{
/// <summary>
/// 接口Id
/// </summary>
public int Id { get; set; }
///<summary>
/// 接口名
///</summary>
public string Name { get; set; }
///<summary>
/// 接口代码
///</summary>
public string Code { get; set; }
///<summary>
/// 请求协议
///</summary>
public string RequestProtocol { get; set; }
///<summary>
/// 请求方式
///</summary>
public string RequestMethod { get; set; }
///<summary>
/// 请求地址
///</summary>
public string RequestAddress { get; set; }
///<summary>
/// 接口描述
///</summary>
public string Description { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public DateTime? UpdateTime { get; set; }
}

View File

@ -0,0 +1,20 @@
using InterfaceForward.Domain.Shared.Dtos;
namespace InterfaceForward.Repositories.Interface.ValueObjects
{
/// <summary>
/// 分页查询系统接口
/// </summary>
public class SystemInterfacePaginatedInputObjectValue : PagedQueryInput
{
///<summary>
/// 接口分组默认请选择对应0值
///</summary>
public int Category { get; set; }
///<summary>
/// 接口名
///</summary>
public string NameOrCode { get; set; }
}
}

View File

@ -0,0 +1,48 @@
namespace InterfaceForward.Repositories.Interface.ValueObjects
{
/// <summary>
///
/// </summary>
public class SystemInterfacePaginatedOutputValueObject
{
/// <summary>
/// 接口Id
/// </summary>
public int Id { get; set; }
///<summary>
/// 接口分组
///</summary>
public string Category { get; set; }
///<summary>
/// 接口名
///</summary>
public string Name { get; set; }
///<summary>
/// 接口代码
///</summary>
public string Code { get; set; }
///<summary>
/// 请求协议
///</summary>
public string RequestProtocol { get; set; }
///<summary>
/// 接口描述
///</summary>
public string Description { get; set; }
///<summary>
/// 映射数
///</summary>
public int MapCount { get; set; }
/// <summary>
/// 更新时间
/// </summary>
public DateTime? UpdateTime { get; set; }
}
}