Browse Source

增加程序鉴权以及激活接口

增加激活码生成程序
程序功能调整
master
王晓寒 5 months ago
parent
commit
fe59f0b1d2
55 changed files with 2349 additions and 212 deletions
  1. +7
    -0
      SafeCampus.API/SafeAuthActivate/App.config
  2. +84
    -0
      SafeCampus.API/SafeAuthActivate/CryptogramUtil.cs
  3. +47
    -0
      SafeCampus.API/SafeAuthActivate/Program.cs
  4. +15
    -0
      SafeCampus.API/SafeAuthActivate/SafeAuthActivate.csproj
  5. +362
    -0
      SafeCampus.API/SafeAuthActivate/SafeAuthActivate.xml
  6. +398
    -0
      SafeCampus.API/SafeAuthActivate/Sm/SM2CryptoUtil.cs
  7. +40
    -0
      SafeCampus.API/SafeAuthActivate/Sm/SM2Util.cs
  8. +415
    -0
      SafeCampus.API/SafeAuthActivate/Sm/SM4CryptoUtil.cs
  9. +164
    -0
      SafeCampus.API/SafeAuthActivate/Sm/SM4Util.cs
  10. +1
    -1
      SafeCampus.API/SafeCampus.Application/Manager/DeepelephManager/DeepelephManager.cs
  11. +20
    -0
      SafeCampus.API/SafeCampus.Application/Manager/Machine/IMachineUtil.cs
  12. +58
    -0
      SafeCampus.API/SafeCampus.Application/Manager/Machine/MachineUtil.cs
  13. +4
    -4
      SafeCampus.API/SafeCampus.Application/Manager/SMS/TxySmsUtil.cs
  14. +36
    -0
      SafeCampus.API/SafeCampus.Application/SafeCampus.Application.xml
  15. +20
    -15
      SafeCampus.API/SafeCampus.Application/Services/Business/CameraInfoService/CameraInfoService.cs
  16. +70
    -30
      SafeCampus.API/SafeCampus.Application/Services/Business/Warn/Service/WarnInfoService.cs
  17. +2
    -2
      SafeCampus.API/SafeCampus.Core/Core.Development.json
  18. +2
    -2
      SafeCampus.API/SafeCampus.Core/Core.Production.json
  19. +8
    -2
      SafeCampus.API/SafeCampus.Core/Dto/WarnGroupInfo.cs
  20. +1
    -11
      SafeCampus.API/SafeCampus.Core/Options/AppInfoOptions.cs
  21. +0
    -4
      SafeCampus.API/SafeCampus.Core/SafeCampus.Core.csproj
  22. +5
    -0
      SafeCampus.API/SafeCampus.Core/SafeCampus.Core.xml
  23. +25
    -23
      SafeCampus.API/SafeCampus.Core/Utils/Cryptogram/CryptogramUtil.cs
  24. +16
    -0
      SafeCampus.API/SafeCampus.System/Const/BizConfigConst.cs
  25. +20
    -0
      SafeCampus.API/SafeCampus.System/SafeCampus.System.xml
  26. +119
    -49
      SafeCampus.API/SafeCampus.System/SeedData/Json/WarnGroup.json
  27. +4
    -12
      SafeCampus.API/SafeCampus.System/Services/Limit/Role/SysRoleService.cs
  28. +1
    -1
      SafeCampus.API/SafeCampus.System/Services/System/Resource/ResourceService.cs
  29. +1
    -11
      SafeCampus.API/SafeCampus.System/Startup.cs
  30. +5
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/BuildingController.cs
  31. +5
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/CameraGroupController.cs
  32. +9
    -2
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/CameraInfoController.cs
  33. +5
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/ClassTeacherController.cs
  34. +6
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/DepartmentController.cs
  35. +10
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/DormitoryController.cs
  36. +4
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/Dto/ConfigJsonInput.cs
  37. +8
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/KeyPersonnelController.cs
  38. +6
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/MajorController.cs
  39. +1
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/MobileController.cs
  40. +97
    -7
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/WarnInfoController.cs
  41. +15
    -6
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/LargeScreen/LargeScreenController.cs
  42. +1
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Violation/VioAnalysisController.cs
  43. +9
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Violation/VioPortraitSummary.cs
  44. +66
    -0
      SafeCampus.API/SafeCampus.Web.Core/Controllers/System/Auth/ActivateAuthController.cs
  45. +1
    -11
      SafeCampus.API/SafeCampus.Web.Core/Controllers/System/Auth/SessionController.cs
  46. +1
    -11
      SafeCampus.API/SafeCampus.Web.Core/Controllers/System/Organization/UserController.cs
  47. +62
    -0
      SafeCampus.API/SafeCampus.Web.Core/Filter/SystemAuthorizeMiddleware.cs
  48. +1
    -0
      SafeCampus.API/SafeCampus.Web.Core/Handlers/JwtHandler.cs
  49. +24
    -0
      SafeCampus.API/SafeCampus.Web.Core/Job/CameraSyncJob.cs
  50. +40
    -1
      SafeCampus.API/SafeCampus.Web.Core/SafeCampus.Web.Core.xml
  51. +17
    -3
      SafeCampus.API/SafeCampus.Web.Core/Startup.cs
  52. +1
    -1
      SafeCampus.API/SafeCampus.Web.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user
  53. +1
    -0
      SafeCampus.API/SafeCampus.Web.Entry/activation.config
  54. +3
    -3
      SafeCampus.API/SafeCampus.Web.Entry/appsettings.json
  55. +6
    -0
      SafeCampus.API/SafeCampus.sln

+ 7
- 0
SafeCampus.API/SafeAuthActivate/App.config View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="SM2PublicKey" value="048A407FD953AD0318AAE08709EC6DF161BBB2A0A268DE20AFAC3C17131B046EEE6F1070F6DDC68066651F6BF6F2DC27ADFE11E78FDB4A042576F101E1BB999B0B"/>
<add key="SM2PrivateKey" value="76DDFE59DFA9FF27CA73EF1BC9BF02C473FE1FA7D181083BE828BF93E02CE9BC"/>
</appSettings>
</configuration>

+ 84
- 0
SafeCampus.API/SafeAuthActivate/CryptogramUtil.cs View File

@@ -0,0 +1,84 @@
using SafeAuthActivate.Sm;

namespace SafeAuthActivate;

/// <summary>
/// 加解密功能
/// </summary>
public class CryptogramUtil
{
#region SM2

/// <summary>
/// SM2解密
/// </summary>
/// <param name="str">密文</param>
/// <returns>明文</returns>
public static string Sm2Decrypt(string str)
{
// 解密
if (!string.IsNullOrWhiteSpace(str))
return SafeAuthActivate.Sm.SM2Util.Decrypt(str);
try
{
// // 解密
// if (!string.IsNullOrWhiteSpace(str))
// return SM2Util.Decrypt(str);
}
catch
{
return "";
}
return "";
}

/// <summary>
/// SM2加密
/// </summary>
/// <param name="str">明文</param>
/// <returns>密文</returns>
public static string Sm2Encrypt(string str)
{
try
{
// 加密
if (!string.IsNullOrWhiteSpace(str))
return SafeAuthActivate.Sm.SM2Util.Encrypt(str);
}
catch
{
return "";
}
return "";
}

#endregion SM2

#region Sm4

/// <summary>
/// SM4解密
/// </summary>
/// <param name="str">密文</param>
/// <returns>明文</returns>
public static string Sm4Decrypt(string str)
{
if (!string.IsNullOrWhiteSpace(str))// 解密
return SM4Util.Decrypt(new SM4Util { Data = str });
return "";
}

/// <summary>
/// SM4加密
/// </summary>
/// <param name="str">明文</param>
/// <returns>密文</returns>
public static string Sm4Encrypt(string str)
{
if (!string.IsNullOrWhiteSpace(str))// 加密
return SM4Util.Encrypt(new SM4Util { Data = str });
return "";
}

#endregion Sm4
}

+ 47
- 0
SafeCampus.API/SafeAuthActivate/Program.cs View File

@@ -0,0 +1,47 @@
using SafeAuthActivate.Sm;

namespace SafeAuthActivate
{
internal class Program
{
static void Main(string[] args)
{
var a = SM2CryptoUtil.GetKey();
Console.WriteLine("g:"+a.PublicKey);
Console.WriteLine("s:"+a.PrivateKey);
while (true)
{
try
{
var timeYZ = true;
var time = "";
Console.Write("请输入机器码:");
var machineCode = Console.ReadLine();
var hardwareId = CryptogramUtil.Sm4Decrypt(machineCode);
while (timeYZ)
{
Console.Write("请输入授权到期时间(例:2024-01-01):");
time = Console.ReadLine();
timeYZ = !DateTime.TryParse(time, out var activeTime);
if (timeYZ)
{
Console.WriteLine("时间输入错误格式为【yyyy-MM-dd】(例:2024-01-01)");
}
}

var code = CryptogramUtil.Sm2Encrypt(hardwareId + "$" + time);
Console.WriteLine("===============激活码生成成功请注意保存!=====================");
Console.WriteLine(code);
Console.WriteLine("==============================================================");
Console.Write("按任意键退出!");
Console.ReadLine();
Environment.Exit(0);
}
catch (Exception)
{
Console.WriteLine("机器码效验错误,请检查机器码正确性!");
}
}
}
}
}

+ 15
- 0
SafeCampus.API/SafeAuthActivate/SafeAuthActivate.csproj View File

@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Portable.BouncyCastle" Version="1.9.0" />
<PackageReference Include="System.Configuration.ConfigurationManager" Version="8.0.0" />
</ItemGroup>

</Project>

+ 362
- 0
SafeCampus.API/SafeAuthActivate/SafeAuthActivate.xml View File

@@ -0,0 +1,362 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>SafeAuthActivate</name>
</assembly>
<members>
<member name="T:SafeAuthActivate.CryptogramUtil">
<summary>
加解密功能
</summary>
</member>
<member name="M:SafeAuthActivate.CryptogramUtil.Sm2Decrypt(System.String)">
<summary>
SM2解密
</summary>
<param name="str">密文</param>
<returns>明文</returns>
</member>
<member name="M:SafeAuthActivate.CryptogramUtil.Sm2Encrypt(System.String)">
<summary>
SM2加密
</summary>
<param name="str">明文</param>
<returns>密文</returns>
</member>
<member name="M:SafeAuthActivate.CryptogramUtil.Sm4Decrypt(System.String)">
<summary>
SM4解密
</summary>
<param name="str">密文</param>
<returns>明文</returns>
</member>
<member name="M:SafeAuthActivate.CryptogramUtil.Sm4Encrypt(System.String)">
<summary>
SM4加密
</summary>
<param name="str">明文</param>
<returns>密文</returns>
</member>
<member name="T:SafeAuthActivate.Sm.SM2CryptoUtil">
<summary>
SM2工具类
</summary>
</member>
<member name="M:SafeAuthActivate.Sm.SM2CryptoUtil.GetKey">
<summary>
获取公钥私钥
</summary>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM2CryptoUtil.Encrypt(System.String,System.String)">
<summary>
加密
</summary>
<param name="publickey">公钥</param>
<param name="sourceData">需要加密的值</param>
<returns>加密结果</returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM2CryptoUtil.Encrypt(System.Byte[],System.Byte[])">
<summary>
加密
</summary>
<param name="publicKey">公钥</param>
<param name="data">需要加密的值</param>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM2CryptoUtil.Decrypt(System.String,System.String)">
<summary>
</summary>
<param name="privateKey"></param>
<param name="encryptedData"></param>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM2CryptoUtil.Decrypt(System.Byte[],System.Byte[])">
<summary>
解密
</summary>
<param name="privateKey"></param>
<param name="encryptedData"></param>
<returns></returns>
</member>
<member name="P:SafeAuthActivate.Sm.SM2CryptoUtil.SM2Model.PublicKey">
<summary>
公钥
</summary>
</member>
<member name="P:SafeAuthActivate.Sm.SM2CryptoUtil.SM2Model.PrivateKey">
<summary>
私钥
</summary>
</member>
<member name="T:SafeAuthActivate.Sm.SM2Util">
<summary>
SM2加密解密
</summary>
</member>
<member name="F:SafeAuthActivate.Sm.SM2Util.PublicKey">
<summary>
公钥
</summary>
</member>
<member name="F:SafeAuthActivate.Sm.SM2Util.PrivateKey">
<summary>
私钥
</summary>
</member>
<member name="M:SafeAuthActivate.Sm.SM2Util.Encrypt(System.String)">
<summary>
公钥加密明文
</summary>
<param name="plainText">明文</param>
<returns>密文</returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM2Util.Decrypt(System.String)">
<summary>
私钥解密密文
</summary>
<param name="cipherText">密文</param>
<returns>明文</returns>
</member>
<member name="T:SafeAuthActivate.Sm.SM4CryptoUtil">
<summary>
SM4工具类
</summary>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.GetULongByBe(System.Byte[],System.Int32)">
<summary>
加密 非线性τ函数B=τ(A)
</summary>
<param name="b"></param>
<param name="i"></param>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.PutULongToBe(System.Int64,System.Byte[],System.Int32)">
<summary>
解密 非线性τ函数B=τ(A)
</summary>
<param name="n"></param>
<param name="b"></param>
<param name="i"></param>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.Rotl(System.Int64,System.Int32)">
<summary>
循环移位,为32位的x循环左移n位
</summary>
<param name="x"></param>
<param name="n"></param>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.Swap(System.Int64[],System.Int32)">
<summary>
将密钥逆序
</summary>
<param name="sk"></param>
<param name="i"></param>
</member>
<member name="F:SafeAuthActivate.Sm.SM4CryptoUtil.SboxTable">
<summary>
S盒
</summary>
</member>
<member name="F:SafeAuthActivate.Sm.SM4CryptoUtil.FK">
<summary>
系统参数FK
</summary>
</member>
<member name="F:SafeAuthActivate.Sm.SM4CryptoUtil.CK">
<summary>
固定参数CK
</summary>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.Sm4Sbox(System.Byte)">
<summary>
Sm4的S盒取值
</summary>
<param name="inch"></param>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.Sm4Lt(System.Int64)">
<summary>
线性变换 L
</summary>
<param name="ka"></param>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.Sm4F(System.Int64,System.Int64,System.Int64,System.Int64,System.Int64)">
<summary>
轮函数 F
</summary>
<param name="x0"></param>
<param name="x1"></param>
<param name="x2"></param>
<param name="x3"></param>
<param name="rk"></param>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.Sm4CalciRk(System.Int64)">
<summary>
轮密钥rk
</summary>
<param name="ka"></param>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.SetKey(System.Int64[],System.Byte[])">
<summary>
加密密钥
</summary>
<param name="SK"></param>
<param name="key"></param>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.Sm4OneRound(System.Int64[],System.Byte[],System.Byte[])">
<summary>
解密函数
</summary>
<param name="sk">轮密钥</param>
<param name="input">输入分组的密文</param>
<param name="output">输出的对应的分组明文</param>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.Padding(System.Byte[],System.Int32)">
<summary>
补足 16 进制字符串的 0 字符,返回不带 0x 的16进制字符串
</summary>
<param name="input"></param>
<param name="mode">1表示加密,0表示解密</param>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.SetKeyEnc(SafeAuthActivate.Sm.Sm4Context,System.Byte[])">
<summary>
设置加密的key
</summary>
<param name="ctx"></param>
<param name="key"></param>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.Sm4SetKeyDec(SafeAuthActivate.Sm.Sm4Context,System.Byte[])">
<summary>
设置解密的key
</summary>
<param name="ctx"></param>
<param name="key"></param>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.Sm4CryptEcb(SafeAuthActivate.Sm.Sm4Context,System.Byte[])">
<summary>
ECB
</summary>
<param name="ctx"></param>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM4CryptoUtil.Sm4CryptCbc(SafeAuthActivate.Sm.Sm4Context,System.Byte[],System.Byte[])">
<summary>
CBC
</summary>
<param name="ctx"></param>
<param name="iv"></param>
<param name="input"></param>
<returns></returns>
</member>
<member name="T:SafeAuthActivate.Sm.Sm4Context">
<summary>
SM4处理中心
</summary>
</member>
<member name="F:SafeAuthActivate.Sm.Sm4Context.Mode">
<summary>
1表示加密,0表示解密
</summary>
</member>
<member name="F:SafeAuthActivate.Sm.Sm4Context.Key">
<summary>
密钥
</summary>
</member>
<member name="F:SafeAuthActivate.Sm.Sm4Context.IsPadding">
<summary>
是否补足16进制字符串
</summary>
</member>
<member name="T:SafeAuthActivate.Sm.SM4Util">
<summary>
Sm4算法
对标国际DES算法
</summary>
</member>
<member name="P:SafeAuthActivate.Sm.SM4Util.Data">
<summary>
数据
</summary>
</member>
<member name="P:SafeAuthActivate.Sm.SM4Util.Key">
<summary>
秘钥
</summary>
</member>
<member name="P:SafeAuthActivate.Sm.SM4Util.Iv">
<summary>
向量
</summary>
</member>
<member name="P:SafeAuthActivate.Sm.SM4Util.HexString">
<summary>
明文是否是十六进制
</summary>
</member>
<member name="P:SafeAuthActivate.Sm.SM4Util.CryptoMode">
<summary>
加密模式(默认ECB)
统一改为ECB模式
</summary>
</member>
<member name="M:SafeAuthActivate.Sm.SM4Util.EncryptECB(SafeAuthActivate.Sm.SM4Util)">
<summary>
ECB加密
</summary>
<param name="entity"></param>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM4Util.EncryptCBC(SafeAuthActivate.Sm.SM4Util)">
<summary>
CBC加密
</summary>
<param name="entity"></param>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM4Util.Decrypt(SafeAuthActivate.Sm.SM4Util)">
<summary>
解密
</summary>
<param name="entity"></param>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM4Util.DecryptECB(SafeAuthActivate.Sm.SM4Util)">
<summary>
ECB解密
</summary>
<param name="entity"></param>
<returns></returns>
</member>
<member name="M:SafeAuthActivate.Sm.SM4Util.DecryptCBC(SafeAuthActivate.Sm.SM4Util)">
<summary>
CBC解密
</summary>
<param name="entity"></param>
<returns></returns>
</member>
<member name="T:SafeAuthActivate.Sm.SM4Util.Sm4CryptoEnum">
<summary>
加密类型
</summary>
</member>
<member name="F:SafeAuthActivate.Sm.SM4Util.Sm4CryptoEnum.ECB">
<summary>
ECB(电码本模式)
</summary>
</member>
<member name="F:SafeAuthActivate.Sm.SM4Util.Sm4CryptoEnum.CBC">
<summary>
CBC(密码分组链接模式)
</summary>
</member>
</members>
</doc>

