main
SummmerLost 3 years ago
commit 586020a884
  1. 3
      .gitignore
  2. 36
      Common.csproj
  3. 50
      Helper/Auth/AuthHelper.cs
  4. 23
      Helper/Auth/JwtHelper.cs
  5. 58
      Helper/Cache/CacheHelper.cs
  6. 72
      Helper/Code/CodeHelper.cs
  7. 27
      Helper/Encryption/AppSettingJsonHelper.cs
  8. 17
      Helper/Encryption/ConnectionStringsHelper.cs
  9. 61
      Helper/Encryption/DesHelper.cs
  10. 104
      Helper/Encryption/RsaHelper.cs
  11. 50
      Helper/Entity/ModelToEntity.cs
  12. 46
      Helper/Excel/ExcelHelper.cs
  13. 53
      Helper/File/FileHelper.cs
  14. 18
      Helper/Nlog/LogHelper.cs
  15. 97
      Helper/Page/PageHelper.cs
  16. 128
      Helper/Redis/RedisHelper.cs
  17. 116
      Helper/Request/RequestHelper.cs
  18. 365
      Helper/Response/ResponseHelper.cs
  19. 304
      Helper/SqlServer/SqlHelper.cs
  20. 25
      Helper/StringText/CodeHelper.cs
  21. 34
      Helper/StringText/PinYinHelper.cs
  22. 22
      Helper/StringText/TypeChangeHelper.cs
  23. 47
      Helper/Verify/IdCardHelper.cs
  24. 28
      Helper/WeChat/Models/SubscribeMessage/AuditResult.cs
  25. 30
      Helper/WeChat/Models/SubscribeMessage/PaymentSuccessful.cs
  26. 18
      Helper/WeChat/Models/SubscribeMessageModel.cs
  27. 12
      Helper/WeChat/Models/TokenModel.cs
  28. 40
      Helper/WeChat/Models/UnlimitedQrCodeModel.cs
  29. 19
      Helper/WeChat/Models/WeChatPayModel.cs
  30. 12
      Helper/WeChat/Response/OpenIdResponse.cs
  31. 12
      Helper/WeChat/Response/UnlimitedQrCodeResponse.cs
  32. 12
      Helper/WeChat/Response/WeChatResponse.cs
  33. 81
      Helper/WeChat/WeChat.cs
  34. 131
      Middleware/JwtMiddleware.cs
  35. 30
      Nlog.config
  36. 2231
      bin/Debug/netcoreapp3.1/Common.deps.json
  37. BIN
      bin/Debug/netcoreapp3.1/Common.dll
  38. BIN
      bin/Debug/netcoreapp3.1/Common.pdb
  39. 30
      bin/Debug/netcoreapp3.1/Nlog.config
  40. 126
      obj/Common.csproj.nuget.dgspec.json
  41. 19
      obj/Common.csproj.nuget.g.props
  42. 2
      obj/Common.csproj.nuget.g.targets
  43. 4
      obj/Debug/netcoreapp3.1/.NETCoreApp,Version=v3.1.AssemblyAttributes.cs
  44. 23
      obj/Debug/netcoreapp3.1/Common.AssemblyInfo.cs
  45. 1
      obj/Debug/netcoreapp3.1/Common.AssemblyInfoInputs.cache
  46. 3
      obj/Debug/netcoreapp3.1/Common.GeneratedMSBuildEditorConfig.editorconfig
  47. BIN
      obj/Debug/netcoreapp3.1/Common.assets.cache
  48. BIN
      obj/Debug/netcoreapp3.1/Common.csproj.AssemblyReference.cache
  49. 0
      obj/Debug/netcoreapp3.1/Common.csproj.BuildWithSkipAnalyzers
  50. 1
      obj/Debug/netcoreapp3.1/Common.csproj.CoreCompileInputs.cache
  51. 11
      obj/Debug/netcoreapp3.1/Common.csproj.FileListAbsolute.txt
  52. BIN
      obj/Debug/netcoreapp3.1/Common.dll
  53. BIN
      obj/Debug/netcoreapp3.1/Common.pdb
  54. 1
      obj/Debug/netcoreapp3.1/_IsIncrementalBuild
  55. 7023
      obj/project.assets.json
  56. 138
      obj/project.nuget.cache

3
.gitignore vendored

@ -0,0 +1,3 @@
*.csproj
bin/
obj/

@ -0,0 +1,36 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netcoreapp3.1</TargetFramework>
</PropertyGroup>
<ItemGroup>
<None Remove="Nlog.config" />
</ItemGroup>
<ItemGroup>
<Content Include="Nlog.config">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<PackageReference Include="ExcelDataReader.DataSet" Version="3.6.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.28" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.7" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.7" />
<PackageReference Include="Microsoft.International.Converters.PinYinConverter" Version="1.0.0" />
<PackageReference Include="NLog.Web.AspNetCore" Version="5.1.4" />
<PackageReference Include="QRCoder" Version="1.4.3" />
<PackageReference Include="StackExchange.Redis" Version="2.6.70" />
<PackageReference Include="Swashbuckle.AspNetCore.Swagger" Version="6.4.0" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.4.0" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="6.4.0" />
<PackageReference Include="System.Data.OleDb" Version="6.0.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.3" />
<PackageReference Include="System.Text.Encoding.CodePages" Version="6.0.0" />
</ItemGroup>
</Project>

@ -0,0 +1,50 @@
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Reflection;
using System.Security.Claims;
using System.Text;
namespace Common.Helper.Auth
{
public class AuthHelper
{
private readonly IConfiguration _configuration;
/// <param name="configuration"></param>
public AuthHelper(IConfiguration configuration)
{
_configuration = configuration;
}
public string GetToken(dynamic userInfo)
{
var dynamicProperties =(PropertyInfo[]) userInfo.GetType().GetProperties();
// token中的claims用于储存自定义信息,如登录之后的用户id等
var claims = new Claim[dynamicProperties.Length];
for (var i = 0; i < dynamicProperties.Length; i++)
{
claims[i] = new Claim(dynamicProperties[i].Name, userInfo.GetType().GetProperty(dynamicProperties[i].Name).GetValue(userInfo,null)?.ToString());
}
// 获取SecurityKey
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration.GetSection("Authentication")["SecurityKey"]));
var token = new JwtSecurityToken(
issuer: _configuration.GetSection("Authentication")["IsSure"], // 发布者
audience: _configuration.GetSection("Authentication")["Audience"], // 接收者
notBefore: DateTime.Now, // token签发时间
expires: DateTime.Now.AddMinutes(30), // token过期时间
claims: claims, // 该token内存储的自定义字段信息
signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256) // 用于签发token的秘钥算法
);
// 返回成功信息,写出token
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
}

@ -0,0 +1,23 @@
using System;
using System.Linq;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Mvc;
namespace Common.Helper.Auth
{
public static class JwtHelper
{
/// <summary>
/// 获取当前jwt缓存里面的数值 直接本地this.CurValue即可
/// </summary>
/// <param name="controller"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string CurValue(this ControllerBase controller,string key)
{
var auth = controller.HttpContext.AuthenticateAsync().Result.Principal.Claims;
var value = auth.FirstOrDefault(t => t.Type.Equals(key))?.Value;
return value;
}
}
}

@ -0,0 +1,58 @@
using System;
using Microsoft.Extensions.Caching.Memory;
namespace Common.Helper.Cache
{
/// <summary>
/// 缓存框架
/// </summary>
public class CacheHelper
{
private readonly IMemoryCache _memoryCache;
/// <summary>
/// 缓存框架
/// </summary>
/// <param name="memoryCache"></param>
public CacheHelper(IMemoryCache memoryCache)
{
_memoryCache = memoryCache;
}
/// <summary>
/// 存缓存
/// </summary>
/// <param name="key">关键词</param>
/// <param name="value">值</param>
public void Set(string key, string value)
{
var cacheOptions = new MemoryCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromMinutes(5));
_memoryCache.Set(key, value,cacheOptions);
}
/// <summary>
/// 存缓存 带时效
/// </summary>
/// <param name="key">关键词</param>
/// <param name="value">值</param>
/// <param name="aging">时效</param>
public void SetAging(string key, string value,int aging)
{
var cacheOptions = new MemoryCacheEntryOptions()
.SetSlidingExpiration(TimeSpan.FromMinutes(aging));
_memoryCache.Set(key, value, cacheOptions);
}
/// <summary>
/// 获取缓存值
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public string Get(string key)
{
return _memoryCache.TryGetValue(key, out string value) ? value:"";
}
}
}

