diff --git a/.gitee/ISSUE_TEMPLATE/bug.yml b/.gitee/ISSUE_TEMPLATE/bug.yml index 5ddb99f898dda3bf15c2d196cc6f075ee8687e31..2282841207dc7cb3ac12b3fcf402ac8642392350 100644 --- a/.gitee/ISSUE_TEMPLATE/bug.yml +++ b/.gitee/ISSUE_TEMPLATE/bug.yml @@ -13,7 +13,8 @@ body: label: 版本号 description: 请选择项目使用的 Furion 版本? options: - - 4.9.6.9 (最新) + - 4.9.6.10 (最新) + - 4.9.6.9 - 4.9.6.8 - 4.9.6.7 - 4.9.6.6 diff --git a/framework/Directory.Build.props b/framework/Directory.Build.props index 18936d3662b8b95d80a7acbb916cf18fc6a7eeaa..33321fd45800591cab151f1d0b88f90117d84d9f 100644 --- a/framework/Directory.Build.props +++ b/framework/Directory.Build.props @@ -2,7 +2,7 @@ preview net8.0;net9.0 - 4.9.6.9 + 4.9.6.10 enable 百小僧 diff --git a/framework/Furion.Pure/V5_Experience/HttpRemote/Models/RateLimitedStream.cs b/framework/Furion.Pure/V5_Experience/HttpRemote/Models/RateLimitedStream.cs index 90523eb7b259ac867a002056e826648e227445af..4ca7ae793bed332f75ec78151d05425b4321ccc7 100644 --- a/framework/Furion.Pure/V5_Experience/HttpRemote/Models/RateLimitedStream.cs +++ b/framework/Furion.Pure/V5_Experience/HttpRemote/Models/RateLimitedStream.cs @@ -30,25 +30,44 @@ namespace Furion.HttpRemote; /// /// 带应用速率限制的流 /// +/// +/// 基于令牌桶算法(Token Bucket Algorithm)实现流量控制和速率限制。 +/// 参考文献:https://baike.baidu.com/item/令牌桶算法/6597000。 +/// public sealed class RateLimitedStream : Stream { /// - /// 每秒允许的最大字节数 + /// 单次读取或写入操作中处理的最大数据块大小 /// - private readonly int _bytesPerSecond; + internal const int CHUNK_SIZE = 4096; + + /// + /// 每秒允许传输的最大字节数 + /// + internal readonly double _bytesPerSecond; /// internal readonly Stream _innerStream; /// - /// 用于精确计时的 实例 + /// 用于同步访问的锁对象 /// - internal readonly Stopwatch _stopwatch = new(); + internal readonly object _lockObject = new(); /// - /// 到目前为止已读取或写入的总字节数 + /// 用来计算时间间隔的计时器 /// - internal long _totalBytesProcessed; + internal readonly Stopwatch _stopwatch; + + /// + /// 当前可用的令牌数量(字节数) + /// + internal double _availableTokens; + + /// + /// 上次令牌补充的时间戳 + /// + internal long _lastTokenRefillTime; /// /// @@ -56,8 +75,8 @@ public sealed class RateLimitedStream : Stream /// /// /// - /// 每秒允许的最大字节数 - public RateLimitedStream(Stream innerStream, int bytesPerSecond) + /// 每秒允许传输的最大字节数 + public RateLimitedStream(Stream innerStream, double bytesPerSecond) { // 空检查 ArgumentNullException.ThrowIfNull(innerStream); @@ -72,8 +91,14 @@ public sealed class RateLimitedStream : Stream _innerStream = innerStream; _bytesPerSecond = bytesPerSecond; - // 启动 Stopwatch 来开始计时 - _stopwatch.Start(); + // 开始计时 + _stopwatch = Stopwatch.StartNew(); + + // 记录初始时间 + _lastTokenRefillTime = _stopwatch.ElapsedMilliseconds; + + // 初始化可用令牌数 + _availableTokens = bytesPerSecond; } /// @@ -104,11 +129,14 @@ public sealed class RateLimitedStream : Stream /// public override int Read(byte[] buffer, int offset, int count) { - // 根据设定的速率限制调整读写操作的速度 - ApplyRateLimitAsync(count).GetAwaiter().GetResult(); + // 确保单次读取不会超过预设的数据块大小 + var adjustedCount = Math.Min(count, CHUNK_SIZE); + + // 等待直到有足够令牌可用 + WaitForTokens(adjustedCount); // 从内部流读取数据到缓冲区 - return _innerStream.Read(buffer, offset, count); + return _innerStream.Read(buffer, offset, adjustedCount); } /// @@ -120,11 +148,14 @@ public sealed class RateLimitedStream : Stream /// public override void Write(byte[] buffer, int offset, int count) { - // 向内部流写入数据 - _innerStream.Write(buffer, offset, count); + // 确保单次写入不会超过预设的数据块大小 + var adjustedCount = Math.Min(count, CHUNK_SIZE); - // 根据设定的速率限制调整读写操作的速度 - ApplyRateLimitAsync(count).GetAwaiter().GetResult(); + // 等待直到有足够令牌可用 + WaitForTokens(adjustedCount); + + // 向内部流写入数据 + _innerStream.Write(buffer, offset, adjustedCount); } /// @@ -134,35 +165,78 @@ public sealed class RateLimitedStream : Stream if (disposing) { _innerStream.Dispose(); + _stopwatch.Stop(); } base.Dispose(disposing); } /// - /// 根据设定的速率限制调整读写操作的速度 + /// 补充令牌的方法 /// - /// 本次操作将处理的字节数 - internal async Task ApplyRateLimitAsync(int bytesToProcess) + internal void RefillTokens() { - // 自开始以来经过的时间(秒) - var elapsedSeconds = _stopwatch.ElapsedMilliseconds / 1000.0; + // 获取当前计时器的时间 + var now = _stopwatch.ElapsedMilliseconds; - // 根据速率预期应读取的字节数 - var totalBytesExpected = elapsedSeconds * _bytesPerSecond; + // 计算自上次填充令牌以来经过的时间 + var timePassed = now - _lastTokenRefillTime; - // 计算实际与预期之差 - var bytesOverLimit = _totalBytesProcessed + bytesToProcess - totalBytesExpected; - - if (bytesOverLimit > 0) + // 如果时间没有流逝或者流逝时间不足以产生新的令牌,则直接返回 + if (timePassed <= 0) { - // 如果实际操作超过预期,则计算需要等待的时间,并进行延迟 - var delayMilliseconds = (int)(bytesOverLimit / _bytesPerSecond * 1000.0); - - await Task.Delay(delayMilliseconds).ConfigureAwait(false); + return; } - // 更新已处理的总字节数 - _totalBytesProcessed += bytesToProcess; + // 据每秒允许的最大字节数以及经过的时间计算可以补充的令牌数量 + var newTokens = _bytesPerSecond * timePassed / 1000.0; + + // 更新可用令牌,但不超过每秒允许的最大值 + _availableTokens = Math.Min(_bytesPerSecond, _availableTokens + newTokens); + + // 更新最后一次填充令牌的时间戳 + _lastTokenRefillTime = now; + } + + /// + /// 等待直到有足够令牌可用 + /// + /// 需要等待的令牌数量 + internal void WaitForTokens(int desiredTokens) + { + while (true) + { + // 防止并发访问问题 + lock (_lockObject) + { + // 尝试补充令牌 + RefillTokens(); + + // 检查是否已有足够的令牌 + if (_availableTokens >= desiredTokens) + { + // 扣除所需的令牌数量 + _availableTokens -= desiredTokens; + + // 如果有足够的令牌,退出循环 + return; + } + } + + // 如果没有足够的令牌,计算还需要多少令牌 + var requiredTokens = desiredTokens - _availableTokens; + + // 计算为了获得所需令牌需要等待的时间 + var waitTime = (int)(requiredTokens * 1000.0 / _bytesPerSecond); + + // 添加一点额外延迟用来确保精确性,具体是增加了 5% 的延迟 + waitTime = (int)(waitTime * 1.05); + + // 确保不会一次性等待过长时间,最多等待 100 毫秒 + if (waitTime > 0) + { + Thread.Sleep(Math.Min(100, waitTime)); + } + } } } \ No newline at end of file diff --git a/framework/Furion/V5_Experience/HttpRemote/Models/RateLimitedStream.cs b/framework/Furion/V5_Experience/HttpRemote/Models/RateLimitedStream.cs index 90523eb7b259ac867a002056e826648e227445af..4ca7ae793bed332f75ec78151d05425b4321ccc7 100644 --- a/framework/Furion/V5_Experience/HttpRemote/Models/RateLimitedStream.cs +++ b/framework/Furion/V5_Experience/HttpRemote/Models/RateLimitedStream.cs @@ -30,25 +30,44 @@ namespace Furion.HttpRemote; /// /// 带应用速率限制的流 /// +/// +/// 基于令牌桶算法(Token Bucket Algorithm)实现流量控制和速率限制。 +/// 参考文献:https://baike.baidu.com/item/令牌桶算法/6597000。 +/// public sealed class RateLimitedStream : Stream { /// - /// 每秒允许的最大字节数 + /// 单次读取或写入操作中处理的最大数据块大小 /// - private readonly int _bytesPerSecond; + internal const int CHUNK_SIZE = 4096; + + /// + /// 每秒允许传输的最大字节数 + /// + internal readonly double _bytesPerSecond; /// internal readonly Stream _innerStream; /// - /// 用于精确计时的 实例 + /// 用于同步访问的锁对象 /// - internal readonly Stopwatch _stopwatch = new(); + internal readonly object _lockObject = new(); /// - /// 到目前为止已读取或写入的总字节数 + /// 用来计算时间间隔的计时器 /// - internal long _totalBytesProcessed; + internal readonly Stopwatch _stopwatch; + + /// + /// 当前可用的令牌数量(字节数) + /// + internal double _availableTokens; + + /// + /// 上次令牌补充的时间戳 + /// + internal long _lastTokenRefillTime; /// /// @@ -56,8 +75,8 @@ public sealed class RateLimitedStream : Stream /// /// /// - /// 每秒允许的最大字节数 - public RateLimitedStream(Stream innerStream, int bytesPerSecond) + /// 每秒允许传输的最大字节数 + public RateLimitedStream(Stream innerStream, double bytesPerSecond) { // 空检查 ArgumentNullException.ThrowIfNull(innerStream); @@ -72,8 +91,14 @@ public sealed class RateLimitedStream : Stream _innerStream = innerStream; _bytesPerSecond = bytesPerSecond; - // 启动 Stopwatch 来开始计时 - _stopwatch.Start(); + // 开始计时 + _stopwatch = Stopwatch.StartNew(); + + // 记录初始时间 + _lastTokenRefillTime = _stopwatch.ElapsedMilliseconds; + + // 初始化可用令牌数 + _availableTokens = bytesPerSecond; } /// @@ -104,11 +129,14 @@ public sealed class RateLimitedStream : Stream /// public override int Read(byte[] buffer, int offset, int count) { - // 根据设定的速率限制调整读写操作的速度 - ApplyRateLimitAsync(count).GetAwaiter().GetResult(); + // 确保单次读取不会超过预设的数据块大小 + var adjustedCount = Math.Min(count, CHUNK_SIZE); + + // 等待直到有足够令牌可用 + WaitForTokens(adjustedCount); // 从内部流读取数据到缓冲区 - return _innerStream.Read(buffer, offset, count); + return _innerStream.Read(buffer, offset, adjustedCount); } /// @@ -120,11 +148,14 @@ public sealed class RateLimitedStream : Stream /// public override void Write(byte[] buffer, int offset, int count) { - // 向内部流写入数据 - _innerStream.Write(buffer, offset, count); + // 确保单次写入不会超过预设的数据块大小 + var adjustedCount = Math.Min(count, CHUNK_SIZE); - // 根据设定的速率限制调整读写操作的速度 - ApplyRateLimitAsync(count).GetAwaiter().GetResult(); + // 等待直到有足够令牌可用 + WaitForTokens(adjustedCount); + + // 向内部流写入数据 + _innerStream.Write(buffer, offset, adjustedCount); } /// @@ -134,35 +165,78 @@ public sealed class RateLimitedStream : Stream if (disposing) { _innerStream.Dispose(); + _stopwatch.Stop(); } base.Dispose(disposing); } /// - /// 根据设定的速率限制调整读写操作的速度 + /// 补充令牌的方法 /// - /// 本次操作将处理的字节数 - internal async Task ApplyRateLimitAsync(int bytesToProcess) + internal void RefillTokens() { - // 自开始以来经过的时间(秒) - var elapsedSeconds = _stopwatch.ElapsedMilliseconds / 1000.0; + // 获取当前计时器的时间 + var now = _stopwatch.ElapsedMilliseconds; - // 根据速率预期应读取的字节数 - var totalBytesExpected = elapsedSeconds * _bytesPerSecond; + // 计算自上次填充令牌以来经过的时间 + var timePassed = now - _lastTokenRefillTime; - // 计算实际与预期之差 - var bytesOverLimit = _totalBytesProcessed + bytesToProcess - totalBytesExpected; - - if (bytesOverLimit > 0) + // 如果时间没有流逝或者流逝时间不足以产生新的令牌,则直接返回 + if (timePassed <= 0) { - // 如果实际操作超过预期,则计算需要等待的时间,并进行延迟 - var delayMilliseconds = (int)(bytesOverLimit / _bytesPerSecond * 1000.0); - - await Task.Delay(delayMilliseconds).ConfigureAwait(false); + return; } - // 更新已处理的总字节数 - _totalBytesProcessed += bytesToProcess; + // 据每秒允许的最大字节数以及经过的时间计算可以补充的令牌数量 + var newTokens = _bytesPerSecond * timePassed / 1000.0; + + // 更新可用令牌,但不超过每秒允许的最大值 + _availableTokens = Math.Min(_bytesPerSecond, _availableTokens + newTokens); + + // 更新最后一次填充令牌的时间戳 + _lastTokenRefillTime = now; + } + + /// + /// 等待直到有足够令牌可用 + /// + /// 需要等待的令牌数量 + internal void WaitForTokens(int desiredTokens) + { + while (true) + { + // 防止并发访问问题 + lock (_lockObject) + { + // 尝试补充令牌 + RefillTokens(); + + // 检查是否已有足够的令牌 + if (_availableTokens >= desiredTokens) + { + // 扣除所需的令牌数量 + _availableTokens -= desiredTokens; + + // 如果有足够的令牌,退出循环 + return; + } + } + + // 如果没有足够的令牌,计算还需要多少令牌 + var requiredTokens = desiredTokens - _availableTokens; + + // 计算为了获得所需令牌需要等待的时间 + var waitTime = (int)(requiredTokens * 1000.0 / _bytesPerSecond); + + // 添加一点额外延迟用来确保精确性,具体是增加了 5% 的延迟 + waitTime = (int)(waitTime * 1.05); + + // 确保不会一次性等待过长时间,最多等待 100 毫秒 + if (waitTime > 0) + { + Thread.Sleep(Math.Min(100, waitTime)); + } + } } } \ No newline at end of file diff --git a/samples/Furion.Core/Furion.Core.csproj b/samples/Furion.Core/Furion.Core.csproj index 38ddb7e65e0efab46393e10df38219cc67df9af9..fde4b89d3b84a5e930f54cea121542b014793fe2 100644 --- a/samples/Furion.Core/Furion.Core.csproj +++ b/samples/Furion.Core/Furion.Core.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/templates/FurionApiTemplate/Furion.Template.Api.nuspec b/templates/FurionApiTemplate/Furion.Template.Api.nuspec index c0bd10bd3f7fb7f21558df7a666bdc54da463002..5afe73559e4e3ac22100c958d0406eb70760e2d7 100644 --- a/templates/FurionApiTemplate/Furion.Template.Api.nuspec +++ b/templates/FurionApiTemplate/Furion.Template.Api.nuspec @@ -2,7 +2,7 @@ Furion.Template.Api - 4.9.6.9 + 4.9.6.10 基于 Furion 框架快速搭建 Api 多层架构模板。 百小僧 diff --git a/templates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj b/templates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj index 5595cef92c7309034a53e5e4ab3fc5885a8d6fee..c355550565300cee1246f4fd54d2740aec729348 100644 --- a/templates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj +++ b/templates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj @@ -17,9 +17,9 @@ - - - + + + diff --git a/templates/FurionAppTemplate/Furion.Template.App.nuspec b/templates/FurionAppTemplate/Furion.Template.App.nuspec index ec719f921ee0522bafa002a05a2e445eee2ff27a..c9fd4f17e1a48337c5fda7f171046d955c94f8ab 100644 --- a/templates/FurionAppTemplate/Furion.Template.App.nuspec +++ b/templates/FurionAppTemplate/Furion.Template.App.nuspec @@ -2,7 +2,7 @@ Furion.Template.App - 4.9.6.9 + 4.9.6.10 基于 Furion 框架快速搭建 Mvc/Api 多层架构模板。 百小僧 diff --git a/templates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj b/templates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj index 0c201f65e855be3b70554900166cdc1fbc708ee1..7e43ef7370a1a093fecbcfa7d2b3bc93e4eee940 100644 --- a/templates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj +++ b/templates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj @@ -17,9 +17,9 @@ - - - + + + diff --git a/templates/FurionBlazorAppTemplate/Furion.Template.Blazor.App.nuspec b/templates/FurionBlazorAppTemplate/Furion.Template.Blazor.App.nuspec index 267383117fd88722b0515aac7b38d6e4f7eee802..df898da7ebc8652f04cdcc7f0201e1be8ffa6216 100644 --- a/templates/FurionBlazorAppTemplate/Furion.Template.Blazor.App.nuspec +++ b/templates/FurionBlazorAppTemplate/Furion.Template.Blazor.App.nuspec @@ -2,7 +2,7 @@ Furion.Template.Blazor.App - 4.9.6.9 + 4.9.6.10 基于 Furion 框架快速搭建 Blazor App 多层架构模板。 百小僧 diff --git a/templates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj b/templates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj index dc9c1627614bf414330b028b71837c9ab14ba080..6ff492c4601e41e0a60224964d27e67650007de6 100644 --- a/templates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj +++ b/templates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/templates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec b/templates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec index c26353c95b527b937c3aee15b93dbfd6a4fb9ed4..c9af25b8d95927f67f22b60341dc64bc24d6d543 100644 --- a/templates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec +++ b/templates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec @@ -2,7 +2,7 @@ Furion.Template.Blazor - 4.9.6.9 + 4.9.6.10 基于 Furion 框架快速搭建 Blazor 多层架构模板。 百小僧 diff --git a/templates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj b/templates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj index dc9c1627614bf414330b028b71837c9ab14ba080..6ff492c4601e41e0a60224964d27e67650007de6 100644 --- a/templates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj +++ b/templates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/templates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec b/templates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec index becb568f456617546576632782242bdfeae550f9..18582631cfedf94f82d69fcae80f64de6a11dc31 100644 --- a/templates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec +++ b/templates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec @@ -2,7 +2,7 @@ Furion.Template.BlazorWithWebApi - 4.9.6.9 + 4.9.6.10 基于 Furion 框架快速搭建 Blazor和WebApi 多层架构模板。 百小僧 diff --git a/templates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj b/templates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj index faea3a931bc10ba0f47a8bd156f3e2d044a281d9..4b11d93f6c495aa3ee93350be826119eb33c7314 100644 --- a/templates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj +++ b/templates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj @@ -17,9 +17,9 @@ - - - + + + diff --git a/templates/FurionMvcTemplate/Furion.Template.Mvc.nuspec b/templates/FurionMvcTemplate/Furion.Template.Mvc.nuspec index 437525cec965f0edc0122ee365a65baf67982a1f..4946d8a5426141515cf39e54a28830f8278c9ddf 100644 --- a/templates/FurionMvcTemplate/Furion.Template.Mvc.nuspec +++ b/templates/FurionMvcTemplate/Furion.Template.Mvc.nuspec @@ -2,7 +2,7 @@ Furion.Template.Mvc - 4.9.6.9 + 4.9.6.10 基于 Furion 框架快速搭建 Mvc 多层架构模板。 百小僧 diff --git a/templates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj b/templates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj index dc9c1627614bf414330b028b71837c9ab14ba080..6ff492c4601e41e0a60224964d27e67650007de6 100644 --- a/templates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj +++ b/templates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/templates/FurionRazorTemplate/Furion.Template.Razor.nuspec b/templates/FurionRazorTemplate/Furion.Template.Razor.nuspec index 5cd69e3c29721826aced8cc6d6249b8c87e252b2..ae3651708872852f6215fe239712c2dd86c9647c 100644 --- a/templates/FurionRazorTemplate/Furion.Template.Razor.nuspec +++ b/templates/FurionRazorTemplate/Furion.Template.Razor.nuspec @@ -2,7 +2,7 @@ Furion.Template.Razor - 4.9.6.9 + 4.9.6.10 基于 Furion 框架快速搭建 Razor Pages 多层架构模板。 百小僧 diff --git a/templates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj b/templates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj index dc9c1627614bf414330b028b71837c9ab14ba080..6ff492c4601e41e0a60224964d27e67650007de6 100644 --- a/templates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj +++ b/templates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/templates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec b/templates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec index 7d3cf38af969e8cbf964b334acdb41c139548e1d..ee5a98f4527489233afd29f3960ef266fab42ff2 100644 --- a/templates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec +++ b/templates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec @@ -2,7 +2,7 @@ Furion.Template.RazorWithWebApi - 4.9.6.9 + 4.9.6.10 基于 Furion 框架快速搭建 RazorPages和WebApi 多层架构模板。 百小僧 diff --git a/templates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj b/templates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj index 0595ae68f21f7070580e139ef5a54f2f31480d8c..efd53c002a7a0ae5a78cfea2f4abb475a3be5102 100644 --- a/templates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj +++ b/templates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj @@ -17,9 +17,9 @@ - - - + + + diff --git a/templates/SqlSugarTemplates/FurionApiTemplate/Furion.Template.Api.nuspec b/templates/SqlSugarTemplates/FurionApiTemplate/Furion.Template.Api.nuspec index d0b9c42b5654cbde8b7bee5dc39b59b1e36378b0..85edec3556dbdd0ccccae46c1c9e3a50c50322fd 100644 --- a/templates/SqlSugarTemplates/FurionApiTemplate/Furion.Template.Api.nuspec +++ b/templates/SqlSugarTemplates/FurionApiTemplate/Furion.Template.Api.nuspec @@ -2,7 +2,7 @@ Furion.SqlSugar.Template.Api - 4.9.6.9 + 4.9.6.10 基于 Furion 和 SqlSugar 框架快速搭建 Api 多层架构模板。 百小僧 diff --git a/templates/SqlSugarTemplates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj b/templates/SqlSugarTemplates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj index fa7c7b978ffb433557ed7fe66e236c05cc9127c5..ddb9b67defb15a5faaa5757f787d03e5d63eb3a1 100644 --- a/templates/SqlSugarTemplates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj +++ b/templates/SqlSugarTemplates/FurionApiTemplate/src/FurionApi.Core/FurionApi.Core.csproj @@ -17,9 +17,9 @@ - - - + + + diff --git a/templates/SqlSugarTemplates/FurionAppTemplate/Furion.Template.App.nuspec b/templates/SqlSugarTemplates/FurionAppTemplate/Furion.Template.App.nuspec index d8361fce6139fea0f63b4f0001ee70f463789ee9..baeb2b65966310cd15735bfe552eea3ab5206b49 100644 --- a/templates/SqlSugarTemplates/FurionAppTemplate/Furion.Template.App.nuspec +++ b/templates/SqlSugarTemplates/FurionAppTemplate/Furion.Template.App.nuspec @@ -2,7 +2,7 @@ Furion.SqlSugar.Template.App - 4.9.6.9 + 4.9.6.10 基于 Furion 和 SqlSugar 框架快速搭建 Mvc/Api 多层架构模板。 百小僧 diff --git a/templates/SqlSugarTemplates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj b/templates/SqlSugarTemplates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj index ac5fe9484d1fa07eda85ff559bb6603d30ebab9d..de328b41194f1d4f536ad11d08ad2424c5d0bf84 100644 --- a/templates/SqlSugarTemplates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj +++ b/templates/SqlSugarTemplates/FurionAppTemplate/src/FurionApp.Core/FurionApp.Core.csproj @@ -17,9 +17,9 @@ - - - + + + diff --git a/templates/SqlSugarTemplates/FurionBlazorAppTemplate/Furion.SqlSugar.Template.Blazor.App.nuspec b/templates/SqlSugarTemplates/FurionBlazorAppTemplate/Furion.SqlSugar.Template.Blazor.App.nuspec index d4e3b878b176a53df95ca2cf9aa9df58c5fa17e5..da5dbcd9f247f6b32e73a2d74b1a93f31cb771a5 100644 --- a/templates/SqlSugarTemplates/FurionBlazorAppTemplate/Furion.SqlSugar.Template.Blazor.App.nuspec +++ b/templates/SqlSugarTemplates/FurionBlazorAppTemplate/Furion.SqlSugar.Template.Blazor.App.nuspec @@ -2,7 +2,7 @@ Furion.SqlSugar.Template.Blazor.App - 4.9.6.9 + 4.9.6.10 基于 Furion 和 SqlSugar 框架快速搭建 Blazor App 多层架构模板。 百小僧 diff --git a/templates/SqlSugarTemplates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj b/templates/SqlSugarTemplates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj index 59a01e830ca61ba394a621b7dd1c9a7127466924..724bd708734866df156d937d385b3ab136f6ddd1 100644 --- a/templates/SqlSugarTemplates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj +++ b/templates/SqlSugarTemplates/FurionBlazorAppTemplate/src/FurionBlazorApp.Core/FurionBlazorApp.Core.csproj @@ -11,9 +11,9 @@ - + - + diff --git a/templates/SqlSugarTemplates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec b/templates/SqlSugarTemplates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec index a64ff16abd00684beb4a9143c31acde5ea1b5de1..59bc541f29b094706d1d81127b5b7502221aa472 100644 --- a/templates/SqlSugarTemplates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec +++ b/templates/SqlSugarTemplates/FurionBlazorTemplate/Furion.Template.Blazor.nuspec @@ -2,7 +2,7 @@ Furion.SqlSugar.Template.Blazor - 4.9.6.9 + 4.9.6.10 基于 Furion 和 SqlSugar 框架快速搭建 Blazor 多层架构模板。 百小僧 diff --git a/templates/SqlSugarTemplates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj b/templates/SqlSugarTemplates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj index 8a70ebc7e84b437634852da39b97d5278d59daaa..517ee270fa98123a8da2059865252c2a288da532 100644 --- a/templates/SqlSugarTemplates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj +++ b/templates/SqlSugarTemplates/FurionBlazorTemplate/src/FurionBlazor.Core/FurionBlazor.Core.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec b/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec index d9d495ed029406f28993658e3a3fe3cd9e8c7551..5be9e5d50c4db0c12e1e8cc798cebe9748c0036a 100644 --- a/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec +++ b/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/Furion.Template.BlazorWithWebApi.nuspec @@ -2,7 +2,7 @@ Furion.SqlSugar.Template.BlazorWithWebApi - 4.9.6.9 + 4.9.6.10 基于 Furion 和 SqlSugar 框架快速搭建 Blazor和WebApi 多层架构模板。 百小僧 diff --git a/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj b/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj index 2b204be82ddf649046158fe4d691cc73b125ab3a..629b851ef6c5d12deb52efdf922831963578b433 100644 --- a/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj +++ b/templates/SqlSugarTemplates/FurionBlazorWithWebApiTemplate/src/FurionBlazorApi.Core/FurionBlazorApi.Core.csproj @@ -17,9 +17,9 @@ - - - + + + diff --git a/templates/SqlSugarTemplates/FurionMvcTemplate/Furion.Template.Mvc.nuspec b/templates/SqlSugarTemplates/FurionMvcTemplate/Furion.Template.Mvc.nuspec index 0c31e93010a4004987b0370f0e159ac44d861670..1a15dfad8c2f2e6efed9b996a808372bbf282d47 100644 --- a/templates/SqlSugarTemplates/FurionMvcTemplate/Furion.Template.Mvc.nuspec +++ b/templates/SqlSugarTemplates/FurionMvcTemplate/Furion.Template.Mvc.nuspec @@ -2,7 +2,7 @@ Furion.SqlSugar.Template.Mvc - 4.9.6.9 + 4.9.6.10 基于 Furion 和 SqlSugar 框架快速搭建 Mvc 多层架构模板。 百小僧 diff --git a/templates/SqlSugarTemplates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj b/templates/SqlSugarTemplates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj index 8a70ebc7e84b437634852da39b97d5278d59daaa..517ee270fa98123a8da2059865252c2a288da532 100644 --- a/templates/SqlSugarTemplates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj +++ b/templates/SqlSugarTemplates/FurionMvcTemplate/src/FurionMvc.Core/FurionMvc.Core.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/templates/SqlSugarTemplates/FurionRazorTemplate/Furion.Template.Razor.nuspec b/templates/SqlSugarTemplates/FurionRazorTemplate/Furion.Template.Razor.nuspec index 13ca5bbbaba55584365e475e7f282d0b75be0678..81f28e227723adf850071f4819f93209388687d8 100644 --- a/templates/SqlSugarTemplates/FurionRazorTemplate/Furion.Template.Razor.nuspec +++ b/templates/SqlSugarTemplates/FurionRazorTemplate/Furion.Template.Razor.nuspec @@ -2,7 +2,7 @@ Furion.SqlSugar.Template.Razor - 4.9.6.9 + 4.9.6.10 基于 Furion 和 SqlSugar 框架快速搭建 Razor Pages 多层架构模板。 百小僧 diff --git a/templates/SqlSugarTemplates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj b/templates/SqlSugarTemplates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj index 8a70ebc7e84b437634852da39b97d5278d59daaa..517ee270fa98123a8da2059865252c2a288da532 100644 --- a/templates/SqlSugarTemplates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj +++ b/templates/SqlSugarTemplates/FurionRazorTemplate/src/FurionRazor.Core/FurionRazor.Core.csproj @@ -11,8 +11,8 @@ - - + + diff --git a/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec b/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec index 9afc0f3e4eb6681f98bc996ebbed37b0104b419b..59ce837bd81ed4902aa53f98dfa9d646d247f633 100644 --- a/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec +++ b/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/Furion.Template.RazorWithWebApi.nuspec @@ -2,7 +2,7 @@ Furion.SqlSugar.Template.RazorWithWebApi - 4.9.6.9 + 4.9.6.10 基于 Furion 和 SqlSugar 框架快速搭建 RazorPages和WebApi 多层架构模板。 百小僧 diff --git a/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj b/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj index 3b3ff4b3e82d58a6b2b9a02edaacc3cb6a2fae19..2a54a4664166ea74a0fa1fbf155306a5969cfb63 100644 --- a/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj +++ b/templates/SqlSugarTemplates/FurionRazorWithWebApiTemplate/src/FurionRazorApi.Core/FurionRazorApi.Core.csproj @@ -17,9 +17,9 @@ - - - + + + diff --git a/tools/Furion.Tools/Directory.Build.props b/tools/Furion.Tools/Directory.Build.props index 8d24d27f1a4b6fe97fa6118187aac29fff2869df..0b7d7591a7033b0277c5fbdfc37045f3d1c92404 100644 --- a/tools/Furion.Tools/Directory.Build.props +++ b/tools/Furion.Tools/Directory.Build.props @@ -2,7 +2,7 @@ preview net8.0;net9.0 - 4.9.6.9 + 4.9.6.10 enable 百小僧 diff --git a/tools/Furion.Tools/Furion.Tools/Furion.Tools.csproj b/tools/Furion.Tools/Furion.Tools/Furion.Tools.csproj index a21b86075138add450eb41a22436c4313f9ddb68..8e1ba696b82e78c1764105f7375d6c5a9cf5cd3e 100644 --- a/tools/Furion.Tools/Furion.Tools/Furion.Tools.csproj +++ b/tools/Furion.Tools/Furion.Tools/Furion.Tools.csproj @@ -7,7 +7,7 @@ - + \ No newline at end of file diff --git a/tools/cli.ps1 b/tools/cli.ps1 index 575f4c915a42964b26ce95309ee9eb35251266d6..ffe1f3c4290a16ddb214256836d9908e5d04c476 100644 --- a/tools/cli.ps1 +++ b/tools/cli.ps1 @@ -96,7 +96,7 @@ function AddXmlCommentsToProperties($content, $commentsDictionary) { return $modifiedContent } -$FurTools = "Furion Tools v4.9.6.9"; +$FurTools = "Furion Tools v4.9.6.10"; # 输出信息 $copyright = @"