+ 398
- 0
SafeCampus.API/SafeAuthActivate/Sm/SM2CryptoUtil.cs View File

@@ -0,0 +1,398 @@
using System.Text;
using Org.BouncyCastle.Crypto.Digests;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Math.EC;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Utilities.Encoders;

namespace SafeAuthActivate.Sm;

/// <summary>
/// SM2工具类
/// </summary>
public class SM2CryptoUtil
{
#region 获取公钥私钥

/// <summary>
/// 获取公钥私钥
/// </summary>
/// <returns></returns>
public static SM2Model GetKey()
{
var sm2 = SM2.Instance;
var key = sm2.ecc_key_pair_generator.GenerateKeyPair();
var ecpriv = (ECPrivateKeyParameters)key.Private;
var ecpub = (ECPublicKeyParameters)key.Public;
var privateKey = ecpriv.D;
var publicKey = ecpub.Q;
var sM2Model = new SM2Model();
sM2Model.PrivateKey = Encoding.UTF8.GetString(Hex.Encode(privateKey.ToByteArray())).ToUpper();
sM2Model.PublicKey = Encoding.UTF8.GetString(Hex.Encode(publicKey.GetEncoded())).ToUpper();
return sM2Model;
}

#endregion 获取公钥私钥

#region 加密

/// <summary>
/// 加密
/// </summary>
/// <param name="publickey">公钥</param>
/// <param name="sourceData">需要加密的值</param>
/// <returns>加密结果</returns>
public static string Encrypt(string publickey, string sourceData)
{
var data = Encrypt(Hex.Decode(publickey), Encoding.UTF8.GetBytes(sourceData));
return data;
}

/// <summary>
/// 加密
/// </summary>
/// <param name="publicKey">公钥</param>
/// <param name="data">需要加密的值</param>
/// <returns></returns>
public static string Encrypt(byte[] publicKey, byte[] data)
{
if (null == publicKey || publicKey.Length == 0)
{
return null;
}
if (data == null || data.Length == 0)
{
return null;
}

var source = new byte[data.Length];
Array.Copy(data, 0, source, 0,
data.Length);

var cipher = new Cipher();
var sm2 = SM2.Instance;

var userKey = sm2.ecc_curve.DecodePoint(publicKey);

var c1 = cipher.Init_enc(sm2, userKey);
cipher.Encrypt(source);

var c3 = new byte[32];
cipher.Dofinal(c3);

var sc1 = Encoding.UTF8.GetString(Hex.Encode(c1.GetEncoded()));
var sc2 = Encoding.UTF8.GetString(Hex.Encode(source));
var sc3 = Encoding.UTF8.GetString(Hex.Encode(c3));

return (sc1 + sc2 + sc3).ToUpper();
}

#endregion 加密

#region 解密

/// <summary>
///
/// </summary>
/// <param name="privateKey"></param>
/// <param name="encryptedData"></param>
/// <returns></returns>
public static string Decrypt(string privateKey, string encryptedData)
{
var data = Encoding.UTF8.GetString(Decrypt(Hex.Decode(privateKey), Hex.Decode(encryptedData)));
return data;
}

/// <summary>
/// 解密
/// </summary>
/// <param name="privateKey"></param>
/// <param name="encryptedData"></param>
/// <returns></returns>
public static byte[] Decrypt(byte[] privateKey, byte[] encryptedData)
{
if (null == privateKey || privateKey.Length == 0)
{
return null;
}
if (encryptedData == null || encryptedData.Length == 0)
{
return null;
}

var data = Encoding.UTF8.GetString(Hex.Encode(encryptedData));

var c1Bytes = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(0, 130)));
var c2Len = encryptedData.Length - 97;
var c2 = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(130, 2 * c2Len)));
var c3 = Hex.Decode(Encoding.UTF8.GetBytes(data.Substring(130 + 2 * c2Len, 64)));

var sm2 = SM2.Instance;
var userD = new BigInteger(1, privateKey);

//ECPoint c1 = sm2.ecc_curve.DecodePoint(c1Bytes);

var c1 = sm2.ecc_curve.DecodePoint(c1Bytes);
var cipher = new Cipher();
cipher.Init_dec(userD, c1);
cipher.Decrypt(c2);
cipher.Dofinal(c3);

return c2;
}

#endregion 解密

private class Cipher
{
private int ct;
private ECPoint p2;
private SM3Digest sm3keybase;
private SM3Digest sm3c3;
private byte[] key;
private byte keyOff;

public Cipher()
{
ct = 1;
key = new byte[32];
keyOff = 0;
}

public static byte[] byteConvert32Bytes(BigInteger n)
{
byte[] tmpd;
if (n == null)
{
return null;
}

if (n.ToByteArray().Length == 33)
{
tmpd = new byte[32];
Array.Copy(n.ToByteArray(), 1, tmpd, 0,
32);
}
else if (n.ToByteArray().Length == 32)
{
tmpd = n.ToByteArray();
}
else
{
tmpd = new byte[32];
for (var i = 0; i < 32 - n.ToByteArray().Length; i++)
{
tmpd[i] = 0;
}
Array.Copy(n.ToByteArray(), 0, tmpd, 32 - n.ToByteArray().Length,
n.ToByteArray().Length);
}
return tmpd;
}

private void Reset()
{
sm3keybase = new SM3Digest();
sm3c3 = new SM3Digest();

var p = byteConvert32Bytes(p2.Normalize().XCoord.ToBigInteger());
sm3keybase.BlockUpdate(p, 0, p.Length);
sm3c3.BlockUpdate(p, 0, p.Length);

p = byteConvert32Bytes(p2.Normalize().YCoord.ToBigInteger());
sm3keybase.BlockUpdate(p, 0, p.Length);
ct = 1;
NextKey();
}

private void NextKey()
{
var sm3keycur = new SM3Digest(sm3keybase);
sm3keycur.Update((byte)(ct >> 24 & 0xff));
sm3keycur.Update((byte)(ct >> 16 & 0xff));
sm3keycur.Update((byte)(ct >> 8 & 0xff));
sm3keycur.Update((byte)(ct & 0xff));
sm3keycur.DoFinal(key, 0);
keyOff = 0;
ct++;
}

public ECPoint Init_enc(SM2 sm2, ECPoint userKey)
{
var key = sm2.ecc_key_pair_generator.GenerateKeyPair();
var ecpriv = (ECPrivateKeyParameters)key.Private;
var ecpub = (ECPublicKeyParameters)key.Public;
var k = ecpriv.D;
var c1 = ecpub.Q;
p2 = userKey.Multiply(k);
Reset();
return c1;
}

public void Encrypt(byte[] data)
{
sm3c3.BlockUpdate(data, 0, data.Length);
for (var i = 0; i < data.Length; i++)
{
if (keyOff == key.Length)
{
NextKey();
}
data[i] ^= key[keyOff++];
}
}

public void Init_dec(BigInteger userD, ECPoint c1)
{
p2 = c1.Multiply(userD);
Reset();
}

public void Decrypt(byte[] data)
{
for (var i = 0; i < data.Length; i++)
{
if (keyOff == key.Length)
{
NextKey();
}
data[i] ^= key[keyOff++];
}

sm3c3.BlockUpdate(data, 0, data.Length);
}

public void Dofinal(byte[] c3)
{
var p = byteConvert32Bytes(p2.Normalize().YCoord.ToBigInteger());
sm3c3.BlockUpdate(p, 0, p.Length);
sm3c3.DoFinal(c3, 0);
Reset();
}
}

private class SM2
{
public static SM2 Instance
{
get
{
return new SM2();
}
}

public static SM2 InstanceTest
{
get
{
return new SM2();
}
}

public static readonly string[] sm2_param =
{
"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF",// p,0
"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC",// a,1
"28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93",// b,2
"FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123",// n,3
"32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7",// gx,4
"BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0"// gy,5
};

public string[] ecc_param = sm2_param;

public readonly BigInteger ecc_p;
public readonly BigInteger ecc_a;
public readonly BigInteger ecc_b;
public readonly BigInteger ecc_n;
public readonly BigInteger ecc_gx;
public readonly BigInteger ecc_gy;

public readonly ECCurve ecc_curve;
public readonly ECPoint ecc_point_g;

public readonly ECDomainParameters ecc_bc_spec;

public readonly ECKeyPairGenerator ecc_key_pair_generator;

private SM2()
{
ecc_param = sm2_param;

ECFieldElement ecc_gx_fieldelement;
ECFieldElement ecc_gy_fieldelement;

ecc_p = new BigInteger(ecc_param[0], 16);
ecc_a = new BigInteger(ecc_param[1], 16);
ecc_b = new BigInteger(ecc_param[2], 16);
ecc_n = new BigInteger(ecc_param[3], 16);
ecc_gx = new BigInteger(ecc_param[4], 16);
ecc_gy = new BigInteger(ecc_param[5], 16);

ecc_gx_fieldelement = new FpFieldElement(ecc_p, ecc_gx);
ecc_gy_fieldelement = new FpFieldElement(ecc_p, ecc_gy);

ecc_curve = new FpCurve(ecc_p, ecc_a, ecc_b);
ecc_point_g = new FpPoint(ecc_curve, ecc_gx_fieldelement, ecc_gy_fieldelement);

ecc_bc_spec = new ECDomainParameters(ecc_curve, ecc_point_g, ecc_n);

ECKeyGenerationParameters ecc_ecgenparam;
ecc_ecgenparam = new ECKeyGenerationParameters(ecc_bc_spec, new SecureRandom());

ecc_key_pair_generator = new ECKeyPairGenerator();
ecc_key_pair_generator.Init(ecc_ecgenparam);
}

public virtual byte[] Sm2GetZ(byte[] userId, ECPoint userKey)
{
var sm3 = new SM3Digest();
byte[] p;
// userId length
var len = userId.Length * 8;
sm3.Update((byte)(len >> 8 & 0x00ff));
sm3.Update((byte)(len & 0x00ff));

// userId
sm3.BlockUpdate(userId, 0, userId.Length);

// a,b
p = ecc_a.ToByteArray();
sm3.BlockUpdate(p, 0, p.Length);
p = ecc_b.ToByteArray();
sm3.BlockUpdate(p, 0, p.Length);
// gx,gy
p = ecc_gx.ToByteArray();
sm3.BlockUpdate(p, 0, p.Length);
p = ecc_gy.ToByteArray();
sm3.BlockUpdate(p, 0, p.Length);

// x,y
p = userKey.AffineXCoord.ToBigInteger().ToByteArray();
sm3.BlockUpdate(p, 0, p.Length);
p = userKey.AffineYCoord.ToBigInteger().ToByteArray();
sm3.BlockUpdate(p, 0, p.Length);

// Z
var md = new byte[sm3.GetDigestSize()];
sm3.DoFinal(md, 0);

return md;
}
}

public class SM2Model
{
/// <summary>
/// 公钥
/// </summary>
public string PublicKey { get; set; }

/// <summary>
/// 私钥
/// </summary>
public string PrivateKey { get; set; }
}
}

+ 40
- 0
SafeCampus.API/SafeAuthActivate/Sm/SM2Util.cs View File

@@ -0,0 +1,40 @@
using System.Configuration;

namespace SafeAuthActivate.Sm;

/// <summary>
/// SM2加密解密
/// </summary>
public class SM2Util
{
/// <summary>
/// 公钥
/// </summary>
public static string PublicKey = ConfigurationManager.AppSettings["SM2PublicKey"];

/// <summary>
/// 私钥
/// </summary>
public static string PrivateKey = ConfigurationManager.AppSettings["SM2PrivateKey"];

/// <summary>
/// 公钥加密明文
/// </summary>
/// <param name="plainText">明文</param>
/// <returns>密文</returns>
public static string Encrypt(string plainText)
{
return SafeAuthActivate.Sm.SM2CryptoUtil.Encrypt(PublicKey, plainText);
}

/// <summary>
/// 私钥解密密文
/// </summary>
/// <param name="cipherText">密文</param>
/// <returns>明文</returns>
public static string Decrypt(string cipherText)
{
if (!cipherText.StartsWith("04")) cipherText = "04" + cipherText;//如果不是04开头加上04
return SafeAuthActivate.Sm.SM2CryptoUtil.Decrypt(PrivateKey, cipherText);
}
}

+ 415
- 0
SafeCampus.API/SafeAuthActivate/Sm/SM4CryptoUtil.cs View File

@@ -0,0 +1,415 @@
namespace SafeAuthActivate.Sm;