@ -0,0 +1,72 @@
using System;
using System.Collections.Generic;
using System.Drawing.Imaging;
using System.Drawing;
using System.IO;
using QRCoder;
namespace Common.Helper.Code
{
public class CodeHelper
{
private static Bitmap QcCode(string text)
{
var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(text, QRCodeGenerator.ECCLevel.Q);
var qrCode = new QRCode(qrCodeData);
return qrCode.GetGraphic(20, Color.Black, Color.White, new Bitmap(Path.Combine(Directory.GetCurrentDirectory(), "Image", "Logo.jpg")));
}
private static Bitmap QcCodeTitle(string text,string title)
{
var qrCodeImage = QcCode(text);
var bitmap = new Bitmap(500, 450);
var g = Graphics.FromImage(bitmap);
var font = new Font("SimSun", 24, FontStyle.Regular);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
g.Clear(Color.White);
g.DrawImage(qrCodeImage, 50, 0, 400, 400);
var solidBrush = new SolidBrush(Color.Black);
g.DrawString(title, font, solidBrush, 190, 400);
g.Dispose();
qrCodeImage.Dispose();
return bitmap;
}
/// <summary>
/// 获取二维码
/// </summary>
/// <param name="text">文本</param>
/// <param name="title"></param>
/// <param name="filePath">生成文件地址</param>
public static void QcCodeForFilePath(string text, string title, string filePath)
{
var map = QcCodeTitle(text,title);
map.Save(filePath + title, ImageFormat.Png);
map.Dispose();
}
/// <summary>
/// 获取带标题的二维码
/// </summary>
/// <param name="text"></param>
/// <param name="title"></param>
/// <returns></returns>
public static string QcCodeBase64(string text,string title)
{
using var ms = new MemoryStream();
var map = QcCodeTitle(text,title);
map.Save(ms, ImageFormat.Png);
map.Dispose();
return Convert.ToBase64String(ms.GetBuffer());
}
}
}

@ -0,0 +1,27 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration.Json;
namespace Common.Helper.Encryption
{
/// <summary>
/// 获取配置文件信息
/// </summary>
public class AppSettingJsonHelper
{
private static readonly IConfiguration Configuration = new ConfigurationBuilder()
.Add(new JsonConfigurationSource { Path = "appsettings.json", ReloadOnChange = true })
.Build();
/// <summary>
/// 获取配置文件里面的参数
/// </summary>
/// <param name="section"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string GetSection(string section,string key)
{
return Configuration.GetSection(section)[key];
}
}
}

@ -0,0 +1,17 @@
namespace Common.Helper.Encryption
{
public class ConnectionStringsHelper
{
/// <summary>
/// 直接返回解密后的connectionString
/// </summary>
/// <param name="configName"></param>
/// <param name="configValue"></param>
/// <returns></returns>
public static string GetDesConfig(string configName,string configValue)
{
return DesHelper.DesDecrypt(AppSettingJsonHelper.GetSection(configName, configValue));
}
}
}

@ -0,0 +1,61 @@
using System;
using System.IO;
using System.Security.Cryptography;
namespace Common.Helper.Encryption
{
public class DesHelper
{
private const string Key = "Blue2021";
private const string Iv = "Flag2021";
/// <summary>
/// DES加密
/// </summary>
/// <param name="data">加密数据</param>
/// <returns></returns>
public static string DesEncrypt(string data)
{
var byKey = System.Text.Encoding.ASCII.GetBytes(Key);
var byIv = System.Text.Encoding.ASCII.GetBytes(Iv);
var cryptoProvider = new DESCryptoServiceProvider();
var ms = new MemoryStream();
var cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIv), CryptoStreamMode.Write);
var sw = new StreamWriter(cst);
sw.Write(data);
sw.Flush();
cst.FlushFinalBlock();
sw.Flush();
return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
}
/// <summary>
/// DES解密
/// </summary>
/// <param name="data">解密数据</param>
/// <returns></returns>
public static string DesDecrypt(string data)
{
var byKey = System.Text.Encoding.ASCII.GetBytes(Key);
var byIv = System.Text.Encoding.ASCII.GetBytes(Iv);
byte[] byEnc;
try
{
byEnc = Convert.FromBase64String(data);
}
catch
{
return null;
}
var cryptoProvider = new DESCryptoServiceProvider();
var ms = new MemoryStream(byEnc);
var cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIv), CryptoStreamMode.Read);
var sr = new StreamReader(cst);
return sr.ReadToEnd();
}
}
}

@ -0,0 +1,104 @@
using System;
using System.Collections.Generic;
using System.Security.Cryptography;
using System.Text;
namespace Common.Helper.Encryption
{
public class RsaHelper
{
private RSACryptoServiceProvider Csp { get; set; }
private RSAParameters PrivateKey { get; set; }
private RSAParameters PublicKey { get; set; }
/// <summary>
/// 公钥字符串
/// </summary>
public string PublicKeyString { get; set; }
private RsaHelper()
{
Csp = new RSACryptoServiceProvider(2048);
//how to get the private key
PrivateKey = Csp.ExportParameters(true);
//and the public key ...
PublicKey = Csp.ExportParameters(false);
//converting the public key into a string representation
{
//we need some buffer
var sw = new System.IO.StringWriter();
//we need a serializer
var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
//serialize the key into the stream
xs.Serialize(sw, PublicKey);
//get the string from the stream
PublicKeyString = sw.ToString();
}
//converting it back
{
//get a stream from the string
var sr = new System.IO.StringReader(PublicKeyString);
//we need a deserializer
var xs = new System.Xml.Serialization.XmlSerializer(typeof(RSAParameters));
//get the object back from the stream
PublicKey = (RSAParameters)xs.Deserialize(sr);
}
}
static RsaHelper(){}
public static RsaHelper Instance { get; } = new RsaHelper();
/// <summary>
/// 加密数据
/// </summary>
/// <param name="keyWord"></param>
/// <returns></returns>
public string DesEncrypt(string keyWord)
{
//lets take a new CSP with a new 2048 bit rsa key pair
//conversion for the private key is no black magic either ... omitted
//we have a public key ... let's get a new csp and load that key
Csp = new RSACryptoServiceProvider();
Csp.ImportParameters(PublicKey);
//for encryption, always handle bytes...
var bytesPlainTextData = System.Text.Encoding.Unicode.GetBytes(keyWord);
//apply pkcs#1.5 padding and encrypt our data
var bytesCypherText = Csp.Encrypt(bytesPlainTextData, false);
//we might want a string representation of our cypher text... base64 will do
return Convert.ToBase64String(bytesCypherText);
}
/// <summary>
/// 解密数据
/// </summary>
/// <param name="keyWord"></param>
/// <returns></returns>
public string DesDecrypt(string keyWord)
{
//first, get our bytes back from the base64 string ...
var bytesCypherText = Convert.FromBase64String(keyWord);
//we want to decrypt, therefore we need a csp and load our private key
var csp = new RSACryptoServiceProvider();
csp.ImportParameters(PrivateKey);
//decrypt and strip pkcs#1.5 padding
var bytesPlainTextData = csp.Decrypt(bytesCypherText, false);
//get our original plainText back...
return System.Text.Encoding.Unicode.GetString(bytesPlainTextData);
}
}
}

@ -0,0 +1,50 @@
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
namespace Common.Helper.Entity
{
public class ModelToEntity<TM,TE>
{
/// <summary>
/// 类型转换,有则赋值,没有则默认值 这个可以不传需要转换的值
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public static TE Change(TM model)
{
var modelPropertyInfos = typeof(TM).GetProperties();
var entityType = typeof(TE);
var entity =(TE)Activator.CreateInstance(typeof(TE));
foreach (var modelPropertyInfo in modelPropertyInfos)
{
if(entityType.GetProperty(modelPropertyInfo.Name)!=null)
entityType.GetProperty(modelPropertyInfo.Name)?.SetValue(entity, modelPropertyInfo.GetValue(model), null);
}
return entity;
}
/// <summary>
/// 类型转换,只是这个可以传入需要转换的值
/// </summary>
/// <param name="model"></param>
/// <param name="entity"></param>
/// <returns></returns>
public static TE Set(TM model,TE entity)
{
var modelPropertyInfos = typeof(TM).GetProperties();
var entityType = typeof(TE);
foreach (var modelPropertyInfo in modelPropertyInfos)
{
if (entityType.GetProperty(modelPropertyInfo.Name) != null)
entityType.GetProperty(modelPropertyInfo.Name)?.SetValue(entity, modelPropertyInfo.GetValue(model), null);
}
return entity;
}
}
}

@ -0,0 +1,46 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using ExcelDataReader;
namespace Common.Helper.Excel
{
public class ExcelHelper
{
static ExcelHelper() { }
private ExcelHelper() { }
public static ExcelHelper Instance { get; } = new ExcelHelper();
/// <summary>
/// 读取excel的帮助类 必须传该excel有几列
/// </summary>
/// <param name="filePath"></param>
/// <param name="columnCount"></param>
/// <returns></returns>
public List<List<string>> Read(string filePath,int columnCount)
{
var excelContent = new List<List<string>>();
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
using var stream = System.IO.File.Open(filePath, FileMode.Open, FileAccess.Read);
using var reader = ExcelReaderFactory.CreateReader(stream);
do
{
while (reader.Read())
{
var cellContent = new List<string>();
for (var i = 0; i < columnCount; i++)
{
cellContent.Add(reader[i]==null?"": reader[i].ToString());
}
if(!cellContent.All(string.IsNullOrEmpty))
excelContent.Add(cellContent);
}
} while (reader.NextResult());
return excelContent;
}
}
}

@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using Common.Helper.Nlog;
namespace Common.Helper.File
{
public class FileHelper
{
/// <summary>
/// 创建文件夹
/// </summary>
/// <param name="file"></param>
public static void CreateFile(string file)
{
if (Directory.Exists(file))
//文件夹已经存在
return;
try
{
Directory.CreateDirectory(file);
//创建成功
}
catch (Exception e)
{
LogHelper.Log.Error($"文件创建出错:{e.ToString()}");
}
}
/// <summary>
/// 获取文件大小
/// </summary>
/// <param name="length">文件长度</param>
/// <returns></returns>
public static string FileSize(long length)
{
var unit = new List<string>() { "K", "M", "G" };
var size = Math.Round(length / 1024.0, 2);
var index = 0;
while (size > 1024 && index < 2)
{
index++;
size = Math.Round(size / 1024, 2);
}
return $"{size}{unit[index]}";
}
}
}

