feat: 完成文件模块开发
This commit is contained in:
@@ -10,6 +10,57 @@ namespace Yi.Framework.AspNetCore.Extensions
|
|||||||
{
|
{
|
||||||
public static class HttpContextExtensions
|
public static class HttpContextExtensions
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 设置文件下载名称
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="httpContext"></param>
|
||||||
|
/// <param name="fileName"></param>
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 设置文件附件名称
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="httpContext"></param>
|
||||||
|
/// <param name="fileName"></param>
|
||||||
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取语言种类
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="httpContext"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 判断是否为异步请求
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="request"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static bool IsAjaxRequest(this HttpRequest request)
|
||||||
|
{
|
||||||
|
string header = request.Headers["X-Requested-With"];
|
||||||
|
return "XMLHttpRequest".Equals(header);
|
||||||
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取客户端IP
|
/// 获取客户端IP
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 定义公共文件常量
|
||||||
|
/// </summary>
|
||||||
|
public class PathConst
|
||||||
|
{
|
||||||
|
public const string wwwroot = "wwwroot";
|
||||||
|
public const string DataTemplate = "_DataTemplate";
|
||||||
|
public const string DataExport = "_DataExport";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 定义公共文件路径
|
||||||
|
/// </summary>
|
||||||
|
public enum FileTypeEnum
|
||||||
|
{
|
||||||
|
File,
|
||||||
|
Image,
|
||||||
|
Thumbnail,
|
||||||
|
Excel,
|
||||||
|
Temp
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Yi.Framework.Core.Enums;
|
||||||
|
|
||||||
namespace Yi.Framework.Core.Helper
|
namespace Yi.Framework.Core.Helper
|
||||||
{
|
{
|
||||||
@@ -13,6 +14,11 @@ namespace Yi.Framework.Core.Helper
|
|||||||
// 将所有的Content Type都扔进去吧
|
// 将所有的Content Type都扔进去吧
|
||||||
// 调用的时候直接调用静态方法即可。
|
// 调用的时候直接调用静态方法即可。
|
||||||
|
|
||||||
|
public static List<string> ImageType { get; set; } = new List<string>
|
||||||
|
{
|
||||||
|
".jpg",".png",".jpge",".gif"
|
||||||
|
};
|
||||||
|
|
||||||
private static Hashtable _mimeMappingTable;
|
private static Hashtable _mimeMappingTable;
|
||||||
|
|
||||||
private static void AddMimeMapping(string extension, string MimeType)
|
private static void AddMimeMapping(string extension, string MimeType)
|
||||||
@@ -35,6 +41,16 @@ namespace Yi.Framework.Core.Helper
|
|||||||
return text;
|
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()
|
static MimeHelper()
|
||||||
{
|
{
|
||||||
MimeHelper._mimeMappingTable = new Hashtable(190, StringComparer.CurrentCultureIgnoreCase);
|
MimeHelper._mimeMappingTable = new Hashtable(190, StringComparer.CurrentCultureIgnoreCase);
|
||||||
|
|||||||
@@ -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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 文件表
|
||||||
|
///</summary>
|
||||||
|
[SugarTable("File")]
|
||||||
|
public class FileEntity : IEntity<long>,IAuditedObject
|
||||||
|
{
|
||||||
|
[SugarColumn(ColumnName = "Id", IsPrimaryKey = true)]
|
||||||
|
public long Id { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 文件类型
|
||||||
|
///</summary>
|
||||||
|
[SugarColumn(ColumnName = "FileContentType")]
|
||||||
|
public string? FileContentType { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 文件大小
|
||||||
|
///</summary>
|
||||||
|
[SugarColumn(ColumnName = "FileSize")]
|
||||||
|
public decimal FileSize { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 文件名
|
||||||
|
///</summary>
|
||||||
|
[SugarColumn(ColumnName = "FileName")]
|
||||||
|
public string FileName { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// 文件路径
|
||||||
|
///</summary>
|
||||||
|
[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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 文件处理
|
||||||
|
/// </summary>
|
||||||
|
public class FileService : ApplicationService, IFileService, IAutoApiService
|
||||||
|
{
|
||||||
|
private readonly IRepository<FileEntity> _repository;
|
||||||
|
private readonly ThumbnailSharpManager _thumbnailSharpManager;
|
||||||
|
private readonly HttpContext _httpContext;
|
||||||
|
public FileService(IRepository<FileEntity> repository, ThumbnailSharpManager thumbnailSharpManager, IHttpContextAccessor httpContextAccessor
|
||||||
|
)
|
||||||
|
{
|
||||||
|
_repository = repository;
|
||||||
|
_thumbnailSharpManager = thumbnailSharpManager;
|
||||||
|
if (httpContextAccessor.HttpContext is null)
|
||||||
|
{
|
||||||
|
throw new ApplicationException("HttpContext为空");
|
||||||
|
}
|
||||||
|
_httpContext = httpContextAccessor.HttpContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 下载文件,是否缩略图
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[Route("/api/file/{code}/{isThumbnail?}")]
|
||||||
|
public async Task<IActionResult> 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");
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 上传文件
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<List<FileGetListOutputDto>> Post([FromForm] IFormFileCollection file)
|
||||||
|
{
|
||||||
|
if (file.Count() == 0)
|
||||||
|
{
|
||||||
|
throw new ArgumentException("文件上传为空!");
|
||||||
|
}
|
||||||
|
//批量插入
|
||||||
|
List<FileEntity> 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<List<FileGetListOutputDto>>();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -4,10 +4,15 @@
|
|||||||
<TargetFramework>net6.0</TargetFramework>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
|
<GenerateDocumentationFile>True</GenerateDocumentationFile>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\framework\Yi.Framework.AspNetCore\Yi.Framework.AspNetCore.csproj" />
|
||||||
<ProjectReference Include="..\..\framework\Yi.Framework.Core\Yi.Framework.Core.csproj" />
|
<ProjectReference Include="..\..\framework\Yi.Framework.Core\Yi.Framework.Core.csproj" />
|
||||||
|
<ProjectReference Include="..\..\framework\Yi.Framework.Data\Yi.Framework.Data.csproj" />
|
||||||
|
<ProjectReference Include="..\..\framework\Yi.Framework.Ddd\Yi.Framework.Ddd.csproj" />
|
||||||
|
<ProjectReference Include="..\Yi.Framework.ThumbnailSharp\Yi.Framework.ThumbnailSharp.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,7 +1,20 @@
|
|||||||
namespace Yi.Framework.FileManager
|
using Microsoft.AspNetCore.Builder;
|
||||||
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
|
using StartupModules;
|
||||||
|
|
||||||
|
namespace Yi.Framework.FileManager
|
||||||
{
|
{
|
||||||
public class YiFrameworkFileManagerModule
|
public class YiFrameworkFileManagerModule : IStartupModule
|
||||||
|
{
|
||||||
|
public void Configure(IApplicationBuilder app, ConfigureMiddlewareContext context)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ConfigureServices(IServiceCollection services, ConfigureServicesContext context)
|
||||||
|
{
|
||||||
|
services.AddTransient<FileService>();
|
||||||
|
services.AddTransient<IFileService,FileService>();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -17,6 +17,7 @@
|
|||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\..\..\framework\Yi.Framework.Data\Yi.Framework.Data.csproj" />
|
<ProjectReference Include="..\..\..\framework\Yi.Framework.Data\Yi.Framework.Data.csproj" />
|
||||||
<ProjectReference Include="..\..\..\module\Yi.Framework.EventBus\Yi.Framework.EventBus.csproj" />
|
<ProjectReference Include="..\..\..\module\Yi.Framework.EventBus\Yi.Framework.EventBus.csproj" />
|
||||||
|
<ProjectReference Include="..\..\..\module\Yi.Framework.FileManager\Yi.Framework.FileManager.csproj" />
|
||||||
<ProjectReference Include="..\..\..\module\Yi.Framework.OperLogManager\Yi.Framework.OperLogManager.csproj" />
|
<ProjectReference Include="..\..\..\module\Yi.Framework.OperLogManager\Yi.Framework.OperLogManager.csproj" />
|
||||||
<ProjectReference Include="..\..\..\module\Yi.Framework.ThumbnailSharp\Yi.Framework.ThumbnailSharp.csproj" />
|
<ProjectReference Include="..\..\..\module\Yi.Framework.ThumbnailSharp\Yi.Framework.ThumbnailSharp.csproj" />
|
||||||
<ProjectReference Include="..\Yi.RBAC.Domain.Shared\Yi.RBAC.Domain.Shared.csproj" />
|
<ProjectReference Include="..\Yi.RBAC.Domain.Shared\Yi.RBAC.Domain.Shared.csproj" />
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ using System.Threading.Tasks;
|
|||||||
using Yi.Framework.Core.Attributes;
|
using Yi.Framework.Core.Attributes;
|
||||||
using Yi.Framework.Data;
|
using Yi.Framework.Data;
|
||||||
using Yi.Framework.EventBus;
|
using Yi.Framework.EventBus;
|
||||||
|
using Yi.Framework.FileManager;
|
||||||
using Yi.Framework.OperLogManager;
|
using Yi.Framework.OperLogManager;
|
||||||
using Yi.Framework.ThumbnailSharp;
|
using Yi.Framework.ThumbnailSharp;
|
||||||
using Yi.RBAC.Domain.Logs;
|
using Yi.RBAC.Domain.Logs;
|
||||||
@@ -22,7 +23,8 @@ namespace Yi.RBAC.Domain
|
|||||||
typeof(YiFrameworkDataModule),
|
typeof(YiFrameworkDataModule),
|
||||||
typeof(YiFrameworkThumbnailSharpModule),
|
typeof(YiFrameworkThumbnailSharpModule),
|
||||||
typeof(YiFrameworkEventBusModule),
|
typeof(YiFrameworkEventBusModule),
|
||||||
typeof(YiFrameworkOperLogManagerModule)
|
typeof(YiFrameworkOperLogManagerModule),
|
||||||
|
typeof(YiFrameworkFileManagerModule)
|
||||||
)]
|
)]
|
||||||
public class YiRBACDomainModule : IStartupModule
|
public class YiRBACDomainModule : IStartupModule
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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:微软日志扩展,这块是否考虑封装出来,还是直接提供微软日志的扩展,我们提供模板就可以了
|
||||||
@@ -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:微软日志扩展,这块是否考虑封装出来,还是直接提供微软日志的扩展,我们提供模板就可以了
|
||||||
@@ -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:微软日志扩展,这块是否考虑封装出来,还是直接提供微软日志的扩展,我们提供模板就可以了
|
||||||
@@ -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:微软日志扩展,这块是否考虑封装出来,还是直接提供微软日志的扩展,我们提供模板就可以了
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 30 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 10 KiB |
Binary file not shown.
Reference in New Issue
Block a user