/// <summary>
/// SM4工具类
/// </summary>
public class SM4CryptoUtil
{
/// <summary>
/// 加密 非线性τ函数B=τ(A)
/// </summary>
/// <param name="b"></param>
/// <param name="i"></param>
/// <returns></returns>
private static long GetULongByBe(byte[] b, int i)
{
var n = (long)(b[i] & 0xff) << 24 | (uint)((b[i + 1] & 0xff) << 16) | (uint)((b[i + 2] & 0xff) << 8) | b[i + 3] & 0xff & 0xffffffffL;
return n;
}

/// <summary>
/// 解密 非线性τ函数B=τ(A)
/// </summary>
/// <param name="n"></param>
/// <param name="b"></param>
/// <param name="i"></param>
private static void PutULongToBe(long n, byte[] b, int i)
{
b[i] = (byte)(int)(0xFF & n >> 24);
b[i + 1] = (byte)(int)(0xFF & n >> 16);
b[i + 2] = (byte)(int)(0xFF & n >> 8);
b[i + 3] = (byte)(int)(0xFF & n);
}

/// <summary>
/// 循环移位,为32位的x循环左移n位
/// </summary>
/// <param name="x"></param>
/// <param name="n"></param>
/// <returns></returns>
private static long Rotl(long x, int n)
{
return (x & 0xFFFFFFFF) << n | x >> 32 - n;
}

/// <summary>
/// 将密钥逆序
/// </summary>
/// <param name="sk"></param>
/// <param name="i"></param>
private static void Swap(long[] sk, int i)
{
var t = sk[i];
sk[i] = sk[31 - i];
sk[31 - i] = t;
}

/// <summary>
/// S盒
/// </summary>
public byte[] SboxTable = new byte[]
{
// 0 1 2 3 4 5 6 7 8 9 a b c d e f
0xd6, 0x90, 0xe9, 0xfe, 0xcc, 0xe1, 0x3d, 0xb7, 0x16, 0xb6, 0x14, 0xc2, 0x28, 0xfb, 0x2c, 0x05,
0x2b, 0x67, 0x9a, 0x76, 0x2a, 0xbe, 0x04, 0xc3, 0xaa, 0x44, 0x13, 0x26, 0x49, 0x86, 0x06, 0x99,
0x9c, 0x42, 0x50, 0xf4, 0x91, 0xef, 0x98, 0x7a, 0x33, 0x54, 0x0b, 0x43, 0xed, 0xcf, 0xac, 0x62,
0xe4, 0xb3, 0x1c, 0xa9, 0xc9, 0x08, 0xe8, 0x95, 0x80, 0xdf, 0x94, 0xfa, 0x75, 0x8f, 0x3f, 0xa6,
0x47, 0x07, 0xa7, 0xfc, 0xf3, 0x73, 0x17, 0xba, 0x83, 0x59, 0x3c, 0x19, 0xe6, 0x85, 0x4f, 0xa8,
0x68, 0x6b, 0x81, 0xb2, 0x71, 0x64, 0xda, 0x8b, 0xf8, 0xeb, 0x0f, 0x4b, 0x70, 0x56, 0x9d, 0x35,
0x1e, 0x24, 0x0e, 0x5e, 0x63, 0x58, 0xd1, 0xa2, 0x25, 0x22, 0x7c, 0x3b, 0x01, 0x21, 0x78, 0x87,
0xd4, 0x00, 0x46, 0x57, 0x9f, 0xd3, 0x27, 0x52, 0x4c, 0x36, 0x02, 0xe7, 0xa0, 0xc4, 0xc8, 0x9e,
0xea, 0xbf, 0x8a, 0xd2, 0x40, 0xc7, 0x38, 0xb5, 0xa3, 0xf7, 0xf2, 0xce, 0xf9, 0x61, 0x15, 0xa1,
0xe0, 0xae, 0x5d, 0xa4, 0x9b, 0x34, 0x1a, 0x55, 0xad, 0x93, 0x32, 0x30, 0xf5, 0x8c, 0xb1, 0xe3,
0x1d, 0xf6, 0xe2, 0x2e, 0x82, 0x66, 0xca, 0x60, 0xc0, 0x29, 0x23, 0xab, 0x0d, 0x53, 0x4e, 0x6f,
0xd5, 0xdb, 0x37, 0x45, 0xde, 0xfd, 0x8e, 0x2f, 0x03, 0xff, 0x6a, 0x72, 0x6d, 0x6c, 0x5b, 0x51,
0x8d, 0x1b, 0xaf, 0x92, 0xbb, 0xdd, 0xbc, 0x7f, 0x11, 0xd9, 0x5c, 0x41, 0x1f, 0x10, 0x5a, 0xd8,
0x0a, 0xc1, 0x31, 0x88, 0xa5, 0xcd, 0x7b, 0xbd, 0x2d, 0x74, 0xd0, 0x12, 0xb8, 0xe5, 0xb4, 0xb0,
0x89, 0x69, 0x97, 0x4a, 0x0c, 0x96, 0x77, 0x7e, 0x65, 0xb9, 0xf1, 0x09, 0xc5, 0x6e, 0xc6, 0x84,
0x18, 0xf0, 0x7d, 0xec, 0x3a, 0xdc, 0x4d, 0x20, 0x79, 0xee, 0x5f, 0x3e, 0xd7, 0xcb, 0x39, 0x48
};

/// <summary>
/// 系统参数FK
/// </summary>
public uint[] FK = { 0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc };

/// <summary>
/// 固定参数CK
/// </summary>
public uint[] CK =
{
0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,
0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,
0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,
0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,
0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,
0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,
0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,
0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279
};

/// <summary>
/// Sm4的S盒取值
/// </summary>
/// <param name="inch"></param>
/// <returns></returns>
private byte Sm4Sbox(byte inch)
{
var i = inch & 0xFF;
var retVal = SboxTable[i];
return retVal;
}

/// <summary>
/// 线性变换 L
/// </summary>
/// <param name="ka"></param>
/// <returns></returns>
private long Sm4Lt(long ka)
{
var a = new byte[4];
var b = new byte[4];
PutULongToBe(ka, a, 0);
b[0] = Sm4Sbox(a[0]);
b[1] = Sm4Sbox(a[1]);
b[2] = Sm4Sbox(a[2]);
b[3] = Sm4Sbox(a[3]);
var bb = GetULongByBe(b, 0);
var c = bb ^ Rotl(bb, 2) ^ Rotl(bb, 10) ^ Rotl(bb, 18) ^ Rotl(bb, 24);
return c;
}

/// <summary>
/// 轮函数 F
/// </summary>
/// <param name="x0"></param>
/// <param name="x1"></param>
/// <param name="x2"></param>
/// <param name="x3"></param>
/// <param name="rk"></param>
/// <returns></returns>
private long Sm4F(long x0, long x1, long x2,
long x3, long rk)
{
return x0 ^ Sm4Lt(x1 ^ x2 ^ x3 ^ rk);
}

/// <summary>
/// 轮密钥rk
/// </summary>
/// <param name="ka"></param>
/// <returns></returns>
private long Sm4CalciRk(long ka)
{
var a = new byte[4];
var b = new byte[4];
PutULongToBe(ka, a, 0);
b[0] = Sm4Sbox(a[0]);
b[1] = Sm4Sbox(a[1]);
b[2] = Sm4Sbox(a[2]);
b[3] = Sm4Sbox(a[3]);
var bb = GetULongByBe(b, 0);
var rk = bb ^ Rotl(bb, 13) ^ Rotl(bb, 23);
return rk;
}

/// <summary>
/// 加密密钥
/// </summary>
/// <param name="SK"></param>
/// <param name="key"></param>
private void SetKey(long[] SK, byte[] key)
{
//加密密钥长度为 128 比特
var MK = new long[4];
var i = 0;
MK[0] = GetULongByBe(key, 0);
MK[1] = GetULongByBe(key, 4);
MK[2] = GetULongByBe(key, 8);
MK[3] = GetULongByBe(key, 12);
var k = new long[36];
//轮密钥生成方法
k[0] = MK[0] ^ FK[0];
k[1] = MK[1] ^ FK[1];
k[2] = MK[2] ^ FK[2];
k[3] = MK[3] ^ FK[3];
for (; i < 32; i++)
{
k[i + 4] = k[i] ^ Sm4CalciRk(k[i + 1] ^ k[i + 2] ^ k[i + 3] ^ CK[i]);
SK[i] = k[i + 4];
}
}

/// <summary>
/// 解密函数
/// </summary>
/// <param name="sk">轮密钥</param>
/// <param name="input">输入分组的密文</param>
/// <param name="output">输出的对应的分组明文</param>
private void Sm4OneRound(long[] sk, byte[] input, byte[] output)
{
var i = 0;
var ulbuf = new long[36];
ulbuf[0] = GetULongByBe(input, 0);
ulbuf[1] = GetULongByBe(input, 4);
ulbuf[2] = GetULongByBe(input, 8);
ulbuf[3] = GetULongByBe(input, 12);
while (i < 32)//开始32轮解密 ,一次进行4轮,共计八次
{
ulbuf[i + 4] = Sm4F(ulbuf[i], ulbuf[i + 1], ulbuf[i + 2], ulbuf[i + 3],
sk[i]);
i++;
}
PutULongToBe(ulbuf[35], output, 0);
PutULongToBe(ulbuf[34], output, 4);
PutULongToBe(ulbuf[33], output, 8);
PutULongToBe(ulbuf[32], output, 12);
}

/// <summary>
/// 补足 16 进制字符串的 0 字符,返回不带 0x 的16进制字符串
/// </summary>
/// <param name="input"></param>
/// <param name="mode">1表示加密,0表示解密</param>
/// <returns></returns>
private static byte[] Padding(byte[] input, int mode)
{
if (input == null)
{
return null;
}
byte[] ret;
if (mode == 1)
{
var p = 16 - input.Length % 16;
ret = new byte[input.Length + p];
Array.Copy(input, 0, ret, 0,
input.Length);
for (var i = 0; i < p; i++)
{
ret[input.Length + i] = (byte)p;
}
}
else
{
int p = input[input.Length - 1];
ret = new byte[input.Length - p];
Array.Copy(input, 0, ret, 0,
input.Length - p);
}
return ret;
}

/// <summary>
/// 设置加密的key
/// </summary>
/// <param name="ctx"></param>
/// <param name="key"></param>
public void SetKeyEnc(Sm4Context ctx, byte[] key)
{
ctx.Mode = 1;
SetKey(ctx.Key, key);
}

/// <summary>
/// 设置解密的key
/// </summary>
/// <param name="ctx"></param>
/// <param name="key"></param>
public void Sm4SetKeyDec(Sm4Context ctx, byte[] key)
{
ctx.Mode = 0;
SetKey(ctx.Key, key);
int i;
for (i = 0; i < 16; i++)
{
Swap(ctx.Key, i);
}
}

/// <summary>
/// ECB
/// </summary>
/// <param name="ctx"></param>
/// <param name="input"></param>
/// <returns></returns>
public byte[] Sm4CryptEcb(Sm4Context ctx, byte[] input)
{
if (ctx.IsPadding && ctx.Mode == 1)
{
input = Padding(input, 1);
}
var length = input.Length;
var bins = new byte[length];
Array.Copy(input, 0, bins, 0,
length);
var bous = new byte[length];
for (var i = 0; length > 0; length -= 16, i++)
{
var inBytes = new byte[16];
var outBytes = new byte[16];
Array.Copy(bins, i * 16, inBytes, 0,
length > 16 ? 16 : length);
Sm4OneRound(ctx.Key, inBytes, outBytes);
Array.Copy(outBytes, 0, bous, i * 16,
length > 16 ? 16 : length);
}
if (ctx.IsPadding && ctx.Mode == 0)
{
bous = Padding(bous, 0);
}
return bous;
}

/// <summary>
/// CBC
/// </summary>
/// <param name="ctx"></param>
/// <param name="iv"></param>
/// <param name="input"></param>
/// <returns></returns>
public byte[] Sm4CryptCbc(Sm4Context ctx, byte[] iv, byte[] input)
{
if (ctx.IsPadding && ctx.Mode == 1)
{
input = Padding(input, 1);
}
var length = input.Length;
var bins = new byte[length];
Array.Copy(input, 0, bins, 0,
length);
var bousList = new List<byte>();
int i;
if (ctx.Mode == 1)
{
for (var j = 0; length > 0; length -= 16, j++)
{
var inBytes = new byte[16];
var outBytes = new byte[16];
var out1 = new byte[16];
Array.Copy(bins, j * 16, inBytes, 0,
length > 16 ? 16 : length);
for (i = 0; i < 16; i++)
{
outBytes[i] = (byte)(inBytes[i] ^ iv[i]);
}
Sm4OneRound(ctx.Key, outBytes, out1);
Array.Copy(out1, 0, iv, 0,
16);
for (var k = 0; k < 16; k++)
{
bousList.Add(out1[k]);
}
}
}
else
{
var temp = new byte[16];
for (var j = 0; length > 0; length -= 16, j++)
{
var inBytes = new byte[16];
var outBytes = new byte[16];
var out1 = new byte[16];
Array.Copy(bins, j * 16, inBytes, 0,
length > 16 ? 16 : length);
Array.Copy(inBytes, 0, temp, 0,
16);
Sm4OneRound(ctx.Key, inBytes, outBytes);
for (i = 0; i < 16; i++)
{
out1[i] = (byte)(outBytes[i] ^ iv[i]);
}
Array.Copy(temp, 0, iv, 0,
16);
for (var k = 0; k < 16; k++)
{
bousList.Add(out1[k]);
}
}
}
if (ctx.IsPadding && ctx.Mode == 0)
{
var bous = Padding(bousList.ToArray(), 0);
return bous;
}
return bousList.ToArray();
}
}

/// <summary>
/// SM4处理中心
/// </summary>
public class Sm4Context
{
public Sm4Context()
{
Mode = 1;
IsPadding = true;
Key = new long[32];
}

/// <summary>
/// 1表示加密,0表示解密
/// </summary>
public int Mode;

/// <summary>
/// 密钥
/// </summary>
public long[] Key;

/// <summary>
/// 是否补足16进制字符串
/// </summary>
public bool IsPadding;
}

+ 164
- 0
SafeCampus.API/SafeAuthActivate/Sm/SM4Util.cs View File

@@ -0,0 +1,164 @@
using System.ComponentModel;
using System.Text;
using Org.BouncyCastle.Utilities.Encoders;

namespace SafeAuthActivate.Sm;

//加密和解密结构相同,只不过,解密密钥是加密密钥的逆序
/// <summary>
/// Sm4算法
/// 对标国际DES算法
/// </summary>
public class SM4Util
{
public SM4Util()
{
Key = "1814546261730461";//密钥长度必须为16字节。
Iv = "0000000000000000";
HexString = false;
CryptoMode = Sm4CryptoEnum.ECB;
}

/// <summary>
/// 数据
/// </summary>
public string Data { get; set; }

/// <summary>
/// 秘钥
/// </summary>
public string Key { get; }//不同的key,加密出来的数据不一样,所以此处设定好key以后,禁止修改

/// <summary>
/// 向量
/// </summary>
public string Iv { get; set; }

/// <summary>
/// 明文是否是十六进制
/// </summary>
public bool HexString { get; }//set;

/// <summary>
/// 加密模式(默认ECB)
/// 统一改为ECB模式
/// </summary>
public Sm4CryptoEnum CryptoMode { get; }

#region 加密

public static string Encrypt(SM4Util entity)
{
return entity.CryptoMode == Sm4CryptoEnum.CBC ? EncryptCBC(entity) : EncryptECB(entity);
}

/// <summary>
/// ECB加密
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public static string EncryptECB(SM4Util entity)
{
var ctx = new Sm4Context
{
IsPadding = true
};
var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key);
var sm4 = new SM4CryptoUtil();
sm4.SetKeyEnc(ctx, keyBytes);
var encrypted = sm4.Sm4CryptEcb(ctx, Encoding.Default.GetBytes(entity.Data));
return Encoding.Default.GetString(Hex.Encode(encrypted));
}

/// <summary>
/// CBC加密
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public static string EncryptCBC(SM4Util entity)
{
var ctx = new Sm4Context
{
IsPadding = true
};
var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key);
var ivBytes = entity.HexString ? Hex.Decode(entity.Iv) : Encoding.Default.GetBytes(entity.Iv);
var sm4 = new SM4CryptoUtil();
sm4.SetKeyEnc(ctx, keyBytes);
var encrypted = sm4.Sm4CryptCbc(ctx, ivBytes, Encoding.Default.GetBytes(entity.Data));
return Convert.ToBase64String(encrypted);
}

#endregion 加密

#region 解密

/// <summary>
/// 解密
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public static string Decrypt(SM4Util entity)
{
return entity.CryptoMode == Sm4CryptoEnum.CBC ? DecryptCBC(entity) : DecryptECB(entity);
}

/// <summary>
/// ECB解密
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public static string DecryptECB(SM4Util entity)
{
var ctx = new Sm4Context
{
IsPadding = true,
Mode = 0
};
var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key);
var sm4 = new SM4CryptoUtil();
sm4.Sm4SetKeyDec(ctx, keyBytes);
var decrypted = sm4.Sm4CryptEcb(ctx, Hex.Decode(entity.Data));
return Encoding.Default.GetString(decrypted);
}

/// <summary>
/// CBC解密
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public static string DecryptCBC(SM4Util entity)
{
var ctx = new Sm4Context
{
IsPadding = true,
Mode = 0
};
var keyBytes = entity.HexString ? Hex.Decode(entity.Key) : Encoding.Default.GetBytes(entity.Key);
var ivBytes = entity.HexString ? Hex.Decode(entity.Iv) : Encoding.Default.GetBytes(entity.Iv);
var sm4 = new SM4CryptoUtil();
sm4.Sm4SetKeyDec(ctx, keyBytes);
var decrypted = sm4.Sm4CryptCbc(ctx, ivBytes, Convert.FromBase64String(entity.Data));
return Encoding.Default.GetString(decrypted);
}

#endregion 解密

/// <summary>
/// 加密类型
/// </summary>
public enum Sm4CryptoEnum
{
/// <summary>
/// ECB(电码本模式)
/// </summary>
[Description("ECB模式")]
ECB = 0,

/// <summary>
/// CBC(密码分组链接模式)
/// </summary>
[Description("CBC模式")]
CBC = 1
}
}

+ 1
- 1
SafeCampus.API/SafeCampus.Application/Manager/DeepelephManager/DeepelephManager.cs View File