@ -0,0 +1,18 @@
using NLog;
namespace Common.Helper.Nlog
{
/// <summary>
/// 日志静态类
/// </summary>
public class LogHelper
{
/// <summary>
/// 日志调用对象
/// </summary>
public static readonly NLog.Logger Log = LogManager.GetCurrentClassLogger();
}
}

@ -0,0 +1,97 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.EntityFrameworkCore;
namespace Common.Helper.Page
{
/// <summary>
/// 分页帮助类
/// </summary>
public class PageHelper
{
/*
* 1. list.Skip(x).Take(y);
* 2.(x,y)(0,list.Count)list为空[],()
*/
/// <summary>
/// 分页
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="list">数据</param>
/// <param name="page">页码</param>
/// <param name="size">数据量/页</param>
/// <returns></returns>
public static Data Pagination<T>(List<T> list, int page, int size)
{
if (list == null)
return new Data(0, page, null);
if (list.Count != 0 && list.Count >= size)
return new Data(list.Count, page <= 0 ? 0 : page,
list.Skip(Convert.ToInt32((page <= 0 ? 0 : page - 1) * size)).Take(size).ToList());
return new Data(list.Count, page, list);
}
/// <summary>
/// 该分页方法适用于sql server 2008 .net core 3.1不支持2008数据库
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="db"></param>
/// <param name="dbTable"></param>
/// <param name="page"></param>
/// <param name="size"></param>
/// <returns></returns>
public static Data Pagination<T>(DbContext db, DbSet<T> dbTable, int page, int size) where T : class
{
var entityType = db.Model.FindEntityType(typeof(T));
var tableName = entityType.GetTableName();
var primaryKeyName = entityType.FindPrimaryKey().Properties.First().Name;
return new Data(dbTable.Count(), page, dbTable.FromSqlRaw($"select * from (select ROW_NUMBER() OVER(ORDER BY {primaryKeyName}) RowSerialNumber ,* from {tableName}) s where RowSerialNumber BETWEEN {(page - 1) * size + 1} and {page * size}").ToList());
}
/// <summary>
/// 该方法适用于sql server 2008以上的数据库 sql server 2008会报错
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
/// <param name="page"></param>
/// <param name="size"></param>
/// <returns></returns>
public static Data Pagination<T>(IEnumerable<T> list, int page, int size)
{
return list == null ? new Data(0, page, null) : new Data(list.Count(), page, list.Skip(Convert.ToInt32((page <= 0 ? 0 : page - 1) * size)).Take(size).ToList());
}
}
/// <summary>
/// 数据页数
/// </summary>
public class Data
{
/// <summary>
/// 总数
/// </summary>
public int? Total { get; set; }
/// <summary>
/// 当前页码
/// </summary>
public int? Current { get; set; }
/// <summary>
/// 数据
/// </summary>
public object List { get; set; }
/// <summary>
/// 入参
/// </summary>
/// <param name="total"></param>
/// <param name="current"></param>
/// <param name="list"></param>
public Data(int? total, int? current, object list)
{
Total = total ?? 0;
Current = current;
List = list;
}
}
}

@ -0,0 +1,128 @@
using System;
using Common.Helper.Encryption;
using Newtonsoft.Json;
using StackExchange.Redis;
namespace Common.Helper.Redis
{
/// <summary>
/// Redis帮助类--- 项目的appsetting.json 文件里面必须包含 Redis ConnectionString 的配置
/// </summary>
public class RedisHelper
{
private static readonly object Locker = new object();
//连接多路复用器
private ConnectionMultiplexer _redisMultiplexer;
private IDatabase _db = null;
private static RedisHelper _instance = null;
/// <summary>
/// 单例模式
/// </summary>
public static RedisHelper Instance
{
get
{
if (_instance != null) return _instance;
lock (Locker)
{
_instance ??= new RedisHelper();
}
return _instance;
}
}
/// <summary>
/// 连接redis
/// </summary>
public void InitConnect()
{
try
{
//连接redis服务器
var redisConnection = AppSettingJsonHelper.GetSection("Redis","ConnectionString");
_redisMultiplexer = ConnectionMultiplexer.Connect(redisConnection);
_db = _redisMultiplexer.GetDatabase();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
_redisMultiplexer = null;
_db = null;
}
}
/// <summary>
/// 实例化
/// </summary>
public RedisHelper()
{
InitConnect();
}
#region 通用key操作
/// <summary>
/// 判断键是否存在
/// </summary>
public bool ExistsKey(string key)
{
return _db.KeyExists(key);
}
/// <summary>
/// 删除键
/// </summary>
public bool DeleteKey(string key)
{
return _db.KeyDelete(key);
}
#endregion
#region string操作
/// <summary>
/// 保存单个key value
/// </summary>
/// <param name="key">键</param>
/// <param name="value">值</param>
/// <param name="expiry">过期时间</param>
public bool SetStringKey(string key, string value, TimeSpan? expiry=null)
{
expiry ??= new TimeSpan(0, 5, 0);
return _db.StringSet(key, value, expiry);
}
/// <summary>
/// 获取单个key的值
/// </summary>
public RedisValue GetRedisValue(string key)
{
return _db.StringGet(key);
}
public string GetStringValue(string key)
{
return _db.StringGet(key);
}
/// <summary>
/// 保存一个对象
/// </summary>
/// <typeparam name="T">对象的类型</typeparam>
public bool SetObjectKey<T>(string key, T obj, TimeSpan? expiry = default(TimeSpan?))
{
var json = JsonConvert.SerializeObject(obj);
return _db.StringSet(key, json, expiry);
}
/// <summary>
/// 获取一个key的对象
/// </summary>
/// <typeparam name="T">返回类型</typeparam>
public T GetStringKey<T>(string key)
{
var value = _db.StringGet(key);
return value.IsNullOrEmpty ? default : JsonConvert.DeserializeObject<T>(value);
}
#endregion
}
}

@ -0,0 +1,116 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
namespace Common.Helper.Request
{
public class RequestHelper
{
/// <summary>
/// get方法获取文件流
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static async Task<Stream> GetFileStream(string url)
{
using var client = new HttpClient();
var msg = await client.GetAsync($"{url}");
if (!msg.IsSuccessStatusCode) return null;
// create a new file to write to
var contentStream = await msg.Content.ReadAsStreamAsync(); // get the actual content stream
return contentStream;
}
/// <summary>
/// get方法返回实体对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <returns></returns>
public static async Task<T> GetEntity<T>(string url)
{
using var client = new HttpClient();
var msg = await client.GetAsync($"{url}");
if (!msg.IsSuccessStatusCode) return default;
var content = await msg.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<T>(content);
}
/// <summary>
/// get方法返回文本字符
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
public static async Task<string> GetString(string url)
{
using var client = new HttpClient();
var msg = await client.GetAsync($"{url}");
if (!msg.IsSuccessStatusCode) return default;
return await msg.Content.ReadAsStringAsync();
}
/// <summary>
/// post方法返回文件流
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="entity"></param>
/// <returns></returns>
public static async Task<Stream> PostFileStream<T>(string url,T entity)
{
using var client = new HttpClient();
var msg = await client.PostAsync($"{url}", new StringContent(JsonConvert.SerializeObject(entity), Encoding.UTF8, "application/json"));
if (!msg.IsSuccessStatusCode) return null;
// create a new file to write to
var contentStream = await msg.Content.ReadAsStreamAsync(); // get the actual content stream
return contentStream;
}
/// <summary>
/// post方法返回实体对象
/// </summary>
/// <typeparam name="TR"></typeparam>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="entity"></param>
/// <returns></returns>
public static async Task<TR> PostEntity<TR,T>(string url,T entity)
{
using var client = new HttpClient();
var msg = await client.PostAsync($"{url}", new StringContent(JsonConvert.SerializeObject(entity), Encoding.UTF8, "application/json"));
if (!msg.IsSuccessStatusCode) return default;
var content = await msg.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<TR>(content);
}
public static async Task<TR> PostFormDataEntity<TR>(string url, FormUrlEncodedContent formUrl)
{
using var client = new HttpClient();
var msg = await client.PostAsync($"{url}", formUrl);
if (!msg.IsSuccessStatusCode) return default;
var content = await msg.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<TR>(content);
}
/// <summary>
/// post方法返回文本字符
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="url"></param>
/// <param name="entity"></param>
/// <returns></returns>
public static async Task<string> PostString<T>(string url,T entity)
{
using var client = new HttpClient();
var msg = await client.PostAsync($"{url}", new StringContent(JsonConvert.SerializeObject(entity), Encoding.UTF8, "application/json"));
if (!msg.IsSuccessStatusCode) return default;
return await msg.Content.ReadAsStringAsync();
}
}
}

