From 272466bbbf73bc64f90d7f7ee9a9c33b7c525d6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E6=B7=B3?= Date: Thu, 23 Feb 2023 14:15:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Extensions/HttpContextExtensions.cs | 51 ++ .../Yi.Framework.Core/Const/PathConst.cs | 18 + .../Yi.Framework.Core/Enums/FileTypeEnum.cs | 20 + .../Yi.Framework.Core/Helper/MimeHelper.cs | 462 +++++++++--------- .../Yi.Framework.FileManager/FileEntity.cs | 48 ++ .../FileGetListOutputDto.cs | 14 + .../Yi.Framework.FileManager/FileService.cs | 158 ++++++ .../Yi.Framework.FileManager/IFileService.cs | 12 + .../Yi.Framework.FileManager.csproj | 5 + .../YiFrameworkFileManagerModule.cs | 21 +- .../rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj | 1 + .../rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs | 4 +- .../wwwroot/File/1628628277864304640.txt | 28 ++ .../wwwroot/File/1628628396160454656.txt | 28 ++ .../wwwroot/File/1628628415508779008.txt | 28 ++ .../wwwroot/File/1628636925021786112.txt | 28 ++ .../wwwroot/Image/1628639014875697152.jpg | Bin 0 -> 30944 bytes .../wwwroot/Image/1628639326948691968.jpg | Bin 0 -> 30944 bytes .../wwwroot/Thumbnail/1628639326948691968.jpg | Bin 0 -> 10366 bytes .../rbac/Yi.RBAC.Web/yi-sqlsugar-dev.db | Bin 135168 -> 143360 bytes 20 files changed, 698 insertions(+), 228 deletions(-) create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.Core/Const/PathConst.cs create mode 100644 Yi.Framework.Net6/src/framework/Yi.Framework.Core/Enums/FileTypeEnum.cs create mode 100644 Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileEntity.cs create mode 100644 Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileGetListOutputDto.cs create mode 100644 Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileService.cs create mode 100644 Yi.Framework.Net6/src/module/Yi.Framework.FileManager/IFileService.cs create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628277864304640.txt create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628396160454656.txt create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628415508779008.txt create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628636925021786112.txt create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/Image/1628639014875697152.jpg create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/Image/1628639326948691968.jpg create mode 100644 Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/Thumbnail/1628639326948691968.jpg diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.AspNetCore/Extensions/HttpContextExtensions.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.AspNetCore/Extensions/HttpContextExtensions.cs index 759555ed..b16e5509 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.AspNetCore/Extensions/HttpContextExtensions.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.AspNetCore/Extensions/HttpContextExtensions.cs @@ -10,6 +10,57 @@ namespace Yi.Framework.AspNetCore.Extensions { public static class HttpContextExtensions { + /// + /// 设置文件下载名称 + /// + /// + /// + public static void FileInlineHandle(this HttpContext httpContext, string fileName) + { + string encodeFilename = System.Web.HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8")); + httpContext.Response.Headers.Add("Content-Disposition", "inline;filename=" + encodeFilename); + + } + + /// + /// 设置文件附件名称 + /// + /// + /// + public static void FileAttachmentHandle(this HttpContext httpContext, string fileName) + { + string encodeFilename = System.Web.HttpUtility.UrlEncode(fileName, Encoding.GetEncoding("UTF-8")); + httpContext.Response.Headers.Add("Content-Disposition", "attachment;filename=" + encodeFilename); + + } + + /// + /// 获取语言种类 + /// + /// + /// + public static string GetLanguage(this HttpContext httpContext) + { + string res = "zh-CN"; + var str = httpContext.Request.Headers["Accept-Language"].FirstOrDefault(); + if (str is not null) + { + res = str.Split(",")[0]; + } + return res; + + } + + /// + /// 判断是否为异步请求 + /// + /// + /// + public static bool IsAjaxRequest(this HttpRequest request) + { + string header = request.Headers["X-Requested-With"]; + return "XMLHttpRequest".Equals(header); + } /// /// 获取客户端IP /// diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Const/PathConst.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Const/PathConst.cs new file mode 100644 index 00000000..ba393ce5 --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Const/PathConst.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Core.Const +{ + /// + /// 定义公共文件常量 + /// + public class PathConst + { + public const string wwwroot = "wwwroot"; + public const string DataTemplate = "_DataTemplate"; + public const string DataExport = "_DataExport"; + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Enums/FileTypeEnum.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Enums/FileTypeEnum.cs new file mode 100644 index 00000000..1776d35f --- /dev/null +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Enums/FileTypeEnum.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.Core.Enums +{ + /// + /// 定义公共文件路径 + /// + public enum FileTypeEnum + { + File, + Image, + Thumbnail, + Excel, + Temp + } +} diff --git a/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Helper/MimeHelper.cs b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Helper/MimeHelper.cs index ca0e7c05..c0b5b611 100644 --- a/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Helper/MimeHelper.cs +++ b/Yi.Framework.Net6/src/framework/Yi.Framework.Core/Helper/MimeHelper.cs @@ -4,241 +4,257 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Yi.Framework.Core.Enums; namespace Yi.Framework.Core.Helper { - public static class MimeHelper + public static class MimeHelper { // 通过自己定义一个静态类 // 将所有的Content Type都扔进去吧 // 调用的时候直接调用静态方法即可。 - - private static Hashtable _mimeMappingTable; - private static void AddMimeMapping(string extension, string MimeType) + public static List ImageType { get; set; } = new List + { + ".jpg",".png",".jpge",".gif" + }; + + private static Hashtable _mimeMappingTable; + + private static void AddMimeMapping(string extension, string MimeType) + { + MimeHelper._mimeMappingTable.Add(extension, MimeType); + } + + public static string GetMimeMapping(string FileName) + { + string text = null!; + int num = FileName.LastIndexOf('.'); + if (0 < num && num > FileName.LastIndexOf('\\')) { - MimeHelper._mimeMappingTable.Add(extension, MimeType); + text = (string)MimeHelper._mimeMappingTable[FileName.Substring(num)]!; } - - public static string GetMimeMapping(string FileName) + if (text == null) { - string text = null!; - int num = FileName.LastIndexOf('.'); - if (0 < num && num > FileName.LastIndexOf('\\')) - { - text = (string)MimeHelper._mimeMappingTable[FileName.Substring(num)]!; - } - if (text == null) - { - text = (string)MimeHelper._mimeMappingTable[".*"]!; - } - return text; + text = (string)MimeHelper._mimeMappingTable[".*"]!; } + return text; + } + + public static FileTypeEnum GetFileType(string fileName) + { + var extension = Path.GetExtension(fileName); + if(ImageType.Contains(extension.ToLower())) + return FileTypeEnum.Image; + return FileTypeEnum.File; + + + } + + static MimeHelper() + { + MimeHelper._mimeMappingTable = new Hashtable(190, StringComparer.CurrentCultureIgnoreCase); + MimeHelper.AddMimeMapping(".323", "text/h323"); + MimeHelper.AddMimeMapping(".asx", "video/x-ms-asf"); + MimeHelper.AddMimeMapping(".acx", "application/internet-property-stream"); + MimeHelper.AddMimeMapping(".ai", "application/postscript"); + MimeHelper.AddMimeMapping(".aif", "audio/x-aiff"); + MimeHelper.AddMimeMapping(".aiff", "audio/aiff"); + MimeHelper.AddMimeMapping(".axs", "application/olescript"); + MimeHelper.AddMimeMapping(".aifc", "audio/aiff"); + MimeHelper.AddMimeMapping(".asr", "video/x-ms-asf"); + MimeHelper.AddMimeMapping(".avi", "video/x-msvideo"); + MimeHelper.AddMimeMapping(".asf", "video/x-ms-asf"); + MimeHelper.AddMimeMapping(".au", "audio/basic"); + MimeHelper.AddMimeMapping(".application", "application/x-ms-application"); + MimeHelper.AddMimeMapping(".bin", "application/octet-stream"); + MimeHelper.AddMimeMapping(".bas", "text/plain"); + MimeHelper.AddMimeMapping(".bcpio", "application/x-bcpio"); + MimeHelper.AddMimeMapping(".bmp", "image/bmp"); + MimeHelper.AddMimeMapping(".cdf", "application/x-cdf"); + MimeHelper.AddMimeMapping(".cat", "application/vndms-pkiseccat"); + MimeHelper.AddMimeMapping(".crt", "application/x-x509-ca-cert"); + MimeHelper.AddMimeMapping(".c", "text/plain"); + MimeHelper.AddMimeMapping(".css", "text/css"); + MimeHelper.AddMimeMapping(".cer", "application/x-x509-ca-cert"); + MimeHelper.AddMimeMapping(".crl", "application/pkix-crl"); + MimeHelper.AddMimeMapping(".cmx", "image/x-cmx"); + MimeHelper.AddMimeMapping(".csh", "application/x-csh"); + MimeHelper.AddMimeMapping(".cod", "image/cis-cod"); + MimeHelper.AddMimeMapping(".cpio", "application/x-cpio"); + MimeHelper.AddMimeMapping(".clp", "application/x-msclip"); + MimeHelper.AddMimeMapping(".crd", "application/x-mscardfile"); + MimeHelper.AddMimeMapping(".deploy", "application/octet-stream"); + MimeHelper.AddMimeMapping(".dll", "application/x-msdownload"); + MimeHelper.AddMimeMapping(".dot", "application/msword"); + MimeHelper.AddMimeMapping(".doc", "application/msword"); + MimeHelper.AddMimeMapping(".dvi", "application/x-dvi"); + MimeHelper.AddMimeMapping(".dir", "application/x-director"); + MimeHelper.AddMimeMapping(".dxr", "application/x-director"); + MimeHelper.AddMimeMapping(".der", "application/x-x509-ca-cert"); + MimeHelper.AddMimeMapping(".dib", "image/bmp"); + MimeHelper.AddMimeMapping(".dcr", "application/x-director"); + MimeHelper.AddMimeMapping(".disco", "text/xml"); + MimeHelper.AddMimeMapping(".exe", "application/octet-stream"); + MimeHelper.AddMimeMapping(".etx", "text/x-setext"); + MimeHelper.AddMimeMapping(".evy", "application/envoy"); + MimeHelper.AddMimeMapping(".eml", "message/rfc822"); + MimeHelper.AddMimeMapping(".eps", "application/postscript"); + MimeHelper.AddMimeMapping(".flr", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".fif", "application/fractals"); + MimeHelper.AddMimeMapping(".gtar", "application/x-gtar"); + MimeHelper.AddMimeMapping(".gif", "image/gif"); + MimeHelper.AddMimeMapping(".gz", "application/x-gzip"); + MimeHelper.AddMimeMapping(".hta", "application/hta"); + MimeHelper.AddMimeMapping(".htc", "text/x-component"); + MimeHelper.AddMimeMapping(".htt", "text/webviewhtml"); + MimeHelper.AddMimeMapping(".h", "text/plain"); + MimeHelper.AddMimeMapping(".hdf", "application/x-hdf"); + MimeHelper.AddMimeMapping(".hlp", "application/winhlp"); + MimeHelper.AddMimeMapping(".html", "text/html"); + MimeHelper.AddMimeMapping(".htm", "text/html"); + MimeHelper.AddMimeMapping(".hqx", "application/mac-binhex40"); + MimeHelper.AddMimeMapping(".isp", "application/x-internet-signup"); + MimeHelper.AddMimeMapping(".iii", "application/x-iphone"); + MimeHelper.AddMimeMapping(".ief", "image/ief"); + MimeHelper.AddMimeMapping(".ivf", "video/x-ivf"); + MimeHelper.AddMimeMapping(".ins", "application/x-internet-signup"); + MimeHelper.AddMimeMapping(".ico", "image/x-icon"); + MimeHelper.AddMimeMapping(".jpg", "image/jpeg"); + MimeHelper.AddMimeMapping(".jfif", "image/pjpeg"); + MimeHelper.AddMimeMapping(".jpe", "image/jpeg"); + MimeHelper.AddMimeMapping(".jpeg", "image/jpeg"); + MimeHelper.AddMimeMapping(".js", "application/x-javascript"); + MimeHelper.AddMimeMapping(".lsx", "video/x-la-asf"); + MimeHelper.AddMimeMapping(".latex", "application/x-latex"); + MimeHelper.AddMimeMapping(".lsf", "video/x-la-asf"); + MimeHelper.AddMimeMapping(".manifest", "application/x-ms-manifest"); + MimeHelper.AddMimeMapping(".mhtml", "message/rfc822"); + MimeHelper.AddMimeMapping(".mny", "application/x-msmoney"); + MimeHelper.AddMimeMapping(".mht", "message/rfc822"); + MimeHelper.AddMimeMapping(".mid", "audio/mid"); + MimeHelper.AddMimeMapping(".mpv2", "video/mpeg"); + MimeHelper.AddMimeMapping(".man", "application/x-troff-man"); + MimeHelper.AddMimeMapping(".mvb", "application/x-msmediaview"); + MimeHelper.AddMimeMapping(".mpeg", "video/mpeg"); + MimeHelper.AddMimeMapping(".m3u", "audio/x-mpegurl"); + MimeHelper.AddMimeMapping(".mdb", "application/x-msaccess"); + MimeHelper.AddMimeMapping(".mpp", "application/vnd.ms-project"); + MimeHelper.AddMimeMapping(".m1v", "video/mpeg"); + MimeHelper.AddMimeMapping(".mpa", "video/mpeg"); + MimeHelper.AddMimeMapping(".me", "application/x-troff-me"); + MimeHelper.AddMimeMapping(".m13", "application/x-msmediaview"); + MimeHelper.AddMimeMapping(".movie", "video/x-sgi-movie"); + MimeHelper.AddMimeMapping(".m14", "application/x-msmediaview"); + MimeHelper.AddMimeMapping(".mpe", "video/mpeg"); + MimeHelper.AddMimeMapping(".mp2", "video/mpeg"); + MimeHelper.AddMimeMapping(".mov", "video/quicktime"); + MimeHelper.AddMimeMapping(".mp3", "audio/mpeg"); + MimeHelper.AddMimeMapping(".mpg", "video/mpeg"); + MimeHelper.AddMimeMapping(".ms", "application/x-troff-ms"); + MimeHelper.AddMimeMapping(".nc", "application/x-netcdf"); + MimeHelper.AddMimeMapping(".nws", "message/rfc822"); + MimeHelper.AddMimeMapping(".oda", "application/oda"); + MimeHelper.AddMimeMapping(".ods", "application/oleobject"); + MimeHelper.AddMimeMapping(".pmc", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".p7r", "application/x-pkcs7-certreqresp"); + MimeHelper.AddMimeMapping(".p7b", "application/x-pkcs7-certificates"); + MimeHelper.AddMimeMapping(".p7s", "application/pkcs7-signature"); + MimeHelper.AddMimeMapping(".pmw", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".ps", "application/postscript"); + MimeHelper.AddMimeMapping(".p7c", "application/pkcs7-mime"); + MimeHelper.AddMimeMapping(".pbm", "image/x-portable-bitmap"); + MimeHelper.AddMimeMapping(".ppm", "image/x-portable-pixmap"); + MimeHelper.AddMimeMapping(".pub", "application/x-mspublisher"); + MimeHelper.AddMimeMapping(".pnm", "image/x-portable-anymap"); + MimeHelper.AddMimeMapping(".png", "image/png"); + MimeHelper.AddMimeMapping(".pml", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".p10", "application/pkcs10"); + MimeHelper.AddMimeMapping(".pfx", "application/x-pkcs12"); + MimeHelper.AddMimeMapping(".p12", "application/x-pkcs12"); + MimeHelper.AddMimeMapping(".pdf", "application/pdf"); + MimeHelper.AddMimeMapping(".pps", "application/vnd.ms-powerpoint"); + MimeHelper.AddMimeMapping(".p7m", "application/pkcs7-mime"); + MimeHelper.AddMimeMapping(".pko", "application/vndms-pkipko"); + MimeHelper.AddMimeMapping(".ppt", "application/vnd.ms-powerpoint"); + MimeHelper.AddMimeMapping(".pmr", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".pma", "application/x-perfmon"); + MimeHelper.AddMimeMapping(".pot", "application/vnd.ms-powerpoint"); + MimeHelper.AddMimeMapping(".prf", "application/pics-rules"); + MimeHelper.AddMimeMapping(".pgm", "image/x-portable-graymap"); + MimeHelper.AddMimeMapping(".qt", "video/quicktime"); + MimeHelper.AddMimeMapping(".ra", "audio/x-pn-realaudio"); + MimeHelper.AddMimeMapping(".rgb", "image/x-rgb"); + MimeHelper.AddMimeMapping(".ram", "audio/x-pn-realaudio"); + MimeHelper.AddMimeMapping(".rmi", "audio/mid"); + MimeHelper.AddMimeMapping(".ras", "image/x-cmu-raster"); + MimeHelper.AddMimeMapping(".roff", "application/x-troff"); + MimeHelper.AddMimeMapping(".rtf", "application/rtf"); + MimeHelper.AddMimeMapping(".rtx", "text/richtext"); + MimeHelper.AddMimeMapping(".sv4crc", "application/x-sv4crc"); + MimeHelper.AddMimeMapping(".spc", "application/x-pkcs7-certificates"); + MimeHelper.AddMimeMapping(".setreg", "application/set-registration-initiation"); + MimeHelper.AddMimeMapping(".snd", "audio/basic"); + MimeHelper.AddMimeMapping(".stl", "application/vndms-pkistl"); + MimeHelper.AddMimeMapping(".setpay", "application/set-payment-initiation"); + MimeHelper.AddMimeMapping(".stm", "text/html"); + MimeHelper.AddMimeMapping(".shar", "application/x-shar"); + MimeHelper.AddMimeMapping(".sh", "application/x-sh"); + MimeHelper.AddMimeMapping(".sit", "application/x-stuffit"); + MimeHelper.AddMimeMapping(".spl", "application/futuresplash"); + MimeHelper.AddMimeMapping(".sct", "text/scriptlet"); + MimeHelper.AddMimeMapping(".scd", "application/x-msschedule"); + MimeHelper.AddMimeMapping(".sst", "application/vndms-pkicertstore"); + MimeHelper.AddMimeMapping(".src", "application/x-wais-source"); + MimeHelper.AddMimeMapping(".sv4cpio", "application/x-sv4cpio"); + MimeHelper.AddMimeMapping(".tex", "application/x-tex"); + MimeHelper.AddMimeMapping(".tgz", "application/x-compressed"); + MimeHelper.AddMimeMapping(".t", "application/x-troff"); + MimeHelper.AddMimeMapping(".tar", "application/x-tar"); + MimeHelper.AddMimeMapping(".tr", "application/x-troff"); + MimeHelper.AddMimeMapping(".tif", "image/tiff"); + MimeHelper.AddMimeMapping(".txt", "text/plain"); + MimeHelper.AddMimeMapping(".texinfo", "application/x-texinfo"); + MimeHelper.AddMimeMapping(".trm", "application/x-msterminal"); + MimeHelper.AddMimeMapping(".tiff", "image/tiff"); + MimeHelper.AddMimeMapping(".tcl", "application/x-tcl"); + MimeHelper.AddMimeMapping(".texi", "application/x-texinfo"); + MimeHelper.AddMimeMapping(".tsv", "text/tab-separated-values"); + MimeHelper.AddMimeMapping(".ustar", "application/x-ustar"); + MimeHelper.AddMimeMapping(".uls", "text/iuls"); + MimeHelper.AddMimeMapping(".vcf", "text/x-vcard"); + MimeHelper.AddMimeMapping(".wps", "application/vnd.ms-works"); + MimeHelper.AddMimeMapping(".wav", "audio/wav"); + MimeHelper.AddMimeMapping(".wrz", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".wri", "application/x-mswrite"); + MimeHelper.AddMimeMapping(".wks", "application/vnd.ms-works"); + MimeHelper.AddMimeMapping(".wmf", "application/x-msmetafile"); + MimeHelper.AddMimeMapping(".wcm", "application/vnd.ms-works"); + MimeHelper.AddMimeMapping(".wrl", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".wdb", "application/vnd.ms-works"); + MimeHelper.AddMimeMapping(".wsdl", "text/xml"); + MimeHelper.AddMimeMapping(".xap", "application/x-silverlight-app"); + MimeHelper.AddMimeMapping(".xml", "text/xml"); + MimeHelper.AddMimeMapping(".xlm", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xaf", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".xla", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xls", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xlsx", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xof", "x-world/x-vrml"); + MimeHelper.AddMimeMapping(".xlt", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xlc", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xsl", "text/xml"); + MimeHelper.AddMimeMapping(".xbm", "image/x-xbitmap"); + MimeHelper.AddMimeMapping(".xlw", "application/vnd.ms-excel"); + MimeHelper.AddMimeMapping(".xpm", "image/x-xpixmap"); + MimeHelper.AddMimeMapping(".xwd", "image/x-xwindowdump"); + MimeHelper.AddMimeMapping(".xsd", "text/xml"); + MimeHelper.AddMimeMapping(".z", "application/x-compress"); + MimeHelper.AddMimeMapping(".zip", "application/x-zip-compressed"); + MimeHelper.AddMimeMapping(".*", "application/octet-stream"); + } + } + - static MimeHelper() - { - MimeHelper._mimeMappingTable = new Hashtable(190, StringComparer.CurrentCultureIgnoreCase); - MimeHelper.AddMimeMapping(".323", "text/h323"); - MimeHelper.AddMimeMapping(".asx", "video/x-ms-asf"); - MimeHelper.AddMimeMapping(".acx", "application/internet-property-stream"); - MimeHelper.AddMimeMapping(".ai", "application/postscript"); - MimeHelper.AddMimeMapping(".aif", "audio/x-aiff"); - MimeHelper.AddMimeMapping(".aiff", "audio/aiff"); - MimeHelper.AddMimeMapping(".axs", "application/olescript"); - MimeHelper.AddMimeMapping(".aifc", "audio/aiff"); - MimeHelper.AddMimeMapping(".asr", "video/x-ms-asf"); - MimeHelper.AddMimeMapping(".avi", "video/x-msvideo"); - MimeHelper.AddMimeMapping(".asf", "video/x-ms-asf"); - MimeHelper.AddMimeMapping(".au", "audio/basic"); - MimeHelper.AddMimeMapping(".application", "application/x-ms-application"); - MimeHelper.AddMimeMapping(".bin", "application/octet-stream"); - MimeHelper.AddMimeMapping(".bas", "text/plain"); - MimeHelper.AddMimeMapping(".bcpio", "application/x-bcpio"); - MimeHelper.AddMimeMapping(".bmp", "image/bmp"); - MimeHelper.AddMimeMapping(".cdf", "application/x-cdf"); - MimeHelper.AddMimeMapping(".cat", "application/vndms-pkiseccat"); - MimeHelper.AddMimeMapping(".crt", "application/x-x509-ca-cert"); - MimeHelper.AddMimeMapping(".c", "text/plain"); - MimeHelper.AddMimeMapping(".css", "text/css"); - MimeHelper.AddMimeMapping(".cer", "application/x-x509-ca-cert"); - MimeHelper.AddMimeMapping(".crl", "application/pkix-crl"); - MimeHelper.AddMimeMapping(".cmx", "image/x-cmx"); - MimeHelper.AddMimeMapping(".csh", "application/x-csh"); - MimeHelper.AddMimeMapping(".cod", "image/cis-cod"); - MimeHelper.AddMimeMapping(".cpio", "application/x-cpio"); - MimeHelper.AddMimeMapping(".clp", "application/x-msclip"); - MimeHelper.AddMimeMapping(".crd", "application/x-mscardfile"); - MimeHelper.AddMimeMapping(".deploy", "application/octet-stream"); - MimeHelper.AddMimeMapping(".dll", "application/x-msdownload"); - MimeHelper.AddMimeMapping(".dot", "application/msword"); - MimeHelper.AddMimeMapping(".doc", "application/msword"); - MimeHelper.AddMimeMapping(".dvi", "application/x-dvi"); - MimeHelper.AddMimeMapping(".dir", "application/x-director"); - MimeHelper.AddMimeMapping(".dxr", "application/x-director"); - MimeHelper.AddMimeMapping(".der", "application/x-x509-ca-cert"); - MimeHelper.AddMimeMapping(".dib", "image/bmp"); - MimeHelper.AddMimeMapping(".dcr", "application/x-director"); - MimeHelper.AddMimeMapping(".disco", "text/xml"); - MimeHelper.AddMimeMapping(".exe", "application/octet-stream"); - MimeHelper.AddMimeMapping(".etx", "text/x-setext"); - MimeHelper.AddMimeMapping(".evy", "application/envoy"); - MimeHelper.AddMimeMapping(".eml", "message/rfc822"); - MimeHelper.AddMimeMapping(".eps", "application/postscript"); - MimeHelper.AddMimeMapping(".flr", "x-world/x-vrml"); - MimeHelper.AddMimeMapping(".fif", "application/fractals"); - MimeHelper.AddMimeMapping(".gtar", "application/x-gtar"); - MimeHelper.AddMimeMapping(".gif", "image/gif"); - MimeHelper.AddMimeMapping(".gz", "application/x-gzip"); - MimeHelper.AddMimeMapping(".hta", "application/hta"); - MimeHelper.AddMimeMapping(".htc", "text/x-component"); - MimeHelper.AddMimeMapping(".htt", "text/webviewhtml"); - MimeHelper.AddMimeMapping(".h", "text/plain"); - MimeHelper.AddMimeMapping(".hdf", "application/x-hdf"); - MimeHelper.AddMimeMapping(".hlp", "application/winhlp"); - MimeHelper.AddMimeMapping(".html", "text/html"); - MimeHelper.AddMimeMapping(".htm", "text/html"); - MimeHelper.AddMimeMapping(".hqx", "application/mac-binhex40"); - MimeHelper.AddMimeMapping(".isp", "application/x-internet-signup"); - MimeHelper.AddMimeMapping(".iii", "application/x-iphone"); - MimeHelper.AddMimeMapping(".ief", "image/ief"); - MimeHelper.AddMimeMapping(".ivf", "video/x-ivf"); - MimeHelper.AddMimeMapping(".ins", "application/x-internet-signup"); - MimeHelper.AddMimeMapping(".ico", "image/x-icon"); - MimeHelper.AddMimeMapping(".jpg", "image/jpeg"); - MimeHelper.AddMimeMapping(".jfif", "image/pjpeg"); - MimeHelper.AddMimeMapping(".jpe", "image/jpeg"); - MimeHelper.AddMimeMapping(".jpeg", "image/jpeg"); - MimeHelper.AddMimeMapping(".js", "application/x-javascript"); - MimeHelper.AddMimeMapping(".lsx", "video/x-la-asf"); - MimeHelper.AddMimeMapping(".latex", "application/x-latex"); - MimeHelper.AddMimeMapping(".lsf", "video/x-la-asf"); - MimeHelper.AddMimeMapping(".manifest", "application/x-ms-manifest"); - MimeHelper.AddMimeMapping(".mhtml", "message/rfc822"); - MimeHelper.AddMimeMapping(".mny", "application/x-msmoney"); - MimeHelper.AddMimeMapping(".mht", "message/rfc822"); - MimeHelper.AddMimeMapping(".mid", "audio/mid"); - MimeHelper.AddMimeMapping(".mpv2", "video/mpeg"); - MimeHelper.AddMimeMapping(".man", "application/x-troff-man"); - MimeHelper.AddMimeMapping(".mvb", "application/x-msmediaview"); - MimeHelper.AddMimeMapping(".mpeg", "video/mpeg"); - MimeHelper.AddMimeMapping(".m3u", "audio/x-mpegurl"); - MimeHelper.AddMimeMapping(".mdb", "application/x-msaccess"); - MimeHelper.AddMimeMapping(".mpp", "application/vnd.ms-project"); - MimeHelper.AddMimeMapping(".m1v", "video/mpeg"); - MimeHelper.AddMimeMapping(".mpa", "video/mpeg"); - MimeHelper.AddMimeMapping(".me", "application/x-troff-me"); - MimeHelper.AddMimeMapping(".m13", "application/x-msmediaview"); - MimeHelper.AddMimeMapping(".movie", "video/x-sgi-movie"); - MimeHelper.AddMimeMapping(".m14", "application/x-msmediaview"); - MimeHelper.AddMimeMapping(".mpe", "video/mpeg"); - MimeHelper.AddMimeMapping(".mp2", "video/mpeg"); - MimeHelper.AddMimeMapping(".mov", "video/quicktime"); - MimeHelper.AddMimeMapping(".mp3", "audio/mpeg"); - MimeHelper.AddMimeMapping(".mpg", "video/mpeg"); - MimeHelper.AddMimeMapping(".ms", "application/x-troff-ms"); - MimeHelper.AddMimeMapping(".nc", "application/x-netcdf"); - MimeHelper.AddMimeMapping(".nws", "message/rfc822"); - MimeHelper.AddMimeMapping(".oda", "application/oda"); - MimeHelper.AddMimeMapping(".ods", "application/oleobject"); - MimeHelper.AddMimeMapping(".pmc", "application/x-perfmon"); - MimeHelper.AddMimeMapping(".p7r", "application/x-pkcs7-certreqresp"); - MimeHelper.AddMimeMapping(".p7b", "application/x-pkcs7-certificates"); - MimeHelper.AddMimeMapping(".p7s", "application/pkcs7-signature"); - MimeHelper.AddMimeMapping(".pmw", "application/x-perfmon"); - MimeHelper.AddMimeMapping(".ps", "application/postscript"); - MimeHelper.AddMimeMapping(".p7c", "application/pkcs7-mime"); - MimeHelper.AddMimeMapping(".pbm", "image/x-portable-bitmap"); - MimeHelper.AddMimeMapping(".ppm", "image/x-portable-pixmap"); - MimeHelper.AddMimeMapping(".pub", "application/x-mspublisher"); - MimeHelper.AddMimeMapping(".pnm", "image/x-portable-anymap"); - MimeHelper.AddMimeMapping(".png", "image/png"); - MimeHelper.AddMimeMapping(".pml", "application/x-perfmon"); - MimeHelper.AddMimeMapping(".p10", "application/pkcs10"); - MimeHelper.AddMimeMapping(".pfx", "application/x-pkcs12"); - MimeHelper.AddMimeMapping(".p12", "application/x-pkcs12"); - MimeHelper.AddMimeMapping(".pdf", "application/pdf"); - MimeHelper.AddMimeMapping(".pps", "application/vnd.ms-powerpoint"); - MimeHelper.AddMimeMapping(".p7m", "application/pkcs7-mime"); - MimeHelper.AddMimeMapping(".pko", "application/vndms-pkipko"); - MimeHelper.AddMimeMapping(".ppt", "application/vnd.ms-powerpoint"); - MimeHelper.AddMimeMapping(".pmr", "application/x-perfmon"); - MimeHelper.AddMimeMapping(".pma", "application/x-perfmon"); - MimeHelper.AddMimeMapping(".pot", "application/vnd.ms-powerpoint"); - MimeHelper.AddMimeMapping(".prf", "application/pics-rules"); - MimeHelper.AddMimeMapping(".pgm", "image/x-portable-graymap"); - MimeHelper.AddMimeMapping(".qt", "video/quicktime"); - MimeHelper.AddMimeMapping(".ra", "audio/x-pn-realaudio"); - MimeHelper.AddMimeMapping(".rgb", "image/x-rgb"); - MimeHelper.AddMimeMapping(".ram", "audio/x-pn-realaudio"); - MimeHelper.AddMimeMapping(".rmi", "audio/mid"); - MimeHelper.AddMimeMapping(".ras", "image/x-cmu-raster"); - MimeHelper.AddMimeMapping(".roff", "application/x-troff"); - MimeHelper.AddMimeMapping(".rtf", "application/rtf"); - MimeHelper.AddMimeMapping(".rtx", "text/richtext"); - MimeHelper.AddMimeMapping(".sv4crc", "application/x-sv4crc"); - MimeHelper.AddMimeMapping(".spc", "application/x-pkcs7-certificates"); - MimeHelper.AddMimeMapping(".setreg", "application/set-registration-initiation"); - MimeHelper.AddMimeMapping(".snd", "audio/basic"); - MimeHelper.AddMimeMapping(".stl", "application/vndms-pkistl"); - MimeHelper.AddMimeMapping(".setpay", "application/set-payment-initiation"); - MimeHelper.AddMimeMapping(".stm", "text/html"); - MimeHelper.AddMimeMapping(".shar", "application/x-shar"); - MimeHelper.AddMimeMapping(".sh", "application/x-sh"); - MimeHelper.AddMimeMapping(".sit", "application/x-stuffit"); - MimeHelper.AddMimeMapping(".spl", "application/futuresplash"); - MimeHelper.AddMimeMapping(".sct", "text/scriptlet"); - MimeHelper.AddMimeMapping(".scd", "application/x-msschedule"); - MimeHelper.AddMimeMapping(".sst", "application/vndms-pkicertstore"); - MimeHelper.AddMimeMapping(".src", "application/x-wais-source"); - MimeHelper.AddMimeMapping(".sv4cpio", "application/x-sv4cpio"); - MimeHelper.AddMimeMapping(".tex", "application/x-tex"); - MimeHelper.AddMimeMapping(".tgz", "application/x-compressed"); - MimeHelper.AddMimeMapping(".t", "application/x-troff"); - MimeHelper.AddMimeMapping(".tar", "application/x-tar"); - MimeHelper.AddMimeMapping(".tr", "application/x-troff"); - MimeHelper.AddMimeMapping(".tif", "image/tiff"); - MimeHelper.AddMimeMapping(".txt", "text/plain"); - MimeHelper.AddMimeMapping(".texinfo", "application/x-texinfo"); - MimeHelper.AddMimeMapping(".trm", "application/x-msterminal"); - MimeHelper.AddMimeMapping(".tiff", "image/tiff"); - MimeHelper.AddMimeMapping(".tcl", "application/x-tcl"); - MimeHelper.AddMimeMapping(".texi", "application/x-texinfo"); - MimeHelper.AddMimeMapping(".tsv", "text/tab-separated-values"); - MimeHelper.AddMimeMapping(".ustar", "application/x-ustar"); - MimeHelper.AddMimeMapping(".uls", "text/iuls"); - MimeHelper.AddMimeMapping(".vcf", "text/x-vcard"); - MimeHelper.AddMimeMapping(".wps", "application/vnd.ms-works"); - MimeHelper.AddMimeMapping(".wav", "audio/wav"); - MimeHelper.AddMimeMapping(".wrz", "x-world/x-vrml"); - MimeHelper.AddMimeMapping(".wri", "application/x-mswrite"); - MimeHelper.AddMimeMapping(".wks", "application/vnd.ms-works"); - MimeHelper.AddMimeMapping(".wmf", "application/x-msmetafile"); - MimeHelper.AddMimeMapping(".wcm", "application/vnd.ms-works"); - MimeHelper.AddMimeMapping(".wrl", "x-world/x-vrml"); - MimeHelper.AddMimeMapping(".wdb", "application/vnd.ms-works"); - MimeHelper.AddMimeMapping(".wsdl", "text/xml"); - MimeHelper.AddMimeMapping(".xap", "application/x-silverlight-app"); - MimeHelper.AddMimeMapping(".xml", "text/xml"); - MimeHelper.AddMimeMapping(".xlm", "application/vnd.ms-excel"); - MimeHelper.AddMimeMapping(".xaf", "x-world/x-vrml"); - MimeHelper.AddMimeMapping(".xla", "application/vnd.ms-excel"); - MimeHelper.AddMimeMapping(".xls", "application/vnd.ms-excel"); - MimeHelper.AddMimeMapping(".xlsx", "application/vnd.ms-excel"); - MimeHelper.AddMimeMapping(".xof", "x-world/x-vrml"); - MimeHelper.AddMimeMapping(".xlt", "application/vnd.ms-excel"); - MimeHelper.AddMimeMapping(".xlc", "application/vnd.ms-excel"); - MimeHelper.AddMimeMapping(".xsl", "text/xml"); - MimeHelper.AddMimeMapping(".xbm", "image/x-xbitmap"); - MimeHelper.AddMimeMapping(".xlw", "application/vnd.ms-excel"); - MimeHelper.AddMimeMapping(".xpm", "image/x-xpixmap"); - MimeHelper.AddMimeMapping(".xwd", "image/x-xwindowdump"); - MimeHelper.AddMimeMapping(".xsd", "text/xml"); - MimeHelper.AddMimeMapping(".z", "application/x-compress"); - MimeHelper.AddMimeMapping(".zip", "application/x-zip-compressed"); - MimeHelper.AddMimeMapping(".*", "application/octet-stream"); - } - } - - } diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileEntity.cs b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileEntity.cs new file mode 100644 index 00000000..18c9c58f --- /dev/null +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileEntity.cs @@ -0,0 +1,48 @@ +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Data.Auditing; +using Yi.Framework.Ddd.Entities; + +namespace Yi.Framework.FileManager +{ + /// + /// 文件表 + /// + [SugarTable("File")] + public class FileEntity : IEntity,IAuditedObject + { + [SugarColumn(ColumnName = "Id", IsPrimaryKey = true)] + public long Id { get; set; } + /// + /// 文件类型 + /// + [SugarColumn(ColumnName = "FileContentType")] + public string? FileContentType { get; set; } + /// + /// 文件大小 + /// + [SugarColumn(ColumnName = "FileSize")] + public decimal FileSize { get; set; } + /// + /// 文件名 + /// + [SugarColumn(ColumnName = "FileName")] + public string FileName { get; set; } + /// + /// 文件路径 + /// + [SugarColumn(ColumnName = "FilePath")] + public string FilePath { get; set; } + + public DateTime CreationTime { get; set; } + public long? CreatorId { get; set; } + + public long? LastModifierId { get; set; } + + public DateTime? LastModificationTime { get; set; } + } +} diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileGetListOutputDto.cs b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileGetListOutputDto.cs new file mode 100644 index 00000000..9cc4c5e4 --- /dev/null +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileGetListOutputDto.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.Ddd.Dtos; + +namespace Yi.Framework.FileManager +{ + public class FileGetListOutputDto:IEntityDto + { + public long Id { get; set; } + } +} diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileService.cs b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileService.cs new file mode 100644 index 00000000..59f89626 --- /dev/null +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/FileService.cs @@ -0,0 +1,158 @@ +using Cike.AutoWebApi.Setting; +using Mapster; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using SqlSugar; +using System; +using System.Collections.Generic; +using System.Data; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Yi.Framework.AspNetCore.Extensions; +using Yi.Framework.Core.Const; +using Yi.Framework.Core.Enums; +using Yi.Framework.Core.Helper; +using Yi.Framework.Ddd.Repositories; +using Yi.Framework.Ddd.Services; +using Yi.Framework.Ddd.Services.Abstract; +using Yi.Framework.ThumbnailSharp; + +namespace Yi.Framework.FileManager +{ + /// + /// 文件处理 + /// + public class FileService : ApplicationService, IFileService, IAutoApiService + { + private readonly IRepository _repository; + private readonly ThumbnailSharpManager _thumbnailSharpManager; + private readonly HttpContext _httpContext; + public FileService(IRepository repository, ThumbnailSharpManager thumbnailSharpManager, IHttpContextAccessor httpContextAccessor + ) + { + _repository = repository; + _thumbnailSharpManager = thumbnailSharpManager; + if (httpContextAccessor.HttpContext is null) + { + throw new ApplicationException("HttpContext为空"); + } + _httpContext = httpContextAccessor.HttpContext; + } + + /// + /// 下载文件,是否缩略图 + /// + /// + [Route("/api/file/{code}/{isThumbnail?}")] + public async Task Get([FromRoute] long code, [FromRoute] bool? isThumbnail) + { + var file = await _repository.GetByIdAsync(code); + if (file is null) + { + return new NotFoundResult(); + } + + var path = file.FilePath; + //如果为缩略图,需要修改路径 + if (isThumbnail is true) + { + path = $"{PathConst.wwwroot}/{FileTypeEnum.Thumbnail}/{file.Id}{Path.GetExtension(file.FileName)}"; + } + //路径为: 文件路径/文件id+文件扩展名 + + if (!File.Exists(path)) + { + return new NotFoundResult(); + } + + var steam = await File.ReadAllBytesAsync(path); + + //设置附件下载,下载名称 + _httpContext.FileAttachmentHandle(file.FileName); + return new FileContentResult(steam, file.FileContentType ?? @"text/plain"); + } + + /// + /// 上传文件 + /// + /// + public async Task> Post([FromForm] IFormFileCollection file) + { + if (file.Count() == 0) + { + throw new ArgumentException("文件上传为空!"); + } + //批量插入 + List entities = new(); + + foreach (var f in file) + { + FileEntity data = new(); + data.Id = SnowflakeHelper.NextId; + data.FileSize = ((decimal)f.Length) / 1024; + data.FileName = f.FileName; + + + data.FileContentType = MimeHelper.GetMimeMapping(f.FileName); + + + var type = MimeHelper.GetFileType(f.FileName); + + //落盘文件,文件名为雪花id+自己的扩展名 + string filename = data.Id.ToString() + Path.GetExtension(f.FileName); + string typePath = $"{PathConst.wwwroot}/{type}"; + if (!Directory.Exists(typePath)) + { + Directory.CreateDirectory(typePath); + } + + var filePath = Path.Combine(typePath, filename); + data.FilePath = filePath; + + + //生成文件 + using (var stream = new FileStream(filePath, FileMode.CreateNew, FileAccess.ReadWrite)) + { + await f.CopyToAsync(stream); + + //如果是图片类型,还需要生成缩略图,当然,如果图片很小,直接复制过去即可 + if (FileTypeEnum.Image.Equals(type)) + { + string thumbnailPath = $"{PathConst.wwwroot}/{FileTypeEnum.Thumbnail}"; + if (!Directory.Exists(thumbnailPath)) + { + Directory.CreateDirectory(thumbnailPath); + } + //保存至缩略图路径 + byte[] result = null!; + try + { + result = _thumbnailSharpManager.CreateThumbnailBytes(thumbnailSize: 300, imageStream: stream, imageFormat: Format.Jpeg); + } + catch + { + result = new byte[stream.Length]; + stream.Read(result, 0, result.Length); + // 设置当前流的位置为流的开始 + stream.Seek(0, SeekOrigin.Begin); + } + finally + { + + await System.IO.File.WriteAllBytesAsync(Path.Combine(thumbnailPath, filename), result); + } + } + + + }; + entities.Add(data); + } + await _repository.InsertRangeAsync(entities); + return entities.Adapt>(); + + + } + } +} diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/IFileService.cs b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/IFileService.cs new file mode 100644 index 00000000..ad47147f --- /dev/null +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/IFileService.cs @@ -0,0 +1,12 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Yi.Framework.FileManager +{ + public interface IFileService + { + } +} diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/Yi.Framework.FileManager.csproj b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/Yi.Framework.FileManager.csproj index 4317b5b8..453826c2 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/Yi.Framework.FileManager.csproj +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/Yi.Framework.FileManager.csproj @@ -4,10 +4,15 @@ net6.0 enable enable + True + + + + diff --git a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs index 371a8b6a..34d1deb2 100644 --- a/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs +++ b/Yi.Framework.Net6/src/module/Yi.Framework.FileManager/YiFrameworkFileManagerModule.cs @@ -1,7 +1,20 @@ -namespace Yi.Framework.FileManager -{ - public class YiFrameworkFileManagerModule - { +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using StartupModules; +namespace Yi.Framework.FileManager +{ + public class YiFrameworkFileManagerModule : IStartupModule + { + public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context) + { + + } + + public void ConfigureServices(IServiceCollection services, ConfigureServicesContext context) + { + services.AddTransient(); + services.AddTransient(); + } } } \ No newline at end of file diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj index e4000629..5aad5dba 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/Yi.RBAC.Domain.csproj @@ -17,6 +17,7 @@ + diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs index 06869cdb..0c06234c 100644 --- a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Domain/YiRBACDomainModule.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using Yi.Framework.Core.Attributes; using Yi.Framework.Data; using Yi.Framework.EventBus; +using Yi.Framework.FileManager; using Yi.Framework.OperLogManager; using Yi.Framework.ThumbnailSharp; using Yi.RBAC.Domain.Logs; @@ -22,7 +23,8 @@ namespace Yi.RBAC.Domain typeof(YiFrameworkDataModule), typeof(YiFrameworkThumbnailSharpModule), typeof(YiFrameworkEventBusModule), - typeof(YiFrameworkOperLogManagerModule) + typeof(YiFrameworkOperLogManagerModule), + typeof(YiFrameworkFileManagerModule) )] public class YiRBACDomainModule : IStartupModule { diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628277864304640.txt b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628277864304640.txt new file mode 100644 index 00000000..119417d4 --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628277864304640.txt @@ -0,0 +1,28 @@ +3-5 +一周一次 + +实现涂膜功能 +1:数据存储,Crud +2:后台线程,任务调度 +3:plc通信交互,IM工厂 +4:定时任务界面管控 +5:signlr开发 +6:授权鉴权 +7:用户角色菜单模块 +8:配置文件统一标准化 +9:规范问题 +10:动态api +11:发布订阅 +12:resful +13:dto注释 +14:代码中文 +15:种子数据 + +1:job任务调度的模式,可以在if上的改 +2:Crud,EntityServiceBase,考虑复用的话sqlsugar这块就不用动了、仓储、工作单元、过滤器 +3:IOptionsWritable ,直接可以复用 +4:事件,是否需要,需要的话,用哪个 +5:动态api,是否需要 +6:IM,IVarReader中的IDataChannel工厂 +6:ISignal +7:微软日志扩展,这块是否考虑封装出来,还是直接提供微软日志的扩展,我们提供模板就可以了 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628396160454656.txt b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628396160454656.txt new file mode 100644 index 00000000..119417d4 --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628396160454656.txt @@ -0,0 +1,28 @@ +3-5 +一周一次 + +实现涂膜功能 +1:数据存储,Crud +2:后台线程,任务调度 +3:plc通信交互,IM工厂 +4:定时任务界面管控 +5:signlr开发 +6:授权鉴权 +7:用户角色菜单模块 +8:配置文件统一标准化 +9:规范问题 +10:动态api +11:发布订阅 +12:resful +13:dto注释 +14:代码中文 +15:种子数据 + +1:job任务调度的模式,可以在if上的改 +2:Crud,EntityServiceBase,考虑复用的话sqlsugar这块就不用动了、仓储、工作单元、过滤器 +3:IOptionsWritable ,直接可以复用 +4:事件,是否需要,需要的话,用哪个 +5:动态api,是否需要 +6:IM,IVarReader中的IDataChannel工厂 +6:ISignal +7:微软日志扩展,这块是否考虑封装出来,还是直接提供微软日志的扩展,我们提供模板就可以了 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628415508779008.txt b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628415508779008.txt new file mode 100644 index 00000000..119417d4 --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628628415508779008.txt @@ -0,0 +1,28 @@ +3-5 +一周一次 + +实现涂膜功能 +1:数据存储,Crud +2:后台线程,任务调度 +3:plc通信交互,IM工厂 +4:定时任务界面管控 +5:signlr开发 +6:授权鉴权 +7:用户角色菜单模块 +8:配置文件统一标准化 +9:规范问题 +10:动态api +11:发布订阅 +12:resful +13:dto注释 +14:代码中文 +15:种子数据 + +1:job任务调度的模式,可以在if上的改 +2:Crud,EntityServiceBase,考虑复用的话sqlsugar这块就不用动了、仓储、工作单元、过滤器 +3:IOptionsWritable ,直接可以复用 +4:事件,是否需要,需要的话,用哪个 +5:动态api,是否需要 +6:IM,IVarReader中的IDataChannel工厂 +6:ISignal +7:微软日志扩展,这块是否考虑封装出来,还是直接提供微软日志的扩展,我们提供模板就可以了 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628636925021786112.txt b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628636925021786112.txt new file mode 100644 index 00000000..119417d4 --- /dev/null +++ b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/File/1628636925021786112.txt @@ -0,0 +1,28 @@ +3-5 +一周一次 + +实现涂膜功能 +1:数据存储,Crud +2:后台线程,任务调度 +3:plc通信交互,IM工厂 +4:定时任务界面管控 +5:signlr开发 +6:授权鉴权 +7:用户角色菜单模块 +8:配置文件统一标准化 +9:规范问题 +10:动态api +11:发布订阅 +12:resful +13:dto注释 +14:代码中文 +15:种子数据 + +1:job任务调度的模式,可以在if上的改 +2:Crud,EntityServiceBase,考虑复用的话sqlsugar这块就不用动了、仓储、工作单元、过滤器 +3:IOptionsWritable ,直接可以复用 +4:事件,是否需要,需要的话,用哪个 +5:动态api,是否需要 +6:IM,IVarReader中的IDataChannel工厂 +6:ISignal +7:微软日志扩展,这块是否考虑封装出来,还是直接提供微软日志的扩展,我们提供模板就可以了 diff --git a/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/Image/1628639014875697152.jpg b/Yi.Framework.Net6/src/project/rbac/Yi.RBAC.Web/wwwroot/Image/1628639014875697152.jpg new file mode 100644 index 0000000000000000000000000000000000000000..57c1f446cb28dd7bdbb3f2f11057650f693e93a5 GIT binary patch literal 30944 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 C(=9jv delta 300 zcmZp8z|pXPV}i6`0RsbrA`ruX@I)PB#)6Fr^Z6M$n*_EAFtRx4urt17V0_7Uo#zVQ zI?n$*t2wMVud!EhaI(&34`8{(n#Cx=xPif+;W__l{?ii|%5V1%U~FY!V$PU;FNAT* z^z-qIhAf=dnC5Su&w7gy$YMCSxt2YWY5TQEMjcj0#>s&SC)kX|*u>oxCvW7Dn7*)s zQG8nhBa?yw1A{2TYX<)7{OyotOPJPUa8xvz6Ci|Q<#mJ znHXL(odlY+bNlNC#y4D(B^YOJFX&-ZWSYLNk&$Qn^)SX{#%&XTo)KW?lB%?WMkvs%)tL;JBI?}O8&_Q{8_i}c+cpe006l@S$F^d