@@ -203,7 +203,7 @@ public class DeepelephManager : IDeepelephManager, IScoped
{

var body = json["body"];
if (body != null)
if (body != null&& body["poiId"]?.ToString() == setting.PoiId)
{
var model = new WarnInfoDto
{


+ 20
- 0
SafeCampus.API/SafeCampus.Application/Manager/Machine/IMachineUtil.cs View File

@@ -0,0 +1,20 @@
namespace SafeCampus.Core.Utils.Machine;

public interface IMachineUtil
{
/// <summary>
/// CPU码
/// </summary>
/// <returns></returns>
Task<string> GetProcessorId();
/// <summary>
/// 硬盘码
/// </summary>
/// <returns></returns>
Task<string> GetDiskId();
/// <summary>
/// MAC地址
/// </summary>
/// <returns></returns>
Task<string> GetMacAddress();
}

+ 58
- 0
SafeCampus.API/SafeCampus.Application/Manager/Machine/MachineUtil.cs View File

@@ -0,0 +1,58 @@
using Newtonsoft.Json;
using System.Management;

namespace SafeCampus.Core.Utils.Machine;

public class MachineUtil : IMachineUtil
{
private readonly ISimpleCacheService _simpleCacheService;

public MachineUtil(ISimpleCacheService simpleCacheService)
{
_simpleCacheService = simpleCacheService;
}

/// <summary>
/// CPU码
/// </summary>
/// <returns></returns>
public async Task<string> GetProcessorId()
{
var json = _simpleCacheService.Get<string>(BizConfigConst.BIZ_MACHINE_CPU);
if (json != null) return json;
using ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT ProcessorId FROM Win32_Processor");
ManagementObjectCollection collection = searcher.Get();
string processorId = collection.Cast<ManagementBaseObject>().First()["ProcessorId"].ToString();
_simpleCacheService.Add(BizConfigConst.BIZ_MACHINE_CPU, processorId);
return processorId;

}
/// <summary>
/// 硬盘码
/// </summary>
/// <returns></returns>
public async Task<string> GetDiskId()
{
var json = _simpleCacheService.Get<string>(BizConfigConst.BIZ_MACHINE_DISK);
if (json != null) return json;
using ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT SerialNumber FROM Win32_DiskDrive");
ManagementObjectCollection collection = searcher.Get();
string diskId = collection.Cast<ManagementBaseObject>().First()["SerialNumber"].ToString();
_simpleCacheService.Add(BizConfigConst.BIZ_MACHINE_DISK, diskId);
return diskId;
}
/// <summary>
/// MAC地址
/// </summary>
/// <returns></returns>
public async Task<string> GetMacAddress()
{
var json = _simpleCacheService.Get<string>(BizConfigConst.BIZ_MACHINE_MAC);
if (json != null) return json;
using ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT MACAddress FROM Win32_NetworkAdapter WHERE PhysicalAdapter=True");
ManagementObjectCollection collection = searcher.Get();
string macAddress = collection.Cast<ManagementBaseObject>().First()["MACAddress"].ToString();
_simpleCacheService.Add(BizConfigConst.BIZ_MACHINE_MAC, macAddress);
return macAddress;
}
}

+ 4
- 4
SafeCampus.API/SafeCampus.Application/Manager/SMS/TxySmsUtil.cs View File

@@ -42,15 +42,15 @@ public class TxySmsUtil: ISMSUtilService, IScoped
SmsSdkAppId = setting.SmsAppId,
SignName = setting.SmsSn,
TemplateId = setting.VerificationCodeId,
TemplateParamSet = content,
TemplateParamSet = content
};
SendSmsResponse resp = await client.SendSms(req);
if (resp.SendStatusSet[0].Code == "Ok")
{
await CreateSMSLog(string.Join(",", phone), true, string.Join(",", content));
await CreateSMSLog(string.Join(",", phone), true, content==null?"":string.Join(",", content));
return true;
}
await CreateSMSLog(string.Join(",",phone), false, string.Join(",", content));
await CreateSMSLog(string.Join(",",phone), false, content == null ? "" : string.Join(",", content));
return false;
}
public async Task CreateSMSLog(string phone, bool sendState,string content)
@@ -63,7 +63,7 @@ public class TxySmsUtil: ISMSUtilService, IScoped
Name = "短信通知",
Category = CateGoryConst.CONFIG_SYS_ALARM_SMS,
ExeStatus = sendState ? SysLogConst.SUCCESS : SysLogConst.FAIL,
OpAddress = content,
OpAddress = string.IsNullOrEmpty(content)? "泉江科技提醒您有新的预警信息,请您与预警平台-预警信息功能处查看详情" : content,
OpIp = "",
OpBrowser = "",
OpOs = "",


+ 36
- 0
SafeCampus.API/SafeCampus.Application/SafeCampus.Application.xml View File

@@ -2662,6 +2662,42 @@
</summary>
<param name="services"></param>
</member>
<member name="M:SafeCampus.Core.Utils.Machine.IMachineUtil.GetProcessorId">
<summary>
CPU码
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Core.Utils.Machine.IMachineUtil.GetDiskId">
<summary>
硬盘码
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Core.Utils.Machine.IMachineUtil.GetMacAddress">
<summary>
MAC地址
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Core.Utils.Machine.MachineUtil.GetProcessorId">
<summary>
CPU码
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Core.Utils.Machine.MachineUtil.GetDiskId">
<summary>
硬盘码
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Core.Utils.Machine.MachineUtil.GetMacAddress">
<summary>
MAC地址
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Core.Utils.TXYSMS.TxySmsUtil.SendSms(System.String[],System.String[])">
<summary>
发送短信


+ 20
- 15
SafeCampus.API/SafeCampus.Application/Services/Business/CameraInfoService/CameraInfoService.cs View File

@@ -52,20 +52,22 @@ public class CameraInfoService : DbRepository<CameraInfo>, ICameraInfoService
old_model.ResWidth = (int)item["resWidth"];
old_model.SensorName = item["sensorName"].ToString();
old_model.SnapshotUrl = item["snapshotUrl"].ToString();
var signImg = Path.Combine(Directory.GetCurrentDirectory(), "Files", App.Configuration["AppInfo:CameraImg"], old_model.SensorId + ".jpg");
var steam = await old_model.SnapshotUrl.GetAsByteArrayAsync();
using (MemoryStream ms = new MemoryStream(steam))
if (!string.IsNullOrEmpty(old_model.SnapshotUrl))
{
using (Bitmap bmp = new Bitmap(ms))
var signImg = Path.Combine(Directory.GetCurrentDirectory(), "Files", App.Configuration["AppInfo:CameraImg"], old_model.SensorId + ".jpg");
var steam = await old_model.SnapshotUrl.GetAsByteArrayAsync();
using (MemoryStream ms = new MemoryStream(steam))
{
using (Graphics g = Graphics.FromImage(bmp))
using (Bitmap bmp = new Bitmap(ms))
{

//using (Graphics g = Graphics.FromImage(bmp))
//{
//}
bmp.Save(signImg, ImageFormat.Jpeg);
}
bmp.Save(signImg, ImageFormat.Jpeg);
}
old_model.SnapshotUrl = $"/Files/{App.Configuration["AppInfo:CameraImg"]}/{old_model.SensorId}.jpg";
}
old_model.SnapshotUrl = $"/Files/{App.Configuration["AppInfo:CameraImg"]}/{old_model.SensorId}.jpg";
await UpdateAsync(old_model);
}
else
@@ -85,19 +87,22 @@ public class CameraInfoService : DbRepository<CameraInfo>, ICameraInfoService

};
var signImg = Path.Combine(Directory.GetCurrentDirectory(), "Files", App.Configuration["AppInfo:CameraImg"], cameraModel.SensorId + ".jpg");
var steam = await cameraModel.SnapshotUrl.GetAsByteArrayAsync();
using (MemoryStream ms = new MemoryStream(steam))
if (!string.IsNullOrEmpty(cameraModel.SnapshotUrl))
{
using (Bitmap bmp = new Bitmap(ms))
var steam = await cameraModel.SnapshotUrl.GetAsByteArrayAsync();
using (MemoryStream ms = new MemoryStream(steam))
{
using (Graphics g = Graphics.FromImage(bmp))
using (Bitmap bmp = new Bitmap(ms))
{
using (Graphics g = Graphics.FromImage(bmp))
{

}
bmp.Save(signImg, ImageFormat.Jpeg);
}
bmp.Save(signImg, ImageFormat.Jpeg);
}
cameraModel.SnapshotUrl = $"/Files/{App.Configuration["AppInfo:CameraImg"]}/{cameraModel.SensorId}.jpg";
}
cameraModel.SnapshotUrl = $"/Files/{App.Configuration["AppInfo:CameraImg"]}/{cameraModel.SensorId}.jpg";
await InsertAsync(cameraModel);
}
}
@@ -227,7 +232,7 @@ public class CameraInfoService : DbRepository<CameraInfo>, ICameraInfoService

public async Task<CameraInfoDto> GetInfoByCode(string sensorId)
{
var model = await Context.Queryable<CameraInfo>().Where(x => x.SensorId==sensorId).FirstAsync();
var model = await Context.Queryable<CameraInfo>().Includes(x=>x.SysUserItem).Where(x => x.SensorId==sensorId).FirstAsync();
return model?.Adapt<CameraInfoDto>();
}
}

+ 70
- 30
SafeCampus.API/SafeCampus.Application/Services/Business/Warn/Service/WarnInfoService.cs View File

@@ -8,7 +8,9 @@ using SafeCampus.Application.Services.Business.CameraInfoService;
using SafeCampus.Application.Services.Business.PersonInfoService;
using SafeCampus.Application.Services.Business.Warn.Dto;
using SafeCampus.Application.Services.Business.Warn.Service;
using SafeCampus.Core.Utils;
using SafeCampus.Core.Utils.TXYSMS;
using System.Collections.Generic;

namespace SafeCampus.Web.Core.Controllers.Application.Business.Warn.Service;

@@ -19,14 +21,16 @@ public class WarnInfoService : DbRepository<WarnInfo>, IWarnInfoService, ITransi
private readonly ISMSUtilService _smsUtilService;
private readonly ICameraInfoService _cameraInfoService;
private readonly IPersonInfoService _personInfoService;
private readonly ISysUserService _sysUserService;

public WarnInfoService(ISimpleCacheService simpleCacheService, IConfigService configService, ISMSUtilService smsUtilService, ICameraInfoService cameraInfoService, IPersonInfoService personInfoService)
public WarnInfoService(ISimpleCacheService simpleCacheService, IConfigService configService, ISMSUtilService smsUtilService, ICameraInfoService cameraInfoService, IPersonInfoService personInfoService, ISysUserService sysUserService)
{
_simpleCacheService = simpleCacheService;
_configService = configService;
_smsUtilService = smsUtilService;
_cameraInfoService = cameraInfoService;
_personInfoService = personInfoService;
_sysUserService = sysUserService;
}

public async Task<bool> Add(WarnInfoDto vm)
@@ -41,6 +45,7 @@ public class WarnInfoService : DbRepository<WarnInfo>, IWarnInfoService, ITransi
var daySum =
(await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE, BizConfigConst.BIZ_SMS_STATES_DAY))
.ConfigValue.ToInt();
if (daySum > 1)
{
count = await Context.Queryable<WarnInfo>().CountAsync(x =>
@@ -49,35 +54,70 @@ public class WarnInfoService : DbRepository<WarnInfo>, IWarnInfoService, ITransi

if (!pushState || count < daySum) return true;
{
var phone = await _cameraInfoService.GetInfoByCode(model.CameraId);
if (phone == null) return true;
//var phone = await _cameraInfoService.GetInfoByCode(model.CameraId);
var config = _simpleCacheService.Get<List<WarnGroupInfo>>(SafeCampusConst.WarnGroup);
//场景名称
var sceneName = config.FirstOrDefault(x => x.Subset.Any(xx => xx.Code == model.AlarmType) && x.CameraId.Contains(model.CameraId))?.Name;
//TODO 发送短信
var kzxx = "";
if (!string.IsNullOrEmpty(model.Extend))
{
if (string.IsNullOrEmpty(model.PersonId))
{
var extend = JsonConvert.DeserializeObject<JObject>(model.Extend);
kzxx = extend["age"] != null ? $",年龄:{extend["age"]};年龄置信度:{Convert.ToInt32(Convert.ToDecimal(extend["ageProb"]) * 100)}%;" : "";
}
else
{
var pre = await _personInfoService.GetInfo(model.PersonId);
if (pre!=null)
{
kzxx = $",姓名:{pre.Name},班级:{pre.PersonSetName}";
}
}
}
if (model.AlarmType == "crowd")
var scene = config.Where(x =>
x.Subset.Any(xx => xx.Code == model.AlarmType && xx.State && x.CameraId.Contains(model.CameraId))&&x.PushUserId.HasValue)
.ToList();
foreach (var warnGroupInfo in scene)
{
kzxx = $",人群聚集数量:{model.Count}";
var user= await _sysUserService.Detail(new BaseIdInput { Id = warnGroupInfo.PushUserId.Value });
if (user == null) continue;
var issend = _simpleCacheService.Get<string>($"SMS_send{user.Phone}");
if (issend != null) return true;
var sendState = await _smsUtilService.SendSms(new[] { "+86" + user.Phone }, null);
if (sendState)
{
var configInterval = (await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE,
BizConfigConst.BIZ_SMS_INTERVAL));
if (configInterval != null)
{
_simpleCacheService.Add($"SMS_send{user.Phone}", "发送成功", configInterval.ConfigValue.ToInt() * 60);
}
}
}
var content = $"{model.Tick:yyyy-MM-dd HH:mm:ss}【{phone.SensorName}】触发【{model.AlarmTypeDesc}】预警,场景【{sceneName}】{kzxx}";
await _smsUtilService.SendSms(new[] { phone.SysUserItem.Phone }, new[] { content });
//if (phone == null) return true;
//场景名称
//var sceneName = config.FirstOrDefault(x =>
// x.Subset.Any(xx => xx.Code == model.AlarmType) && x.CameraId.Contains(model.CameraId))?.Name;
////TODO 发送短信
//var kzxx = "";
//if (!string.IsNullOrEmpty(model.Extend))
//{
// if (string.IsNullOrEmpty(model.PersonId))
// {
// var extend = JsonConvert.DeserializeObject<JObject>(model.Extend);
// kzxx = extend["age"] != null ? $",年龄:{extend["age"]};年龄置信度:{Convert.ToInt32(Convert.ToDecimal(extend["ageProb"]) * 100)}%;" : "";
// }
// else
// {
// var pre = await _personInfoService.GetInfo(model.PersonId);
// if (pre!=null)
// {
// kzxx = $",姓名:{pre.Name},班级:{pre.PersonSetName}";
// }
// }
//}
//if (model.AlarmType == "crowd")
//{
// kzxx = $",人群聚集数量:{model.Count}";
//}
//var content = $"{model.Tick:yyyy-MM-dd HH:mm:ss}【{phone.SensorName}】触发【{model.AlarmTypeDesc}】预警,场景【{sceneName}】{kzxx}";

//var issend = _simpleCacheService.Get<string>($"SMS_send{phone.SysUserItem.Phone}");
//if (issend != null) return true;
//var sendState = await _smsUtilService.SendSms(new[] { "+86" + CryptogramUtil.Sm4Decrypt(phone.SysUserItem.Phone) }, null);
//if (sendState)
//{
// var configInterval = (await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE,
// BizConfigConst.BIZ_SMS_INTERVAL));
// if (configInterval != null)
// {
// _simpleCacheService.Add($"SMS_send{phone.SysUserItem.Phone}", "发送成功", configInterval.ConfigValue.ToInt() * 60);
// }

//}

}
return true;
}
@@ -141,7 +181,7 @@ public class WarnInfoService : DbRepository<WarnInfo>, IWarnInfoService, ITransi
if (!warnGroupSubset.State)
{
guolvIds.AddRange(guolv
.Where(x => warnGroupInfo.CameraId.Contains(x.CameraId) &&
.Where(x => warnGroupSubset.CameraId.Contains(x.CameraId) &&
x.AlarmType == warnGroupSubset.Code).Select(x => x.Id).ToList());
}
}
@@ -204,7 +244,7 @@ public class WarnInfoService : DbRepository<WarnInfo>, IWarnInfoService, ITransi
if (!warnGroupSubset.State)
{
guolvIds.AddRange(guolv
.Where(x => warnGroupInfo.CameraId.Contains(x.CameraId) &&
.Where(x => warnGroupSubset.CameraId.Contains(x.CameraId) &&
x.AlarmType == warnGroupSubset.Code).Select(x => x.Id).ToList());
}
}
@@ -252,7 +292,7 @@ public class WarnInfoService : DbRepository<WarnInfo>, IWarnInfoService, ITransi
if (!warnGroupSubset.State)
{
guolvIds.AddRange(guolv
.Where(x => warnGroupInfo.CameraId.Contains(x.CameraId) &&
.Where(x => warnGroupSubset.CameraId.Contains(x.CameraId) &&
x.AlarmType == warnGroupSubset.Code).Select(x => x.Id).ToList());
}
}


+ 2
- 2
SafeCampus.API/SafeCampus.Core/Core.Development.json View File