@ -0,0 +1,365 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.ComponentModel;
namespace Common.Helper.Response
{
public static class ResponseHelper
{
/// <summary>
/// 首位:
/// 3:warning
/// 4:info(提示信息)
/// 5:error;
/// 6:后端校验,前端不报错
/// 倒数第二位:
/// 0:代码校验出的错
/// 1:业务流程里面的错误
/// 4: notFind
/// 5: 权限
/// </summary>
public enum ErrorEnum
{
#region 3:warning
//倒数第二位 0
//倒数第二位 1
/// <summary>
/// 申请单已经发送到检验科,请联系检验科取消配血,并在his中删除医嘱及记账信息
/// </summary>
[Description("申请单已经发送到检验科,请联系检验科取消配血,并在his中删除医嘱及记账信息")]
HasBeenSent = 30011,
/// <summary>
/// 申请已发送或已作废,请勿重复操作
/// </summary>
[Description("申请已发送或已作废,请勿重复操作")]
RepeatSending = 30012,
/// <summary>
/// 条码作废- 改条码在检验科已经扫码上机,不能作废
/// </summary>
[Description("该条码在检验科已经扫码上机,不能作废")]
NotCancelBarcode = 30013,
/// <summary>
/// 检验科未发血
/// </summary>
[Description("检验科未发血")]
NotSend = 30014,
/// <summary>
/// 血袋已接收
/// </summary>
[Description("血袋已接收")]
BloodReceived = 30015,
/// <summary>
/// 操作时间不能超过当前时间
/// </summary>
[Description("操作时间不能超过当前时间")]
NurseTimeOut = 30016,
/// <summary>
/// 输注记录已反馈
/// </summary>
[Description("输注记录已反馈")]
InfusionFeedback = 3017,
/// <summary>
/// 输注记录已反馈
/// </summary>
[Description("血袋配血科室不匹配")]
DeptMismatch = 3018,
[Description("自助申请单名称重复")]
ApplicationNameRepeat = 30019,
[Description("该用户码不属于此次采集场所")]
UserCodeError = 300101,
[Description("该申请未审核")]
ApplicationNotAudit = 300102,
[Description("Excel有误")]
ExcelIsError = 300103,
[Description("未付款")]
Unpaid = 300104,
[Description("该用户信息已经注册过")]
UserInfoRepeat = 300105,
[Description("该用户信息已经注册过")]
UserBindRepeat = 300106,
[Description("已超过最终上传时间")]
UploadFileTimeOut = 300107,
[Description("请登录")]
NotLogin = 300108,
[Description("团检申请不能停用")]
GroupInspectionNotDelete = 300109,
[Description("该申请已经停用")]
ApplicationIsStop = 300120,
//倒数第二位 4
/// <summary>
/// 未找到数据
/// </summary>
[Description("未找到数据")]
NotFindData = 30041,
/// <summary>
/// 未找到输血申请单信息
/// </summary>
[Description("未找到输血申请单信息")]
NotFindBloodRequest = 30042,
/// <summary>
/// 未找到患者信息
/// </summary>
[Description("未找到患者信息")]
NotFindPatientInfo = 30043,
/// <summary>
/// 未找到样本信息
/// </summary>
[Description("未找到样本信息")]
NotFindSampleInfo = 30044,
/// <summary>
/// 未找到知情同意书信息
/// </summary>
[Description("未找到知情同意书信息")]
NotFindInformed = 30045,
/// <summary>
/// 未找到交叉配血信息
/// </summary>
[Description("未找到交叉配血信息")]
NotFindBloodMatch = 30046,
/// <summary>
/// 未找到血袋库存信息
/// </summary>
[Description("未找到血袋库存信息")]
NotFindBlood = 30047,
/// <summary>
/// 未找到输注记录数据
/// </summary>
[Description("未找到输注记录")]
NotFindInfusion = 30048,
/// <summary>
/// 未找到不良反应记录
/// </summary>
[Description("未找到不良反应记录")]
NotFindReaction = 30049,
/// <summary>
/// 未找到输注前巡视记录
/// </summary>
[Description("未找到输注前巡视记录")]
NotFindBeforeInspect = 30410,
/// <summary>
/// 未找到报告单
/// </summary>
[Description("未找到报告单")]
NotFindReport = 30411,
//倒数第二位 5 权限
/// <summary>
/// 输血申请未审核
/// </summary>
[Description("输血申请未审核")]
UnReviewBloodRequisition = 30051,
/// <summary>
/// 未进行医生审核
/// </summary>
[Description("未进行医生审核")]
UnReviewDoctor = 30052,
/// <summary>
/// 权限不足,医生无相关证书信息,如果确有证书请到his添加
/// </summary>
[Description("权限不足,医生无相关证书信息,如果确有证书请到his添加")]
InsufficientPermissions = 30053,
/// <summary>
/// 医生审核职称权限不足
/// </summary>
[Description("权限不足,医生职称不符合审核要求")]
InsufficientDoctorTitle = 30054,
/// <summary>
/// 护士审核权限不足
/// </summary>
[Description("护士审核权限不足")]
NurseInsufficient = 30055,
#endregion
#region 4:info
/// <summary>
/// 正在配血,请等待
/// </summary>
[Description("正在配血,请等待")]
Matching = 40011,
#endregion
#region 5:error
/// <summary>
/// Token错误
/// </summary>
[Description("Token错误")]
TokenError = 50001,
[Description("参数错误")]
ParamsError = 50002,
[Description("登录失败,用户名或密码错误")]
UserAndPwError = 50011,
/// <summary>
/// 医嘱业务流程错误-输血申请单发送
/// </summary>
[Description("业务逻辑错误")]
BusinessError = 50012,
/// <summary>
/// 血型未确认-创建知情同意书
/// </summary>
[Description("患者血型未确认")]
BloodAboRhError = 50013,
/// <summary>
/// 科室不匹配-首页获取在院患者列表
/// </summary>
[Description("科室不匹配")]
DeptMismatchError = 50014,
#endregion
#region 6:后端校验,前端不报错
[Description("登录失败,用户名或密码为空")]
UserAndPwIsNull = 60001,
#endregion
}
/// <summary>
/// 获取枚举对应的Description
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
public static string GetDescription(this Enum val)
{
var field = val.GetType().GetField(val.ToString());
if (field == null)
return null;
var customAttribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute));
return customAttribute == null ? val.ToString() : ((DescriptionAttribute)customAttribute).Description;
}
/// <summary>
/// 返回需单独处理错误的信息
/// </summary>
/// <param name="enums"></param>
/// <returns></returns>
public static ActionResult Fail(ErrorEnum enums)
{
var code = Convert.ToInt32(enums);
var message = enums.GetDescription();
var result = new ResultModel(code, message, "");
return new OkObjectResult(result);
}
/// <summary>
/// 返回需单独处理错误的信息,自定义message
/// </summary>
/// <param name="enums"></param>
/// <param name="message"></param>
/// <returns></returns>
public static ActionResult Fail(ErrorEnum enums, string message)
{
var code = Convert.ToInt32(enums);
var result = new ResultModel(code, message, "");
return new OkObjectResult(result);
}
/// <summary>
///
/// </summary>
/// <param name="data"></param>
/// <param name="enums"></param>
/// <returns></returns>
public static ActionResult Fail(object data, ErrorEnum enums)
{
var result = new ResultModel(Convert.ToInt32(enums),enums.GetDescription(), data);
return new OkObjectResult(result);
}
/// <summary>
/// 成功(200,无返回)
/// </summary>
/// <returns></returns>
public static ActionResult Success()
{
var result = new ResultModel(200, "Success", "");
return new OkObjectResult(result);
}
/// <summary>
/// 成功(200,返回数据)
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public static ActionResult Success(object data)//File(ms.ToArray(), "application/pdf");
{
var result = new ResultModel(200, "Success", data);
return new OkObjectResult(result);
}
/// <summary>
/// 返回自定义错误
/// </summary>
/// <param name="message"></param>
/// <param name="code"></param>
/// <returns></returns>
public static ActionResult CustomizeFail(string message, int code = 5)
{
code = code switch
{
5 => 50001,
6 => 60001,
4 => 40001,
3 => 30001,
_ => code
};
return new OkObjectResult(new ResultModel(code, message, ""));
}
/// <summary>
/// 失败(500)
/// </summary>
/// <returns></returns>
public static ActionResult ServerError()
{
var result = new ResultModel(500, "服务器内部错误,请联系系统管理员。", "");
return new OkObjectResult(result);
}
/// <summary>
/// 失败(500)
/// </summary>
/// <returns></returns>
public static ActionResult Fail(Exception ex)
{
var result = new ResultModel(500, ex.Message, "");
return new OkObjectResult(result);
}
}
public class ResultModel
{
public int Code { get; set; }
public string Message { get; set; }
public object Data { get; set; }
public ResultModel()
{
}
public ResultModel(int code, string message, object data)
{
Code = code;
Message = message;
Data = data;
}
}
}

