FlexJobApi.CommonServer.Application/FileUtils/Commands/FileCommandHandler.cs
New file @@ -0,0 +1,32 @@ using FlexJobApi.Core; using Mapster; using MediatR; using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.CommonServer.Application { /// <summary> /// 上传文件 /// </summary> public class FileCommandHandler : IRequestHandler<UploadFileCommand, UploadFileCommandResult> { /// <summary> /// 上传文件 /// </summary> /// <param name="request"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public Task<UploadFileCommandResult> Handle(UploadFileCommand request, CancellationToken cancellationToken) { var upload = AliyunOSSUtils.Upload(request.Scene, request.File); var result = upload.Adapt<UploadFileCommandResult>(); return Task.FromResult(result); } } } FlexJobApi.CommonServer.Application/FileUtils/Queries/FileQueryHandler.cs
New file @@ -0,0 +1,29 @@ using FlexJobApi.Core; using MediatR; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.CommonServer.Application { /// <summary> /// 文件查询处理器 /// </summary> public class FileQueryHandler : IRequestHandler<GetFileUrlQuery, string> { /// <summary> /// 获取文件地址 /// </summary> /// <param name="request"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public Task<string> Handle(GetFileUrlQuery request, CancellationToken cancellationToken) { var url = AliyunOSSUtils.GetUrl(request.Url); return Task.FromResult(url); } } } FlexJobApi.CommonServer.Application/FlexJobApi.CommonServer.Application.xml
@@ -141,6 +141,50 @@ <param name="models"></param> <param name="all"></param> </member> <member name="T:FlexJobApi.CommonServer.Application.FileCommandHandler"> <summary> 上传文件 </summary> </member> <member name="M:FlexJobApi.CommonServer.Application.FileCommandHandler.Handle(FlexJobApi.Core.UploadFileCommand,System.Threading.CancellationToken)"> <summary> 上传文件 </summary> <param name="request"></param> <param name="cancellationToken"></param> <returns></returns> </member> <member name="T:FlexJobApi.CommonServer.Application.FileQueryHandler"> <summary> 文件查询处理器 </summary> </member> <member name="M:FlexJobApi.CommonServer.Application.FileQueryHandler.Handle(FlexJobApi.Core.GetFileUrlQuery,System.Threading.CancellationToken)"> <summary> 获取文件地址 </summary> <param name="request"></param> <param name="cancellationToken"></param> <returns></returns> </member> <member name="T:FlexJobApi.CommonServer.Application.OcrCommandHandler"> <summary> 文字识别营业执照 </summary> </member> <member name="M:FlexJobApi.CommonServer.Application.OcrCommandHandler.#ctor"> <summary> 文字识别营业执照 </summary> </member> <member name="M:FlexJobApi.CommonServer.Application.OcrCommandHandler.Handle(FlexJobApi.Core.GetLicenseOcrCommand,System.Threading.CancellationToken)"> <summary> 文字识别营业执照 </summary> <param name="request"></param> <param name="cancellationToken"></param> <returns></returns> </member> <member name="T:FlexJobApi.UserServer.Application.GetResourceFieldsQueryHandler"> <summary> 获取资源字段 FlexJobApi.CommonServer.Application/OcrUtils/Commands/OcrCommandHandler.cs
New file @@ -0,0 +1,30 @@ using FlexJobApi.Core; using Mapster; using MediatR; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.CommonServer.Application { /// <summary> /// 文字识别营业执照 /// </summary> public class OcrCommandHandler() : IRequestHandler<GetLicenseOcrCommand, GetLicenseOcrCommandResult> { /// <summary> /// 文字识别营业执照 /// </summary> /// <param name="request"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task<GetLicenseOcrCommandResult> Handle(GetLicenseOcrCommand request, CancellationToken cancellationToken) { var result = await request.Url.OcrBusinessLicense(request.Scene, request.IsOssUrl); return result.Adapt<GetLicenseOcrCommandResult>(); } } } FlexJobApi.Core/Enums/Common/EnumOcrAccess.cs
New file @@ -0,0 +1,19 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// 文字识别通道 /// </summary> public enum EnumOcrAccess { /// <summary> /// 百度 /// </summary> Baidu = 10 } } FlexJobApi.Core/Enums/Common/EnumResourceController.cs
@@ -33,6 +33,17 @@ TaskCheckReceive, /// <summary> /// 文字识别 /// </summary> [ResourceController(Service = EnumResourceService.CommonServer)] FileUtils, /// <summary> /// 文字识别 /// </summary> [ResourceController(Service = EnumResourceService.CommonServer)] OcrUtils, /// <summary> /// 用户认证 /// </summary> [ResourceController(Service = EnumResourceService.UserServer)] FlexJobApi.Core/FlexJobApi.Core.csproj
@@ -19,6 +19,7 @@ <ItemGroup> <PackageReference Include="aliyun-net-sdk-core" Version="1.5.6" /> <PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" /> <PackageReference Include="Baidu.AI" Version="4.15.16" /> <PackageReference Include="Consul" Version="1.7.14.8" /> <PackageReference Include="EFCore.BulkExtensions" Version="9.0.1" /> <PackageReference Include="Furion" Version="4.9.7.106" /> FlexJobApi.Core/FlexJobApi.Core.xml
@@ -2387,6 +2387,16 @@ 严重 </summary> </member> <member name="T:FlexJobApi.Core.EnumOcrAccess"> <summary> 文字识别通道 </summary> </member> <member name="F:FlexJobApi.Core.EnumOcrAccess.Baidu"> <summary> 百度 </summary> </member> <member name="T:FlexJobApi.Core.EnumPagedListOrder"> <summary> 分页列表排序 @@ -2450,6 +2460,16 @@ <member name="F:FlexJobApi.Core.EnumResourceController.TaskCheckReceive"> <summary> 任务验收 </summary> </member> <member name="F:FlexJobApi.Core.EnumResourceController.FileUtils"> <summary> 文字识别 </summary> </member> <member name="F:FlexJobApi.Core.EnumResourceController.OcrUtils"> <summary> 文字识别 </summary> </member> <member name="F:FlexJobApi.Core.EnumResourceController.Auth"> @@ -3711,6 +3731,81 @@ <member name="P:FlexJobApi.Core.GetDictionaryDatasQueryResultItemCategory.Name"> <summary> 名称 </summary> </member> <member name="T:FlexJobApi.Core.UploadFileCommand"> <summary> 上传文件 </summary> </member> <member name="P:FlexJobApi.Core.UploadFileCommand.Scene"> <summary> 场景 </summary> </member> <member name="P:FlexJobApi.Core.UploadFileCommand.File"> <summary> 文件 </summary> </member> <member name="T:FlexJobApi.Core.UploadFileCommandResult"> <summary> 上传文件-结果 </summary> </member> <member name="P:FlexJobApi.Core.UploadFileCommandResult.Url"> <summary> 地址 </summary> </member> <member name="T:FlexJobApi.Core.GetFileUrlQuery"> <summary> 获取文件地址 </summary> </member> <member name="P:FlexJobApi.Core.GetFileUrlQuery.Url"> <summary> 地址 </summary> </member> <member name="T:FlexJobApi.Core.GetLicenseOcrCommand"> <summary> 文字识别营业执照 </summary> </member> <member name="P:FlexJobApi.Core.GetLicenseOcrCommand.Access"> <summary> 通道 </summary> </member> <member name="P:FlexJobApi.Core.GetLicenseOcrCommand.Scene"> <summary> 场景 </summary> </member> <member name="P:FlexJobApi.Core.GetLicenseOcrCommand.Url"> <summary> 链接地址 </summary> </member> <member name="P:FlexJobApi.Core.GetLicenseOcrCommand.IsOssUrl"> <summary> 是否为云存储相对地址 </summary> </member> <member name="T:FlexJobApi.Core.GetLicenseOcrCommandResult"> <summary> 文字识别营业执照 </summary> </member> <member name="P:FlexJobApi.Core.GetLicenseOcrCommandResult.Url"> <summary> 地址 </summary> </member> <member name="P:FlexJobApi.Core.GetLicenseOcrCommandResult.Model"> <summary> 模型 </summary> </member> <member name="T:FlexJobApi.Core.GetResourceFieldsQuery"> @@ -8879,6 +8974,21 @@ 模板代码 </summary> </member> <member name="T:FlexJobApi.Core.AliyunOSSUploadResult"> <summary> 阿里云OSS上传结果 </summary> </member> <member name="P:FlexJobApi.Core.AliyunOSSUploadResult.Url"> <summary> 相对路径 </summary> </member> <member name="P:FlexJobApi.Core.AliyunOSSUploadResult.Buffer"> <summary> 字节 </summary> </member> <member name="T:FlexJobApi.Core.AliyunOSSUtils"> <summary> 阿里云OSS工具 @@ -8919,6 +9029,175 @@ <param name="process"></param> <returns></returns> </member> <member name="T:FlexJobApi.Core.BaiduOcrBusinessLicenseResult"> <summary> 百度文字识别结果 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResult.Url"> <summary> 地址 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResult.Model"> <summary> 模型 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResult.ErrorCode"> <summary> 错误码 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResult.ErrorMessage"> <summary> 错误消息 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResult.WordsResult"> <summary> 文字结果 </summary> </member> <member name="T:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel"> <summary> 百度文字识别结果 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.EnterpriseName"> <summary> 企业全称 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.SocietyCreditCode"> <summary> 统一社会信用代码 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.LegalPerson"> <summary> 法人姓名 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.EnterpriseType"> <summary> 企业类型 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.RegisteredCapital"> <summary> 注册资本 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.EstablishmentDate"> <summary> 成立日期 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.Address"> <summary> 企业地址 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrBusinessLicenseResultModel.BusinessScope"> <summary> 经营范围 </summary> </member> <member name="T:FlexJobApi.Core.BaiduOcrResultWord"> <summary> 百度文字识别结果 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrResultWord.Location"> <summary> 定位 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrResultWord.Words"> <summary> 文字 </summary> </member> <member name="T:FlexJobApi.Core.BaiduOcrResultWordLocation"> <summary> 百度文字识别结果 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrResultWordLocation.Top"> <summary> 距离顶部 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrResultWordLocation.Left"> <summary> 距离左边 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrResultWordLocation.Width"> <summary> 宽度 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrResultWordLocation.Height"> <summary> 高度 </summary> </member> <member name="T:FlexJobApi.Core.BaiduOcrUtils"> <summary> 百度文字识别工具 </summary> </member> <member name="M:FlexJobApi.Core.BaiduOcrUtils.OcrBusinessLicense(System.String,System.String,System.Boolean)"> <summary> 营业执照OCR </summary> <param name="url"></param> <param name="scene"></param> <param name="isOssUrl"></param> </member> <member name="T:FlexJobApi.Core.BaiduOptions"> <summary> 百度配置 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOptions.Ocr"> <summary> 文字识别 </summary> </member> <member name="T:FlexJobApi.Core.BaiduOcrOptions"> <summary> 百度文字识别配置 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrOptions.Key"> <summary> 键 </summary> </member> <member name="P:FlexJobApi.Core.BaiduOcrOptions.Secret"> <summary> 秘钥 </summary> </member> <member name="T:FlexJobApi.Core.OcrResult`1"> <summary> OCR识别结果 </summary> <typeparam name="T"></typeparam> </member> <member name="P:FlexJobApi.Core.OcrResult`1.Url"> <summary> 地址 </summary> </member> <member name="P:FlexJobApi.Core.OcrResult`1.Data"> <summary> 数据 </summary> </member> <member name="M:FlexJobApi.Core.CollectionUtils.DistinctAdd``1(System.Collections.Generic.List{``0},``0,System.Collections.Generic.IEqualityComparer{``0})"> <summary> 去重添加 FlexJobApi.Core/Models/CommonServer/FileUtils/Commands/UploadFileCommand.cs
New file @@ -0,0 +1,38 @@ using MediatR; using Microsoft.AspNetCore.Http; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// 上传文件 /// </summary> [Resource([EnumResourceController.FileUtils], FileUpload = true)] public class UploadFileCommand : IRequest<UploadFileCommandResult> { /// <summary> /// 场景 /// </summary> public string Scene { get; set; } /// <summary> /// 文件 /// </summary> public IFormFile File { get; set; } } /// <summary> /// 上传文件-结果 /// </summary> public class UploadFileCommandResult { /// <summary> /// 地址 /// </summary> public string Url { get; set; } } } FlexJobApi.Core/Models/CommonServer/FileUtils/Queries/GetFileUrlQuery.cs
New file @@ -0,0 +1,21 @@ using MediatR; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// 获取文件地址 /// </summary> [Resource([EnumResourceController.FileUtils])] public class GetFileUrlQuery : IRequest<string> { /// <summary> /// 地址 /// </summary> public string Url { get; set; } } } FlexJobApi.Core/Models/CommonServer/OcrUtils/Commands/OcrCommand.cs
New file @@ -0,0 +1,53 @@ using MediatR; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// 文字识别营业执照 /// </summary> [Resource([EnumResourceController.OcrUtils])] public class GetLicenseOcrCommand : IRequest<GetLicenseOcrCommandResult> { /// <summary> /// 通道 /// </summary> public EnumOcrAccess Access { get; set; } /// <summary> /// 场景 /// </summary> public string Scene { get; set; } /// <summary> /// 链接地址 /// </summary> public string Url { get; set; } /// <summary> /// 是否为云存储相对地址 /// </summary> public bool IsOssUrl { get; set; } } /// <summary> /// 文字识别营业执照 /// </summary> public class GetLicenseOcrCommandResult { /// <summary> /// 地址 /// </summary> public string Url { get; set; } /// <summary> /// 模型 /// </summary> public BaiduOcrBusinessLicenseResultModel Model { get; set; } } } FlexJobApi.Core/Utils/AliyunUtils/AliyunOSSUploadResult.cs
New file @@ -0,0 +1,24 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// 阿里云OSS上传结果 /// </summary> public class AliyunOSSUploadResult { /// <summary> /// 相对路径 /// </summary> public string Url { get; set; } /// <summary> /// 字节 /// </summary> public byte[] Buffer { get; set; } } } FlexJobApi.Core/Utils/AliyunUtils/AliyunOSSUtils.cs
@@ -4,6 +4,7 @@ using Aliyun.Acs.Core.Profile; using Aliyun.OSS; using Furion; using Furion.DistributedIDGenerator; using Furion.HttpRemote; using Microsoft.AspNetCore.Http; using Microsoft.CodeAnalysis; @@ -51,8 +52,12 @@ /// <param name="url"></param> /// <param name="filename"></param> /// <returns></returns> public static string Upload(string scene, string url, string filename = null) public static AliyunOSSUploadResult Upload(string scene, string url, string filename = null) { if (filename.IsNull()) { filename = url.Substring(url.LastIndexOf('/') + 1); } var stream = App.GetRequiredService<IHttpRemoteService>().GetAsStream(url); return Upload(scene, stream, filename); } @@ -64,9 +69,10 @@ /// <param name="file"></param> /// <param name="filename"></param> /// <returns></returns> public static string Upload(string scene, IFormFile file, string filename = null) public static AliyunOSSUploadResult Upload(string scene, IFormFile file, string filename = null) { var stream = file.OpenReadStream(); filename = filename ?? file.FileName; return Upload(scene, stream, filename); } @@ -77,13 +83,20 @@ /// <param name="stream"></param> /// <param name="filename"></param> /// <returns></returns> public static string Upload(string scene, Stream stream, string filename = null) public static AliyunOSSUploadResult Upload(string scene, Stream stream, string filename) { var options = App.GetOptions<AliyunOptions>().OSS; var client = new OssClient(options.Endpoint, options.AccessKeyId, options.AccessSecret); var key = $"Resource/{scene}/{DateTime.Now:yyyy-MM-dd}/{filename}"; var key = $"Resource/FlexJob/{scene}/{DateTime.Now:yyyy-MM-dd}/{DateTime.Now.ToTimeStamp()}-{IDGen.NextID()}/{filename}"; client.PutObject(options.BucketName, key, stream); return key; var result = new AliyunOSSUploadResult { Url = key }; stream.Seek(0, SeekOrigin.Begin); result.Buffer = new byte[stream.Length]; stream.ReadExactly(result.Buffer); return result; } /// <summary> FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrBusinessLicenseResult.cs
New file @@ -0,0 +1,90 @@ using Newtonsoft.Json; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// 百度文字识别结果 /// </summary> public class BaiduOcrBusinessLicenseResult { /// <summary> /// 地址 /// </summary> public string Url { get; set; } /// <summary> /// 模型 /// </summary> public BaiduOcrBusinessLicenseResultModel Model { get; set; } /// <summary> /// 错误码 /// </summary> [JsonProperty("error_code")] public string ErrorCode { get; set; } /// <summary> /// 错误消息 /// </summary> [JsonProperty("error_msg")] public string ErrorMessage { get; set; } /// <summary> /// 文字结果 /// </summary> [JsonProperty("words_result")] public Dictionary<string, BaiduOcrResultWord> WordsResult { get; set; } } /// <summary> /// 百度文字识别结果 /// </summary> public class BaiduOcrBusinessLicenseResultModel { /// <summary> /// 企业全称 /// </summary> public string EnterpriseName { get; set; } /// <summary> /// 统一社会信用代码 /// </summary> public string SocietyCreditCode { get; set; } /// <summary> /// 法人姓名 /// </summary> public string LegalPerson { get; set; } /// <summary> /// 企业类型 /// </summary> public string EnterpriseType { get; set; } /// <summary> /// 注册资本 /// </summary> public string RegisteredCapital { get; set; } /// <summary> /// 成立日期 /// </summary> public string EstablishmentDate { get; set; } /// <summary> /// 企业地址 /// </summary> public string Address { get; set; } /// <summary> /// 经营范围 /// </summary> public string BusinessScope { get; set; } } } FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrResultWord.cs
New file @@ -0,0 +1,57 @@ using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// 百度文字识别结果 /// </summary> public class BaiduOcrResultWord { /// <summary> /// 定位 /// </summary> [JsonProperty("location")] public BaiduOcrResultWordLocation Location { get; set; } /// <summary> /// 文字 /// </summary> [JsonProperty("words")] public string Words { get; set; } } /// <summary> /// 百度文字识别结果 /// </summary> public class BaiduOcrResultWordLocation { /// <summary> /// 距离顶部 /// </summary> [JsonProperty("top")] public int Top { get; set; } /// <summary> /// 距离左边 /// </summary> [JsonProperty("left")] public int Left { get; set; } /// <summary> /// 宽度 /// </summary> [JsonProperty("width")] public int Width { get; set; } /// <summary> /// 高度 /// </summary> [JsonProperty("height")] public int Height { get; set; } } } FlexJobApi.Core/Utils/BaiduUtils/BaiduOcrUtils.cs
New file @@ -0,0 +1,70 @@ using Baidu.Aip.Ocr; using Furion; using Furion.DistributedIDGenerator; using Furion.FriendlyException; using Furion.HttpRemote; using Microsoft.AspNetCore.DataProtection; using Microsoft.Extensions.Options; using NetTopologySuite.Operation.Buffer; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// 百度文字识别工具 /// </summary> public static class BaiduOcrUtils { /// <summary> /// 营业执照OCR /// </summary> /// <param name="url"></param> /// <param name="scene"></param> /// <param name="isOssUrl"></param> public static async Task<BaiduOcrBusinessLicenseResult> OcrBusinessLicense(this string url, string scene, bool isOssUrl = true) { var options = App.GetOptions<BaiduOptions>(); var ocr = new Ocr(options.Ocr.Key, options.Ocr.Secret); ocr.Timeout = 60000; JObject value; if (isOssUrl) { var downloadUrl = AliyunOSSUtils.GetUrl(url); var buffer = await App.GetRequiredService<IHttpRemoteService>().GetAsByteArrayAsync(downloadUrl); value = ocr.BusinessLicense(buffer); } else { var upload = AliyunOSSUtils.Upload(scene, url); url = upload.Url; value = ocr.BusinessLicense(upload.Buffer); } var result = value.ToObject<BaiduOcrBusinessLicenseResult>(); result.Url = url; if (result.ErrorCode.IsNotNull()) { return result; } result.Model = new BaiduOcrBusinessLicenseResultModel { EnterpriseName = result.WordsResult["单位名称"].Words, SocietyCreditCode = result.WordsResult["社会信用代码"].Words, LegalPerson = result.WordsResult["法人"].Words, EnterpriseType = result.WordsResult["类型"].Words, RegisteredCapital = result.WordsResult["注册资本"].Words, EstablishmentDate = result.WordsResult["成立日期"].Words, Address = result.WordsResult["地址"].Words, BusinessScope = result.WordsResult["经营范围"].Words, }; return result; } } } FlexJobApi.Core/Utils/BaiduUtils/BaiduOptions.cs
New file @@ -0,0 +1,36 @@ using Furion.ConfigurableOptions; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// 百度配置 /// </summary> public class BaiduOptions : IConfigurableOptions { /// <summary> /// 文字识别 /// </summary> public BaiduOcrOptions Ocr { get; set; } } /// <summary> /// 百度文字识别配置 /// </summary> public class BaiduOcrOptions { /// <summary> /// 键 /// </summary> public string Key { get; set; } /// <summary> /// 秘钥 /// </summary> public string Secret { get; set; } } } FlexJobApi.Core/Utils/BaiduUtils/OcrResult.cs
New file @@ -0,0 +1,26 @@ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FlexJobApi.Core { /// <summary> /// OCR识别结果 /// </summary> /// <typeparam name="T"></typeparam> public class OcrResult<T> where T : class, new() { /// <summary> /// 地址 /// </summary> public string Url { get; set; } /// <summary> /// 数据 /// </summary> public T Data { get; set; } } } FlexJobApi.Core/Utils/ExcelUtils/ExcelUtils.cs
@@ -87,7 +87,7 @@ var stream = new MemoryStream(); await MiniExcel.SaveAsAsync(stream, models, configuration: config); stream.Seek(0, SeekOrigin.Begin); return AliyunOSSUtils.Upload(scene, stream, filename); return AliyunOSSUtils.Upload(scene, stream, filename).Url; } } } FlexJobApi.Web.Entry/Startup.cs
@@ -26,6 +26,7 @@ services.AddConfigurableOptions<WxmpOptions>(); services.AddConfigurableOptions<AliyunOptions>(); services.AddConfigurableOptions<BaiduOptions>(); services.AddComponent<LogServiceComponent>(); @@ -37,7 +38,7 @@ services.AddHttpRemote(); services.AddSingleton<ResourceHttpUtils>(); services.AddSingleton<AliyunSmsUtils>(); services.AddSingleton<AliyunSmsUtils>(); services.AddSingleton<WxmpUtils>(); services.AddScoped<SmsUtils>(); FlexJobApi.Web.Entry/appsettings.json
@@ -44,6 +44,12 @@ "DurationSeconds": 3600 } }, "Baidu": { "Ocr": { "Key": "Htx3y6eFnlW92WvHx9aW44f8", "Secret": "k1rDa3vjVtArrQio9LtR5AjqARSw45WO" } }, "SMS": { "Enable": true, "AccessKeyId": "LTAI5tMS7qz1duiyncCqxB8H",