@@ -3,8 +3,8 @@
"Cryptogram": {
//SM2国密配置
"SM2": {
"PublicKey": "04BD62406DF6789B1FBE8C457AECAE6D7C806CDB39316F190519905C24DF395E8952C47798D76ADECF8CA28C935702AFCDD9B17DE77121FA6448F0EDEFBD8365D6", //公钥
"PrivateKey": "00F908E5ED9C2059A960E3A58056F69E0CF75299182CEB93B74CD1FDC633FCA0E5" //私钥
"PublicKey": "048A407FD953AD0318AAE08709EC6DF161BBB2A0A268DE20AFAC3C17131B046EEE6F1070F6DDC68066651F6BF6F2DC27ADFE11E78FDB4A042576F101E1BB999B0B", //公钥
"PrivateKey": "76DDFE59DFA9FF27CA73EF1BC9BF02C473FE1FA7D181083BE828BF93E02CE9BC" //私钥
}
},
//日志配置


+ 2
- 2
SafeCampus.API/SafeCampus.Core/Core.Production.json View File

@@ -3,8 +3,8 @@
"Cryptogram": {
//SM2国密配置
"SM2": {
"PublicKey": "04BD62406DF6789B1FBE8C457AECAE6D7C806CDB39316F190519905C24DF395E8952C47798D76ADECF8CA28C935702AFCDD9B17DE77121FA6448F0EDEFBD8365D6", //公钥
"PrivateKey": "00F908E5ED9C2059A960E3A58056F69E0CF75299182CEB93B74CD1FDC633FCA0E5" //私钥
"PublicKey": "048A407FD953AD0318AAE08709EC6DF161BBB2A0A268DE20AFAC3C17131B046EEE6F1070F6DDC68066651F6BF6F2DC27ADFE11E78FDB4A042576F101E1BB999B0B", //公钥
"PrivateKey": "76DDFE59DFA9FF27CA73EF1BC9BF02C473FE1FA7D181083BE828BF93E02CE9BC" //私钥
}
},
//日志配置


+ 8
- 2
SafeCampus.API/SafeCampus.Core/Dto/WarnGroupInfo.cs View File

@@ -2,8 +2,12 @@

public class WarnGroupInfo: WarnGroupSubset
{
public List<string> CameraId { get; set; }
public List<string> CameraName { get; set; }
/// <summary>
/// 推送人id
/// </summary>
public long? PushUserId { get; set; }
public string PushUserName { get; set; }
public string PushPhone { get; set; }
public List<WarnGroupSubset> Subset { get; set; }
}

@@ -13,4 +17,6 @@ public class WarnGroupSubset
public string Code { get; set; }
public bool State {get;set;}
public int Value { get; set; }
public List<string> CameraId { get; set; } = new List<string>();
public List<string> CameraName { get; set; } = new List<string>();
}

+ 1
- 11
SafeCampus.API/SafeCampus.Core/Options/AppInfoOptions.cs View File

@@ -1,14 +1,4 @@

//








using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Configuration;
using MoYu.ConfigurableOptions;

namespace SafeCampus.Core;


+ 0
- 4
SafeCampus.API/SafeCampus.Core/SafeCampus.Core.csproj View File

@@ -27,8 +27,4 @@
</None>
</ItemGroup>

<ItemGroup>
<Folder Include="Utils\TXYSMS\" />
</ItemGroup>

</Project>

+ 5
- 0
SafeCampus.API/SafeCampus.Core/SafeCampus.Core.xml View File

@@ -321,6 +321,11 @@
token剩余有效期百分比
</summary>
</member>
<member name="P:SafeCampus.Core.WarnGroupInfo.PushUserId">
<summary>
推送人id
</summary>
</member>
<member name="F:SafeCampus.Core.AlarmType.visual_fence">
<summary>
周界入侵


+ 25
- 23
SafeCampus.API/SafeCampus.Core/Utils/Cryptogram/CryptogramUtil.cs View File

@@ -1,14 +1,4 @@

//








namespace SafeCampus.Core.Utils;
namespace SafeCampus.Core.Utils;

/// <summary>
/// 加解密功能
@@ -24,14 +14,11 @@ public class CryptogramUtil
/// <returns>明文</returns>
public static string Sm2Decrypt(string str)
{
// 解密
if (!string.IsNullOrWhiteSpace(str))
return SM2Util.Decrypt(str);
try
{
// // 解密
// if (!string.IsNullOrWhiteSpace(str))
// return SM2Util.Decrypt(str);
// 解密
if (!string.IsNullOrWhiteSpace(str))
return SM2Util.Decrypt(str);
}
catch
{
@@ -71,9 +58,17 @@ public class CryptogramUtil
/// <returns>明文</returns>
public static string Sm4Decrypt(string str)
{
if (!string.IsNullOrWhiteSpace(str))// 解密
return SM4Util.Decrypt(new SM4Util { Data = str });
return "";
try
{
if (!string.IsNullOrWhiteSpace(str))// 解密
return SM4Util.Decrypt(new SM4Util { Data = str });
return "";
}
catch (Exception e)
{
return "";
}
}

/// <summary>
@@ -83,9 +78,16 @@ public class CryptogramUtil
/// <returns>密文</returns>
public static string Sm4Encrypt(string str)
{
if (!string.IsNullOrWhiteSpace(str))// 加密
return SM4Util.Encrypt(new SM4Util { Data = str });
return "";
try
{
if (!string.IsNullOrWhiteSpace(str))// 加密
return SM4Util.Encrypt(new SM4Util { Data = str });
return "";
}
catch (Exception)
{
return "";
}
}

#endregion Sm4


+ 16
- 0
SafeCampus.API/SafeCampus.System/Const/BizConfigConst.cs View File

@@ -13,6 +13,10 @@ public class BizConfigConst
/// </summary>
public const string BIZ_SMS_STATES = "BIZ_SMS_STATES";
/// <summary>
/// 短信推送时间间隔(分钟)
/// </summary>
public const string BIZ_SMS_INTERVAL = "BIZ_SMS_INTERVAL";
/// <summary>
/// 归寝时间设置
/// </summary>
public const string BIZ_DORMITORY_TIME = "BIZ_DORMITORY_TIME";
@@ -20,4 +24,16 @@ public class BizConfigConst
/// 短信推送预警阈值
/// </summary>
public const string BIZ_SMS_STATES_DAY = "BIZ_SMS_STATES_DAY";
/// <summary>
/// CPU码
/// </summary>
public const string BIZ_MACHINE_CPU = "BIZ_MACHINE_CPU";
/// <summary>
/// 硬盘码
/// </summary>
public const string BIZ_MACHINE_DISK = "BIZ_MACHINE_DISK";
/// <summary>
/// MAC地址
/// </summary>
public const string BIZ_MACHINE_MAC = "BIZ_MACHINE_MAC";
}

+ 20
- 0
SafeCampus.API/SafeCampus.System/SafeCampus.System.xml View File

@@ -61,6 +61,11 @@
短信推送开关
</summary>
</member>
<member name="F:SafeCampus.System.BizConfigConst.BIZ_SMS_INTERVAL">
<summary>
短信推送时间间隔(分钟)
</summary>
</member>
<member name="F:SafeCampus.System.BizConfigConst.BIZ_DORMITORY_TIME">
<summary>
归寝时间设置
@@ -71,6 +76,21 @@
短信推送预警阈值
</summary>
</member>
<member name="F:SafeCampus.System.BizConfigConst.BIZ_MACHINE_CPU">
<summary>
CPU码
</summary>
</member>
<member name="F:SafeCampus.System.BizConfigConst.BIZ_MACHINE_DISK">
<summary>
硬盘码
</summary>
</member>
<member name="F:SafeCampus.System.BizConfigConst.BIZ_MACHINE_MAC">
<summary>
MAC地址
</summary>
</member>
<member name="T:SafeCampus.System.CateGoryConst">
<summary>
分类常量


+ 119
- 49
SafeCampus.API/SafeCampus.System/SeedData/Json/WarnGroup.json View File

@@ -2,39 +2,51 @@
{
"Name": "明厨亮灶",
"Code": "MCLZ",
"CameraId": [ "SXT001" ],
"CameraName": [ "厨房(良景)" ],
"CameraId": [ ],
"CameraName": [ ],
"State": true,
"Subset": [
{
"Name": "烟火告警",
"Code": "fire_smoke",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "猫鼠检测",
"Code": "animal_break_in",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "未戴口罩检测",
"Code": "mask_detect",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "未穿工作服检测",
"Code": "cloth_detect",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "抽烟检测",
"Code": "person_smoke",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "未戴帽子检测",
"Code": "hat_detect",
"State": false
"State": false,
"CameraId": [],
"CameraName": []
}
]
},
@@ -42,23 +54,29 @@
"Name": "智慧课堂",
"Code": "ZHKT",
"State": true,
"CameraId": [ "SXT002" ],
"CameraName": [ "教室(海康)" ],
"CameraId": [ ],
"CameraName": [],
"Subset": [
{
"Name": "教室点名",
"Code": "class_room_call",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "趴桌子",
"Code": "lie_on_table",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "烟火告警",
"Code": "fire_smoke",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
}
]
},
@@ -66,13 +84,15 @@
"Name": "学生归寝",
"Code": "XSGQ",
"State": true,
"CameraId": [ "SXT004" ],
"CameraName": [ "宿舍楼" ],
"CameraId": [ ],
"CameraName": [ ],
"Subset": [
{
"Name": "无感考勤",
"Code": "attendance",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
}
]
},
@@ -80,38 +100,50 @@
"Name": "校园防霸凌",
"Code": "XYFBL",
"State": true,
"CameraId": [ "SXT003" ],
"CameraName": [ "大厅(魔豆)" ],
"CameraId": [ ],
"CameraName": [ ],
"Subset": [
{
"Name": "抽烟检测",
"Code": "person_smoke",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "人群聚集",
"Code": "crowd",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "奔跑",
"Code": "run",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "追逐",
"Code": "chase",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "摔倒",
"Code": "fall_down",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "打闹检测",
"Code": "fight",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
}
]
},
@@ -119,92 +151,122 @@
"Name": "校园安全",
"Code": "XYAQ",
"State": true,
"CameraId": [ "SXT005" ],
"CameraName": [ "大门口" ],
"CameraId": [ ],
"CameraName": [ ],
"Subset": [
{
"Name": "可疑徘徊",
"Code": "wander",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "重点人员布控",
"Code": "blacklist",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "人群聚集",
"Code": "crowd",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "人员跟踪",
"Code": "vision",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "翻越",
"Code": "climb_over",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "周界入侵",
"Code": "visual_fence",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "摔倒",
"Code": "fall_down",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "奔跑",
"Code": "run",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "追逐",
"Code": "chase",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "打闹检测",
"Code": "fight",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "车辆违停",
"Code": "vehicle_parking",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "车辆超速",
"Code": "vehicle_speeding",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
}
]
},
{
"Name": "区域管控",
"Code": "QYGK",
"CameraId": [ "SXT006" ],
"CameraName": [ "学校禁区" ],
"CameraId": [],
"CameraName": [],
"State": true,
"Subset": [
{
"Name": "跨线",
"Code": "cross_line",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "周界入侵",
"Code": "visual_fence",
"State": false
"State": false,
"CameraId": [],
"CameraName": []
},
{
"Name": "可疑徘徊",
"Code": "wander",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
}
]
},
@@ -212,28 +274,36 @@
"Name": "安保巡逻",
"Code": "ABXL",
"State": true,
"CameraId": [ "SXT007" ],
"CameraName": [ "走廊" ],
"CameraId": [ ],
"CameraName": [ ],
"Subset": [
{
"Name": "重点人员布控",
"Code": "blacklist",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "巡更检测",
"Code": "patrol",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "离岗检测",
"Code": "off_duty",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
},
{
"Name": "未穿工作服检测",
"Code": "cloth_detect",
"State": true
"State": true,
"CameraId": [],
"CameraName": []
}
]
}

+ 4
- 12
SafeCampus.API/SafeCampus.System/Services/Limit/Role/SysRoleService.cs View File

@@ -1,14 +1,4 @@

//








namespace SafeCampus.System;
namespace SafeCampus.System;

/// <inheritdoc cref="ISysRoleService"/>
//[Injection(Proxy = typeof(GlobalDispatchProxy))]
@@ -222,7 +212,8 @@ public class SysRoleService : DbRepository<SysRole>, ISysRoleService
//获取菜单信息
var menus = await _resourceService.GetResourcesByIds(menuIds, CateGoryConst.RESOURCE_MENU);
//获取权限授权树
var permissions = _resourceService.PermissionTreeSelector(menus.Select(it => it.Path).ToList());
var menusPath = menus.Select(it => it.Path).ToList();
var permissions = _resourceService.PermissionTreeSelector(menusPath);
if (permissions.Count > 0)
permissionTreeSelectors.AddRange(permissions.Select(it => it.PermissionName).ToList());//返回授权树权限名称列表
}
@@ -415,6 +406,7 @@ public class SysRoleService : DbRepository<SysRole>, ISysRoleService
if (result.IsSuccess)//如果成功了
{
await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_RESOURCE);//刷新关系缓存
await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_MODULE);//刷新关系缓存
await _relationService.RefreshCache(CateGoryConst.RELATION_SYS_ROLE_HAS_PERMISSION);//刷新关系缓存
await _eventPublisher.PublishAsync(EventSubscriberConst.CLEAR_USER_CACHE, new List<long> { input.Id });//发送事件清除角色下用户缓存
}


+ 1
- 1
SafeCampus.API/SafeCampus.System/Services/System/Resource/ResourceService.cs View File

