Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6cfd47cb17 | ||
|
|
26d7690092 | ||
|
|
c2134298b5 | ||
|
|
746fed8cdb | ||
|
|
31eae8b056 | ||
|
|
ae867373dd | ||
|
|
e6fac670f7 | ||
|
|
cc82301e92 | ||
|
|
545610d927 | ||
|
|
db4ea77939 | ||
|
|
1c413817fa | ||
|
|
ca94efb132 | ||
|
|
5809dc7d59 | ||
|
|
c9af4408e0 | ||
|
|
66af5379cb | ||
|
|
97394b81e9 | ||
|
|
225dd3d748 | ||
|
|
be313984c7 | ||
|
|
bbe7bf2c22 | ||
|
|
840711740e | ||
|
|
f792622653 | ||
|
|
f8a5938375 | ||
|
|
5b8a84b4e1 | ||
|
|
f2a2650523 | ||
|
|
43a3f3c0dc | ||
|
|
68c7b324af | ||
|
|
251ab23db8 | ||
|
|
7121e416fc | ||
|
|
4fd0dbf784 | ||
|
|
107623b26a | ||
|
|
35af87946d | ||
|
|
083b214b97 | ||
|
|
9ac178d375 | ||
|
|
3d76038301 | ||
|
|
704cd5116c | ||
|
|
b46cb4e10e | ||
|
|
f680738f12 | ||
|
|
faaaeb592d | ||
|
|
259fe3e592 | ||
|
|
e50945332f | ||
|
|
17a9ec53cc | ||
|
|
a043373430 | ||
|
|
5f5607b6c2 | ||
|
|
9198b18e4f | ||
|
|
a0c5117f5e | ||
|
|
628a845fa6 | ||
|
|
082b5b72b1 | ||
|
|
f25a4f49a8 | ||
|
|
47c06f2b9a | ||
|
|
2a450c237d | ||
|
|
21bd1d2b32 | ||
|
|
092c59b5b2 | ||
|
|
25a99127f5 | ||
|
|
216869ab56 | ||
|
|
b5c3842ea7 | ||
|
|
20ea077f4c | ||
|
|
41ea7f6e58 | ||
|
|
0f9235e1f0 | ||
|
|
7adadfb6e8 | ||
|
|
69c7a3fcef | ||
|
|
ab4d12df52 | ||
|
|
efb7578ff9 | ||
|
|
5cf35a37ac | ||
|
|
8df7ab3b9c | ||
|
|
643ff4a41d | ||
|
|
11d20f36f3 | ||
|
|
28f1198a9c | ||
|
|
71e8777414 | ||
|
|
c80f57153e | ||
|
|
d30bcdb374 | ||
|
|
679e75ea54 | ||
|
|
f936401a2e | ||
|
|
71d7ee8cff | ||
|
|
364a0f5c23 | ||
|
|
4a200f1ae4 | ||
|
|
d228201a4e | ||
|
|
606e203df5 | ||
|
|
c4e5c5e8a6 | ||
|
|
b3a387f0a6 | ||
|
|
2d56a44117 | ||
|
|
aa625e5f44 | ||
|
|
ea92cccf59 | ||
|
|
15ab81f6e4 | ||
|
|
98ff99257b | ||
|
|
2e647b49bf | ||
|
|
5a1a04e988 | ||
|
|
5ba959d69c | ||
|
|
fd7f8b3897 | ||
|
|
7444559b84 | ||
|
|
a4c3317c10 | ||
|
|
bb8a8cd498 | ||
|
|
a498bb69f5 | ||
|
|
735ed43fa2 | ||
|
|
ab44d9028f | ||
|
|
bf940b46f3 | ||
|
|
a6e5911b32 | ||
|
|
5e5c08d507 | ||
|
|
058091e904 | ||
|
|
6e23a4bf07 | ||
|
|
084f1b3765 | ||
|
|
6e87610611 | ||
|
|
f74fe9abea | ||
|
|
41ad3c1831 | ||
|
|
c80806d5cb | ||
|
|
ce357c39f7 | ||
|
|
c50ffab7ed | ||
|
|
f6afb0bbb3 | ||
|
|
f1d62b958c | ||
|
|
1b1bc81f91 | ||
|
|
436df007a9 | ||
|
|
c67b84ea7a | ||
|
|
ef2cc93f57 | ||
|
|
0fa8efbfff | ||
|
|
45c0987a72 | ||
|
|
0dd9184b24 | ||
|
|
1cd6540e2d | ||
|
|
2dfd72b34b | ||
|
|
d391e3b266 | ||
|
|
316d514b9b | ||
|
|
0923e5ad3e | ||
|
|
4a49340f7a | ||
|
|
190e87bee0 | ||
|
|
5214aafc34 | ||
|
|
2998125b70 | ||
|
|
2f58d8cdd2 | ||
|
|
7d9a8535e0 | ||
|
|
8301ec7fdb | ||
|
|
c6831c764b | ||
|
|
c2d6b384ee | ||
|
|
946e12e15a | ||
|
|
14ddd2cd6e | ||
|
|
90a13306b9 | ||
|
|
bd9632f4f6 | ||
|
|
565185378f | ||
|
|
328bb390d7 | ||
|
|
caf724b823 | ||
|
|
b14a98446c | ||
|
|
cba194a185 | ||
|
|
f5b2b67f0d | ||
|
|
d2f1219847 | ||
|
|
9de4e476d2 | ||
|
|
287652c461 | ||
|
|
63f605ca11 | ||
|
|
fea1fe66ae | ||
|
|
4d5fcd42a9 | ||
|
|
0be5854ffe | ||
|
|
989952d12a | ||
|
|
2dfe428397 | ||
|
|
ee872d3b98 | ||
|
|
3279633692 | ||
|
|
796cef01ff | ||
|
|
03c83f04a6 | ||
|
|
048f8fdd65 | ||
|
|
a1dd6f04d7 | ||
|
|
99ea333e92 | ||
|
|
7b7bda86ec | ||
|
|
5d05765b52 | ||
|
|
0a08621c22 | ||
|
|
69b3149b71 | ||
|
|
da413be342 | ||
|
|
4f6fb0ebc6 | ||
|
|
d6051f1c4f | ||
|
|
adbac2663b | ||
|
|
460775b7ee | ||
|
|
a35e551fe9 | ||
|
|
ea237b84e1 | ||
|
|
68340154f0 | ||
|
|
6891fd4c0d | ||
|
|
bf21f85bb0 | ||
|
|
e513261507 | ||
|
|
43b6ad6544 | ||
|
|
93c8ebdbf4 | ||
|
|
535e824032 | ||
|
|
7f0361ae7d | ||
|
|
6a07bb4fd9 | ||
|
|
9faa8a8738 | ||
|
|
63ac0695bb | ||
|
|
f1fd1cd42c | ||
|
|
019b8e907f | ||
|
|
0004c39f05 | ||
|
|
c01031927e | ||
|
|
837b522170 | ||
|
|
9921909559 | ||
|
|
2fdd78ce25 | ||
|
|
24faae27d6 | ||
|
|
9306564fcf |
@@ -10,12 +10,12 @@
|
||||
[submodule "references/Steam4NET"]
|
||||
path = references/Steam4NET
|
||||
url = https://github.com/SteamTools-Team/Steam4NET.git
|
||||
[submodule "references/WinAuth"]
|
||||
path = references/WinAuth
|
||||
url = https://github.com/SteamTools-Team/WinAuth.git
|
||||
[submodule "references/Depressurizer"]
|
||||
path = references/Depressurizer
|
||||
url = https://github.com/SteamTools-Team/Depressurizer.git
|
||||
[submodule "references/AvaloniaGif"]
|
||||
path = references/AvaloniaGif
|
||||
url = https://github.com/SteamTools-Team/AvaloniaGif
|
||||
[submodule "references/WinAuth"]
|
||||
path = references/WinAuth
|
||||
url = https://github.com/SteamTools-Team/WinAuth
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
「Steam++」is a toolkit that contains a variety of Steam tools, most of which require you to download and install Steam in order to use them.
|
||||
|
||||