@ -0,0 +1,304 @@
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Dynamic;
using System.Linq;
namespace Common.Helper.SqlServer
{
public class SqlHelper
{
public static readonly string ConnectString = "";
private SqlConnection _con;
private SqlCommand _cmd;
private SqlDataAdapter _sda;
private SqlDataReader _sdr;
private DataSet _ds;
private DataView _dv;
public static SqlConnection GetConnection()//定义成静态的,很重要!
{
return new SqlConnection(ConnectString);
}
/// <summary>
/// 打开数据库连接
/// </summary>
public void OpenDataBase()
{
_con = new SqlConnection(ConnectString);
_con.Open();
}
/// <summary>
/// 关闭数据库连接
/// </summary>
public void CloseDataBase()
{
_con.Close();
_con.Dispose();
}
/// <summary>
/// 返回DataSet数据集
/// </summary>
/// <param name="sqlStr">数据库查询字符串</param>
/// <param name="tableName"></param>
/// <returns>DataSet</returns>
public DataSet GetDs(string sqlStr, string tableName)
{
OpenDataBase();
_sda = new SqlDataAdapter(sqlStr, _con);
_ds = new DataSet();
_sda.Fill(_ds, tableName);
CloseDataBase();
return _ds;
}
public DataView GetDv(string sqlStr)
{
OpenDataBase();
_sda = new SqlDataAdapter(sqlStr, _con);
_ds = new DataSet();
_sda.Fill(_ds);
_dv = _ds.Tables[0].DefaultView;
CloseDataBase();
return _dv;
}
/// <summary>
/// 返回DataReader对象
/// </summary>
/// <param name="sqlString">查询字符串</param>
/// <returns>返回值</returns>
public SqlDataReader GetDataReader(string sqlString)
{
OpenDataBase();
_cmd = new SqlCommand(sqlString, _con);
_sdr = _cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
return _sdr;
}
public DataSet DataSet(string sql)
{
SqlConnection con = new SqlConnection(ConnectString);
SqlCommand cmd = new SqlCommand(sql, con);
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = null;
try
{
con.Open();
ds = new DataSet();
da.Fill(ds);
}
catch (SqlException ex)
{
throw ex;
}
catch (Exception ex)
{
throw ex;
}
finally
{
con.Close();
}
return ds;
}
public static DataTable DataTable(string sql)
{
var con = new SqlConnection(ConnectString);
var cmd = new SqlCommand(sql, con);
var da = new SqlDataAdapter(cmd);
DataTable ds = null;
try
{
con.Open();
ds = new DataTable();
da.Fill(ds);
}
catch (SqlException ex)
{
throw ex;
}
catch (Exception ex)
{
throw ex;
}
finally
{
con.Close();
}
return ds;
}
public static DataTable DataTable(string sql,string connectString)
{
var con = new SqlConnection(connectString);
var cmd = new SqlCommand(sql, con);
var da = new SqlDataAdapter(cmd);
DataTable ds = null;
try
{
con.Open();
ds = new DataTable();
da.Fill(ds);
}
catch (SqlException ex)
{
throw ex;
}
catch (Exception ex)
{
throw ex;
}
finally
{
con.Close();
}
return ds;
}
/// <summary>
/// 可以传入连接字符串 返回T类型对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <param name="connectString"></param>
/// <returns></returns>
public static List<T> Entity<T>(string sql,string connectString)
{
return ConvertDataTableToEntity<T>(DataTable(sql,connectString));
}
/// <summary>
/// 根据sql语句返回 T 类型对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="sql"></param>
/// <returns></returns>
public static List<T> Entity<T>(string sql)
{
return ConvertDataTableToEntity<T>(DataTable(sql));
}
/// <summary>
/// 根据sql语句直接返回泛型对象
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public static List<ExpandoObject> Entity(string sql)
{
return ConvertDataTableToEntity(DataTable(sql));
}
/// <summary>
/// 执行Sql语句方法没有返回值
/// </summary>
/// <param name="sqlStr">传入的查询参数</param>
public void RunSql(string sqlStr)
{
OpenDataBase();
_cmd = new SqlCommand(sqlStr, _con);
_cmd.ExecuteNonQuery();
CloseDataBase();
}
/// <summary>
/// 返回查询结果的首行首列
/// </summary>
/// <param name="sqlStr">查询字符串</param>
/// <returns>返回结果</returns>
public string ReturnSql(string sqlStr)
{
OpenDataBase();
string returnSql;
try
{
_cmd = new SqlCommand(sqlStr, _con);
returnSql = _cmd.ExecuteScalar().ToString();
}
catch(Exception ex)
{
throw ex;
}
CloseDataBase();
return returnSql;
}
/// <summary>
/// 将DataTable转成 T 实体对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt"></param>
/// <returns></returns>
public static List<T> ConvertDataTableToEntity<T>(DataTable dt)
{
return (from DataRow row in dt.Rows select GetItem<T>(row)).ToList();
}
/// <summary>
/// 组装实体的方法
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dr"></param>
/// <returns></returns>
private static T GetItem<T>(DataRow dr)
{
var temp = typeof(T);
var obj = Activator.CreateInstance<T>();
foreach (DataColumn column in dr.Table.Columns)
{
foreach (var pro in temp.GetProperties())
{
if (string.Equals(pro.Name, column.ColumnName.Replace("_", string.Empty), StringComparison.CurrentCultureIgnoreCase))
{
if (dr[column.ColumnName] is DBNull)
{
pro.SetValue(obj, default, null);
continue;
}
pro.SetValue(obj, dr[column.ColumnName], null);
if (dr[column.ColumnName] is string)
pro.SetValue(obj, Convert.ToString(dr[column.ColumnName]).Trim(), null);
}
else
continue;
}
}
return obj;
}
/// <summary>
/// 将DataTable转成 泛型实体对象
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static List<ExpandoObject> ConvertDataTableToEntity(DataTable dt)
{
return (from DataRow row in dt.Rows select GetItem(row)).ToList();
}
/// <summary>
/// 不需要定义实体,直接返回泛型实体
/// </summary>
/// <param name="dr"></param>
/// <returns></returns>
public static ExpandoObject GetItem(DataRow dr)
{
dynamic dynamicEntity = new ExpandoObject();
foreach (DataColumn column in dr.Table.Columns)
{
(dynamicEntity as IDictionary<string, object>).Add(column.ColumnName, (dr[column.ColumnName] is string)? dr[column.ColumnName].ToString().Trim(): dr[column.ColumnName]);
}
return dynamicEntity;
}
}
}

@ -0,0 +1,25 @@
using System;
namespace Common.Helper.StringText
{
/// <summary>
/// 相关码的生成
/// </summary>
public class CodeHelper
{
/// <summary>
///获取文本数字码
/// </summary>
/// <param name="code">需要转换的文本</param>
/// <param name="length">需要码长度</param>
/// <returns></returns>
public string GetCode(string code, int length)
{
code = PinYinHelper.GetFirstPinyin(code);
var random = new Random();
var numberLength = length - code.Length;
code += random.Next(Convert.ToInt32(Math.Pow(10, numberLength)),Convert.ToInt32(Math.Pow(10, numberLength + 1)));
return code;
}
}
}

@ -0,0 +1,34 @@
using Microsoft.International.Converters.PinYinConverter;
namespace Common.Helper.StringText
{
/// <summary>
/// 拼音帮助类
/// </summary>
public class PinYinHelper
{
/// <summary>
/// 获取首字母
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string GetFirstPinyin(string str)
{
var r = string.Empty;
foreach (var obj in str)
{
try
{
var chineseChar = new ChineseChar(obj);
var t = chineseChar.Pinyins[0];
r += t[..1];
}
catch
{
r += obj.ToString();
}
}
return r;
}
}
}

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace Common.Helper.StringText
{
public class TypeChangeHelper
{
/// <summary>
/// 流转base64 适用于图片流
/// </summary>
/// <param name="stream"></param>
/// <returns></returns>
public static string StreamToBase64(Stream stream)
{
using var memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
return Convert.ToBase64String(memoryStream.ToArray());
}
}
}

@ -0,0 +1,47 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Common.Helper.Verify
{
public class IdCardHelper
{
/// <summary>
/// 18位身份证验证 //校验码验证 符合GB11643-1999标准
/// </summary>
/// <param name="id">身份证号</param>
/// <returns></returns>
public static bool CheckIdCard18(string id)
{
if (long.TryParse(id.Remove(17), out var n) == false || n < Math.Pow(10, 16) ||
long.TryParse(id.Replace('x', '0').Replace('X', '0'), out n) == false)
{
return false; //数字验证
}
const string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";
if (address.IndexOf(id.Remove(2), StringComparison.Ordinal) == -1)
{
return false; //省份验证
}
var birth = id.Substring(6, 8).Insert(6, "-").Insert(4, "-");
if (DateTime.TryParse(birth, out _) == false)
{
return false; //生日验证
}
var arrVerifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');
var wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',');
var ai = id.Remove(17).ToCharArray();
var sum = 0;
for (var i = 0; i < 17; i++)
{
sum += int.Parse(wi[i]) * int.Parse(ai[i].ToString());
}
Math.DivRem(sum, 11, out var y);
return arrVerifyCode[y] == id.Substring(17, 1).ToLower();
}
}
}

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Common.Helper.WeChat.Models.SubscribeMessage
{
public class AuditResult
{
/// <summary>
/// 申请类型
/// </summary>
public string phrase1 { get; set; }
/// <summary>
/// 审核结果
/// </summary>
public string phrase2 { get; set; }
/// <summary>
/// 审核时间
/// </summary>
public string date3 { get; set; }
/// <summary>
/// 备注
/// </summary>
public string thing4 { get; set; }
}
}

@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Common.Helper.WeChat.Models.SubscribeMessage
{
public class PaymentSuccessful
{
/// <summary>
/// 就诊人
/// </summary>
public string thing6 { get; set; }
/// <summary>
/// 服务名称
/// </summary>
public string phrase1 { get; set; }
/// <summary>
/// 订单总价
/// </summary>
public string amount3 { get; set; }
/// <summary>
/// 下单时间
/// </summary>
public string date4 { get; set; }
/// <summary>
/// 备注
/// </summary>
public string thing5 { get; set; }
}
}