@@ -190,7 +190,7 @@ public class ResourceService : DbRepository<SysResource>, IResourceService
var route = routeAttributes[0];//取第一个值
var routeName = GetRouteName(controller.Name, route.Template);//赋值路由名称
//如果路由包含在路由列表中
if (routes.Contains(routeName))
if (routes.Contains(routeName)||(routes.Contains("/business") && routeName.Contains("business")))
{
//获取所有方法
var methods = controller.GetMethods();


+ 1
- 11
SafeCampus.API/SafeCampus.System/Startup.cs View File

@@ -1,14 +1,4 @@

//








namespace SafeCampus.System;
namespace SafeCampus.System;

/// <summary>
/// AppStartup启动类


+ 5
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/BuildingController.cs View File

@@ -24,6 +24,7 @@ public class BuildingController
/// </summary>
/// <param name="input">添加参数</param>
/// <returns></returns>
[DisplayName("添加")]
public async Task<bool> Add(BuildingInfoDto input)
{
return await _buildingService.Add(input);
@@ -34,6 +35,7 @@ public class BuildingController
/// </summary>
/// <param name="input">添加参数</param>
/// <returns></returns>
[DisplayName("修改")]
public async Task<bool> Update(BuildingInfoDto input)
{
return await _buildingService.Update(input);
@@ -44,6 +46,7 @@ public class BuildingController
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[DisplayName("删除")]
public async Task<bool> Delete(long id)
{
return await _buildingService.Delete(id);
@@ -53,6 +56,7 @@ public class BuildingController
/// 获取列表
/// </summary>
/// <returns></returns>
[DisplayName("获取列表")]
public async Task<List<BuildingInfoDto>> GetNoPageList()
{
return await _buildingService.GetNoPageList();
@@ -61,6 +65,7 @@ public class BuildingController
/// 获取未被宿舍楼使用的摄像头
/// </summary>
/// <returns></returns>
[DisplayName("获取未被宿舍楼使用的摄像头")]
public async Task<List<CameraInfoDto>> GetBuildCameraList()
{
var list =await _buildingService.GetUseCameraList();


+ 5
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/CameraGroupController.cs View File

@@ -21,6 +21,7 @@ public class CameraGroupController
/// </summary>
/// <param name="input">添加参数</param>
/// <returns></returns>
[DisplayName("添加分组")]
public Task<bool> Add(CameraGroupAddInput input)
{
return _cameraGroupService.Add(input);
@@ -31,6 +32,7 @@ public class CameraGroupController
/// </summary>
/// <param name="input">添加参数</param>
/// <returns></returns>
[DisplayName("修改分组")]
public Task<bool> Update(CameraGroupInput input)
{
return _cameraGroupService.Update(input);
@@ -41,6 +43,8 @@ public class CameraGroupController
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>

[DisplayName("删除分组")]
public Task<bool> Delete(long id)
{
return _cameraGroupService.Delete(id);
@@ -50,6 +54,7 @@ public class CameraGroupController
/// 获取分组列表
/// </summary>
/// <returns></returns>
[DisplayName("获取分组列表")]
public async Task<List<CameraGroup>> GetNoPageList()
{
var list =await _cameraGroupService.GetNoPageList();


+ 9
- 2
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/CameraInfoController.cs View File

@@ -21,7 +21,8 @@ public class CameraInfoController
/// 数据同步
/// </summary>
/// <returns></returns>
public async Task<bool> DataSync()
[DisplayName("数据同步")]
public async Task<bool> Dat()
{
return await _cameraInfoService.DataSync();
}
@@ -30,6 +31,7 @@ public class CameraInfoController
/// </summary>
/// <param name="search"></param>
/// <returns></returns>
[DisplayName("获取摄像头列表")]
public async Task<SqlSugarPagedList<CameraInfoDto>> GetPageList(CameraSearch search)
{
return await _cameraInfoService.GetPageList(search);
@@ -39,7 +41,8 @@ public class CameraInfoController
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<bool> BatchSetGroup(SetGroupInput input)
[DisplayName("批量给摄像头设置分组")]
public async Task<bool> BatchSetGroup(SetGroupInput input)
{
return await _cameraInfoService.BatchSetGroup(input);
}
@@ -48,6 +51,7 @@ public class CameraInfoController
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("根据分组批量设置推送人")]
public async Task<bool> BatchSetPushPersonByGroup(SetPushPersonGroupInput input)
{
return await _cameraInfoService.BatchSetPushPersonByGroup(input);
@@ -57,6 +61,7 @@ public class CameraInfoController
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("对摄像头批量设置推送人")]
public async Task<bool> BatchSetPushPerson(SetPushPersonInput input)
{
return await _cameraInfoService.BatchSetPushPerson(input);
@@ -66,6 +71,7 @@ public class CameraInfoController
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("根据预警分组设置推送人")]
public async Task<bool> BatchSetPushPersonByWarn(SetPushPersonWarnInput input)
{
return await _cameraInfoService.BatchSetPushPersonByWarn(input);
@@ -74,6 +80,7 @@ public class CameraInfoController
/// 设备状态统计API
/// </summary>
/// <returns></returns>
[DisplayName("设备状态统计API")]
public async Task<dynamic> GetCameraStatistic()
{
var list = await _cameraInfoService.GetPageList(new CameraSearch{PageNum = 1,PageSize = 1000});


+ 5
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/ClassTeacherController.cs View File

@@ -21,6 +21,7 @@ public class ClassTeacherController
/// </summary>
/// <param name="input">添加参数</param>
/// <returns></returns>
[DisplayName("添加班主任")]
public async Task<bool> Add(ClassTeacherInput input)
{
return await _classTeacherService.Add(input);
@@ -31,6 +32,7 @@ public class ClassTeacherController
/// </summary>
/// <param name="input">添加参数</param>
/// <returns></returns>
[DisplayName("修改班主任")]
public async Task<bool> Update(ClassTeacherUpdateInput input)
{
return await _classTeacherService.Update(input);
@@ -41,6 +43,7 @@ public class ClassTeacherController
/// </summary>
/// <param name="id">id</param>
/// <returns></returns>
[DisplayName("删除班主任")]
public async Task<bool> Delete(long id)
{
return await _classTeacherService.Delete(id);
@@ -50,6 +53,7 @@ public class ClassTeacherController
/// 根据班级id获取班主任信息
/// </summary>
/// <returns></returns>
[DisplayName("根据班级id获取班主任信息")]
public async Task<ClassTeacherDto> GetInfo(string personSetId)
{
return await _classTeacherService.GetInfo(personSetId);
@@ -59,6 +63,7 @@ public class ClassTeacherController
/// 获取列表
/// </summary>
/// <returns></returns>
[DisplayName("获取列表")]
public async Task<List<ClassTeacherDto>> GetNoPageList()
{
return await _classTeacherService.GetNoPageList();


+ 6
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/DepartmentController.cs View File

@@ -22,6 +22,7 @@ public class DepartmentController
/// </summary>
/// <param name="input">添加参数</param>
/// <returns></returns>
[DisplayName("添加")]
public async Task<bool> Add(DepartmentDto input)
{
return await _departmentService.Add(input);
@@ -32,6 +33,7 @@ public class DepartmentController
/// </summary>
/// <param name="input">添加参数</param>
/// <returns></returns>
[DisplayName("修改")]
public async Task<bool> Update(DepartmentDto input)
{
return await _departmentService.Update(input);
@@ -42,6 +44,7 @@ public class DepartmentController
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[DisplayName("获取详情")]
public async Task<DepartmentDto> GetInfo(long id)
{
return await _departmentService.GetInfo(id);
@@ -53,6 +56,7 @@ public class DepartmentController
/// <param name="id">id</param>
/// <returns></returns>
[HttpPost]
[DisplayName("删除")]
public async Task<bool> Delete(BaseIdListInput id)
{
return await _departmentService.Delete(id.Ids);
@@ -62,6 +66,7 @@ public class DepartmentController
/// 获取列表
/// </summary>
/// <returns></returns>
[DisplayName("获取列表")]
public async Task<SqlSugarPagedList<DepartmentDto>> GetPageList(DepartmentSearch search)
{
return await _departmentService.GetPageList(search);
@@ -72,6 +77,7 @@ public class DepartmentController
/// </summary>
/// <param name="search"></param>
/// <returns></returns>
[DisplayName("不分页获取列表")]
public async Task<List<DepartmentDto>> GetNoPageList(DepartmentSearch search)
{
return await _departmentService.GetNoPageList(search);


+ 10
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/DormitoryController.cs View File

@@ -43,6 +43,7 @@ public class DormitoryController
/// </summary>
/// <param name="input">添加参数</param>
/// <returns></returns>
[DisplayName("添加")]
public async Task<bool> Add(DormitoryInfoDto input)
{
return await _dormitoryService.Add(input);
@@ -53,6 +54,7 @@ public class DormitoryController
/// </summary>
/// <param name="input">添加参数</param>
/// <returns></returns>
[DisplayName("修改")]
public async Task<bool> Update(DormitoryInfoDto input)
{
return await _dormitoryService.Update(input);
@@ -62,6 +64,7 @@ public class DormitoryController
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[DisplayName("获取详情")]
public async Task<DormitoryInfoDto> GetInfo(long id)
{
return await _dormitoryService.GetInfo(id);
@@ -72,6 +75,7 @@ public class DormitoryController
/// <param name="id">id</param>
/// <returns></returns>
[HttpPost]
[DisplayName("删除")]
public async Task<bool> Delete(BaseIdListInput id)
{
return await _dormitoryService.Delete(id.Ids);
@@ -81,6 +85,7 @@ public class DormitoryController
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("寝室分配人员")]
public async Task<bool> SetAssignPerson(DormitorySetPersonInput input)
{
return await _dormitoryService.SetAssignPerson(input);
@@ -89,6 +94,7 @@ public class DormitoryController
/// 获取列表
/// </summary>
/// <returns></returns>
[DisplayName("获取列表")]
public async Task<SqlSugarPagedList<DormitoryInfoList>> GetPageList(DormitoryInfoSearch search)
{
return await _dormitoryService.GetPageList(search);
@@ -98,6 +104,7 @@ public class DormitoryController
/// </summary>
/// <param name="search"></param>
/// <returns></returns>
[DisplayName("查询归寝寝室列表")]
public async Task<SqlSugarPagedList<ReturnDormitoryList>> GetReturnPageList(ReturnDormitoryISearch search)
{
if (!search.BuildId.HasValue)
@@ -112,6 +119,7 @@ public class DormitoryController
/// <param name="id">寝室id</param>
/// <param name="returnTime">归寝日期</param>
/// <returns></returns>
[DisplayName("查询寝室归寝详情")]
public async Task<ReturnDormitoryDto> GetReturnInfo(long id,DateTime returnTime)
{
var model= await _dormitoryService.GetReturnInfo(id, returnTime);
@@ -126,6 +134,7 @@ public class DormitoryController
/// 设置归寝时间
/// </summary>
/// <returns></returns>
[DisplayName("设置归寝时间")]
public async Task<bool> SetReturnTime(ReturnTimeInput input)
{
var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
@@ -208,6 +217,7 @@ public class DormitoryController
/// 获取归寝时间
/// </summary>
/// <returns></returns>
[DisplayName("获取归寝时间")]
public async Task<ReturnTimeInput> GetReturnTime()
{
var json = await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE,


+ 4
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/Dto/ConfigJsonInput.cs View File

@@ -30,4 +30,8 @@ public class ConfigPush
/// 当日预警条数
/// </summary>
public int DaySum { get; set; }
/// <summary>
/// 推送间隔(分钟)
/// </summary>
public int Interval { get; set; }
}

+ 8
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/KeyPersonnelController.cs View File

@@ -32,6 +32,7 @@ public class KeyPersonnelController
/// </summary>
/// <param name="info">人员信息</param>
/// <returns></returns>
[DisplayName("新增人员")]
public async Task<dynamic> CreatePersonA(PersonModel info)
{
var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
@@ -79,6 +80,7 @@ public class KeyPersonnelController
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[DisplayName("人脸图片上传")]
public async Task<dynamic> UploadFile([FromForm] BaseFileInput input)
{
var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
@@ -133,6 +135,7 @@ public class KeyPersonnelController
/// </summary>
/// <param name="personId"></param>
/// <returns></returns>
[DisplayName("删除人员")]
public async Task<dynamic> DeletePersonD(string id)
{
var list = new List<string>();
@@ -180,6 +183,7 @@ public class KeyPersonnelController
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[DisplayName("更新人员信息")]
public async Task<dynamic> UpdatePersionU(PersonModel info)
{
var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
@@ -212,6 +216,7 @@ public class KeyPersonnelController
/// </summary>
/// <param name="search">查询条件</param>
/// <returns></returns>
[DisplayName("分页查询人员信息")]
public async Task<dynamic> PageQuery(PersonSearch search)
{
var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
@@ -256,6 +261,7 @@ public class KeyPersonnelController
/// </summary>
/// <param name="personId">人员id</param>
/// <returns></returns>
[DisplayName("查看人员详情")]
public async Task<dynamic> GetPersionById(ControllersIdInput input)
{
var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
@@ -292,6 +298,7 @@ public class KeyPersonnelController
/// </summary>
/// <param name="info">人脸信息</param>
/// <returns></returns>
[DisplayName("添加人脸")]
public async Task<dynamic> AddFaceA(PersonFaceInfo info)
{
var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
@@ -329,6 +336,7 @@ public class KeyPersonnelController
/// <param name="info">删除信息</param>
/// <returns></returns>
[HttpPost]
[DisplayName("删除人脸")]
public async Task<dynamic> DeleteFaceD(PersonFaceDel info)
{
var appSettings = App.GetOptionsMonitor<AppInfoOptions>();


+ 6
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/MajorController.cs View File

@@ -21,6 +21,7 @@ public class MajorController
/// </summary>
/// <param name="input">添加参数</param>
/// <returns></returns>
[DisplayName("添加")]
public async Task<bool> Add(MajorDto input)
{
return await _majorService.Add(input);
@@ -31,6 +32,7 @@ public class MajorController
/// </summary>
/// <param name="input">添加参数</param>
/// <returns></returns>
[DisplayName("修改")]
public async Task<bool> Update(MajorDto input)
{
return await _majorService.Update(input);
@@ -41,6 +43,7 @@ public class MajorController
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[DisplayName("获取详情")]
public async Task<MajorDto> GetInfo(long id)
{
return await _majorService.GetInfo(id);
@@ -52,6 +55,7 @@ public class MajorController
/// <param name="id">id</param>
/// <returns></returns>
[HttpPost]
[DisplayName("删除")]
public async Task<bool> Delete(BaseIdListInput id)
{
return await _majorService.Delete(id.Ids);
@@ -61,6 +65,7 @@ public class MajorController
/// 获取列表
/// </summary>
/// <returns></returns>
[DisplayName("获取列表")]
public async Task<SqlSugarPagedList<MajorDto>> GetPageList(MajorSearch search)
{
return await _majorService.GetPageList(search);
@@ -71,6 +76,7 @@ public class MajorController
/// </summary>
/// <param name="search"></param>
/// <returns></returns>
[DisplayName("获取列表不分页")]
public async Task<List<MajorDto>> GetNoPageList(MajorSearch search)
{
return await _majorService.GetNoPageList(search);


+ 1
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/MobileController.cs View File

@@ -27,6 +27,7 @@ public class MobileController
/// 移动端获取专业系部班级列表
/// </summary>
/// <returns></returns>
[DisplayName("移动端获取专业系部班级列表")]
public async Task<List<MajorDepPersonSetModel>> GetMajorDep()
{
var dep = await _departmentService.GetNoPageList(new DepartmentSearch());


+ 97
- 7
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Business/WarnInfoController.cs View File

@@ -11,6 +11,9 @@ using SafeCampus.Web.Core.Controllers.Application.Business.Dto;
using System.Collections.Generic;
using SafeCampus.Application.Services.Business.CameraInfoService;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using SafeCampus.Core.Utils;
using MoYu.FriendlyException;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;

namespace SafeCampus.Web.Core.Controllers.Application.Business;
/// <summary>
@@ -82,7 +85,9 @@ public class WarnInfoController

if (config!=null)
{
model.SceneName = config.FirstOrDefault(x => x.Subset.Any(xx => xx.Code == model.AlarmType) && x.CameraId.Contains(model.CameraId))?.Name;
model.SceneName = config.FirstOrDefault(x =>
x.Subset.Any(xx => xx.Code == model.AlarmType) &&
x.Subset.Any(xx => xx.CameraId.Contains(model.CameraId)))?.Name;
}
try
{
@@ -126,7 +131,8 @@ public class WarnInfoController
if (config == null) return page;
foreach (var item in page.List)
{
item.SceneName = config.FirstOrDefault(x => x.Subset.Any(xx => xx.Code == item.AlarmType) && x.CameraId.Contains(item.CameraId))?.Name;
item.SceneName = config.FirstOrDefault(x =>
x.Subset.Any(xx => xx.Code == item.AlarmType) && x.Subset.Any(xx=>xx.CameraId.Contains(item.CameraId)))?.Name;
}
return page;
}
@@ -140,11 +146,17 @@ public class WarnInfoController
list = _simpleCacheService.Get<List<WarnGroupInfo>>(SafeCampusConst.WarnGroup);
if (list != null)
{
if (!string.IsNullOrEmpty(cameraId))
foreach (var item in list)
{
return list.Where(x => x.CameraId.Contains(cameraId)).ToList();
if (item.PushUserId.HasValue)
{
var user = await _sysUserService.Detail(new BaseIdInput { Id = item.PushUserId.Value });
item.PushUserName = user.Name;
item.PushPhone = user.Phone;
}
}
return list;
return !string.IsNullOrEmpty(cameraId) ? list.Where(x => x.CameraId.Contains(cameraId)).ToList() : list;
}
var basePath = AppContext.BaseDirectory;//获取项目目录
var json = basePath.CombinePath("SeedData", "Json", "WarnGroup.json");//获取文件路径
@@ -164,12 +176,31 @@ public class WarnInfoController
foreach (var item in jsonList)
{
var model = oldlist.FirstOrDefault(x => x.Code == item.Code);
if (model != null) model.Subset = item.Subset;
if (model != null)
{
model.Subset = item.Subset;
model.CameraId=item.Subset.Select(x=>x.CameraId).SelectMany(x=>x).ToList();
model.CameraName=item.Subset.Select(x=>x.CameraName).SelectMany(x=>x).ToList();
}
}
_simpleCacheService.Set(SafeCampusConst.WarnGroup, oldlist);
return true;
}
/// <summary>
/// 根据预警分组设置推送人
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<bool> SetPushPersonByWarn(SetPushPersonWarnInput input)
{
var warn = _simpleCacheService.Get<List<WarnGroupInfo>>(SafeCampusConst.WarnGroup);
var warnGroupInfo = warn.FirstOrDefault(x => x.Code == input.WarnCode);
if (warnGroupInfo != null) warnGroupInfo.PushUserId = input.UserId;
_simpleCacheService.Set(SafeCampusConst.WarnGroup, warn);
return true;
//return await _cameraInfoService.BatchSetPushPersonByWarn(input);
}
/// <summary>
/// 关联摄像头和告警分组
/// </summary>
/// <param name="input"></param>
@@ -229,6 +260,25 @@ public class WarnInfoController
ConfigValue = push.DaySum.ToString()
});
}
var sysConfigInterval = await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE, BizConfigConst.BIZ_SMS_INTERVAL);
if (sysConfigInterval != null)
{
await _configService.Edit(new ConfigEditInput
{
Category = CateGoryConst.CONFIG_BIZ_DEFINE,
ConfigKey = BizConfigConst.BIZ_SMS_INTERVAL,
ConfigValue = push.Interval.ToString()
});
}
else
{
await _configService.Add(new ConfigAddInput
{
Category = CateGoryConst.CONFIG_BIZ_DEFINE,
ConfigKey = BizConfigConst.BIZ_SMS_INTERVAL,
ConfigValue = push.Interval.ToString()
});
}
return true;
}
/// <summary>
@@ -237,12 +287,14 @@ public class WarnInfoController
/// <returns></returns>
public async Task<dynamic> GetWarnPushSetting()
{
var sysConfigInterval= await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE, BizConfigConst.BIZ_SMS_INTERVAL);
var configPush = new ConfigPush
{
PushState = (await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE, BizConfigConst.BIZ_SMS_STATES))
.ConfigValue.ToBoolean(),
DaySum = (await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE, BizConfigConst.BIZ_SMS_STATES_DAY))
.ConfigValue.ToInt()
.ConfigValue.ToInt(),
Interval = sysConfigInterval==null?0: sysConfigInterval.ConfigValue.ToInt()
};
return configPush;
}
@@ -443,4 +495,42 @@ public class WarnInfoController
}
return list.Where(x=>x.Count>10).OrderByDescending(x=>x.Day).ToList();
}
/// <summary>
/// 获取订阅配置
/// </summary>
/// <param name="code"></param>
/// <param name="subsetCode"></param>
/// <returns></returns>
public async Task<dynamic> GetFuncConf(string subsetCode)
{
var appSettings = App.GetOptionsMonitor<AppInfoOptions>();
var str = await $"{appSettings.SXAPIURL}/dfield-api/ecology/func/v1/conf/query-paged"
.SetBody(new
{
token = _deepelephManager.GetToken(),
tenantCode = appSettings.TenantCode,
poiId = appSettings.PoiId,
pageIndex=1,
pageSize=1000
})
.SetContentType("application/json")
.PostAsAsync<string>();
var model = JsonConvert.DeserializeObject<JObject>(str);
var result=new List<dynamic>();
if ((bool)model["success"])
{
var list = model["data"].Where(x => x["funcType"].ToString().Contains(subsetCode));
foreach (var item in list)
{
var ids = item["cameraIds"];
var name = item["cameras"].ToString().Split('、');
for (int i = 0; i < name.Length; i++)
{
result.Add(new { id = ids[i].ToString(), name = name[i] });
}
}
return result;
}
throw Oops.Oh(model["message"].ToString());
}
}

+ 15
- 6
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/LargeScreen/LargeScreenController.cs View File

@@ -42,10 +42,9 @@ public class LargeScreenController
private readonly IPersonSetInfoService _personSetInfoService;
private readonly IMajorService _majorService;
private readonly IDepartmentService _departmentService;
private readonly ISMSUtilService _msUtilService;


public LargeScreenController(IPersonInfoService personInfoService, ICameraGroupService cameraGroupService, IWarnInfoService warnInfoService, ISimpleCacheService simpleCacheService, IAttendanceService attendanceService, IBuildingService buildingService, IDormitoryService dormitoryService, IConfigService configService, IClassRoomCallTaskService classRoomCallTaskService, IClassRoomCallService classRoomCallService, IDeepelephManager deepelephManager, IPersonSetInfoService personSetInfoService, IMajorService majorService, IDepartmentService departmentService, ISMSUtilService msUtilService)
public LargeScreenController(IPersonInfoService personInfoService, ICameraGroupService cameraGroupService, IWarnInfoService warnInfoService, ISimpleCacheService simpleCacheService, IAttendanceService attendanceService, IBuildingService buildingService, IDormitoryService dormitoryService, IConfigService configService, IClassRoomCallTaskService classRoomCallTaskService, IClassRoomCallService classRoomCallService, IDeepelephManager deepelephManager, IPersonSetInfoService personSetInfoService, IMajorService majorService, IDepartmentService departmentService)
{
_personInfoService = personInfoService;
_cameraGroupService = cameraGroupService;
@@ -61,7 +60,6 @@ public class LargeScreenController
_personSetInfoService = personSetInfoService;
_majorService = majorService;
_departmentService = departmentService;
_msUtilService = msUtilService;
}

/// <summary>
@@ -107,7 +105,6 @@ public class LargeScreenController
warnGroupSubset.Value = warnlist.Count(x => x.AlarmType == warnGroupSubset.Code);
if (warnGroupSubset.Value==0)
{

warnGroupSubset.Value = r.Next(1, 5);
}
}
@@ -339,9 +336,21 @@ public class LargeScreenController
return await _departmentService.GetNoPageList(new DepartmentSearch());
}

public async Task<bool> SmsTest(string phone,bool issucc,string content)
public async Task<bool> SmsTest(string cameraId)
{
await _msUtilService.CreateSMSLog(phone, issucc, content);
var model = new WarnInfoDto
{
Tick = DateTime.Now,
TenantCode = "quanjiang",
PoiId = "DEMO00001",
AlarmId = "601838f653d34b94842f7b14c7194a07",
AlarmType = "hat_detect",
AlarmTypeDesc = "未戴帽子检测",
CameraId = cameraId,
SnapshotUrl = "/Files/alarmImg/601838f653d34b94842f7b14c7194a07.jpg",
WarnHand = 0,
};
await _warnInfoService.Add(model);
return true;
}
}

+ 1
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Violation/VioAnalysisController.cs View File

@@ -27,6 +27,7 @@ public class VioAnalysisController
//场景报告导出
//导出查询条件
//生成word
[DisplayName("场景报告导出")]
public async Task<IActionResult> ReportExport(ReportExportInput input)
{
//var categories = new List<string>() { "Category A", "Category B", "Category C", "Category D" };


+ 9
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/Application/Violation/VioPortraitSummary.cs View File

@@ -30,6 +30,7 @@ public class VioPortraitSummary
/// 获取学生性别
/// </summary>
/// <returns></returns>
[DisplayName("获取学生性别")]
public async Task<dynamic> GetStudentSex()
{
var label = new List<string> { "男", "女" };
@@ -43,6 +44,7 @@ public class VioPortraitSummary
/// 获取学生年龄
/// </summary>
/// <returns></returns>
[DisplayName("获取学生年龄")]
public async Task<dynamic> GetStudentAge()
{
return await _personInfoService.GetAge();
@@ -52,6 +54,7 @@ public class VioPortraitSummary
/// 获取地理位置
/// </summary>
/// <returns></returns>
[DisplayName("获取地理位置")]
public async Task<dynamic> GetAddress()
{
var random = new Random();
@@ -65,6 +68,7 @@ public class VioPortraitSummary
/// 获取属性标签
/// </summary>
/// <returns></returns>
[DisplayName("获取属性标签")]
public async Task<dynamic> GetStudentAttr()
{
var random = new Random();
@@ -77,6 +81,7 @@ public class VioPortraitSummary
/// 学生--告警分类统计
/// </summary>
/// <returns></returns>
[DisplayName("告警分类统计")]
public async Task<dynamic> GetStudentDetail(SummarySeach seach)
{
var random = new Random();
@@ -88,6 +93,7 @@ public class VioPortraitSummary
/// 学生--出勤情况
/// </summary>
/// <returns></returns>
[DisplayName("出勤情况")]
public async Task<dynamic> Attendance(SummarySeach seach)
{
switch (seach.SearchType)
@@ -106,6 +112,7 @@ public class VioPortraitSummary
/// 学生--出校
/// </summary>
/// <returns></returns>
[DisplayName("出校")]
public async Task<dynamic> OutsideSchool(SummarySeach seach)
{
var camera = await _cameraInfoService.GetPageList(new CameraSearch { GroupId = ApplicationConst.XXDM, PageSize = 1000, PageNum = 1 });
@@ -156,6 +163,7 @@ public class VioPortraitSummary
/// 学生--图书馆
/// </summary>
/// <returns></returns>
[DisplayName("图书馆")]
public async Task<dynamic> Library(SummarySeach seach)
{
var data= await StudentSummary(seach, ApplicationConst.TSG);
@@ -165,6 +173,7 @@ public class VioPortraitSummary
/// 学生--食堂
/// </summary>
/// <returns></returns>
[DisplayName("食堂")]
public async Task<dynamic> Canteen(SummarySeach seach)
{
var data= await StudentSummary(seach, ApplicationConst.ST);


+ 66
- 0
SafeCampus.API/SafeCampus.Web.Core/Controllers/System/Auth/ActivateAuthController.cs View File

@@ -0,0 +1,66 @@
using System.Management;
using System.Text;
using MoYu.FriendlyException;
using SafeCampus.Core.Utils;
using SafeCampus.Core.Utils.Machine;
using SharpCompress.Common;

namespace SafeCampus.Web.Core;
/// <summary>
/// 激活授权控制器
/// </summary>
[ApiDescriptionSettings(Tag = "激活授权控制器")]
[Route("sys/auth/activate")]
[AllowAnonymous]
public class ActivateAuthController : BaseController
{
private readonly IMachineUtil _machineUtil;

public ActivateAuthController(IMachineUtil machineUtil)
{
_machineUtil = machineUtil;
}

/// <summary>
/// 获取机器码
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public async Task<dynamic> MachineCode()
{
string cpuId = await _machineUtil.GetProcessorId();
string diskId = await _machineUtil.GetDiskId();
string macAddress = await _machineUtil.GetMacAddress();
var hardwareId = $"{cpuId}${diskId}${macAddress}"; // 可以用其他硬件信息替代
var machineCode = CryptogramUtil.Sm4Encrypt(hardwareId);
return machineCode;
}
/// <summary>
/// 激活系统
/// </summary>
/// <param name="activationCode"></param>
/// <returns></returns>
public async Task<dynamic> Activation([FromBody]string activationCode)
{
var yuanwen =CryptogramUtil.Sm2Decrypt(activationCode);
var chaifen = yuanwen.Split('$');
if (chaifen.Length!=4)
{
throw Oops.Oh("激活信息不完整");
}
var isCorrect = DateTime.TryParse(chaifen[3],out var activeTime);
if (!isCorrect)
{
throw Oops.Oh("激活时间不正确");
}
if (chaifen[0] != await _machineUtil.GetProcessorId() || chaifen[1] != await _machineUtil.GetDiskId() || chaifen[2]!=await _machineUtil.GetMacAddress() || activeTime <= DateTime.Now)
{
throw Oops.Oh("激活信息不正确");
}
var filePath = Path.Combine(App.HostEnvironment.ContentRootPath, "activation.config");
await using StreamWriter writer = new StreamWriter(filePath);
// 写入文本
await writer.WriteLineAsync(CryptogramUtil.Sm4Encrypt(activationCode));
return true;
}
}

+ 1
- 11
SafeCampus.API/SafeCampus.Web.Core/Controllers/System/Auth/SessionController.cs View File

@@ -1,14 +1,4 @@

//








namespace SafeCampus.Web.Core;
namespace SafeCampus.Web.Core;

/// <summary>
/// 会话管理控制器


+ 1
- 11
SafeCampus.API/SafeCampus.Web.Core/Controllers/System/Organization/UserController.cs View File

@@ -1,14 +1,4 @@

//








namespace SafeCampus.Web.Core;
namespace SafeCampus.Web.Core;

/// <summary>
/// 用户管理控制器


+ 62
- 0
SafeCampus.API/SafeCampus.Web.Core/Filter/SystemAuthorizeMiddleware.cs View File

@@ -0,0 +1,62 @@
using Microsoft.AspNetCore.Http;
using MoYu.FriendlyException;
using SafeCampus.Core.Utils;
using SafeCampus.Core.Utils.Machine;
using SharpCompress.Common;
namespace SafeCampus.Web.Core;

public class SystemAuthorizeMiddleware
{
private readonly RequestDelegate _next;
private readonly IMachineUtil _machineUtil;

public SystemAuthorizeMiddleware(RequestDelegate next, IMachineUtil machineUtil)
{
_next = next;
_machineUtil = machineUtil;
}
// 排除不需要授权验证的接口
private static readonly string[] ExcludedPaths = new[]
{
"/sys/auth/activate/activation",
"/sys/auth/activate/machinecode",
};
public async Task InvokeAsync(HttpContext context)
{
var path = context.Request.Path.ToString().ToLower();
// 排除不需要授权验证的接口
if (ExcludedPaths.Contains(path))
{
await _next(context);
return;
}
var filePath = Path.Combine(App.HostEnvironment.ContentRootPath, "activation.config");
var msg = "";
if (File.Exists(filePath))
{
var activationCode = await File.ReadAllTextAsync(filePath);
var yuanwen1 = CryptogramUtil.Sm4Decrypt(activationCode);
var yuanwen2 = CryptogramUtil.Sm2Decrypt(yuanwen1);
if (!string.IsNullOrEmpty(yuanwen2))
{
var chaifen = yuanwen2.Split('$');
var isCorrect = DateTime.TryParse(chaifen[3], out var activeTime);
if (chaifen.Length == 4 && isCorrect && chaifen[0] == await _machineUtil.GetProcessorId() && chaifen[1] == await _machineUtil.GetDiskId() &&
chaifen[2] == await _machineUtil.GetMacAddress() && activeTime > DateTime.Now)
{
// 调用下一个中间件
await _next(context);
return;
}
}
msg = "授权已过期,请联系管理员授权";
}
else
msg = "请联系管理员授权";
var data = new { message = msg }; // 创建一个数据对象
var json = JsonConvert.SerializeObject(data);
context.Response.StatusCode = StatusCodes.Status421MisdirectedRequest;
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(json);
}
}

+ 1
- 0
SafeCampus.API/SafeCampus.Web.Core/Handlers/JwtHandler.cs View File

@@ -120,6 +120,7 @@ public class JwtHandler : AppAuthorizeHandler
return false;//直接没权限
}

//return true;
//获取角色授权特性
var isRolePermission = httpContext.GetMetadata<RolePermissionAttribute>();
if (isRolePermission != null)


+ 24
- 0
SafeCampus.API/SafeCampus.Web.Core/Job/CameraSyncJob.cs View File

@@ -0,0 +1,24 @@
using Microsoft.Extensions.Logging;
using MoYu.Schedule;
using SafeCampus.Application.Services.Business.CameraInfoService;

namespace SafeCampus.Web.Core.Job;

public class CameraSyncJob:IJob
{
private readonly ICameraInfoService _cameraInfoService;
private readonly ILogger<CameraSyncJob> _logger;

public CameraSyncJob(ICameraInfoService cameraInfoService, ILogger<CameraSyncJob> logger)
{
_cameraInfoService = cameraInfoService;
_logger = logger;
}

public Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
{
//await _cameraInfoService.DataSync();
_logger.LogInformation($"{context}");
return Task.CompletedTask;
}
}

+ 40
- 1
SafeCampus.API/SafeCampus.Web.Core/SafeCampus.Web.Core.xml View File

@@ -188,7 +188,7 @@
摄像头管理接口
</summary>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Business.CameraInfoController.DataSync">
<member name="M:SafeCampus.Web.Core.Controllers.Application.Business.CameraInfoController.Dat">
<summary>
数据同步
</summary>
@@ -720,6 +720,11 @@
当日预警条数
</summary>
</member>
<member name="P:SafeCampus.Web.Core.Controllers.Application.Business.Dto.ConfigPush.Interval">
<summary>
推送间隔(分钟)
</summary>
</member>
<member name="P:SafeCampus.Web.Core.Controllers.Application.Business.Dto.Person.PersonDfieDfie.PersonSetId">
<summary>
底库编码
@@ -1166,6 +1171,13 @@
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Business.WarnInfoController.SetPushPersonByWarn(SafeCampus.Application.Services.Business.CameraInfoService.SetPushPersonWarnInput)">
<summary>
根据预警分组设置推送人
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Business.WarnInfoController.SetWarnGroupCamera(SafeCampus.Web.Core.Controllers.Application.Business.Dto.ConfigJsonCamera)">
<summary>
关联摄像头和告警分组
@@ -1227,6 +1239,14 @@
</summary>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.Controllers.Application.Business.WarnInfoController.GetFuncConf(System.String)">
<summary>
获取订阅配置
</summary>
<param name="code"></param>
<param name="subsetCode"></param>
<returns></returns>
</member>
<member name="T:SafeCampus.Web.Core.Controllers.Application.LargeScreen.LargeScreenController">
<summary>
大屏控制器
@@ -1788,6 +1808,25 @@
<param name="input"></param>
<returns></returns>
</member>
<member name="T:SafeCampus.Web.Core.ActivateAuthController">
<summary>
激活授权控制器
</summary>
</member>
<member name="M:SafeCampus.Web.Core.ActivateAuthController.MachineCode">
<summary>
获取机器码
</summary>
<param name="input"></param>
<returns></returns>
</member>
<member name="M:SafeCampus.Web.Core.ActivateAuthController.Activation(System.String)">
<summary>
激活系统
</summary>
<param name="activationCode"></param>
<returns></returns>
</member>
<member name="T:SafeCampus.Web.Core.AuthBController">
<summary>
B端登录控制器


+ 17
- 3
SafeCampus.API/SafeCampus.Web.Core/Startup.cs View File

@@ -1,5 +1,9 @@
using MoYu.DependencyInjection;
using MoYu.Schedule;
using SafeCampus.Application.Manager.DeepelephManager;
using SafeCampus.Core.Utils.Machine;
using SafeCampus.Web.Core.Job;

namespace SafeCampus.Web.Core;

/// <summary>
@@ -19,8 +23,7 @@ public class Startup : AppStartup
services.AddComponent<WebSettingsComponent>();
//gip压缩
services.AddComponent<GzipCompressionComponent>();
//定时任务
//services.AddSchedule();
services.AddSingleton<IMachineUtil, MachineUtil>();
//添加控制器相关
services.AddControllers().AddNewtonsoftJson(options => //配置json
{
@@ -39,6 +42,14 @@ public class Startup : AppStartup
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
});
//定时任务
//services.AddSchedule();
services.AddSchedule(options =>
{
//注册作业,并配置作业触发器
options.AddJob<CameraSyncJob>("摄像头同步",Triggers.DailyAt(2)); // 表示每天2点执行
//options.AddJob<CameraSyncJob>("摄像头同步", Triggers.SecondlyAt( 10, 20 )); // 表示每天2点执行
});
services.AddRemoteRequest();
services.AddSignalR();
}
@@ -60,7 +71,7 @@ public class Startup : AppStartup
}
//启动Web设置Configure组件
app.UseComponent<WebSettingsApplicationComponent>(env);
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
@@ -96,7 +107,9 @@ public class Startup : AppStartup
app.UseAuthentication();//认证
app.UseAuthorization();//授权
app.UseInject(string.Empty);
app.UseScheduleUI();//定时任务看板
app.UseForwardedHeaders();//Nginx代理的话获取真实IP
app.UseMiddleware<SystemAuthorizeMiddleware>();
app.UseEndpoints(endpoints =>
{
// 注册集线器
@@ -104,6 +117,7 @@ public class Startup : AppStartup

endpoints.MapControllers();
});
var path = Path.Combine(Directory.GetCurrentDirectory(), "Files");
if (!Directory.Exists(path))
{


+ 1
- 1
SafeCampus.API/SafeCampus.Web.Entry/Properties/PublishProfiles/FolderProfile.pubxml.user View File

@@ -5,7 +5,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<Project>
<PropertyGroup>
<_PublishTargetUrl>F:\Project\QJKJ\SafeCampus\SafeCampus.API\SafeCampus.Web.Entry\bin\Release\net6.0\publish\</_PublishTargetUrl>
<History>True|2024-11-19T08:11:53.2744549Z;True|2024-10-24T09:50:55.5191427+08:00;True|2024-10-24T09:34:12.7696084+08:00;True|2024-10-23T10:41:37.0558539+08:00;True|2024-10-23T09:28:31.4313071+08:00;True|2024-10-23T09:26:31.5501719+08:00;True|2024-10-23T09:23:51.0582343+08:00;True|2024-10-23T09:06:44.5849207+08:00;True|2024-10-22T13:08:17.1569031+08:00;True|2024-10-22T09:42:47.5945039+08:00;True|2024-10-21T17:29:20.3317104+08:00;True|2024-10-21T16:46:26.6984879+08:00;True|2024-10-21T10:12:44.0443975+08:00;True|2024-10-10T10:57:40.0075220+08:00;True|2024-10-10T10:02:41.0397715+08:00;True|2024-10-09T17:39:11.0140701+08:00;True|2024-10-09T17:18:07.5988076+08:00;True|2024-10-09T17:10:57.0818759+08:00;True|2024-10-09T17:08:07.1773134+08:00;True|2024-10-09T16:38:21.4832776+08:00;True|2024-10-09T16:31:58.3589164+08:00;True|2024-10-09T16:10:50.3337773+08:00;True|2024-10-09T10:39:55.8405182+08:00;True|2024-10-08T17:55:12.0035540+08:00;True|2024-10-08T16:48:00.5056466+08:00;True|2024-10-08T16:27:40.5071980+08:00;True|2024-10-08T16:24:26.2664694+08:00;True|2024-10-08T15:41:46.6016263+08:00;True|2024-09-30T17:07:19.0903067+08:00;True|2024-09-30T10:34:23.6203647+08:00;True|2024-09-29T14:44:27.0928205+08:00;True|2024-09-24T17:04:13.1154955+08:00;True|2024-09-23T14:58:29.0998917+08:00;True|2024-09-23T14:34:42.4664825+08:00;True|2024-09-23T14:34:14.9788969+08:00;True|2024-09-23T14:21:01.8969413+08:00;True|2024-09-23T14:17:25.6978104+08:00;True|2024-09-23T13:44:21.2948521+08:00;True|2024-09-23T13:42:29.2647186+08:00;True|2024-09-19T17:53:09.3428873+08:00;True|2024-09-19T17:47:47.8015573+08:00;True|2024-09-19T17:33:18.0038814+08:00;True|2024-09-19T17:13:16.6885326+08:00;True|2024-09-19T16:40:10.4911580+08:00;True|2024-09-19T15:32:43.5092007+08:00;True|2024-09-19T14:13:40.1278496+08:00;True|2024-09-19T11:00:03.7642790+08:00;True|2024-09-04T16:01:07.1761640+08:00;True|2024-09-04T15:47:33.3094448+08:00;True|2024-09-04T13:33:22.9396193+08:00;True|2024-08-30T13:27:03.2003529+08:00;True|2024-08-27T15:31:21.7026102+08:00;True|2024-08-20T11:12:26.7141701+08:00;True|2024-08-19T17:23:34.5703879+08:00;True|2024-08-19T15:55:28.3484786+08:00;True|2024-08-19T15:45:49.5623372+08:00;True|2024-08-19T14:56:17.7733738+08:00;True|2024-08-19T14:52:03.2782392+08:00;True|2024-08-19T14:10:57.7043528+08:00;True|2024-08-19T13:38:29.9236695+08:00;False|2024-08-19T13:29:18.8873264+08:00;True|2024-08-19T12:31:57.9280692+08:00;True|2024-08-19T11:50:36.7241244+08:00;True|2024-08-19T10:24:05.0018377+08:00;True|2024-08-19T10:23:30.0445364+08:00;True|2024-08-19T10:12:33.8316906+08:00;True|2024-08-19T10:10:48.0967630+08:00;True|2024-08-16T12:17:51.5743944+08:00;True|2024-08-16T11:36:15.1880346+08:00;True|2024-08-12T11:27:42.2864171+08:00;True|2024-08-09T14:54:42.9062124+08:00;True|2024-08-09T11:49:01.0339449+08:00;True|2024-08-09T11:43:21.9947939+08:00;True|2024-08-09T10:43:25.7641675+08:00;True|2024-08-08T15:23:17.0510180+08:00;True|2024-08-08T15:20:50.3450876+08:00;True|2024-08-08T11:06:43.0783261+08:00;True|2024-08-07T17:24:03.0780935+08:00;True|2024-08-07T17:20:50.6266614+08:00;True|2024-08-07T17:18:15.6367265+08:00;True|2024-08-06T17:31:40.3452266+08:00;True|2024-07-31T16:54:03.1890463+08:00;True|2024-07-30T17:11:33.2514194+08:00;True|2024-07-30T17:08:14.5888060+08:00;True|2024-07-30T09:56:08.6349163+08:00;True|2024-07-30T09:50:02.2368269+08:00;True|2024-07-29T16:20:12.3202393+08:00;True|2024-07-29T16:16:29.9634841+08:00;True|2024-07-29T16:09:51.7696392+08:00;True|2024-07-29T16:06:49.4145658+08:00;True|2024-07-29T15:58:50.6654249+08:00;True|2024-07-29T11:32:11.6206514+08:00;True|2024-07-29T11:26:26.1574563+08:00;True|2024-07-29T11:04:41.1896705+08:00;True|2024-07-29T10:38:38.4560275+08:00;True|2024-07-29T10:33:38.5288332+08:00;False|2024-07-29T10:33:21.0642261+08:00;False|2024-07-29T10:33:00.1005216+08:00;True|2024-07-29T09:54:59.2794860+08:00;True|2024-07-29T09:08:54.4899269+08:00;</History>
<History>True|2024-12-05T09:55:26.3520105Z;True|2024-12-05T16:16:25.4547843+08:00;True|2024-12-05T15:40:26.7141856+08:00;True|2024-12-05T15:10:10.8427444+08:00;True|2024-12-04T17:22:28.7226032+08:00;True|2024-12-04T16:48:08.7253345+08:00;True|2024-12-04T13:36:58.9261836+08:00;True|2024-12-04T11:25:09.0287420+08:00;True|2024-12-04T10:49:03.6405687+08:00;True|2024-12-03T17:23:27.3622111+08:00;True|2024-12-03T17:04:39.8598677+08:00;True|2024-12-03T16:51:32.9879069+08:00;True|2024-12-03T16:43:48.1356230+08:00;True|2024-12-03T15:51:47.8248313+08:00;True|2024-11-22T11:28:53.1271820+08:00;True|2024-11-20T17:52:54.4158858+08:00;True|2024-11-20T17:26:43.3032818+08:00;True|2024-11-20T17:00:52.2470231+08:00;True|2024-11-20T13:48:46.8664181+08:00;True|2024-11-19T16:41:39.5873421+08:00;True|2024-11-19T16:11:53.2744549+08:00;True|2024-10-24T09:50:55.5191427+08:00;True|2024-10-24T09:34:12.7696084+08:00;True|2024-10-23T10:41:37.0558539+08:00;True|2024-10-23T09:28:31.4313071+08:00;True|2024-10-23T09:26:31.5501719+08:00;True|2024-10-23T09:23:51.0582343+08:00;True|2024-10-23T09:06:44.5849207+08:00;True|2024-10-22T13:08:17.1569031+08:00;True|2024-10-22T09:42:47.5945039+08:00;True|2024-10-21T17:29:20.3317104+08:00;True|2024-10-21T16:46:26.6984879+08:00;True|2024-10-21T10:12:44.0443975+08:00;True|2024-10-10T10:57:40.0075220+08:00;True|2024-10-10T10:02:41.0397715+08:00;True|2024-10-09T17:39:11.0140701+08:00;True|2024-10-09T17:18:07.5988076+08:00;True|2024-10-09T17:10:57.0818759+08:00;True|2024-10-09T17:08:07.1773134+08:00;True|2024-10-09T16:38:21.4832776+08:00;True|2024-10-09T16:31:58.3589164+08:00;True|2024-10-09T16:10:50.3337773+08:00;True|2024-10-09T10:39:55.8405182+08:00;True|2024-10-08T17:55:12.0035540+08:00;True|2024-10-08T16:48:00.5056466+08:00;True|2024-10-08T16:27:40.5071980+08:00;True|2024-10-08T16:24:26.2664694+08:00;True|2024-10-08T15:41:46.6016263+08:00;True|2024-09-30T17:07:19.0903067+08:00;True|2024-09-30T10:34:23.6203647+08:00;True|2024-09-29T14:44:27.0928205+08:00;True|2024-09-24T17:04:13.1154955+08:00;True|2024-09-23T14:58:29.0998917+08:00;True|2024-09-23T14:34:42.4664825+08:00;True|2024-09-23T14:34:14.9788969+08:00;True|2024-09-23T14:21:01.8969413+08:00;True|2024-09-23T14:17:25.6978104+08:00;True|2024-09-23T13:44:21.2948521+08:00;True|2024-09-23T13:42:29.2647186+08:00;True|2024-09-19T17:53:09.3428873+08:00;True|2024-09-19T17:47:47.8015573+08:00;True|2024-09-19T17:33:18.0038814+08:00;True|2024-09-19T17:13:16.6885326+08:00;True|2024-09-19T16:40:10.4911580+08:00;True|2024-09-19T15:32:43.5092007+08:00;True|2024-09-19T14:13:40.1278496+08:00;True|2024-09-19T11:00:03.7642790+08:00;True|2024-09-04T16:01:07.1761640+08:00;True|2024-09-04T15:47:33.3094448+08:00;True|2024-09-04T13:33:22.9396193+08:00;True|2024-08-30T13:27:03.2003529+08:00;True|2024-08-27T15:31:21.7026102+08:00;True|2024-08-20T11:12:26.7141701+08:00;True|2024-08-19T17:23:34.5703879+08:00;True|2024-08-19T15:55:28.3484786+08:00;True|2024-08-19T15:45:49.5623372+08:00;True|2024-08-19T14:56:17.7733738+08:00;True|2024-08-19T14:52:03.2782392+08:00;True|2024-08-19T14:10:57.7043528+08:00;True|2024-08-19T13:38:29.9236695+08:00;False|2024-08-19T13:29:18.8873264+08:00;True|2024-08-19T12:31:57.9280692+08:00;True|2024-08-19T11:50:36.7241244+08:00;True|2024-08-19T10:24:05.0018377+08:00;True|2024-08-19T10:23:30.0445364+08:00;True|2024-08-19T10:12:33.8316906+08:00;True|2024-08-19T10:10:48.0967630+08:00;True|2024-08-16T12:17:51.5743944+08:00;True|2024-08-16T11:36:15.1880346+08:00;True|2024-08-12T11:27:42.2864171+08:00;True|2024-08-09T14:54:42.9062124+08:00;True|2024-08-09T11:49:01.0339449+08:00;True|2024-08-09T11:43:21.9947939+08:00;True|2024-08-09T10:43:25.7641675+08:00;True|2024-08-08T15:23:17.0510180+08:00;True|2024-08-08T15:20:50.3450876+08:00;True|2024-08-08T11:06:43.0783261+08:00;True|2024-08-07T17:24:03.0780935+08:00;True|2024-08-07T17:20:50.6266614+08:00;True|2024-08-07T17:18:15.6367265+08:00;</History>
<LastFailureDetails />
</PropertyGroup>
</Project>

+ 1
- 0
SafeCampus.API/SafeCampus.Web.Entry/activation.config View File

@@ -0,0 +1 @@
95d57b99ef8f7324c716380d8b5bcd48b36d8001fd9a536435c0bef458e331c25bd0abae598a42eda2f3a23ae3fb3a1057ffc94098c44c511e0a13c914f63c058770d91e5de256b46791df6c5b399b5d00a5632ca1816a38c4386b3ea60b0a6f8bb2825930b81fc9a3e164503c612569afd346868358586160611e3a65cd09d06407ff55295e1a0c53086a6f4809537aba14ab70d3c4b0680322dfea46d8b995fce361c5b5d585addef49d27d56349edbde775e1947ee16397d7aa002e54efcc8b206f50373a23817b37690abe792e2ddc03b7b873a668399f2862b49f8c8cc9af9149d369517e04b16151c91c6794801cb06dce5bb8f3952ec7f2048386d6a95bb936de588cf0f22494c70035b0ff9d395d3702618901b59b5181ba1a3d9f31e20bb545dd9dbf12d46b92a1f37d9c0df526c94087dc1145866224fde5b5be80c606f57db12aca9edbc092dd901337f5b570a57fd7ed6b69ea6a2092d739ada05

+ 3
- 3
SafeCampus.API/SafeCampus.Web.Entry/appsettings.json View File

@@ -43,14 +43,14 @@
"SXAPIURL": "https://api.deepeleph.com",
"AppKey": "Pep50sPYdY",
"AppSecret": "36000f41-f13c-458b-a29b-59938359e58e",
"PoiId": "DEMO00001",
"PoiId": "001",
"TenantCode": "quanjiang",
"AlarmImg": "alarmImg",
"PersonImg": "personImg",
"AttendanceImg": "attendanceImg",
"RoomCallImg": "roomCallImg",
"CameraImg": "cameraImg",
"Python": "D:\\Program Files\\py39\\python.exe"
"Python": "D:\\Program Files\\py39\\python.exe",
},
//腾讯云短信配置
"TXSms": {
@@ -58,6 +58,6 @@
"SecretKey": "VjgMp1wax3sRjlVyB7l82mHXhfMmxsXw",
"SmsAppId": "1400949814",
"SmsSn": "北京泉江科技",
"VerificationCodeId": "1408635"
"VerificationCodeId": "2312567"
}
}

+ 6
- 0
SafeCampus.API/SafeCampus.sln View File

@@ -19,6 +19,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SafeCampus.Web.Core", "Safe
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SafeCampus.Web.Entry", "SafeCampus.Web.Entry\SafeCampus.Web.Entry.csproj", "{1EF2D216-7C7B-4128-A0FE-675D73D8EE32}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SafeAuthActivate", "SafeAuthActivate\SafeAuthActivate.csproj", "{2D8F3C53-47F5-4E8D-AE25-6E22C994F766}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -57,6 +59,10 @@ Global
{1EF2D216-7C7B-4128-A0FE-675D73D8EE32}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1EF2D216-7C7B-4128-A0FE-675D73D8EE32}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1EF2D216-7C7B-4128-A0FE-675D73D8EE32}.Release|Any CPU.Build.0 = Release|Any CPU
{2D8F3C53-47F5-4E8D-AE25-6E22C994F766}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2D8F3C53-47F5-4E8D-AE25-6E22C994F766}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2D8F3C53-47F5-4E8D-AE25-6E22C994F766}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2D8F3C53-47F5-4E8D-AE25-6E22C994F766}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE


||||||
x
 
000:0
Loading…
Cancel
Save