|
||||

|
||||
[](https://github.com/rmbadmin/SteamTools/releases/latest)
|
||||
[](LICENSE)
|
||||
[](https://github.com/rmbadmin/SteamTools/stargazers)
|
||||
@@ -140,6 +140,7 @@ Read what we [milestones](https://github.com/SteamTools-Team/SteamTools/mileston
|
||||
* [NPOI](https://github.com/nissl-lab/npoi)
|
||||
* [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore)
|
||||
* [AspNet.Security.OpenId.Providers](https://github.com/aspnet-contrib/AspNet.Security.OpenId.Providers)
|
||||
* [AspNet.Security.OAuth.Providers](https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers)
|
||||
* [CefNet](https://github.com/CefNet/CefNet)
|
||||
* [CefSharp](https://github.com/cefsharp/CefSharp)
|
||||
* [React](https://github.com/facebook/react)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
|
||||
「Steam++」是一个包含多种Steam工具功能的工具箱,此工具的大部分功能都是需要您下载安装Steam才能使用。
|
||||
|
||||

|
||||

|
||||
[](https://github.com/rmbadmin/SteamTools/releases/latest)
|
||||
[](LICENSE)
|
||||
[](https://github.com/rmbadmin/SteamTools/stargazers)
|
||||
@@ -152,6 +152,7 @@
|
||||
* [NPOI](https://github.com/nissl-lab/npoi)
|
||||
* [Swashbuckle.AspNetCore](https://github.com/domaindrivendev/Swashbuckle.AspNetCore)
|
||||
* [AspNet.Security.OpenId.Providers](https://github.com/aspnet-contrib/AspNet.Security.OpenId.Providers)
|
||||
* [AspNet.Security.OAuth.Providers](https://github.com/aspnet-contrib/AspNet.Security.OAuth.Providers)
|
||||
* [CefNet](https://github.com/CefNet/CefNet)
|
||||
* [CefSharp](https://github.com/cefsharp/CefSharp)
|
||||
* [React](https://github.com/facebook/react)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<!--<TargetFrameworks>netstandard2.0;netstandard2.1;net5.0</TargetFrameworks>-->
|
||||
@@ -32,8 +32,13 @@
|
||||
<PackageReference Include="CefNet" Version="90.5.21109.1453" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Events\" />
|
||||
<ItemGroup Condition=" Exists('$(MSBuildProjectDirectory)\..\..\..\src\Common.CoreLib\Properties\ThisAssembly.Version.cs') ">
|
||||
<Compile Include="..\..\..\src\Common.CoreLib\Properties\AssemblyInfo.Version.cs">
|
||||
<Link>Properties\AssemblyInfo.Version.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\..\..\src\Common.CoreLib\Properties\ThisAssembly.Version.cs">
|
||||
<Link>Properties\ThisAssembly.Version.cs</Link>
|
||||
</Compile>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -1,28 +1,39 @@
|
||||
1. 修复 多个 GM.js 同时存在
|
||||
2. 修复 GM.js 打包错误
|
||||
3. 修复 手动添加 GM.js 重名替换导致出错
|
||||
4. 修复 成就解锁窗口不显示
|
||||
5. 新增 背景透明度 UI 设置
|
||||
6. 调整 脚本列表 UI
|
||||
7. 修复 代理过程中的闪退错误
|
||||
8. 修复 库存游戏闪退错误
|
||||
9. 修复 Discord 更新代理失效
|
||||
10. 修复 hosts 闪退错误
|
||||
11. 新增 Steam 快速登录
|
||||
1. 改进 端口被占用检测进程名
|
||||
2. 修复 部分 Toast 没有正确显示
|
||||
3. 新增 账号注销功能
|
||||
4. 改进 hosts 文件写入无权操作时显示的错误文本
|
||||
5. 新增 快速登录后可绑定手机号
|
||||
6. 新增 解绑快速登录账号
|
||||
7. 新增 隐藏库存游戏
|
||||
8. 新增 游戏功能-无边框窗口化
|
||||
9. 新增 关于-更新日志
|
||||
10. 新增 令牌加密设置,现在新增令牌默认将不启用本机加密
|
||||
11. 修复 非正常退出程序时导致残留进程且无法启动程序
|
||||
12. 改进 不再写入 C:\Users\用户名\AppData\Local 目录
|
||||
13. 修复 文本框中某些符号可能无法正确输入
|
||||
14. 改进 令牌排序上移下移
|
||||
15. 新增 令牌导入导出
|
||||
16. 新增 游戏时长挂机功能
|
||||
17. 新增 Microsoft 账号快速登录与绑定
|
||||
18. 新增 社区加速 hCaptcha 验证码 / EPIC 验证码 / artstation / v2ex
|
||||
19. 修复 社区加速 discord 更新下载
|
||||
|
||||
| File | Checksum (SHA256) |
|
||||
| ---- | ---- |
|
||||
| Steam++_win_x86_v2.1.0.7z | SHA256 |
|
||||
| Steam++_win_x86_v2.1.0.exe | SHA256 |
|
||||
| Steam++_linux_x64_v2.1.0.7z | SHA256 |
|
||||
| Steam++_linux_x64_v2.1.0.deb | SHA256 |
|
||||
| Steam++_macos_x64_v2.1.0.dmg | SHA256 |
|
||||
| Steam++_macos_arm64_v2.1.0.dmg | SHA256 |
|
||||
| Steam++_android_arm_v2.1.0.apk | SHA256 |
|
||||
| Steam++_android_arm64_v2.1.0.apk | SHA256 |
|
||||
| Steam++_win_arm64_v2.1.0.7z | SHA256 |
|
||||
| Steam++_win_arm64_v2.1.0.exe | SHA256 |
|
||||
| Steam++_win_x86_v2.3.0.7z | SHA256 |
|
||||
| Steam++_win_x86_v2.3.0.exe | SHA256 |
|
||||
| Steam++_win_x86_v2.3.0.msix | SHA256 |
|
||||
| Steam++_win_arm64_v2.3.0.7z | SHA256 |
|
||||
| Steam++_win_arm64_v2.3.0.exe | SHA256 |
|
||||
| Steam++_win_arm64_v2.3.0.msix | SHA256 |
|
||||
| Steam++_linux_x64_v2.3.0.7z | SHA256 |
|
||||
| Steam++_linux_x64_v2.3.0.deb | SHA256 |
|
||||
| Steam++_macos_x64_v2.3.0.dmg | SHA256 |
|
||||
| Steam++_macos_arm64_v2.3.0.dmg | SHA256 |
|
||||
| Steam++_android_v2.3.0.apk | SHA256 |
|
||||
| Steam++_android_arm64_v2.3.0.apk | SHA256 |
|
||||
| Steam++_android_arm_v2.3.0.apk | SHA256 |
|
||||
|
||||
***
|
||||
|
||||
由于程序体积较大,推荐从 [官网 https://steampp.net](https://steampp.net) 中下载
|
||||
由于程序体积较大,推荐从 [官网 https://steampp.net](https://steampp.net) 中下载
|
||||
|
||||
|
After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.8 KiB |
@@ -11,6 +11,9 @@
|
||||
<Compile Include="..\Common.CoreLib\Properties\AssemblyInfo.cs">
|
||||
<Link>Properties\AssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Common.CoreLib\Properties\AssemblyInfo.Version.cs">
|
||||
<Link>Properties\AssemblyInfo.Version.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Common.CoreLib\Properties\InternalsVisibleTo.cs">
|
||||
<Link>Properties\InternalsVisibleTo.cs</Link>
|
||||
</Compile>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<Project Sdk="MSBuild.Sdk.Extras">
|
||||
<Project Sdk="MSBuild.Sdk.Extras">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>MonoAndroid10.0</TargetFramework>
|
||||
@@ -15,6 +15,9 @@
|
||||
<Compile Include="..\Common.CoreLib\Properties\AssemblyInfo.cs">
|
||||
<Link>Properties\AssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Common.CoreLib\Properties\AssemblyInfo.Version.cs">
|
||||
<Link>Properties\AssemblyInfo.Version.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Common.CoreLib\Properties\InternalsVisibleTo.cs">
|
||||
<Link>Properties\InternalsVisibleTo.cs</Link>
|
||||
</Compile>
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
<Compile Include="..\Common.CoreLib\Properties\AssemblyInfo.cs">
|
||||
<Link>Properties\AssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Common.CoreLib\Properties\AssemblyInfo.Version.cs">
|
||||
<Link>Properties\AssemblyInfo.Version.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Common.CoreLib\Properties\InternalsVisibleTo.cs">
|
||||
<Link>Properties\InternalsVisibleTo.cs</Link>
|
||||
</Compile>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace System.Application.Services
|
||||
{
|
||||
|
||||
@@ -33,7 +33,46 @@ namespace System.Application.Services
|
||||
/// <returns></returns>
|
||||
ValueTask<string?> D(byte[]? value, string? secondaryPassword = null);
|
||||
|
||||
/// <inheritdoc cref="D(byte[]?, string?)"/>
|
||||
ValueTask<(string? content, DResultCode resultCode)> D2(byte[]? value, string? secondaryPassword = null);
|
||||
|
||||
/// <inheritdoc cref="D(byte[]?, string?)"/>
|
||||
ValueTask<byte[]?> DB(byte[]? value, string? secondaryPassword = null);
|
||||
|
||||
/// <inheritdoc cref="D(byte[]?, string?)"/>
|
||||
ValueTask<(byte[]? content, DResultCode resultCode)> DB2(byte[]? value, string? secondaryPassword = null);
|
||||
|
||||
public enum DResultCode
|
||||
{
|
||||
/// <summary>
|
||||
/// 成功
|
||||
/// </summary>
|
||||
Success = 200,
|
||||
|
||||
/// <summary>
|
||||
/// 嵌入 Aes 失败
|
||||
/// </summary>
|
||||
EmbeddedAesFail = 901,
|
||||
|
||||
/// <summary>
|
||||
/// 仅本机失败
|
||||
/// </summary>
|
||||
LocalFail,
|
||||
|
||||
/// <summary>
|
||||
/// 二级密码失败
|
||||
/// </summary>
|
||||
SecondaryPasswordFail,
|
||||
|
||||
/// <summary>
|
||||
/// 密文值不正确
|
||||
/// </summary>
|
||||
IncorrectValueFail,
|
||||
|
||||
/// <summary>
|
||||
/// 转换字符串失败
|
||||
/// </summary>
|
||||
UTF8GetStringFail,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@ using System.Linq;
|
||||
using System.Security;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using static System.Application.Services.ISecurityService;
|
||||
|
||||
namespace System.Application.Services.Implementation
|
||||
{
|
||||
@@ -76,23 +77,35 @@ namespace System.Application.Services.Implementation
|
||||
|
||||
public async ValueTask<string?> D(byte[]? value, string? secondaryPassword)
|
||||
{
|
||||
var value2 = await DB(value, secondaryPassword);
|
||||
if (value2 == null || !value2.Any()) return null;
|
||||
(var content, var _) = await D2(value, secondaryPassword);
|
||||
return content;
|
||||
}
|
||||
|
||||
public async ValueTask<(string? content, DResultCode resultCode)> D2(byte[]? value, string? secondaryPassword)
|
||||
{
|
||||
(var content, var resultCode) = await DB2(value, secondaryPassword);
|
||||
if (resultCode != DResultCode.Success || content == null || !content.Any()) return (null, resultCode);
|
||||
try
|
||||
{
|
||||
return Encoding.UTF8.GetString(value2);
|
||||
var content_ = Encoding.UTF8.GetString(content);
|
||||
return (content_, DResultCode.Success);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
return (null, DResultCode.UTF8GetStringFail);
|
||||
}
|
||||
}
|
||||
|
||||
public async ValueTask<byte[]?> DB(byte[]? value, string? secondaryPassword)
|
||||
{
|
||||
if (value == null) return value;
|
||||
if (value.Length == 0) return value;
|
||||
if (value.Length <= sizeof(int)) return null;
|
||||
(var content, var _) = await DB2(value, secondaryPassword);
|
||||
return content;
|
||||
}
|
||||
|
||||
public async ValueTask<(byte[]? content, DResultCode resultCode)> DB2(byte[]? value, string? secondaryPassword)
|
||||
{
|
||||
if (value == null || value.Length == 0) return (value, DResultCode.Success);
|
||||
if (value.Length <= sizeof(int)) return (null, DResultCode.IncorrectValueFail);
|
||||
|
||||
var d_type = (EncryptionMode)BitConverter.ToInt32(value, 0);
|
||||
switch (d_type)
|
||||
@@ -100,27 +113,37 @@ namespace System.Application.Services.Implementation
|
||||
case EncryptionMode.EmbeddedAes:
|
||||
var value_1 = UnConcat(value);
|
||||
var value_1_r = ea.DB(value_1);
|
||||
return value_1_r;
|
||||
return (value_1_r, value_1_r == null ?
|
||||
DResultCode.EmbeddedAesFail : DResultCode.Success);
|
||||
case EncryptionMode.EmbeddedAesWithLocal:
|
||||
var value_2 = UnConcat(value);
|
||||
var value_2_local = await local.DB(value_2);
|
||||
if (value_2_local == null) return (null, DResultCode.LocalFail);
|
||||
var value_2_r = ea.DB(value_2_local);
|
||||
return value_2_r;
|
||||
return (value_2_r, value_2_r == null ?
|
||||
DResultCode.EmbeddedAesFail : DResultCode.Success);
|
||||
case EncryptionMode.EmbeddedAesWithSecondaryPassword:
|
||||
if (string.IsNullOrWhiteSpace(secondaryPassword)) return null;
|
||||
if (string.IsNullOrWhiteSpace(secondaryPassword))
|
||||
return (null, DResultCode.SecondaryPasswordFail);
|
||||
var value_3 = UnConcat(value);
|
||||
var value_3_sp = sp.DB(value_3, secondaryPassword);
|
||||
if (value_3_sp == null) return (null, DResultCode.SecondaryPasswordFail);
|
||||
var value_3_r = ea.DB(value_3_sp);
|
||||
return value_3_r;
|
||||
return (value_3_r, value_3_r == null ?
|
||||
DResultCode.EmbeddedAesFail : DResultCode.Success);
|
||||
case EncryptionMode.EmbeddedAesWithSecondaryPasswordWithLocal:
|
||||
if (string.IsNullOrWhiteSpace(secondaryPassword)) return null;
|
||||
if (string.IsNullOrWhiteSpace(secondaryPassword))
|
||||
return (null, DResultCode.SecondaryPasswordFail);
|
||||
var value_4 = UnConcat(value);
|
||||
var value_4_local = await local.DB(value_4);
|
||||
if (value_4_local == null) return (null, DResultCode.LocalFail);
|
||||
var value_4_sp = sp.DB(value_4_local, secondaryPassword);
|
||||
if (value_4_sp == null) return (null, DResultCode.SecondaryPasswordFail);
|
||||
var value_4_r = ea.DB(value_4_sp);
|
||||
return value_4_r;
|
||||
return (value_4_r, value_4_r == null ?
|
||||
DResultCode.EmbeddedAesFail : DResultCode.Success);
|
||||
default:
|
||||
return null;
|
||||
return (null, DResultCode.IncorrectValueFail);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.1</TargetFramework>
|
||||
@@ -10,6 +10,9 @@
|
||||
<Compile Include="..\Common.CoreLib\Properties\AssemblyInfo.cs">
|
||||
<Link>Properties\AssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Common.CoreLib\Properties\AssemblyInfo.Version.cs">
|
||||
<Link>Properties\AssemblyInfo.Version.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Common.CoreLib\Properties\InternalsVisibleTo.cs">
|
||||
<Link>Properties\InternalsVisibleTo.cs</Link>
|
||||
</Compile>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Threading.Tasks;
|
||||
using System.Threading.Tasks;
|
||||
using Xamarin.Essentials;
|
||||
|
||||
namespace System.Security
|
||||
@@ -30,5 +30,11 @@ namespace System.Security
|
||||
var result = SecureStorage.Remove(key);
|
||||
return Task.FromResult(result);
|
||||
}
|
||||
|
||||
async Task<bool> IStorage.ContainsKeyAsync(string key)
|
||||
{
|
||||
var result = await SecureStorage.GetAsync(key);
|
||||
return result != null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Application.Repositories;
|
||||
using System.Application.Repositories;
|
||||
using System.Application.Services;
|
||||
using System.Security.Cryptography;
|
||||
using System.Threading.Tasks;
|
||||
@@ -57,5 +57,12 @@ namespace System.Security
|
||||
var result = await DeleteAsync(key);
|
||||
return result > 0;
|
||||
}
|
||||
|
||||
async Task<bool> IStorage.ContainsKeyAsync(string key)
|
||||
{
|
||||
key = GetKey(key);
|
||||
var item = await FirstOrDefaultAsync(x => x.Id == key);
|
||||
return item != null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace System.Application.Columns
|
||||
namespace System.Application.Columns
|
||||
{
|
||||
/// <summary>
|
||||
/// 手机号码
|
||||
@@ -7,6 +7,8 @@
|
||||
{
|
||||
/// <inheritdoc cref="IPhoneNumber"/>
|
||||
string? PhoneNumber { get; set; }
|
||||
|
||||
public const int Db_MaxLength_PhoneNumber = 20;
|
||||
}
|
||||
|
||||
/// <inheritdoc cref="IPhoneNumber"/>
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
using System.ApplicationModel;
|
||||
|
||||
namespace System.ApplicationModel
|
||||
{
|
||||
public static class DesktopBridgeHelper
|
||||
{
|
||||
public static bool IsDesktopBridge { internal get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
namespace System
|
||||
{
|
||||
partial class DI
|
||||
{
|
||||
public static bool IsDesktopBridge => DesktopBridgeHelper.IsDesktopBridge;
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFrameworks>netstandard2.1;netcoreapp3.1</TargetFrameworks>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#if !NOT_DI
|
||||
#if !NOT_DI
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
#endif
|
||||
using System.Linq;
|
||||
@@ -12,7 +12,7 @@ namespace System
|
||||
/// <summary>
|
||||
/// 依赖注入服务组(DependencyInjection)
|
||||
/// </summary>
|
||||
public static class DI
|
||||
public static partial class DI
|
||||
{
|
||||
#if !NOT_DI
|
||||
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
using System.Diagnostics;
|
||||
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace System
|
||||
{
|
||||
public static class ProcessExtensions
|
||||
{
|
||||
public static ProcessModule? TryGetMainModule(this Process process)
|
||||
{
|
||||
try
|
||||
{
|
||||
return process.MainModule;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
namespace System.Extensions
|
||||
// ReSharper disable once CheckNamespace
|
||||
namespace System
|
||||
{
|
||||
public static partial class StringExtensions
|
||||
{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// https://github.com/aspnet/AspNetIdentity/blob/master/src/Microsoft.AspNet.Identity.Core/AsyncHelper.cs
|
||||
// https://github.com/aspnet/AspNetIdentity/blob/master/src/Microsoft.AspNet.Identity.Core/AsyncHelper.cs
|
||||
using System.Globalization;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
@@ -8,7 +8,7 @@ namespace System
|
||||
{
|
||||
public static class TaskExtensions
|
||||
{
|
||||
static readonly TaskFactory _myTaskFactory = new TaskFactory(CancellationToken.None,
|
||||
static readonly TaskFactory _myTaskFactory = new(CancellationToken.None,
|
||||
TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default);
|
||||
|
||||
public static TResult RunSync<TResult>(this Func<Task<TResult>> func)
|
||||
|
||||
@@ -54,5 +54,17 @@ namespace System
|
||||
public const string APNG = ".apng";
|
||||
|
||||
public const string EXE = ".exe";
|
||||
|
||||
public const string _7Z = ".7z";
|
||||
|
||||
public const string APPX = ".appx";
|
||||
|
||||
public const string MSIX = ".msix";
|
||||
|
||||
public const string APPX_Bundle = ".appxbundle";
|
||||
|
||||
public const string MSIX_Bundle = ".msixbundle";
|
||||
|
||||
public const string AppInstaller = ".appinstaller";
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.IO;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO;
|
||||
#if !NET35 && !NOT_XE
|
||||
using Xamarin.Essentials;
|
||||
#endif
|
||||
@@ -219,8 +220,10 @@ namespace System
|
||||
return ioPath;
|
||||
}
|
||||
|
||||
public static FileStream OpenRead(string filePath)
|
||||
[return: NotNullIfNotNull("filePath")]
|
||||
public static FileStream? OpenRead(string? filePath)
|
||||
{
|
||||
if (filePath == null) return null;
|
||||
var fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite | FileShare.Delete);
|
||||
return fileStream;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
namespace System
|
||||
namespace System
|
||||
{
|
||||
/// <summary>
|
||||
/// MIME 类型
|
||||
@@ -62,5 +62,15 @@
|
||||
public const string MP4 = "video/mp4";
|
||||
|
||||
public const string APNG = "image/apng";
|
||||
|
||||
public const string APPX = "application/appx";
|
||||
|
||||
public const string MSIX = "application/msix";
|
||||
|
||||
public const string APPX_Bundle = "application/appxbundle";
|
||||
|
||||
public const string MSIX_Bundle = "application/msixbundle";
|
||||
|
||||
public const string AppInstaller = "application/appinstaller";
|
||||
}
|
||||
}
|
||||
@@ -31,7 +31,7 @@ namespace System.Net.Http
|
||||
/// <summary>
|
||||
/// 默认超时时间,16秒
|
||||
/// </summary>
|
||||
public static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(16);
|
||||
public static readonly TimeSpan DefaultTimeout = TimeSpan.FromSeconds(11);
|
||||
|
||||
static readonly Lazy<int> mDefaultTimeoutTotalMilliseconds = new(() => DefaultTimeout.TotalMilliseconds.ToInt32());
|
||||
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
using System.Reflection;
|
||||
using static System.Properties.ThisAssembly;
|
||||
|
||||
[assembly: AssemblyFileVersion(Version)]
|
||||
[assembly: AssemblyInformationalVersion(InfoVersion)]
|
||||
[assembly: AssemblyVersion(Version)]
|
||||
@@ -3,11 +3,9 @@ using System.Runtime.CompilerServices;
|
||||
using static System.Properties.ThisAssembly;
|
||||
|
||||
[assembly: SuppressIldasm]
|
||||
[assembly: AssemblyTitle(AssemblyTrademark)]
|
||||
[assembly: AssemblyTrademark(AssemblyTrademark)]
|
||||
[assembly: AssemblyDescription(AssemblyDescription)]
|
||||
[assembly: AssemblyProduct(AssemblyProduct)]
|
||||
[assembly: AssemblyCopyright(AssemblyCopyright)]
|
||||
[assembly: AssemblyCompany(AssemblyCompany)]
|
||||
[assembly: AssemblyFileVersion(Version)]
|
||||
[assembly: AssemblyInformationalVersion(InfoVersion)]
|
||||
[assembly: AssemblyVersion(Version)]
|
||||
[assembly: AssemblyCompany(AssemblyCompany)]
|
||||
@@ -0,0 +1,9 @@
|
||||
namespace System.Properties
|
||||
{
|
||||
static partial class ThisAssembly
|
||||
{
|
||||
public const string Version = "2.3.0";
|
||||
|
||||
public const string InfoVersion = Version /*+ "-beta"*/;
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,7 @@
|
||||
namespace System.Properties
|
||||
{
|
||||
public static class ThisAssembly
|
||||
public static partial class ThisAssembly
|
||||
{
|
||||
public const string Version = "2.1.0";
|
||||
|
||||
public const string InfoVersion = Version + "-beta";
|
||||
|
||||
#if NETSTANDARD2_1 || NETCOREAPP2_1_OR_GREATER
|
||||
static readonly Lazy<string> mVersionDisplay = new(() =>
|
||||
{
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
using System.Text;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace System.Security
|
||||
{
|
||||
/// <summary>
|
||||
/// 为键/值对提供简单的安全存储
|
||||
/// 为键/值对提供简单的安全存储(值类型泛型与非泛型重载方法不兼容)
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// <para>每个平台使用平台提供的本机API来安全存储数据:</para>
|
||||
@@ -128,6 +128,8 @@ namespace System.Security
|
||||
}
|
||||
}
|
||||
|
||||
Task<bool> ContainsKeyAsync(string key);
|
||||
|
||||
static IStorage Instance => DI.Get<IStorage>();
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -3,12 +3,14 @@ using MessagePack;
|
||||
#endif
|
||||
#if !NOT_NJSON
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
#endif
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Text.Encodings.Web;
|
||||
using System.Text.Json;
|
||||
using System.Threading;
|
||||
#if !NOT_NJSON
|
||||
using static Newtonsoft.Json.JsonConvert;
|
||||
@@ -332,4 +334,33 @@ namespace System
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace Newtonsoft.Json.Serialization
|
||||
{
|
||||
/// <summary>
|
||||
/// 将忽略 <see cref="JsonPropertyAttribute"/> 属性
|
||||
/// </summary>
|
||||
public sealed class IgnoreJsonPropertyContractResolver : DefaultContractResolver
|
||||
{
|
||||
readonly bool useCamelCase;
|
||||
|
||||
public IgnoreJsonPropertyContractResolver(bool useCamelCase = false)
|
||||
{
|
||||
this.useCamelCase = useCamelCase;
|
||||
}
|
||||
|
||||
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
|
||||
{
|
||||
var result = base.CreateProperties(type, memberSerialization);
|
||||
foreach (var item in result)
|
||||
{
|
||||
item.PropertyName = item.UnderlyingName == null ? null :
|
||||
(useCamelCase ?
|
||||
JsonNamingPolicy.CamelCase.ConvertName(item.UnderlyingName) :
|
||||
item.UnderlyingName);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Win32;
|
||||
@@ -198,6 +198,12 @@ namespace System.Application
|
||||
return controller.NotFound();
|
||||
}
|
||||
|
||||
public static IActionResult GetEnv(ControllerBase controller, IWebHostEnvironment environment)
|
||||
{
|
||||
var content = $"<h1>{environment.EnvironmentName}</h1>";
|
||||
return controller.Content(content, MediaTypeNames.HTML);
|
||||
}
|
||||
|
||||
/// <inheritdoc cref="Path2.InitFileSystem(Func{string}, Func{string})"/>
|
||||
public static void InitFileSystem(IWebHostEnvironment environment)
|
||||
{
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net5.0</TargetFramework>
|
||||
@@ -10,6 +10,9 @@
|
||||
<Compile Include="..\Common.CoreLib\Properties\AssemblyInfo.cs">
|
||||
<Link>Properties\AssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Common.CoreLib\Properties\AssemblyInfo.Version.cs">
|
||||
<Link>Properties\AssemblyInfo.Version.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Common.CoreLib\Properties\InternalsVisibleTo.cs">
|
||||
<Link>Properties\InternalsVisibleTo.cs</Link>
|
||||
</Compile>
|
||||
@@ -29,12 +32,12 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.5" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="5.0.5" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.5" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.6" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="5.0.6" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.6" />
|
||||
<!--<PackageReference Include="Microsoft.Extensions.Logging.AzureAppServices" Version="5.0.2" />-->
|
||||
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="5.0.5" />
|
||||
<PackageReference Include="NLog" Version="4.7.9" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="5.0.6" />
|
||||
<PackageReference Include="NLog" Version="4.7.10" />
|
||||
<PackageReference Include="NLog.Web.AspNetCore" Version="4.12.0" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -1,4 +1,4 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System.Application.Repositories;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
@@ -49,5 +49,11 @@ namespace System.Security
|
||||
var result = await DeleteAsync(key);
|
||||
return result > 0;
|
||||
}
|
||||
|
||||
async Task<bool> IStorage.ContainsKeyAsync(string key)
|
||||
{
|
||||
var result = await Get(key).AnyAsync();
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -44,6 +44,7 @@
|
||||
- 目标框架使用 .NET Framework 3.5 并通过 App.config 配置允许在 4.X 中运行 实现在 Windows 上兼容所有的运行库环境
|
||||
- Launch **启动项**
|
||||
- ST.Client.Desktop.Avalonia.App **桌面客户端**
|
||||
- ST.Client.Desktop.Avalonia.App.Bridge* **Desktop Bridge**
|
||||
- ST.Client.Desktop.Avalonia.Demo.App **桌面客户端(UI演示)**
|
||||
- ST.Client.Mobile.Droid.App **Android 客户端**
|
||||
- ST.Client.Mobile.iOS.App **iOS 客户端**
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Metadata;
|
||||
using System.Application.Columns;
|
||||
using System.Application.Entities;
|
||||
@@ -64,7 +64,7 @@ namespace System
|
||||
if (pOrder.IsAssignableFrom(type))
|
||||
{
|
||||
modelBuilder.Entity(type, p => p.HasIndex(nameof(IOrder.Order)));
|
||||
Log.Info(TAG, "IOrder type: {0}", type.FullName);
|
||||
//Log.Info(TAG, "IOrder type: {0}", type.FullName);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -73,10 +73,11 @@ namespace System
|
||||
|
||||
if (pSoftDeleted.IsAssignableFrom(type))
|
||||
{
|
||||
// https://docs.microsoft.com/zh-cn/ef/core/querying/filters
|
||||
modelBuilder.Entity(type, p => p.HasIndex(nameof(ISoftDeleted.SoftDeleted)));
|
||||
modelBuilder.Entity(type).HasQueryFilter(SoftDeletedQueryFilter(type));
|
||||
softDeleted.Add(type);
|
||||
Log.Info(TAG, "IsSoftDeleted type: {0}", type.FullName);
|
||||
//Log.Info(TAG, "IsSoftDeleted type: {0}", type.FullName);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -86,7 +87,7 @@ namespace System
|
||||
if (pCreationTime.IsAssignableFrom(type))
|
||||
{
|
||||
modelBuilder.Entity(type, p => p.Property(nameof(ICreationTime.CreationTime)).HasDefaultValueSql(SQLStrings.SYSDATETIMEOFFSET).IsRequired());
|
||||
Log.Info(TAG, "ICreationTime type: {0}", type.FullName);
|
||||
//Log.Info(TAG, "ICreationTime type: {0}", type.FullName);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -98,7 +99,12 @@ namespace System
|
||||
modelBuilder.Entity(type, p => p.Property(nameof(IUpdateTime.UpdateTime)).HasDefaultValueSql(SQLStrings.SYSDATETIMEOFFSET).IsRequired());
|
||||
modelBuilder.Entity(type, p => p.Property(nameof(IUpdateTime.UpdateTime)).ValueGeneratedOnAddOrUpdate()
|
||||
.Metadata.SetAfterSaveBehavior(PropertySaveBehavior.Save));
|
||||
Log.Info(TAG, "IUpdateTime type: {0}", type.FullName);
|
||||
//Log.Info(TAG, "IUpdateTime type: {0}", type.FullName);
|
||||
}
|
||||
|
||||
if (pPhoneNumber.IsAssignableFrom(type))
|
||||
{
|
||||
modelBuilder.Entity(type, p => p.Property(nameof(IPhoneNumber.PhoneNumber)).HasMaxLength(IPhoneNumber.Db_MaxLength_PhoneNumber));
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -108,7 +114,7 @@ namespace System
|
||||
if (pkGuid.IsAssignableFrom(type))
|
||||
{
|
||||
modelBuilder.Entity(type, b => b.Property(nameof(IEntity<Guid>.Id)).HasDefaultValueSql(SQLStrings.NEWSEQUENTIALID));
|
||||
Log.Info(TAG, "INEWSEQUENTIALID type: {0}", type.FullName);
|
||||
//Log.Info(TAG, "INEWSEQUENTIALID type: {0}", type.FullName);
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -121,6 +127,7 @@ namespace System
|
||||
public static readonly Type pCreationTime = typeof(ICreationTime);
|
||||
public static readonly Type pUpdateTime = typeof(IUpdateTime);
|
||||
public static readonly Type pkGuid = typeof(INEWSEQUENTIALID);
|
||||
public static readonly Type pPhoneNumber = typeof(IPhoneNumber);
|
||||
/// <summary>
|
||||
/// https://docs.microsoft.com/zh-cn/ef/core/modeling/shadow-properties#property-bag-entity-types
|
||||
/// </summary>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netstandard2.1</TargetFramework>
|
||||
@@ -10,6 +10,9 @@
|
||||
<Compile Include="..\Common.CoreLib\Properties\AssemblyInfo.cs">
|
||||
<Link>Properties\AssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Common.CoreLib\Properties\AssemblyInfo.Version.cs">
|
||||
<Link>Properties\AssemblyInfo.Version.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Common.CoreLib\Properties\InternalsVisibleTo.cs">
|
||||
<Link>Properties\InternalsVisibleTo.cs</Link>
|
||||
</Compile>
|
||||
@@ -23,8 +26,8 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.5" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="5.0.5" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.6" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="5.0.6" />
|
||||
<PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="5.1.30" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -10,6 +10,9 @@
|
||||
<Compile Include="..\Common.CoreLib\Properties\AssemblyInfo.cs">
|
||||
<Link>Properties\AssemblyInfo.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Common.CoreLib\Properties\AssemblyInfo.Version.cs">
|
||||
<Link>Properties\AssemblyInfo.Version.cs</Link>
|
||||
</Compile>
|
||||
<Compile Include="..\Common.CoreLib\Properties\InternalsVisibleTo.cs">
|
||||
<Link>Properties\InternalsVisibleTo.cs</Link>
|
||||
</Compile>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Application.Columns;
|
||||
using System.Application.Columns;
|
||||
using System.Runtime.CompilerServices;
|
||||
|
||||
namespace System
|
||||
@@ -78,14 +78,14 @@ namespace System
|
||||
/// <returns></returns>
|
||||
public static FormattableString SoftDeleteFromTableNameWhereIdEqual(string tableName, object id)
|
||||
{
|
||||
var sql = UpdateFrom + tableName + " set " + nameof(ISoftDeleted.SoftDeleted) + " = 1" + WhereIdEqual_0;
|
||||
var sql = Update + tableName + " set " + nameof(ISoftDeleted.SoftDeleted) + " = 1" + WhereIdEqual_0;
|
||||
return FormattableStringFactory.Create(sql, id);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// "update from "
|
||||
/// "update "
|
||||
/// </summary>
|
||||
public const string UpdateFrom = "update from ";
|
||||
public const string Update = "update ";
|
||||
|
||||
/// <summary>
|
||||
/// " where Id in ("
|
||||
|
||||
@@ -12,17 +12,17 @@
|
||||
- 🎁 可与已有的 ASP.NET Core MVC、Razor Pages 项目无缝集成。
|
||||
|
||||
## 🌐 [ASP.NET Core Blazor 简介](https://docs.microsoft.com/zh-cn/aspnet/core/blazor/?view=aspnetcore-5.0)
|
||||
Blazor 是一个使用 [.NET](/dotnet/standard/tour) 生成交互式客户端 Web UI 的框架:
|
||||
Blazor 是一个使用 [.NET](https://docs.microsoft.com/zh-cn/dotnet/standard/tour) 生成交互式客户端 Web UI 的框架:
|
||||
|
||||
* 使用 [C#](/dotnet/csharp/) 代替 [JavaScript](https://www.javascript.com) 来创建信息丰富的交互式 UI。
|
||||
* 使用 [C#](https://docs.microsoft.com/zh-cn/dotnet/csharp/) 代替 [JavaScript](https://www.javascript.com) 来创建信息丰富的交互式 UI。
|
||||
* 共享使用 .NET 编写的服务器端和客户端应用逻辑。
|
||||
* 将 UI 呈现为 HTML 和 CSS,以支持众多浏览器,其中包括移动浏览器。
|
||||
* 与新式托管平台(如 [Docker](/dotnet/standard/microservices-architecture/container-docker-introduction/index))集成。
|
||||
* 与新式托管平台(如 [Docker](https://docs.microsoft.com/zh-cn/dotnet/standard/microservices-architecture/container-docker-introduction/index))集成。
|
||||
|
||||
使用 .NET 进行客户端 Web 开发可提供以下优势:
|
||||
|
||||
* 使用 C# 代替 JavaScript 来编写代码。
|
||||
* 利用现有的 [.NET 库](/dotnet/standard/class-libraries)生态系统。
|
||||
* 利用现有的 [.NET 库](https://docs.microsoft.com/zh-cn/dotnet/standard/class-libraries)生态系统。
|
||||
* 在服务器和客户端之间共享应用逻辑。
|
||||
* 受益于 .NET 的性能、可靠性和安全性。
|
||||
* 在 Windows、Linux 和 macOS 上使用 [Visual Studio](https://visualstudio.microsoft.com) 保持高效工作。
|
||||
@@ -39,7 +39,7 @@ Blazor 是一个使用 [.NET](/dotnet/standard/tour) 生成交互式客户端 We
|
||||
|
||||
| [<img src="https://cdn.jsdelivr.net/gh/alrra/browser-logos/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br> Edge / IE | [<img src="https://cdn.jsdelivr.net/gh/alrra/browser-logos/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://cdn.jsdelivr.net/gh/alrra/browser-logos/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://cdn.jsdelivr.net/gh/alrra/browser-logos/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari | [<img src="https://cdn.jsdelivr.net/gh/alrra/browser-logos/src/opera/opera_48x48.png" alt="Opera" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Opera | [<img src="https://cdn.jsdelivr.net/gh/alrra/browser-logos/src/electron/electron_48x48.png" alt="Electron" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Electron |
|
||||
| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
|
||||
| Edge 16 / IE 11† | 522 | 57 | 11 | 44 | Chromium 57 |
|
||||
| Edge 16 / IE 11† | 52 | 57 | 11 | 44 | Chromium 57 |
|
||||
|
||||
> 由于 [WebAssembly](https://webassembly.org) 的限制,Blazor WebAssembly 不支持 IE 浏览器,但 Blazor Server 支持 IE 11†。 详见[官网说明](https://docs.microsoft.com/en-us/aspnet/core/blazor/supported-platforms?view=aspnetcore-3.1&WT.mc_id=DT-MVP-5003987)。
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 250 B |
|
After Width: | Height: | Size: 288 B |
|
After Width: | Height: | Size: 396 B |
|
After Width: | Height: | Size: 529 B |
|
After Width: | Height: | Size: 909 B |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 22 KiB |
|
After Width: | Height: | Size: 35 KiB |
|
After Width: | Height: | Size: 92 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 96 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 7.8 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 752 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 752 B |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
|
After Width: | Height: | Size: 16 KiB |
|
After Width: | Height: | Size: 517 B |
|
After Width: | Height: | Size: 921 B |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 28 KiB |