@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Common.Helper.WeChat.Models
{
public class SubscribeMessageModel
{
public string touser { get; set; }
public string template_id { get; set; }
public string page { get; set; }
public object data { get; set; }
public string miniprogram_state { get; set; }
public string lang { get; set; }
}
}

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Common.Helper.WeChat.Models
{
public class TokenModel
{
public string access_token { get; set; }
public int? expires_in { get; set; }
}
}

@ -0,0 +1,40 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Common.Helper.WeChat.Models
{
public class UnlimitedQrCodeModel
{
/// <summary>
/// 传参
/// </summary>
public string scene { get; set; }
/// <summary>
/// 小程序页面
/// </summary>
public string page { get; set; }
/// <summary>
/// 是否检查页面存在
/// </summary>
public bool check_path { get; set; }
/// <summary>
/// 打开版本
/// </summary>
public string env_version { get; set; }
/// <summary>
/// 宽度
/// </summary>
public int width { get; set; }
/// <summary>
/// 自动配置线条颜色
/// </summary>
public bool auto_color { get; set; }
/// <summary>
/// 是否需要透明底色
/// </summary>
public bool is_hyaline { get; set; }
}
}

@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Common.Helper.WeChat.Models
{
public class WeChatPayModel
{
public string PayCode { get; set; }
public string Title { get; set; }
public string CallNo { get; set; }
public decimal TotalFee { get; set; }
public string Name { get; set; }
public string CardNo { get; set; }
public string PatientId { get; set; }
public string Mid { get; set; }
public string CollectId { get; set; }
}
}

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Common.Helper.WeChat.Response
{
public class OpenIdResponse : WeChatResponse
{
public string Session_Key { get; set; }
public string Openid { get; set; }
}
}

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Common.Helper.WeChat.Response
{
public class UnlimitedQrCodeResponse:WeChatResponse
{
public string ContentType { get; set; }
public byte Buffer { get; set; }
}
}

@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Common.Helper.WeChat.Response
{
public class WeChatResponse
{
public int ErrCode { get; set; }
public string ErrMsg { get; set; }
}
}

@ -0,0 +1,81 @@
using Common.Helper.Response;
using Common.Helper.WeChat.Models;
using Common.Helper.WeChat.Response;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
namespace Common.Helper.WeChat
{
public class WeChat
{
/// <summary>
/// 小程序通过code获取openId
/// </summary>
/// <param name="appId"></param>
/// <param name="secret"></param>
/// <param name="code"></param>
/// <returns></returns>
public static string GetOpenId(string appId, string secret, string code)
{
var url = $"https://api.weixin.qq.com/sns/jscode2session?appid={appId}&secret={secret}&js_code={code}&grant_type=authorization_code";
return Request.RequestHelper.GetString(url).Result;
// var client = new HttpClient();
// var response = await client.GetAsync(uri);
// response.EnsureSuccessStatusCode();
// return await response.Content.ReadAsStringAsync();
}
/// <summary>
/// 获取token
/// </summary>
/// <param name="appId"></param>
/// <param name="secret"></param>
/// <returns></returns>
public static TokenModel GetToken(string appId, string secret)
{
var url = $"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={appId}&secret={secret}";
return Request.RequestHelper.GetEntity<TokenModel>(url).Result;
}
/// <summary>
/// 微信支付码
/// </summary>
/// <param name="httpIp"></param>
/// <param name="weChatPay"></param>
/// <returns></returns>
public static string QrCodePay(string httpIp,FormUrlEncodedContent weChatPay)
{
return Request.RequestHelper.PostFormDataEntity<ResultModel>($"{httpIp}/wx/pay/qrCodePay.do",weChatPay).Result.Data.ToString();
}
/// <summary>
/// 小程序码
/// </summary>
/// <param name="token"></param>
/// <param name="unlimitedQrCode"></param>
/// <returns></returns>
public static Stream UnlimitedQrCode(string token,UnlimitedQrCodeModel unlimitedQrCode)
{
return Request.RequestHelper
.PostFileStream<UnlimitedQrCodeModel>(
$"https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={token}", unlimitedQrCode).Result;
}
/// <summary>
/// 一次性订阅消息
/// </summary>
/// <param name="token"></param>
/// <param name="subscribeMessage"></param>
/// <returns></returns>
public static WeChatResponse SubscribeMessage(string token,SubscribeMessageModel subscribeMessage)
{
return Request.RequestHelper
.PostEntity<WeChatResponse, SubscribeMessageModel>(
$"https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token={token}", subscribeMessage).Result;
}
}
}

@ -0,0 +1,131 @@
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using Common.Helper.Response;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
namespace Common.Middleware
{
public class JwtMiddleware
{
private readonly RequestDelegate _next;
private readonly JwtSecurityTokenHandler _jwtSecurityTokenHandler = new JwtSecurityTokenHandler();
private static IConfiguration Configuration { get; set; }
public JwtMiddleware(RequestDelegate next, IConfiguration config)
{
_next = next;
Configuration = config;
}
public async Task Invoke(HttpContext context)
{
if (context == null) throw new ArgumentNullException(nameof(context));
var tokenStr = context.Request.Headers["Authorization"].ToString();
//未携带token请求不需要授权页面,让其直接通过,用方法名上面的校验来判断
if (!string.IsNullOrEmpty(tokenStr))
{
//携带了token,判断token,回传失效,过期,或者续期
var setting = new JsonSerializerSettings
{
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
};
//token 是否合规
if (!IsCanReadToken(ref tokenStr))
{
var result = new ResultModel() { Message = "invalid token", Code = Convert.ToInt32(ResponseHelper.ErrorEnum.TokenError) };
await context.Response.WriteAsync( JsonConvert.SerializeObject(result, setting), Encoding.UTF8);
return;
}
// token是否超过有效期
if (IsExp(tokenStr))
{
var result = new ResultModel() { Message = "token expired", Code = Convert.ToInt32(ResponseHelper.ErrorEnum.TokenError) };
await context.Response.WriteAsync( JsonConvert.SerializeObject(result, setting), Encoding.UTF8);
return;
}
var oldClaims = GetJwtSecurityToken(tokenStr).Claims;
var claims = new Claim[oldClaims?.Count() ?? 0];
for (var i = 0; i < (oldClaims?.Count() ?? 0); i++)
{
claims[i] = new Claim(oldClaims.ToList()[i].Type, oldClaims.ToList()[i].Value);
}
// 获取SecurityKey
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration.GetSection("Authentication")["SecurityKey"]));
var token = new JwtSecurityToken(
issuer: Configuration.GetSection("Authentication")["IsSure"], // 发布者
audience: Configuration.GetSection("Authentication")["Audience"], // 接收者
notBefore: DateTime.Now, // token签发时间
expires: DateTime.Now.AddMinutes(30), // token过期时间
claims: claims, // 该token内存储的自定义字段信息
signingCredentials: new SigningCredentials(key, SecurityAlgorithms.HmacSha256) // 用于签发token的秘钥算法
);
// 返回成功信息,写出token
var data = new JwtSecurityTokenHandler().WriteToken(token);
context.Response.Headers.Add("newToken", data);
}
await _next(context);
}
/// <summary>
/// Token是否是符合要求的标准 Json Web 令牌
/// </summary>
/// <param name="tokenStr"></param>
/// <returns></returns>
public bool IsCanReadToken(ref string tokenStr)
{
tokenStr = tokenStr.Replace("Bearer ", string.Empty);
var key = Encoding.UTF8.GetBytes(Configuration.GetSection("Authentication")["SecurityKey"]);
var tokenValidationParameters = new TokenValidationParameters
{
ValidIssuer = Configuration.GetSection("Authentication")["IsSure"],
ValidAudience = Configuration.GetSection("Authentication")["Audience"],
IssuerSigningKey = new SymmetricSecurityKey(key),
RequireExpirationTime = true,
ClockSkew = TimeSpan.Zero
};
// 验证token是否有效,如果过期,报错SecurityTokenExpiredException
// 报错信息:IDX10223 : Lifetime validation failed
try
{
var principal = _jwtSecurityTokenHandler.ValidateToken(tokenStr, tokenValidationParameters, out var securityToken);
return principal != null;
}
catch (Exception)
{
return false;
}
}
/// <summary>
/// 从Token解密出JwtSecurityToken,JwtSecurityToken : SecurityToken
/// </summary>
/// <param name="tokenStr"></param>
/// <returns></returns>
public JwtSecurityToken GetJwtSecurityToken(string tokenStr)
{
var jwt = _jwtSecurityTokenHandler.ReadJwtToken(tokenStr);
return jwt;
}
/// <summary>
/// 判断token是否过期
/// </summary>
/// <param name="token"></param>
/// <returns></returns>
public bool IsExp(string token)
{
return GetDateTime(Convert.ToDouble(GetJwtSecurityToken(token)?.Claims.First(c => c.Type == JwtRegisteredClaimNames.Exp)?.Value)) < DateTime.Now;
}
private static DateTime GetDateTime(double timeStamp)// 时间戳Timestamp转换成日期
{
var dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
dateTime = dateTime.AddSeconds(timeStamp).ToLocalTime();
return dateTime;
}
}
}

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="true"
internalLogLevel="Off" internalLogFile="log\console.log">
<targets>
<target name="console" xsi:type="ColoredConsole"
layout="${date:format=HH\:mm\:ss}> ${message}"/>
<!--VS输出窗口-->
<target name="debugger" xsi:type="Debugger"
layout="${date:format=HH\:mm\:ss} | ${level:padding=-5} | ${message}" />
<target name="info" xsi:type="File" fileName="${basedir}/Logs/Info/${shortdate}/info.txt" layout="${date:format=HH\:mm\:ss} | ${level:padding=-5} | ${message}" />
<!--保存至文件-->
<target name="error_file" xsi:type="File" maxArchiveFiles="30"
fileName="${basedir}/Logs/Error/${shortdate}/error.txt"
layout="${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="debugger" />
<logger name="*" minlevel="Info" writeTo="info" />
<logger name="*" minlevel="Error" writeTo="error_file" />
</rules>
</nlog>

File diff suppressed because it is too large Load Diff

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="true"
internalLogLevel="Off" internalLogFile="log\console.log">
<targets>
<target name="console" xsi:type="ColoredConsole"
layout="${date:format=HH\:mm\:ss}> ${message}"/>
<!--VS输出窗口-->
<target name="debugger" xsi:type="Debugger"
layout="${date:format=HH\:mm\:ss} | ${level:padding=-5} | ${message}" />
<target name="info" xsi:type="File" fileName="${basedir}/Logs/Info/${shortdate}/info.txt" layout="${date:format=HH\:mm\:ss} | ${level:padding=-5} | ${message}" />
<!--保存至文件-->
<target name="error_file" xsi:type="File" maxArchiveFiles="30"
fileName="${basedir}/Logs/Error/${shortdate}/error.txt"
layout="${longdate} | ${level:uppercase=false:padding=-5} | ${message} ${onexception:${exception:format=tostring} ${newline} ${stacktrace} ${newline}" />
</targets>
<rules>
<logger name="*" minlevel="Debug" writeTo="debugger" />
<logger name="*" minlevel="Info" writeTo="info" />
<logger name="*" minlevel="Error" writeTo="error_file" />
</rules>
</nlog>

@ -0,0 +1,126 @@
{
"format": 1,
"restore": {
"C:\\My Space\\ProjectForUnit\\ExternalDocking\\Common\\Common.csproj": {}
},
"projects": {
"C:\\My Space\\ProjectForUnit\\ExternalDocking\\Common\\Common.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "C:\\My Space\\ProjectForUnit\\ExternalDocking\\Common\\Common.csproj",
"projectName": "Common",
"projectPath": "C:\\My Space\\ProjectForUnit\\ExternalDocking\\Common\\Common.csproj",
"packagesPath": "C:\\Users\\14491\\.nuget\\packages\\",
"outputPath": "C:\\My Space\\ProjectForUnit\\ExternalDocking\\Common\\obj\\",
"projectStyle": "PackageReference",
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"C:\\Users\\14491\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"netcoreapp3.1"
],
"sources": {
"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {},
"C:\\Program Files\\dotnet\\library-packs": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"netcoreapp3.1": {
"targetAlias": "netcoreapp3.1",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
}
},
"frameworks": {
"netcoreapp3.1": {
"targetAlias": "netcoreapp3.1",
"dependencies": {
"ExcelDataReader.DataSet": {
"target": "Package",
"version": "[3.6.0, )"
},
"Microsoft.AspNetCore.Authentication.JwtBearer": {
"target": "Package",
"version": "[3.1.28, )"
},
"Microsoft.EntityFrameworkCore": {
"target": "Package",
"version": "[5.0.7, )"
},
"Microsoft.EntityFrameworkCore.SqlServer": {
"target": "Package",
"version": "[5.0.7, )"
},
"Microsoft.International.Converters.PinYinConverter": {
"target": "Package",
"version": "[1.0.0, )"
},
"NLog.Web.AspNetCore": {
"target": "Package",
"version": "[5.1.4, )"
},
"QRCoder": {
"target": "Package",
"version": "[1.4.3, )"
},
"StackExchange.Redis": {
"target": "Package",
"version": "[2.6.70, )"
},
"Swashbuckle.AspNetCore.Swagger": {
"target": "Package",
"version": "[6.4.0, )"
},
"Swashbuckle.AspNetCore.SwaggerGen": {
"target": "Package",
"version": "[6.4.0, )"
},
"Swashbuckle.AspNetCore.SwaggerUI": {
"target": "Package",
"version": "[6.4.0, )"
},
"System.Data.OleDb": {
"target": "Package",
"version": "[6.0.0, )"
},
"System.Data.SqlClient": {
"target": "Package",
"version": "[4.8.3, )"
},
"System.Text.Encoding.CodePages": {
"target": "Package",
"version": "[6.0.0, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\6.0.400\\RuntimeIdentifierGraph.json"
}
}
}
}
}

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">$(UserProfile)\.nuget\packages\</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">C:\Users\14491\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.3.0</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="C:\Users\14491\.nuget\packages\" />
<SourceRoot Include="C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages\" />
</ItemGroup>
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<PkgNewtonsoft_Json Condition=" '$(PkgNewtonsoft_Json)' == '' ">C:\Users\14491\.nuget\packages\newtonsoft.json\10.0.1</PkgNewtonsoft_Json>
</PropertyGroup>
</Project>

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" />

@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v3.1", FrameworkDisplayName = "")]

@ -0,0 +1,23 @@
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行时版本:4.0.30319.42000
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Common")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("Common")]
[assembly: System.Reflection.AssemblyTitleAttribute("Common")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// 由 MSBuild WriteCodeFragment 类生成。

@ -0,0 +1 @@
6a7f5b46ad5631c8134ea72a3bb3fafbbe28db90

@ -0,0 +1,3 @@
is_global = true
build_property.RootNamespace = Common
build_property.ProjectDir = C:\My Space\ProjectForUnit\ExternalDocking\Common\

@ -0,0 +1 @@
2176c2dc1dc9c5aa8fc6a93bb0713b8a719884f0

@ -0,0 +1,11 @@
C:\My Space\ProjectForUnit\ExternalDocking\Common\obj\Debug\netcoreapp3.1\Common.GeneratedMSBuildEditorConfig.editorconfig
C:\My Space\ProjectForUnit\ExternalDocking\Common\obj\Debug\netcoreapp3.1\Common.AssemblyInfoInputs.cache
C:\My Space\ProjectForUnit\ExternalDocking\Common\obj\Debug\netcoreapp3.1\Common.AssemblyInfo.cs
C:\My Space\ProjectForUnit\ExternalDocking\Common\obj\Debug\netcoreapp3.1\Common.csproj.CoreCompileInputs.cache
C:\My Space\ProjectForUnit\ExternalDocking\Common\bin\Debug\netcoreapp3.1\Nlog.config
C:\My Space\ProjectForUnit\ExternalDocking\Common\bin\Debug\netcoreapp3.1\Common.deps.json
C:\My Space\ProjectForUnit\ExternalDocking\Common\bin\Debug\netcoreapp3.1\Common.dll
C:\My Space\ProjectForUnit\ExternalDocking\Common\bin\Debug\netcoreapp3.1\Common.pdb
C:\My Space\ProjectForUnit\ExternalDocking\Common\obj\Debug\netcoreapp3.1\Common.dll
C:\My Space\ProjectForUnit\ExternalDocking\Common\obj\Debug\netcoreapp3.1\Common.pdb
C:\My Space\ProjectForUnit\ExternalDocking\Common\obj\Debug\netcoreapp3.1\Common.csproj.AssemblyReference.cache

@ -0,0 +1 @@
obj\Debug\netcoreapp3.1\\_IsIncrementalBuild

File diff suppressed because it is too large Load Diff

@ -0,0 +1,138 @@
{
"version": 2,
"dgSpecHash": "X8MpBEgbC24PeMn1Jvl8UMrjqlDP/+yKY8GkKD8+vcuTt/hsn1KONtaZynvOFThUnrFIQ4ej6CljDBFf8aVBEw==",
"success": true,
"projectFilePath": "C:\\My Space\\ProjectForUnit\\ExternalDocking\\Common\\Common.csproj",
"expectedPackageFiles": [
"C:\\Users\\14491\\.nuget\\packages\\exceldatareader\\3.6.0\\exceldatareader.3.6.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\exceldatareader.dataset\\3.6.0\\exceldatareader.dataset.3.6.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.aspnetcore.authentication.jwtbearer\\3.1.28\\microsoft.aspnetcore.authentication.jwtbearer.3.1.28.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.csharp\\4.5.0\\microsoft.csharp.4.5.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.data.sqlclient\\2.0.1\\microsoft.data.sqlclient.2.0.1.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.data.sqlclient.sni.runtime\\2.0.1\\microsoft.data.sqlclient.sni.runtime.2.0.1.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.entityframeworkcore\\5.0.7\\microsoft.entityframeworkcore.5.0.7.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.entityframeworkcore.abstractions\\5.0.7\\microsoft.entityframeworkcore.abstractions.5.0.7.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.entityframeworkcore.analyzers\\5.0.7\\microsoft.entityframeworkcore.analyzers.5.0.7.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.entityframeworkcore.relational\\5.0.7\\microsoft.entityframeworkcore.relational.5.0.7.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.entityframeworkcore.sqlserver\\5.0.7\\microsoft.entityframeworkcore.sqlserver.5.0.7.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.extensions.caching.abstractions\\5.0.0\\microsoft.extensions.caching.abstractions.5.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.extensions.caching.memory\\5.0.0\\microsoft.extensions.caching.memory.5.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.extensions.configuration.abstractions\\5.0.0\\microsoft.extensions.configuration.abstractions.5.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.extensions.dependencyinjection\\5.0.1\\microsoft.extensions.dependencyinjection.5.0.1.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.extensions.dependencyinjection.abstractions\\5.0.0\\microsoft.extensions.dependencyinjection.abstractions.5.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.extensions.logging\\5.0.0\\microsoft.extensions.logging.5.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.extensions.logging.abstractions\\5.0.0\\microsoft.extensions.logging.abstractions.5.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.extensions.options\\5.0.0\\microsoft.extensions.options.5.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.extensions.primitives\\5.0.0\\microsoft.extensions.primitives.5.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.identity.client\\4.14.0\\microsoft.identity.client.4.14.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.identitymodel.jsonwebtokens\\5.6.0\\microsoft.identitymodel.jsonwebtokens.5.6.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.identitymodel.logging\\5.6.0\\microsoft.identitymodel.logging.5.6.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.identitymodel.protocols\\5.6.0\\microsoft.identitymodel.protocols.5.6.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.identitymodel.protocols.openidconnect\\5.6.0\\microsoft.identitymodel.protocols.openidconnect.5.6.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.identitymodel.tokens\\5.6.0\\microsoft.identitymodel.tokens.5.6.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.international.converters.pinyinconverter\\1.0.0\\microsoft.international.converters.pinyinconverter.1.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.netcore.platforms\\1.1.1\\microsoft.netcore.platforms.1.1.1.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.netcore.targets\\1.1.3\\microsoft.netcore.targets.1.1.3.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.openapi\\1.2.3\\microsoft.openapi.1.2.3.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.win32.registry\\5.0.0\\microsoft.win32.registry.5.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\microsoft.win32.systemevents\\6.0.0\\microsoft.win32.systemevents.6.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\newtonsoft.json\\10.0.1\\newtonsoft.json.10.0.1.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\nlog\\5.0.4\\nlog.5.0.4.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\nlog.extensions.logging\\5.0.4\\nlog.extensions.logging.5.0.4.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\nlog.web.aspnetcore\\5.1.4\\nlog.web.aspnetcore.5.1.4.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\pipelines.sockets.unofficial\\2.2.2\\pipelines.sockets.unofficial.2.2.2.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\qrcoder\\1.4.3\\qrcoder.1.4.3.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\runtime.native.system\\4.3.0\\runtime.native.system.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\runtime.native.system.data.sqlclient.sni\\4.7.0\\runtime.native.system.data.sqlclient.sni.4.7.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\runtime.win-arm64.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-arm64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\runtime.win-x64.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-x64.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\runtime.win-x86.runtime.native.system.data.sqlclient.sni\\4.4.0\\runtime.win-x86.runtime.native.system.data.sqlclient.sni.4.4.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\stackexchange.redis\\2.6.70\\stackexchange.redis.2.6.70.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\swashbuckle.aspnetcore.swagger\\6.4.0\\swashbuckle.aspnetcore.swagger.6.4.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\swashbuckle.aspnetcore.swaggergen\\6.4.0\\swashbuckle.aspnetcore.swaggergen.6.4.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\swashbuckle.aspnetcore.swaggerui\\6.4.0\\swashbuckle.aspnetcore.swaggerui.6.4.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.collections\\4.3.0\\system.collections.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.collections.concurrent\\4.3.0\\system.collections.concurrent.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.collections.immutable\\5.0.0\\system.collections.immutable.5.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.collections.nongeneric\\4.3.0\\system.collections.nongeneric.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.collections.specialized\\4.3.0\\system.collections.specialized.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.componentmodel\\4.3.0\\system.componentmodel.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.componentmodel.annotations\\5.0.0\\system.componentmodel.annotations.5.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.componentmodel.primitives\\4.3.0\\system.componentmodel.primitives.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.componentmodel.typeconverter\\4.3.0\\system.componentmodel.typeconverter.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.configuration.configurationmanager\\6.0.0\\system.configuration.configurationmanager.6.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.data.oledb\\6.0.0\\system.data.oledb.6.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.data.sqlclient\\4.8.3\\system.data.sqlclient.4.8.3.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.diagnostics.debug\\4.3.0\\system.diagnostics.debug.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.diagnostics.diagnosticsource\\5.0.1\\system.diagnostics.diagnosticsource.5.0.1.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.diagnostics.performancecounter\\6.0.0\\system.diagnostics.performancecounter.6.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.diagnostics.tools\\4.3.0\\system.diagnostics.tools.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.diagnostics.tracing\\4.3.0\\system.diagnostics.tracing.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.drawing.common\\6.0.0\\system.drawing.common.6.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.dynamic.runtime\\4.3.0\\system.dynamic.runtime.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.globalization\\4.3.0\\system.globalization.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.globalization.extensions\\4.3.0\\system.globalization.extensions.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.identitymodel.tokens.jwt\\5.6.0\\system.identitymodel.tokens.jwt.5.6.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.io\\4.3.0\\system.io.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.io.filesystem\\4.3.0\\system.io.filesystem.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.io.filesystem.primitives\\4.3.0\\system.io.filesystem.primitives.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.io.pipelines\\5.0.1\\system.io.pipelines.5.0.1.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.linq\\4.3.0\\system.linq.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.linq.expressions\\4.3.0\\system.linq.expressions.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.memory\\4.5.4\\system.memory.4.5.4.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.net.nameresolution\\4.3.0\\system.net.nameresolution.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.net.primitives\\4.3.0\\system.net.primitives.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.objectmodel\\4.3.0\\system.objectmodel.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.private.datacontractserialization\\4.3.0\\system.private.datacontractserialization.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.private.uri\\4.3.2\\system.private.uri.4.3.2.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.reflection\\4.3.0\\system.reflection.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.reflection.emit\\4.3.0\\system.reflection.emit.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.reflection.emit.ilgeneration\\4.3.0\\system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.reflection.emit.lightweight\\4.3.0\\system.reflection.emit.lightweight.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.reflection.extensions\\4.3.0\\system.reflection.extensions.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.reflection.primitives\\4.3.0\\system.reflection.primitives.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.reflection.typeextensions\\4.3.0\\system.reflection.typeextensions.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.resources.resourcemanager\\4.3.0\\system.resources.resourcemanager.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.runtime\\4.3.0\\system.runtime.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.runtime.caching\\4.7.0\\system.runtime.caching.4.7.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.runtime.compilerservices.unsafe\\6.0.0\\system.runtime.compilerservices.unsafe.6.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.runtime.extensions\\4.3.0\\system.runtime.extensions.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.runtime.handles\\4.3.0\\system.runtime.handles.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.runtime.interopservices\\4.3.0\\system.runtime.interopservices.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.runtime.numerics\\4.3.0\\system.runtime.numerics.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.runtime.serialization.formatters\\4.3.0\\system.runtime.serialization.formatters.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.runtime.serialization.json\\4.3.0\\system.runtime.serialization.json.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.runtime.serialization.primitives\\4.3.0\\system.runtime.serialization.primitives.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.security.accesscontrol\\6.0.0\\system.security.accesscontrol.6.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.security.cryptography.cng\\4.5.0\\system.security.cryptography.cng.4.5.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.security.cryptography.primitives\\4.3.0\\system.security.cryptography.primitives.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.security.cryptography.protecteddata\\6.0.0\\system.security.cryptography.protecteddata.6.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.security.permissions\\6.0.0\\system.security.permissions.6.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.security.principal.windows\\5.0.0\\system.security.principal.windows.5.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.security.securestring\\4.3.0\\system.security.securestring.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.text.encoding\\4.3.0\\system.text.encoding.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.text.encoding.codepages\\6.0.0\\system.text.encoding.codepages.6.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.text.encoding.extensions\\4.3.0\\system.text.encoding.extensions.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.text.regularexpressions\\4.3.0\\system.text.regularexpressions.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.threading\\4.3.0\\system.threading.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.threading.tasks\\4.3.0\\system.threading.tasks.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.threading.tasks.extensions\\4.3.0\\system.threading.tasks.extensions.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.windows.extensions\\6.0.0\\system.windows.extensions.6.0.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.xml.readerwriter\\4.3.0\\system.xml.readerwriter.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.xml.xdocument\\4.3.0\\system.xml.xdocument.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.xml.xmldocument\\4.3.0\\system.xml.xmldocument.4.3.0.nupkg.sha512",
"C:\\Users\\14491\\.nuget\\packages\\system.xml.xmlserializer\\4.3.0\\system.xml.xmlserializer.4.3.0.nupkg.sha512"
],
"logs": [
{
"code": "NU1701",
"level": "Warning",
"warningLevel": 1,
"message": "已使用“.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v4.8, .NETFramework,Version=v4.8.1”而不是项目目标框架“.NETCoreApp,Version=v3.1”还原包“Microsoft.International.Converters.PinYinConverter 1.0.0”。此包可能与项目不完全兼容。",
"libraryId": "Microsoft.International.Converters.PinYinConverter",
"targetGraphs": [
".NETCoreApp,Version=v3.1"
]
}
]
}
Loading…
Cancel
Save