Browse Source

24小时一体机后端新建及工作台菜单,用户管理,单位管理,部门管理,角色管理,角色菜单,角色用户,预约接待,菜单管理接口新增

master
liujiaqiang 2 years ago
commit
91080ee029
  1. 25
      .dockerignore
  2. 3
      .filenesting.json
  3. 71
      .gitignore
  4. 43
      24Hour.sln
  5. 22
      24Hour/24Hour.csproj
  6. 7
      24Hour/24Hour.csproj.user
  7. 200
      24Hour/Controllers/Common/ReservationController.cs
  8. 243
      24Hour/Controllers/Common/StagingController.cs
  9. 24
      24Hour/Controllers/Common/WebSocketController.cs
  10. 189
      24Hour/Controllers/LoginController.cs
  11. 43
      24Hour/Controllers/WeatherForecastController.cs
  12. 1065
      24Hour/Controllers/system/SystemControllerController.cs
  13. 6
      24Hour/Elight.Entity.csproj.user
  14. 169
      24Hour/Program.cs
  15. 31
      24Hour/Properties/launchSettings.json
  16. 13
      24Hour/WeatherForecast.cs
  17. 8
      24Hour/appsettings.Development.json
  18. 32
      24Hour/appsettings.json
  19. 12
      24Hour/wwwroot/CaseFile/logs/Logs/ExceptionLog/20230613/10.log
  20. 78
      Elight.Entity/AppMode/App_ReceptionModel.cs
  21. 72
      Elight.Entity/AppMode/StagingModel.cs
  22. 54
      Elight.Entity/AppMode/StagingNumModel.cs
  23. 13
      Elight.Entity/Elight.Entity.csproj
  24. 68
      Elight.Entity/SystemModel/App_Sys_DepartModel.cs
  25. 113
      Elight.Entity/SystemModel/App_Sys_MenuModel.cs
  26. 60
      Elight.Entity/SystemModel/App_Sys_RoleMenuModel.cs
  27. 60
      Elight.Entity/SystemModel/App_Sys_RoleModel.cs
  28. 60
      Elight.Entity/SystemModel/App_Sys_RoleUserModel.cs
  29. 69
      Elight.Entity/SystemModel/App_Sys_UnitModel.cs
  30. 138
      Elight.Entity/SystemModel/App_Sys_UserModel.cs
  31. 107
      Elight.Entity/SystemModel/Func_Dossier_LogRecordModel.cs
  32. 28
      Elight.Logic/CurrencyDelete.cs
  33. 18
      Elight.Logic/Elight.Logic.csproj
  34. 68
      Elight.Logic/Model/App_ReceptionInput.cs
  35. 52
      Elight.Logic/Model/StagingInput.cs
  36. 53
      Elight.Logic/Model/StagingNumInput.cs
  37. 43
      Elight.Logic/SystemModel/App_Sys_DepartInput.cs
  38. 87
      Elight.Logic/SystemModel/App_Sys_MenuInput.cs
  39. 34
      Elight.Logic/SystemModel/App_Sys_RoleInput.cs
  40. 31
      Elight.Logic/SystemModel/App_Sys_RoleMenuInput.cs
  41. 34
      Elight.Logic/SystemModel/App_Sys_RoleUserInput.cs
  42. 43
      Elight.Logic/SystemModel/App_Sys_UnitInput.cs
  43. 73
      Elight.Logic/SystemModel/App_Sys_UnitTree.cs
  44. 105
      Elight.Logic/SystemModel/App_Sys_UserInput.cs
  45. 59
      Elight.Logic/WriteSysLog.cs
  46. 101
      Elight.Utility/BasicAuthenticationHandler.cs
  47. 21
      Elight.Utility/Elight.Utility.csproj
  48. 58
      Elight.Utility/Encrypt/AES.cs
  49. 73
      Elight.Utility/Encrypt/Md5.cs
  50. 53
      Elight.Utility/Enum/CustomizedStatusCodeEnum.cs
  51. 60
      Elight.Utility/Enum/EnumExtension.cs
  52. 64
      Elight.Utility/Enum/LogLevel.cs
  53. 655
      Elight.Utility/Extensions/StringExtension.cs
  54. 166
      Elight.Utility/Paging.cs
  55. 48
      Elight.Utility/QueryResult.cs
  56. 61
      Elight.Utility/Result.cs
  57. 188
      Elight.Utility/TextWriter.cs
  58. 41
      Elight.Utility/User.cs
  59. 68
      Elight.Utility/WebSocketMiddleware.cs
  60. 258
      Elight.Utility/logs/LogService.cs
  61. 3
      README.md
  62. 4
      desktop.ini

25
.dockerignore

@ -0,0 +1,25 @@
**/.classpath
**/.dockerignore
**/.env
**/.git
**/.gitignore
**/.project
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/*.*proj.user
**/*.dbmdl
**/*.jfm
**/azds.yaml
**/bin
**/charts
**/docker-compose*
**/Dockerfile*
**/node_modules
**/npm-debug.log
**/obj
**/secrets.dev.yaml
**/values.dev.yaml
LICENSE
README.md

3
.filenesting.json

@ -0,0 +1,3 @@
{
"help":"https://go.microsoft.com/fwlink/?linkid=866610"
}

71
.gitignore vendored

@ -0,0 +1,71 @@
# ---> C
# Prerequisites
*.d
# Object files
*.o
*.ko
*.obj
*.elf
# Linker output
*.ilk
*.map
*.exp
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# Debug files
*.dSYM/
*.su
*.idb
*.pdb
# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.conf
/.vs
/24Hour/bin
/24Hour/obj
/Elight.Entity/bin
/Elight.Entity/obj
/Elight.Logic/bin
/Elight.Logic/obj
/Elight.Utility/bin
/Elight.Utility/obj
/Elight.Utility/Extension/ServiceConverter.cs
/24Hour/wwwroot/File
/24Hour/wwwroot/CaseFile/User
/24Hour/wwwroot/CaseFile/Detectionscheme/~$230301193901426.docx
/24Hour/wwwroot/CaseFile/Detectionscheme/20230301195021869.docx
/24Hour/wwwroot/CaseFile/Detectionscheme/20230301194942291.docx
/24Hour/wwwroot/CaseFile/Detectionscheme/20230301193901426.docx
/24Hour/24Hour.xml

43
24Hour.sln

@ -0,0 +1,43 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.3.32901.215
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "24Hour", "24Hour\24Hour.csproj", "{9CC60D58-CC75-4BF7-A854-3220E725CD8C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elight.Entity", "Elight.Entity\Elight.Entity.csproj", "{DC5487D6-C400-4D8A-B44C-F4BE05AA4659}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elight.Logic", "Elight.Logic\Elight.Logic.csproj", "{DE4F1117-9E0E-4570-885A-3E852CB96CB9}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Elight.Utility", "Elight.Utility\Elight.Utility.csproj", "{A5CD41A8-3970-4BE0-B8CB-E827C2B00D15}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{9CC60D58-CC75-4BF7-A854-3220E725CD8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9CC60D58-CC75-4BF7-A854-3220E725CD8C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9CC60D58-CC75-4BF7-A854-3220E725CD8C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9CC60D58-CC75-4BF7-A854-3220E725CD8C}.Release|Any CPU.Build.0 = Release|Any CPU
{DC5487D6-C400-4D8A-B44C-F4BE05AA4659}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DC5487D6-C400-4D8A-B44C-F4BE05AA4659}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DC5487D6-C400-4D8A-B44C-F4BE05AA4659}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DC5487D6-C400-4D8A-B44C-F4BE05AA4659}.Release|Any CPU.Build.0 = Release|Any CPU
{DE4F1117-9E0E-4570-885A-3E852CB96CB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DE4F1117-9E0E-4570-885A-3E852CB96CB9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DE4F1117-9E0E-4570-885A-3E852CB96CB9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DE4F1117-9E0E-4570-885A-3E852CB96CB9}.Release|Any CPU.Build.0 = Release|Any CPU
{A5CD41A8-3970-4BE0-B8CB-E827C2B00D15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A5CD41A8-3970-4BE0-B8CB-E827C2B00D15}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A5CD41A8-3970-4BE0-B8CB-E827C2B00D15}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A5CD41A8-3970-4BE0-B8CB-E827C2B00D15}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {DF93D9CD-387C-4698-B374-B03D65624202}
EndGlobalSection
EndGlobal

22
24Hour/24Hour.csproj

@ -0,0 +1,22 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>_24Hour</RootNamespace>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.16" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.83" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Elight.Entity\Elight.Entity.csproj" />
<ProjectReference Include="..\Elight.Logic\Elight.Logic.csproj" />
<ProjectReference Include="..\Elight.Utility\Elight.Utility.csproj" />
</ItemGroup>
</Project>

7
24Hour/24Hour.csproj.user

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Controller_SelectedScaffolderID>MvcControllerEmptyScaffolder</Controller_SelectedScaffolderID>
<Controller_SelectedScaffolderCategoryPath>root/Common/MVC/Controller</Controller_SelectedScaffolderCategoryPath>
</PropertyGroup>
</Project>

200
24Hour/Controllers/Common/ReservationController.cs

@ -0,0 +1,200 @@
using Elight.Entity;
using Elight.Logic;
using Elight.Utility;
using Elight.Utility.Code;
using Elight.Utility.Extensions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace _24Hour.Controllers.Common
{
[Authorize]
[ApiController]
[Route("api/reception")]
public class ReservationController : Controller
{
#region Identity
private readonly SqlSugarClient _db;//数据库
private readonly WriteSysLog _logs;//操作日志
App_Sys_UserModel _userdata = new App_Sys_UserModel();//当前用户
private readonly ILogger<LoginController> _logger;//日志
Result result = new Result();
public ReservationController(ILogger<LoginController> logger, SqlSugarClient db, WriteSysLog logs, User user)
{
_logger = logger;
_db = db;
_logs = logs;
_userdata = user.Userdata();
}
#endregion
#region 预约接待管理
/// <summary>
/// 预约接待分页查询
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
[Route("QueryReception")]
public async Task<Result> QueryReception(App_ReceptionInput Reception)
{
var Receptionlist = new List<App_ReceptionModel>();
//获取工作台信息
var app_staging = await _db.Queryable<StagingModel>().Where(w => w.IsDelete == 0).ToListAsync();
//查询预约接待记录
var list = await _db.Queryable<App_ReceptionModel>()
.WhereIF(!string.IsNullOrEmpty(Reception.depart), q => q.depart.Contains(Reception.depart))
.WhereIF(!string.IsNullOrEmpty(Reception.createusername), q => q.createusername.Contains(Reception.createusername))
.WhereIF(!string.IsNullOrEmpty(Reception.receptionId), q => q.receptionId.Contains(Reception.receptionId))
.WhereIF(Reception.state != null, q => q.state == Reception.state)
.Where(q => q.IsDelete == 0).ToPageListAsync(Reception.PageIndex, Reception.PageSize);
list.ForEach(q =>
{
var data = app_staging.Where(a => a.Id == q.receptionId).First();
if (data != null)
{
q.receptionId = data.title;
Receptionlist.Add(q);
}
});
var data = new QueryResult<App_ReceptionModel>(Reception, Receptionlist.OrderByDescending(q => q.creationtime).ToList());
result.IsSucceed = true;
result.result = data;
return result;
}
/// <summary>
/// 添加预约接待
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
[Route("AddReception")]
public async Task<Result> AddReception(App_ReceptionModel Receptiondata)
{
try
{
_db.BeginTran();
Receptiondata.Id = Guid.NewGuid().ToString();
Receptiondata.createuserId = _userdata.Id.ToString();
Receptiondata.createusername = _userdata.name;
var num = await _db.Insertable(Receptiondata).ExecuteCommandAsync();
_db.CommitTran();
if (num > 0)
{
result.IsSucceed = true;
result.result = "添加成功";
}
}
catch (System.Exception ex)
{
_db.RollbackTran();
result.IsSucceed = false;
result.Message = ex.Message;
}
_logs.WriteSysLogadd("预约管理", "添加预约接待信息", result,_db);
return result;
}
/// <summary>
/// 修改预约接待
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
[Route("UpdateReception")]
public async Task<Result> UpdateReception(App_ReceptionModel Receptiondata)
{
try
{
_db.BeginTran();
var num = await _db.Updateable(Receptiondata).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
_db.CommitTran();
if (num > 0)
{
result.IsSucceed = true;
result.result = "修改成功";
}
}
catch (System.Exception ex)
{
_db.RollbackTran();
result.IsSucceed = false;
result.Message = ex.Message;
}
_logs.WriteSysLogadd("预约管理", "修改预约接待", result,_db);
return result;
}
/// <summary>
/// 删除预约接待
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
[Route("DeleteReception")]
public async Task<Result> DeleteReception(CurrencyDelete Currency)
{
try
{
_db.BeginTran();
var Receptionlist = await _db.Queryable<App_ReceptionModel>().In(q => q.Id, Currency.id).ToListAsync();
Receptionlist.ForEach(q =>
{
q.IsDelete = 1;
});
var num = await _db.Updateable(Receptionlist).ExecuteCommandAsync();
_db.CommitTran();
if (num > 0)
{
result.IsSucceed = true;
result.result = "删除成功";
}
}
catch (System.Exception ex)
{
_db.RollbackTran();
result.IsSucceed = false;
result.Message = ex.Message;
}
_logs.WriteSysLogadd("预约管理", "删除预约接待", result,_db);
return result;
}
/// <summary>
/// 办理预约接待
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
[Route("UpdateReception_state")]
public async Task<Result> UpdateReception_state(CurrencyDelete Currency)
{
try
{
var Receptionlist = await _db.Queryable<App_ReceptionModel>().Where(q => Currency.id.Contains(q.Id)).ToListAsync();
Receptionlist.ForEach(q => { q.state = 1; });
_db.BeginTran();
var num = await _db.Updateable(Receptionlist).ExecuteCommandAsync();
_db.CommitTran();
if (num > 0)
{
result.IsSucceed = true;
result.result = "办理成功";
}
}
catch (System.Exception ex)
{
_db.RollbackTran();
result.IsSucceed = false;
result.Message = ex.Message;
}
_logs.WriteSysLogadd("预约管理", "办理预约接待", result,_db);
return result;
}
#endregion
}
}

243
24Hour/Controllers/Common/StagingController.cs

@ -0,0 +1,243 @@
using Elight.Entity;
using Elight.Logic;
using Elight.Utility;
using Elight.Utility.Code;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace _24Hour.Controllers.Common
{
[Authorize]
[ApiController]
[Route("api/Staging")]
public class StagingController : Controller
{
#region Identity
private readonly SqlSugarClient _db;//数据库
private readonly WriteSysLog _logs;//操作日志
App_Sys_UserModel _userdata = new App_Sys_UserModel();//当前用户
private readonly ILogger<LoginController> _logger;//日志
Result result = new Result();
public StagingController(ILogger<LoginController> logger, SqlSugarClient db, WriteSysLog logs, User user)
{
_logger = logger;
_db = db;
_logs = logs;
_userdata = user.Userdata();
}
#endregion
#region 工作台管理
/// <summary>
/// 工作台分页查询
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
[Route("QueryStaging")]
public async Task<Result> QueryStaging(StagingInput Staging)
{
var list = await _db.Queryable<StagingModel>()
.WhereIF(!string.IsNullOrEmpty(Staging.title), q => q.title.Contains(Staging.title))
.WhereIF(!string.IsNullOrEmpty(Staging.titletype), q => q.titletype.Contains(Staging.titletype))
.Where(q => q.IsDelete == 0).ToPageListAsync(Staging.PageIndex, Staging.PageSize);
var data = new QueryResult<StagingModel>(Staging, list);
result.IsSucceed = true;
result.result = data;
return result;
}
/// <summary>
/// 添加工作台
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
[Route("AddStaging")]
public async Task<Result> AddStaging(StagingModel Stagingdata)
{
try
{
_db.BeginTran();
Stagingdata.Id = Guid.NewGuid().ToString();
Stagingdata.userId = _userdata.Id.ToString();
Stagingdata.username = _userdata.name;
var num = await _db.Insertable(Stagingdata).ExecuteCommandAsync();
_db.CommitTran();
if (num > 0)
{
result.IsSucceed = true;
result.result = "添加成功";
}
}
catch (System.Exception ex)
{
_db.RollbackTran();
result.IsSucceed = false;
result.Message = ex.Message;
}
_logs.WriteSysLogadd("工作台添加", "添加工作台", result,_db);
return result;
}
/// <summary>
/// 修改工作台
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
[Route("UpdateStaging")]
public async Task<Result> UpdateStaging(StagingModel Stagingdata)
{
try
{
_db.BeginTran();
var num = await _db.Updateable(Stagingdata).IgnoreColumns(ignoreAllNullColumns: true).ExecuteCommandAsync();
_db.CommitTran();
if (num > 0)
{
result.IsSucceed = true;
result.result = "修改成功";
}
}
catch (System.Exception ex)
{
_db.RollbackTran();
result.IsSucceed = false;
result.Message = ex.Message;
}
_logs.WriteSysLogadd("工作台", "修改工作台信息", result,_db);
return result;
}
/// <summary>
/// 删除工作台
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpPost]
[Route("DeleteStaging")]
public async Task<Result> DeleteStaging(CurrencyDelete Currency)
{
try
{
_db.BeginTran();
var Staginglist = await _db.Queryable<StagingModel>().In(q => q.Id, Currency.id).ToListAsync();
Staginglist.ForEach(q =>
{
q.IsDelete = 1;
});
var num = await _db.Updateable(Staginglist).ExecuteCommandAsync();
_db.CommitTran();
if (num > 0)
{
result.IsSucceed = true;
result.result = "删除成功";
}
}
catch (System.Exception ex)
{
_db.RollbackTran();
result.IsSucceed = false;
result.Message = ex.Message;
}
_logs.WriteSysLogadd("工作台", "删除工作台信息", result,_db);
return result;
}
/// <summary>
/// 添加工作台使用次数
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[HttpGet]
[Route("AddStagingnum")]
public async Task<Result> AddStagingnum(string id)
{
try
{
var Stagingdata = await _db.Queryable<StagingModel>().Where(q => q.Id == id).FirstAsync();
if (Stagingdata != null)
{
var Stagingnumdata = await _db.Queryable<StagingNumModel>().Where(q => q.userId == _userdata.Id.ToString() && q.stagingId == id).FirstAsync();
if (Stagingnumdata != null)
{
Stagingnumdata.num++;
Stagingnumdata.creationtime = DateTime.Now;
_db.BeginTran();
var num = await _db.Updateable(Stagingnumdata).UpdateColumns(it => new { it.num }).ExecuteCommandAsync();
_db.CommitTran();
if (num > 0)
{
result.IsSucceed = true;
result.result = "";
}
}
else
{
_db.BeginTran();
var da = new StagingNumModel();
da.Id = Guid.NewGuid().ToString();
da.stagingId = id;
da.num = 1;
da.userId = _userdata.Id;
da.username = _userdata.name;
var num = _db.Insertable(da).ExecuteCommand();
_db.CommitTran();
if (num > 0)
{
result.IsSucceed = true;
result.result = "";
}
}
}
else
{
}
}
catch (System.Exception ex)
{
_db.RollbackTran();
result.IsSucceed = false;
result.Message = ex.Message;
}
_logs.WriteSysLogadd("工作台_使用数据", "更新或则添加使用次数", result,_db);
return result;
}
/// <summary>
/// 获取工作台信息
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("GetStaginglist")]
public async Task<Result> GetStaginglist()
{
var nulist = new List<StagingModel>();
var Staginglist = await _db.Queryable<StagingModel>().Where(q => q.IsDelete == 0).ToListAsync();
var Staginggrlist = Staginglist.GroupBy(q => q.titletype).Select(x => new { type = x.Key, data = x.ToList() }).ToList();
var Numlist = await _db.Queryable<StagingNumModel>().Where(q => q.IsDelete == 0 && q.userId == _userdata.Id).ToListAsync();
if (Numlist.Count > 0)
{
//获取常用工作台菜单
var da = Numlist.OrderByDescending(q => q.creationtime).Take(10).Select(q => q.stagingId);
var dalist = Staginglist.Where(q => da.Contains(q.Id)).ToList();
Staginggrlist.Insert(0, new { type = "我的", data = dalist });
//获取使用次数最多4个常用工作台菜单
var Numda = Numlist.OrderByDescending(q => q.num).Take(4).Select(q => q.stagingId);
nulist = Staginglist.Where(q => Numda.Contains(q.Id)).ToList();
nulist.AddRange(Staginglist.Where(q => !Numda.Contains(q.Id)).Take(4 - nulist.Count()).ToList());
}
else
{
nulist = Staginglist.Take(4).ToList();
}
result.IsSucceed = true;
result.result = new { typelist = Staginggrlist, numlist = nulist };
return result;
}
#endregion
}
}

24
24Hour/Controllers/Common/WebSocketController.cs

@ -0,0 +1,24 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace _24Hour.Controllers.Common
{
[Authorize]
public class WebSocketController : Controller
{
[HttpGet("/ws")]
public async Task WebSocketServer()
{
if (HttpContext.WebSockets.IsWebSocketRequest)
{
try
{
var socket = await HttpContext.WebSockets.AcceptWebSocketAsync();
}
catch (Exception ex)
{
}
}
}
}
}

189
24Hour/Controllers/LoginController.cs

@ -0,0 +1,189 @@
using Elight.Entity;
using Elight.Utility.Code;
using Elight.Utility.Encrypt;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.IdentityModel.Tokens;
using Newtonsoft.Json;
using SqlSugar;
using System.IdentityModel.Tokens.Jwt;
using System.Runtime.Serialization;
using System.Security.Claims;
using System.Text;
namespace _24Hour.Controllers
{
/// <summary>
/// 登录
/// </summary>
[ApiController]
[Route("api/Login")]
public class LoginController : ControllerBase
{
private readonly IConfiguration _configuration;
private readonly SqlSugarClient _db;//数据库
private readonly ILogger<LoginController> _logger;//日志
Result ret = new Result();
public LoginController(ILogger<LoginController> logger, SqlSugarClient db, IConfiguration configuration)
{
_logger = logger;
_db = db;
_configuration = configuration;
}
[HttpPost]
[Route("Login")]
public async Task<Result> Login(UserLogin login)
{
var Passmd5 = Md5.Encrypt32(login.Password).ToLower();
var date = await _db.Queryable<App_Sys_UserModel>().Where(q => q.IsDeleted == 0 && q.isdeactivate == 0 && q.phone == login.phone).FirstAsync();
if (date != null)
{
if (Passmd5 != date.Password)
{
ret.IsSucceed = false;
ret.Message = "账号或则密码错误!";
return ret;
}
else if (date.usertype == 1 && date.audit == null)
{
ret.IsSucceed = false;
ret.Message = "账号审核中!";
return ret;
}
else if (date.usertype == 1 && date.audit == 1)
{
ret.IsSucceed = false;
ret.Message = $"账号审核未通过,原因:{date.describe}!";
return ret;
}
else if (date.usertype == 0 && date.becurrent == 1)
{
ret.IsSucceed = false;
ret.Message = $"账号未授权无法登录,请联系管理员!";
return ret;
}
#region jwt生成token
var tokenHandler = new JwtSecurityTokenHandler();
var claims =new Claim[]
{
new Claim(ClaimTypes.UserData,JsonConvert.SerializeObject(date)),
};
var key = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(_configuration.GetSection("JwtConfiguration:Jwtkey").Value));
var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
//Token
var jwttoken = new JwtSecurityToken(
issuer: "https://127.0.0.1:7246",
audience: "https://127.0.0.1:7246",
claims: claims,
notBefore: DateTime.Now,
expires: DateTime.Now.AddDays(1),
signingCredentials: signingCredentials
);
//var token = new JwtSecurityTokenHandler().CreateToken(jwttoken);
var tokenString = new JwtSecurityTokenHandler().WriteToken(jwttoken);
ret.result = new
{
name = date.name,
sex = date.sex,
phone = date.phone,
photo = date.photo,
duties = date.duties,
unitCode = "",
department = "",
token = tokenString
};
#endregion
ret.IsSucceed = true;
}
else
{
ret.IsSucceed = false;
ret.Message = "账号不存在!";
}
return ret;
}
/// <summary>
/// 微信授权登录
/// </summary>
/// <param name="openId"></param>
/// <returns></returns>
[HttpGet]
[Route("WeChatLogin")]
public async Task<Result> WeChatLogin(string openId)
{
var date = await _db.Queryable<App_Sys_UserModel>().Where(q => q.IsDeleted == 0 && q.isdeactivate == 0 && q.wechatId == openId).FirstAsync();
if (date != null)
{
if (date.usertype == 1 && date.audit == null)
{
ret.IsSucceed = false;
ret.Message = "账号审核中!";
return ret;
}
else if (date.usertype == 1 && date.audit == 1)
{
ret.IsSucceed = false;
ret.Message = $"账号审核未通过,原因:{date.describe}!";
return ret;
}
else if (date.usertype == 0 && date.becurrent == 1)
{
ret.IsSucceed = false;
ret.Message = $"账号未授权无法登录,请联系管理员!";
return ret;
}
#region jwt生成token
var tokenHandler = new JwtSecurityTokenHandler();
var claims = new Claim[]
{
new Claim(ClaimTypes.UserData,JsonConvert.SerializeObject(date)),
};
var key = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(_configuration.GetSection("JwtConfiguration:Jwtkey").Value));
var signingCredentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
//Token
var jwttoken = new JwtSecurityToken(
issuer: "https://127.0.0.1:7246",
audience: "https://127.0.0.1:7246",
claims: claims,
notBefore: DateTime.Now,
expires: DateTime.Now.AddDays(1),
signingCredentials: signingCredentials
);
//var token = new JwtSecurityTokenHandler().CreateToken(jwttoken);
var tokenString = new JwtSecurityTokenHandler().WriteToken(jwttoken);
ret.result = new
{
name = date.name,
sex = date.sex,
phone = date.phone,
photo = date.photo,
duties = date.duties,
unitCode = "",
department = "",
token = tokenString
};
#endregion
ret.IsSucceed = true;
}
else
{
ret.IsSucceed = false;
ret.Message = "微信未授权!";
}
return ret;
}
}
public class UserLogin
{
[DataMember]
public string phone { get; set; }
/// <summary>
/// 登录密码
/// </summary>
[DataMember]
public string Password { get; set; }
}
}

43
24Hour/Controllers/WeatherForecastController.cs

@ -0,0 +1,43 @@
using Elight.Entity;
using Elight.Utility;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SqlSugar;
namespace _24Hour.Controllers
{
[Authorize]
[ApiController]
[Route("api/WeatherForecast")]
public class WeatherForecastController : ControllerBase
{
private readonly SqlSugarClient _db;
App_Sys_UserModel _userdata = new App_Sys_UserModel();//µ±Ç°Óû§
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger, SqlSugarClient db,User user)
{
_logger = logger;
_db = db;
_userdata = user.Userdata();
}
[HttpGet(Name = "GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
var ss = _userdata;
return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}
}

1065
24Hour/Controllers/system/SystemControllerController.cs

File diff suppressed because it is too large Load Diff

6
24Hour/Elight.Entity.csproj.user

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ShowAllFiles>true</ShowAllFiles>
</PropertyGroup>
</Project>

169
24Hour/Program.cs

@ -0,0 +1,169 @@
using Elight.Logic;
using Elight.Utility;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using SqlSugar;
using System.Data;
using System.Text;
#region builder
var builder = WebApplication.CreateBuilder(args);
var Configuration = builder.Configuration;
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
//添加Jwt验证设置
c.AddSecurityRequirement(new OpenApiSecurityRequirement()
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Id = "Bearer",
Type = ReferenceType.SecurityScheme
}
},
new List<string>()
}
});
c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "Value: Bearer {token}",
Name = "Authorization",
In = ParameterLocation.Header,
Type = SecuritySchemeType.ApiKey
});
});
// 添加身份验证服务
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = nameof(ResponseAuthenticationHandler); //401
options.DefaultForbidScheme = nameof(ResponseAuthenticationHandler); //403
})
.AddJwtBearer(options =>
{
// 配置JWT身份验证选项
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = Configuration.GetSection("JwtConfiguration:Issuer").Value,
ValidAudience = Configuration.GetSection("JwtConfiguration:Audience").Value,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration.GetSection("JwtConfiguration:Jwtkey").Value)),
ClockSkew = TimeSpan.Zero
};
////重点在于这里;判断是SignalR的路径(https://www.cnblogs.com/fger/p/11811190.html)
options.Events = new JwtBearerEvents
{
OnMessageReceived = (context) =>
{
if (!context.HttpContext.Request.Path.HasValue) return Task.CompletedTask;
//重点在于这里;判断是SignalR的路径
var accessToken = context.HttpContext.Request.Query["access_token"];
var path = context.HttpContext.Request.Path;
if (string.IsNullOrWhiteSpace(accessToken) || !path.StartsWithSegments("/ws")) return Task.CompletedTask;
context.Token = accessToken;
return Task.CompletedTask;
},
//此处为权限验证失败后触发的事件
OnChallenge = context =>
{
//此处代码为终止.Net Core默认的返回类型和数据结果,这个很重要哦,必须
context.HandleResponse();
//自定义自己想要返回的数据结果,我这里要返回的是Json对象,通过引用Newtonsoft.Json库进行转换
var payload = new { StatusCode = 0, Message = "身份认证失败!" };
//自定义返回的数据类型
context.Response.ContentType = "application/json";
//自定义返回状态码,默认为401 我这里改成 200
context.Response.StatusCode = StatusCodes.Status200OK;
//context.Response.StatusCode = StatusCodes.Status401Unauthorized;
//输出Json数据结果
context.Response.WriteAsync(Convert.ToString(payload));
return Task.FromResult(0);
}
};
}).AddScheme<AuthenticationSchemeOptions, ResponseAuthenticationHandler>(nameof(ResponseAuthenticationHandler), o => { });
builder.Services.AddAuthorization();
builder.Services.AddHttpContextAccessor();
builder.Services.TryAddSingleton<User, User>(); //jwt
builder.Services.TryAddSingleton<WriteSysLog, WriteSysLog>(); //WriteSysLog
builder.Services.AddScoped<SqlSugarClient>(sp =>
{
var connectionString = Configuration.GetSection("ConnectionStrings:MySQLConnString").Value;
var db = new SqlSugarClient(new ConnectionConfig
{
ConnectionString = connectionString,
DbType = SqlSugar.DbType.MySql,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute
});
return db;
});
#endregion
#region APP
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
//路由
app.UseRouting();
app.UseAuthentication(); // 启用身份验证中间件
app.UseAuthorization(); // 启用授权中间件
//app.MapControllers();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
#region swagger
app.UseSwagger();// 启用Swagger中间件
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
c.RoutePrefix = string.Empty;
});
#endregion
#region websockets配置
app.UseWebSockets(new WebSocketOptions
{
KeepAliveInterval = TimeSpan.FromMinutes(120)
});
//app.UseMiddleware<WebSocketMiddleware>();
#endregion
app.Run();
#endregion

31
24Hour/Properties/launchSettings.json

@ -0,0 +1,31 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:54036",
"sslPort": 44381
}
},
"profiles": {
"_24Hour": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:7246",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

13
24Hour/WeatherForecast.cs

@ -0,0 +1,13 @@
namespace _24Hour
{
public class WeatherForecast
{
public DateTime Date { get; set; }
public int TemperatureC { get; set; }
public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
public string? Summary { get; set; }
}
}

8
24Hour/appsettings.Development.json

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

32
24Hour/appsettings.json

@ -0,0 +1,32 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DBType": "MySQL",
"MySQLConnString": "server=192.168.0.251;Database=equipmentrearend;Uid=root;Pwd=sa@admin;Allow User Variables=True;",
},
//JwtConfig
"JwtConfiguration": {
/*JwtConfig Issuer=http://127.0.0.1:api*/
//
"Issuer": "https://127.0.0.1:7246",
/* JwtConfig Audience=http://127.0.0.1:api*/
//
"Audience": "https://127.0.0.1:7246",
//RefreshToken
"RefreshTokenAudience": null,
//Key
"Jwtkey": "ertJKl#521*a@790asD&1#",
//() 120 = 24
"Expires": 1440,
//RefreshToken() 1440 = 1
"RefreshTokenExpires": 1440,
//
"ClockSkew": 1
}
}

12
24Hour/wwwroot/CaseFile/logs/Logs/ExceptionLog/20230613/10.log

@ -0,0 +1,12 @@
日志时间:2023-06-13 10:49:46
************************Exception Start********************************
Exception Remark:添加数据库日志信息_WriteSysLog_1 发生异常
Exception Date:2023/6/13 10:49:46
Exception Type:MySqlConnector.MySqlException
Exception Message:Unknown column 'SerialNumber' in 'field list'
Exception Source:SqlSugar
Exception StackTrace: at SqlSugar.AdoProvider.ExecuteCommand(String sql, SugarParameter[] parameters)
at SqlSugar.InsertableProvider`1.ExecuteCommand()
at Elight.Logic.WriteSysLog.WriteSysLogadd(String operationType, String content, Result result, SqlSugarClient _db, String opeCasDepAccCas) in C:\Users\Administrator\Desktop\24Hour\Elight.Logic\WriteSysLog.cs:line 51
************************Exception End************************************

78
Elight.Entity/AppMode/App_ReceptionModel.cs

@ -0,0 +1,78 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Entity
{
/// <summary>
/// 预约接待
/// </summary>
[Serializable]
[DataContract]
[SugarTable("app_reception")]
public class App_ReceptionModel
{
[DataMember]
[SugarColumn(IsPrimaryKey = true)]
public string? Id { get; set; }
/// <summary>
/// 预约时间
/// </summary>
[DataMember]
public DateTime? receptiontime { get; set; }
/// <summary>
/// 部门
/// </summary>
[DataMember]
public string? depart { get; set; }
/// <summary>
/// 接待人
/// </summary>
[DataMember]
public string? receptionuser { get; set; }
/// <summary>
/// 事由
/// </summary>
[DataMember]
public string? matter { get; set; }
/// <summary>
/// 预约接待类型
/// </summary>
[DataMember]
public string? receptionId { get; set; }
/// <summary>
/// 0:代办,1已完成
/// </summary>
[DataMember]
public int state { get; set; }
[DataMember]
public string createusername { get; set; }
[DataMember]
public string createuserId { get; set; }
/// <summary>
/// 创建日期
/// </summary>
[DataMember]
public DateTime? creationtime { get; set; } = DateTime.Now;
/// <summary>
/// 是否删除:0:未删除、1:删除
/// </summary>
[DataMember]
public int IsDelete { get; set; } = 0;
}
}

72
Elight.Entity/AppMode/StagingModel.cs

@ -0,0 +1,72 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Entity
{
/// <summary>
/// 工作台
/// </summary>
[Serializable]
[DataContract]
[SugarTable("app_staging")]
public class StagingModel
{
[DataMember]
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 跳转地址
/// </summary>
[DataMember]
public string path { get; set; }
/// <summary>
/// 图标地址
/// </summary>
[DataMember]
public string icon { get; set; }
/// <summary>
/// 颜色
/// </summary>
[DataMember]
public string color { get; set; }
/// <summary>
/// 名称
/// </summary>
[DataMember]
public string title { get; set; }
/// <summary>
/// 类型
/// </summary>
[DataMember]
public string titletype { get; set; }
[DataMember]
public string username { get; set; }
[DataMember]
public string userId { get; set; }
/// <summary>
/// 创建日期
/// </summary>
[DataMember]
public DateTime? creationtime { get; set; } = DateTime.Now;
/// <summary>
/// 是否删除:0:未删除、1:删除
/// </summary>
[DataMember]
public int IsDelete { get; set; } = 0;
}
}

54
Elight.Entity/AppMode/StagingNumModel.cs

@ -0,0 +1,54 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Entity
{
/// <summary>
/// 工作台使用数据
/// </summary>
[Serializable]
[DataContract]
[SugarTable("app_staging_num")]
public class StagingNumModel
{
[DataMember]
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 工作台Id
/// </summary>
[DataMember]
public string stagingId { get; set; }
/// <summary>
/// 使用数
/// </summary>
[DataMember]
public int num { get; set; }
[DataMember]
public string username { get; set; }
/// <summary>
/// 用户Id
/// </summary>
[DataMember]
public string userId { get; set; }
/// <summary>
/// 创建日期
/// </summary>
[DataMember]
public DateTime? creationtime { get; set; } = DateTime.Now;
/// <summary>
/// 是否删除:0:未删除、1:删除
/// </summary>
[DataMember]
public int IsDelete { get; set; } = 0;
}
}

13
Elight.Entity/Elight.Entity.csproj

@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="SqlSugarCore" Version="5.1.4.83" />
</ItemGroup>
</Project>

68
Elight.Entity/SystemModel/App_Sys_DepartModel.cs

@ -0,0 +1,68 @@
using SqlSugar;
using System;
using System.Runtime.Serialization;
namespace Elight.Entity
{
/// <summary>
/// 部门信息
/// </summary>
[Serializable]
[DataContract]
[SugarTable("app_sys_depart")]
public class App_Sys_DepartModel
{
/// <summary>
/// 表里用户唯一标识符,自增长Id
/// </summary>
[DataMember]
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 单位Id
/// </summary>
[DataMember]
public string unitId { get; set; }
/// <summary>
/// 部门编码
/// </summary>
[DataMember]
public string departCode { get; set; }
/// <summary>
/// 部门名称
/// </summary>
[DataMember]
public string departname { get; set; }
/// <summary>
/// 部门简称
/// </summary>
[DataMember]
public string departjc { get; set; }
/// <summary>
/// 是否删除 0否,1是
/// </summary>
[DataMember]
public int IsDelete { get; set; }
/// <summary>
/// 创建人Id
/// </summary>
[DataMember]
public string createuserId { get; set; }
/// <summary>
/// 创建人
/// </summary>
[DataMember]
public string createusername { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[DataMember]
public DateTime? createtime { get; set; } = DateTime.Now;
}
}

113
Elight.Entity/SystemModel/App_Sys_MenuModel.cs

@ -0,0 +1,113 @@

using SqlSugar;
using System;
using System.Runtime.Serialization;
namespace Elight.Entity
{
/// <summary>
/// 菜单管理
/// </summary>
[Serializable]
[DataContract]
[SugarTable("app_sys_menu")]
public class App_Sys_MenuModel
{
/// <summary>
/// 表里用户唯一标识符,自增长Id
/// </summary>
[DataMember]
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 父级
/// </summary>
[DataMember]
public string pid { get; set; }
/// <summary>
/// 路径
/// </summary>
[DataMember]
public string path { get; set; }
/// <summary>
/// 菜单名称
/// </summary>
[DataMember]
public string name { get; set; }
/// <summary>
/// 页面组件路径
/// </summary>
[DataMember]
public string component { get; set; }
/// <summary>
/// 直接跳转路径
/// </summary>
[DataMember]
public string redirect { get; set; }
/// <summary>
/// 页面标题
/// </summary>
[DataMember]
public string title { get; set; }
/// <summary>
/// 是否隐藏子菜单
/// </summary>
[DataMember]
public bool hideChildrenInMenu { get; set; }
/// <summary>
/// 图标
/// </summary>
[DataMember]
public string icon { get; set; }
/// <summary>
/// 当前菜单在列表中显示时 激活的菜单
/// </summary>
[DataMember]
public bool currentActiveMenu { get; set; }
/// <summary>
/// 是否隐藏面包眉
/// </summary>
[DataMember]
public bool hideBreadcrumb { get; set; }
/// <summary>
/// 是否隐藏当前菜单
/// </summary>
[DataMember]
public bool hideMenu { get; set; }
/// <summary>
/// 排序
/// </summary>
[DataMember]
public int sortnum { get; set; }
/// <summary>
/// 是否删除 0否,1是
/// </summary>
[DataMember]
public int IsDelete { get; set; }
/// <summary>
/// 创建人Id
/// </summary>
[DataMember]
public string createuserId { get; set; }
/// <summary>
/// 创建人
/// </summary>
[DataMember]
public string createusername { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[DataMember]
public DateTime? createtime { get; set; } = DateTime.Now;
}
}

60
Elight.Entity/SystemModel/App_Sys_RoleMenuModel.cs

@ -0,0 +1,60 @@

using SqlSugar;
using System;
using System.Runtime.Serialization;
namespace Elight.Entity
{
/// <summary>
/// 角色菜单表
/// </summary>
[Serializable]
[DataContract]
[SugarTable("app_sys_rolemenu")]
public class App_Sys_RoleMenuModel
{
/// <summary>
/// 表里用户唯一标识符,自增长Id
/// </summary>
[DataMember]
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 角色Id
/// </summary>
[DataMember]
public string roleId { get; set; }
/// <summary>
/// 菜单Id
/// </summary>
[DataMember]
public string menuId { get; set; }
/// <summary>
/// 用户Id
/// </summary>
[DataMember]
public string userId { get; set; }
/// <summary>
/// 用户名称
/// </summary>
[DataMember]
public string username { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[DataMember]
public DateTime? creationtime { get; set; } = DateTime.Now;
/// <summary>
/// 是否删除
/// </summary>
[DataMember]
public int IsDeleted { get; set; } = 0;
}
}

60
Elight.Entity/SystemModel/App_Sys_RoleModel.cs

@ -0,0 +1,60 @@

using SqlSugar;
using System;
using System.Runtime.Serialization;
namespace Elight.Entity
{
/// <summary>
/// 角色表
/// </summary>
[Serializable]
[DataContract]
[SugarTable("app_sys_role")]
public class App_Sys_RoleModel
{
/// <summary>
/// 表里用户唯一标识符,自增长Id
/// </summary>
[DataMember]
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 单位编码
/// </summary>
[DataMember]
public string unitCode { get; set; }
/// <summary>
/// 角色名称
/// </summary>
[DataMember]
public string name { get; set; }
/// <summary>
/// 用户Id
/// </summary>
[DataMember]
public string userId { get; set; }
/// <summary>
/// 用户名称
/// </summary>
[DataMember]
public string username { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[DataMember]
public DateTime? creationtime { get; set; } = DateTime.Now;
/// <summary>
/// 是否删除
/// </summary>
[DataMember]
public int IsDeleted { get; set; } = 0;
}
}

60
Elight.Entity/SystemModel/App_Sys_RoleUserModel.cs

@ -0,0 +1,60 @@

using SqlSugar;
using System;
using System.Runtime.Serialization;
namespace Elight.Entity
{
/// <summary>
/// 角色用户表
/// </summary>
[Serializable]
[DataContract]
[SugarTable("app_sys_roleuser")]
public class App_Sys_RoleUserModel
{
/// <summary>
/// 表里用户唯一标识符,自增长Id
/// </summary>
[DataMember]
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 单位编码
/// </summary>
[DataMember]
public string roleId { get; set; }
/// <summary>
/// 角色用户Id
/// </summary>
[DataMember]
public string roleuserId { get; set; }
/// <summary>
/// 用户Id
/// </summary>
[DataMember]
public string userId { get; set; }
/// <summary>
/// 用户名称
/// </summary>
[DataMember]
public string username { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[DataMember]
public DateTime? creationtime { get; set; } = DateTime.Now;
/// <summary>
/// 是否删除
/// </summary>
[DataMember]
public int IsDeleted { get; set; } = 0;
}
}

69
Elight.Entity/SystemModel/App_Sys_UnitModel.cs

@ -0,0 +1,69 @@

using SqlSugar;
using System;
using System.Runtime.Serialization;
namespace Elight.Entity
{
/// <summary>
/// 单位信息
/// </summary>
[Serializable]
[DataContract]
[SugarTable("app_sys_unit")]
public class App_Sys_UnitModel
{
/// <summary>
/// 表里用户唯一标识符,自增长Id
/// </summary>
[DataMember]
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 父级
/// </summary>
[DataMember]
public string pid { get; set; }
/// <summary>
/// 单位编码
/// </summary>
[DataMember]
public string unitCode { get; set; }
/// <summary>
/// 单位名称
/// </summary>
[DataMember]
public string unitname { get; set; }
/// <summary>
/// 单位简称
/// </summary>
[DataMember]
public string unitjc { get; set; }
/// <summary>
/// 是否删除 0否,1是
/// </summary>
[DataMember]
public int IsDelete { get; set; }
/// <summary>
/// 创建人Id
/// </summary>
[DataMember]
public string createuserId { get; set; }
/// <summary>
/// 创建人
/// </summary>
[DataMember]
public string createusername { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[DataMember]
public DateTime? createtime { get; set; } = DateTime.Now;
}
}

138
Elight.Entity/SystemModel/App_Sys_UserModel.cs

@ -0,0 +1,138 @@

using SqlSugar;
using System;
using System.Runtime.Serialization;
namespace Elight.Entity
{
/// <summary>
/// 用户信息表(app_sys_user)
/// </summary>
[Serializable]
[DataContract]
[SugarTable("app_sys_user")]
public class App_Sys_UserModel
{
/// <summary>
/// 表里用户唯一标识符,自增长Id
/// </summary>
[DataMember]
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 单位编码
/// </summary>
[DataMember]
public string unitCode { get; set; }
/// <summary>
/// 部门
/// </summary>
[DataMember]
public string department { get; set; }
/// <summary>
/// 密码
/// </summary>
[DataMember]
public string Password { get; set; }
/// <summary>
/// 名称
/// </summary>
[DataMember]
public string name { get; set; }
/// <summary>
/// 职务
/// </summary>
[DataMember]
public string duties { get; set; }
/// <summary>
/// 电话号码
/// </summary>
[DataMember]
public string phone { get; set; }
/// <summary>
/// 身份证号码
/// </summary>
[DataMember]
public string cardId { get; set; }
/// <summary>
/// 身份(检察官,律师,当事人)
/// </summary>
[DataMember]
public string identity { get; set; }
/// <summary>
/// 微信Id
/// </summary>
[DataMember]
public string wechatId { get; set; }
/// <summary>
/// 账号类型0:系统,1:APP
/// </summary>
[DataMember]
public int usertype { get; set; }
/// <summary>
/// 是否停用 0:启用,1禁用
/// </summary>
[DataMember]
public int isdeactivate { get; set; }
/// <summary>
/// 是否App通用:0:通用,1:不通用
/// </summary>
[DataMember]
public int becurrent { get; set; }
/// <summary>
/// 头像地址
/// </summary>
[DataMember]
public string photo { get; set; }
/// <summary>
/// 性别 0:女 1:男
/// </summary>
[DataMember]
public int sex { get; set; }
/// <summary>
/// 是否删除
/// </summary>
[DataMember]
public int IsDeleted { get; set; } = 0;
/// <summary>
/// 审核状态
/// </summary>
[DataMember]
public int? audit { get; set; }
/// <summary>
/// 审核描述
/// </summary>
[DataMember]
public string describe { get; set; }
/// <summary>
/// 创建人Id
/// </summary>
[DataMember]
public string createuserId { get; set; }
/// <summary>
/// 创建人
/// </summary>
[DataMember]
public string createusername { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[DataMember]
public DateTime? createtime { get; set; } = DateTime.Now;
}
}

107
Elight.Entity/SystemModel/Func_Dossier_LogRecordModel.cs

@ -0,0 +1,107 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Entity.SystemModel
{
/// <summary>
/// 日志记录表(Func_Dossier_LogRecord)
/// </summary>
[DataContract]
[Serializable]
[SugarTable("app_sys_depart")]
public class Func_Dossier_LogRecordModel
{
/// <summary>
/// 序号
/// </summary>
[DataMember]
public string SerialNumber { get; set; }
/// <summary>
/// 单位编码
/// </summary>
[DataMember]
public string UnitCode { get; set; }
/// <summary>
/// 单位名称
/// </summary>
[DataMember]
public string NameEntity { get; set; }
/// <summary>
/// 部门编码
/// </summary>
[DataMember]
public string DepartmentCode { get; set; }
/// <summary>
/// 部门名称
/// </summary>
[DataMember]
public string DepartmentName { get; set; }
/// <summary>
/// 操作人工号
/// </summary>
[DataMember]
public string OperatingManual { get; set; }
/// <summary>
/// 操作人
/// </summary>
[DataMember]
public string Operation { get; set; }
/// <summary>
/// 操作时间
/// </summary>
[DataMember]
public string OperatingTime { get; set; }
/// <summary>
/// 操作IP
/// </summary>
[DataMember]
public string OperationIp { get; set; }
/// <summary>
/// 操作类型
/// </summary>
[DataMember]
public string OperationType { get; set; }
/// <summary>
/// 日志内容
/// </summary>
[DataMember]
public string LogContents { get; set; }
/// <summary>
/// 操作案件部门受案号
/// </summary>
[DataMember]
public string OpeCasDepAccCas { get; set; }
/// <summary>
/// 分区列 创建时间取年份,触发器完成
/// </summary>
[DataMember]
public string ParColCreTimTakYeaTri { get; set; }
/// <summary>
/// 是否删除
/// </summary>
[DataMember]
public int IsDeleted { get; set; }
/*CodeAutoBuilderArea*/
}
}

28
Elight.Logic/CurrencyDelete.cs

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Logic
{
/// <summary>
/// 通用id删除
/// </summary>
[Serializable]
[DataContract]
public class CurrencyDelete
{
/// <summary>
/// Id
/// </summary>
[DataMember]
public string tyId { get; set; }
/// <summary>
/// 集合Id
/// </summary>
[DataMember]
public List<string> id { get; set; }
}
}

18
Elight.Logic/Elight.Logic.csproj

@ -0,0 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="IKVM" Version="8.5.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Elight.Entity\Elight.Entity.csproj" />
<ProjectReference Include="..\Elight.Utility\Elight.Utility.csproj" />
</ItemGroup>
</Project>

68
Elight.Logic/Model/App_ReceptionInput.cs

@ -0,0 +1,68 @@
using Elight.Utility.Code;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Logic
{
/// <summary>
/// 预约接待--分页
/// </summary>
[DataContract]
public class App_ReceptionInput : Paging
{
[DataMember]
public string Id { get; set; }
/// <summary>
/// 预约时间
/// </summary>
[DataMember]
public DateTime? receptiontime { get; set; }
/// <summary>
/// 部门
/// </summary>
[DataMember]
public string depart { get; set; }
/// <summary>
/// 接待人
/// </summary>
[DataMember]
public string receptionuser { get; set; }
/// <summary>
/// 事由
/// </summary>
[DataMember]
public string matter { get; set; }
/// <summary>
/// 预约接待类型
/// </summary>
[DataMember]
public string receptionId { get; set; }
/// <summary>
/// 0:代办,1已完成
/// </summary>
[DataMember]
public int? state { get; set; }
/// <summary>
/// 创建人名称
/// </summary>
[DataMember]
public string createusername { get; set; }
/// <summary>
/// 创建人Id
/// </summary>
[DataMember]
public string createuserId { get; set; }
}
}

52
Elight.Logic/Model/StagingInput.cs

@ -0,0 +1,52 @@
using Elight.Utility.Code;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Logic
{
/// <summary>
/// 工作台
/// </summary>
[Serializable]
[DataContract]
public class StagingInput:Paging
{
[DataMember]
public string Id { get; set; }
/// <summary>
/// 跳转地址
/// </summary>
[DataMember]
public string path { get; set; }
/// <summary>
/// 图标地址
/// </summary>
[DataMember]
public string icon { get; set; }
/// <summary>
/// 颜色
/// </summary>
[DataMember]
public string color { get; set; }
/// <summary>
/// 名称
/// </summary>
[DataMember]
public string title { get; set; }
/// <summary>
/// 类型
/// </summary>
[DataMember]
public string titletype { get; set; }
}
}

53
Elight.Logic/Model/StagingNumInput.cs

@ -0,0 +1,53 @@
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Logic
{
/// <summary>
/// 工作台使用数据
/// </summary>
[Serializable]
[DataContract]
public class StagingNumInput
{
[DataMember]
[SugarColumn(IsPrimaryKey = true)]
public string Id { get; set; }
/// <summary>
/// 工作台Id
/// </summary>
[DataMember]
public string stagingId { get; set; }
/// <summary>
/// 使用数
/// </summary>
[DataMember]
public string num { get; set; }
[DataMember]
public string username { get; set; }
/// <summary>
/// 用户Id
/// </summary>
[DataMember]
public int userId { get; set; }
/// <summary>
/// 创建日期
/// </summary>
[DataMember]
public DateTime? creationtime { get; set; } = DateTime.Now;
/// <summary>
/// 是否删除:0:未删除、1:删除
/// </summary>
[DataMember]
public int IsDelete { get; set; } = 0;
}
}

43
Elight.Logic/SystemModel/App_Sys_DepartInput.cs

@ -0,0 +1,43 @@
using Elight.Utility.Code;
using SqlSugar;
using System;
using System.Runtime.Serialization;
namespace Elight.Logic.SystemModel
{
/// <summary>
/// 部门信息--分页
/// </summary>
[DataContract]
public class App_Sys_DepartInput : Paging
{
/// <summary>
/// 表里用户唯一标识符,自增长Id
/// </summary>
[DataMember]
public string Id { get; set; }
/// <summary>
/// 单位Id
/// </summary>
[DataMember]
public string unitId { get; set; }
/// <summary>
/// 部门编码
/// </summary>
[DataMember]
public string departCode { get; set; }
/// <summary>
/// 部门名称
/// </summary>
[DataMember]
public string departname { get; set; }
/// <summary>
/// 部门简称
/// </summary>
[DataMember]
public string departjc { get; set; }
}
}

87
Elight.Logic/SystemModel/App_Sys_MenuInput.cs

@ -0,0 +1,87 @@
using Elight.Utility.Code;
using SqlSugar;
using System;
using System.Runtime.Serialization;
namespace Elight.Logic.SystemModel
{
/// <summary>
/// 菜单管理
/// </summary>
[DataContract]
public class App_Sys_MenuInput:Paging
{
/// <summary>
/// 表里用户唯一标识符,自增长Id
/// </summary>
[DataMember]
public string Id { get; set; }
/// <summary>
/// 父级
/// </summary>
[DataMember]
public string pid { get; set; }
/// <summary>
/// 路径
/// </summary>
[DataMember]
public string path { get; set; }
/// <summary>
/// 菜单名称
/// </summary>
[DataMember]
public string name { get; set; }
/// <summary>
/// 页面组件路径
/// </summary>
[DataMember]
public string component { get; set; }
/// <summary>
/// 直接跳转路径
/// </summary>
[DataMember]
public string redirect { get; set; }
/// <summary>
/// 页面标题
/// </summary>
[DataMember]
public string title { get; set; }
/// <summary>
/// 是否隐藏子菜单
/// </summary>
[DataMember]
public bool hideChildrenInMenu { get; set; }
/// <summary>
/// 图标
/// </summary>
[DataMember]
public string icon { get; set; }
/// <summary>
/// 当前菜单在列表中显示时 激活的菜单
/// </summary>
[DataMember]
public bool currentActiveMenu { get; set; }
/// <summary>
/// 是否隐藏面包眉
/// </summary>
[DataMember]
public bool hideBreadcrum { get; set; }
/// <summary>
/// 是否隐藏当前菜单
/// </summary>
[DataMember]
public bool hideMenu { get; set; }
/// <summary>
/// 排序
/// </summary>
[DataMember]
public int sortnum { get; set; }
}
}

34
Elight.Logic/SystemModel/App_Sys_RoleInput.cs

@ -0,0 +1,34 @@
using Elight.Utility.Code;
using SqlSugar;
using System;
using System.Runtime.Serialization;
namespace Elight.Logic.SystemModel
{
/// <summary>
/// 角色表
/// </summary>
[Serializable]
[DataContract]
public class App_Sys_RoleInput: Paging
{
/// <summary>
/// 表里用户唯一标识符,自增长Id
/// </summary>
[DataMember]
public string Id { get; set; }
/// <summary>
/// 单位编码
/// </summary>
[DataMember]
public string unitCode { get; set; }
/// <summary>
/// 角色名称
/// </summary>
[DataMember]
public string name { get; set; }
}
}

31
Elight.Logic/SystemModel/App_Sys_RoleMenuInput.cs

@ -0,0 +1,31 @@
using Elight.Utility.Code;
using SqlSugar;
using System;
using System.Runtime.Serialization;
namespace Elight.Logic.SystemModel
{
/// <summary>
/// 角色菜单表
/// </summary>
[Serializable]
[DataContract]
public class App_Sys_RoleMenuInput : Paging
{
[DataMember]
public string Id { get; set; }
/// <summary>
/// 角色Id
/// </summary>
[DataMember]
public string roleId { get; set; }
/// <summary>
/// 菜单Id
/// </summary>
[DataMember]
public string menuId { get; set; }
}
}

34
Elight.Logic/SystemModel/App_Sys_RoleUserInput.cs

@ -0,0 +1,34 @@
using Elight.Utility.Code;
using SqlSugar;
using System;
using System.Runtime.Serialization;
namespace Elight.Logic.SystemModel
{
/// <summary>
/// 角色用户表
/// </summary>
[DataContract]
public class App_Sys_RoleUserInput : Paging
{
/// <summary>
/// 表里用户唯一标识符,自增长Id
/// </summary>
[DataMember]
public string Id { get; set; }
/// <summary>
/// 单位编码
/// </summary>
[DataMember]
public string roleId { get; set; }
/// <summary>
/// 角色用户Id
/// </summary>
[DataMember]
public string roleuserId { get; set; }
}
}

43
Elight.Logic/SystemModel/App_Sys_UnitInput.cs

@ -0,0 +1,43 @@
using Elight.Utility.Code;
using SqlSugar;
using System;
using System.Runtime.Serialization;
namespace Elight.Logic.SystemModel
{
/// <summary>
/// 单位信息--分页
/// </summary>
[DataContract]
public class App_Sys_UnitInput : Paging
{
/// <summary>
/// 表里用户唯一标识符,自增长Id
/// </summary>
[DataMember]
public string Id { get; set; }
/// <summary>
/// 父级
/// </summary>
[DataMember]
public string pid { get; set; }
/// <summary>
/// 单位编码
/// </summary>
[DataMember]
public string unitCode { get; set; }
/// <summary>
/// 单位名称
/// </summary>
[DataMember]
public string unitname { get; set; }
/// <summary>
/// 单位简称
/// </summary>
[DataMember]
public string unitjc { get; set; }
}
}

73
Elight.Logic/SystemModel/App_Sys_UnitTree.cs

@ -0,0 +1,73 @@
using Elight.Utility.Code;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
namespace Elight.Logic.SystemModel
{
/// <summary>
/// 单位信息--树型查询
/// </summary>
[DataContract]
[SugarTable("app_sys_unit")]
public class App_Sys_UnitTree
{
/// <summary>
/// 表里用户唯一标识符,自增长Id
/// </summary>
[SqlSugar.SugarColumn(IsPrimaryKey = true)]
[DataMember]
public string Id { get; set; }
/// <summary>
/// 父级
/// </summary>
[DataMember]
public string pid { get; set; }
/// <summary>
/// 单位编码
/// </summary>
[DataMember]
public string unitCode { get; set; }
/// <summary>
/// 单位名称
/// </summary>
[DataMember]
public string unitname { get; set; }
/// <summary>
/// 单位简称
/// </summary>
[DataMember]
public string unitjc { get; set; }
/// <summary>
/// 是否删除 0否,1是
/// </summary>
[DataMember]
public int IsDelete { get; set; }
/// <summary>
/// 创建人Id
/// </summary>
[DataMember]
public string createuserId { get; set; }
/// <summary>
/// 创建人
/// </summary>
[DataMember]
public string createusername { get; set; }
/// <summary>
/// 创建时间
/// </summary>
[DataMember]
public DateTime? createtime { get; set; } = DateTime.Now;
[SqlSugar.SugarColumn(IsIgnore = true)]
public List<App_Sys_UnitTree> Child { get; set; }
}
}

105
Elight.Logic/SystemModel/App_Sys_UserInput.cs

@ -0,0 +1,105 @@
using Elight.Utility.Code;
using SqlSugar;
using System;
using System.Runtime.Serialization;
namespace Elight.Logic.SystemModel
{
/// <summary>
/// 用户信息表
/// </summary>
[DataContract]
public class App_Sys_UserInput:Paging
{
/// <summary>
/// 表里用户唯一标识符,自增长Id
/// </summary>
[DataMember]
public string Id { get; set; }
/// <summary>
/// 单位编码
/// </summary>
[DataMember]
public string unitCode { get; set; }
/// <summary>
/// 部门
/// </summary>
[DataMember]
public string department { get; set; }
/// <summary>
/// 密码
/// </summary>
[DataMember]
public string Password { get; set; }
/// <summary>
/// 名称
/// </summary>
[DataMember]
public string name { get; set; }
/// <summary>
/// 职务
/// </summary>
[DataMember]
public string duties { get; set; }
/// <summary>
/// 电话号码
/// </summary>
[DataMember]
public string phone { get; set; }
/// <summary>
/// 身份
/// </summary>
[DataMember]
public string identity { get; set; }
/// <summary>
/// 身份证号码
/// </summary>
[DataMember]
public string cardId { get; set; }
/// <summary>
/// 微信Id
/// </summary>
[DataMember]
public string wechatId { get; set; }
/// <summary>
/// 账号类型0:系统,1:APP
/// </summary>
[DataMember]
public int? usertype { get; set; }
/// <summary>
/// 是否停用 0:启用,1禁用
/// </summary>
[DataMember]
public int? isdeactivate { get; set; }
/// <summary>
/// 是否App通用:0:通用,1:不通用
/// </summary>
[DataMember]
public int? becurrent { get; set; }
/// <summary>
/// 头像地址
/// </summary>
[DataMember]
public string photo { get; set; }
/// <summary>
/// 性别 0:女 1:男
/// </summary>
[DataMember]
public int? sex { get; set; }
}
}

59
Elight.Logic/WriteSysLog.cs

@ -0,0 +1,59 @@
using Elight.Entity;
using Elight.Entity.SystemModel;
using Elight.Utility;
using Elight.Utility.Code;
using Elight.Utility.logs;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using SqlSugar;
using sun.nio.ch;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Logic
{
public class WriteSysLog
{
App_Sys_UserModel _userdata = new App_Sys_UserModel();//当前用户
Result ret = new Result();
public WriteSysLog(User user)
{
_userdata = user.Userdata();
}
/// <summary>
/// 添加数据库日志信息
/// </summary>
/// <returns></returns>
public void WriteSysLogadd(string operationType, string content, Result result, SqlSugarClient _db=null, string opeCasDepAccCas = null)
{
try
{
Func_Dossier_LogRecordModel model = new Func_Dossier_LogRecordModel
{
UnitCode = _userdata.unitCode,
OperationType = operationType,
NameEntity = "",
LogContents = result.IsSucceed ? $"{content}成功" : $"{content}失败:{result.Message}",
ParColCreTimTakYeaTri = DateTime.Now.Year.ToString(),
OperationIp = "",
Operation = _userdata.name,
OperatingTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
OperatingManual = _userdata.Id,
OpeCasDepAccCas = opeCasDepAccCas ?? string.Empty
};
var sss= _db.Insertable(model).ExecuteCommand();
}
catch (Exception ex)
{
LogService.WriteLog(ex, "添加数据库日志信息_WriteSysLog_1 发生异常");
}
}
}
}

101
Elight.Utility/BasicAuthenticationHandler.cs

@ -0,0 +1,101 @@
using Elight.Utility.Enum;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System.ComponentModel;
using System.Net.Http.Headers;
using System.Security.Claims;
using System.Text;
using System.Text.Encodings.Web;
namespace Elight.Utility
{ /// <summary>
/// 响应认证处理器
/// </summary>
/// Author:mxg
/// CreatedTimed:2022-05-15 10:08 PM
public class ResponseAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
#region Identity
public ResponseAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
ILoggerFactory logger,
UrlEncoder encoder,
ISystemClock clock
) : base(options, logger, encoder, clock)
{
}
#endregion Identity
/// <summary>
///
/// </summary>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
protected override Task<AuthenticateResult> HandleAuthenticateAsync() => throw new NotImplementedException();
/// <summary>
/// HandleChallengeAsync
/// </summary>
/// <param name="properties"></param>
/// <returns></returns>
protected override async Task HandleChallengeAsync(AuthenticationProperties properties)
{
Response.ContentType = "application/json";
Response.StatusCode = StatusCodes.Status401Unauthorized;
await Response.WriteAsync(JsonConvert.SerializeObject(
new ResponseStatusData
{
Code = CustomizedStatusCodeEnum.Status401Unauthorized,
Msg = CustomizedStatusCodeEnum.Status401Unauthorized.ToDescription()
},
new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
}
));
}
/// <summary>
/// HandleForbiddenAsync
/// </summary>
/// <param name="properties"></param>
/// <returns></returns>
protected override async Task HandleForbiddenAsync(AuthenticationProperties properties)
{
Response.ContentType = "application/json";
Response.StatusCode = StatusCodes.Status403Forbidden;
await Response.WriteAsync(JsonConvert.SerializeObject(
new ResponseStatusData
{
Code = CustomizedStatusCodeEnum.Status403Forbidden,
Msg = CustomizedStatusCodeEnum.Status403Forbidden.ToDescription()
},
new JsonSerializerSettings()
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
}
));
}
}
/// <summary>
///
/// </summary>
public class ResponseStatusData
{
/// <summary>
/// 状态码枚举 (0:操作失败 1:操作成功 401:未登录 403:权限不足 404:资源不存在 500:系统内部错误)
/// <see cref="CustomizedStatusCodeEnum"/>
/// </summary>
public CustomizedStatusCodeEnum Code { get; set; } = CustomizedStatusCodeEnum.Status1Ok;
/// <summary>
///
/// </summary>
public string? Msg { get; set; }
}
}

21
Elight.Utility/Elight.Utility.csproj

@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.16" />
<PackageReference Include="Microsoft.Extensions.Identity.Core" Version="7.0.5" />
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="7.0.5" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Elight.Entity\Elight.Entity.csproj" />
</ItemGroup>
</Project>

58
Elight.Utility/Encrypt/AES.cs

@ -0,0 +1,58 @@
using System;
using System.Security.Cryptography;
using System.Text;
namespace Elight.Utility.Encrypt
{
/// <summary>
/// AES
/// </summary>
public class AES
{
/// <summary>
/// 加密
/// </summary>
/// <param name="toEncrypt">数据字符</param>
/// <returns>密文</returns>
public static string Encrypt(string toEncrypt)
{
byte[] keyArray = Encoding.UTF8.GetBytes("12345678901234567890123456789012");
byte[] toEncryptArray = Encoding.UTF8.GetBytes(toEncrypt);
RijndaelManaged rDel = new RijndaelManaged
{
Key = keyArray,
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
ICryptoTransform cTransform = rDel.CreateEncryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Convert.ToBase64String(resultArray, 0, resultArray.Length);
}
/// <summary>
/// 解密
/// </summary>
/// <param name="toDecrypt">密文</param>
/// <returns>结果</returns>
public static string Decrypt(string toDecrypt)
{
byte[] keyArray = Encoding.UTF8.GetBytes("12345678901234567890123456789012");
byte[] toEncryptArray = Convert.FromBase64String(toDecrypt);
RijndaelManaged rDel = new RijndaelManaged
{
Key = keyArray,
Mode = CipherMode.ECB,
Padding = PaddingMode.PKCS7
};
ICryptoTransform cTransform = rDel.CreateDecryptor();
byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
return Encoding.UTF8.GetString(resultArray);
}
}
}

73
Elight.Utility/Encrypt/Md5.cs

@ -0,0 +1,73 @@
using System;
using System.Security.Cryptography;
using System.Text;
namespace Elight.Utility.Encrypt
{/// <summary>
/// Md5
/// </summary>
public class Md5
{
/// <summary>
/// 加密32
/// </summary>
/// <param name="source">数据</param>
/// <returns>密文</returns>
public static string Encrypt32(string source)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] t = md5.ComputeHash(Encoding.UTF8.GetBytes(source));
StringBuilder sb = new StringBuilder(32);
foreach (byte item in t)
{
sb.Append(item.ToString("x").PadLeft(2, '0'));
}
return sb.ToString();
}
/// <summary>
/// 加密16
/// </summary>
/// <param name="source">数据</param>
/// <returns>密文</returns>
public static string Encrypt16(string source)
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
string t2 = BitConverter.ToString(md5.ComputeHash(Encoding.UTF8.GetBytes(source)), 4, 8);
t2 = t2.Replace("-", "");
return t2;
}
/// <summary>
/// MD5 加密字符串
/// </summary>
/// <param name="rawPass">源字符串</param>
/// <returns>加密后字符串</returns>
public static string MD5Encoding(string rawPass)
{
// 创建MD5类的默认实例:MD5CryptoServiceProvider
MD5 md5 = MD5.Create();
byte[] bs = Encoding.UTF8.GetBytes(rawPass);
byte[] hs = md5.ComputeHash(bs);
StringBuilder sb = new StringBuilder();
foreach (byte b in hs)
{
// 以十六进制格式格式化
sb.Append(b.ToString("x2"));
}
return sb.ToString();
}
/// <summary>
/// MD5盐值加密
/// </summary>
/// <param name="rawPass">源字符串</param>
/// <param name="salt">盐值</param>
/// <returns>加密后字符串</returns>
public static string MD5Encoding(string rawPass, object salt)
{
if (salt == null) return rawPass;
return MD5Encoding(rawPass + "{" + salt.ToString() + "}");
}
}
}

53
Elight.Utility/Enum/CustomizedStatusCodeEnum.cs

@ -0,0 +1,53 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Utility.Enum
{
/// <summary>
/// 状态码枚举 (0:操作失败 1:操作成功 401:未登录 403:权限不足 404:资源不存在 500:系统内部错误)
/// </summary>
/// Author:mxg
/// CreatedTimed:2022-05-15 10:31 PM
public enum CustomizedStatusCodeEnum
{
/// <summary>
/// 操作失败
/// </summary>
[Description("操作失败")]
Status0NotOk = 0,
/// <summary>
/// 操作成功
/// </summary>
[Description("操作成功")]
Status1Ok = 1,
/// <summary>
/// 未登录(需要重新登录)
/// </summary>
[Description("未登录")]
Status401Unauthorized = 401,
/// <summary>
/// 权限不足
/// </summary>
[Description("权限不足")]
Status403Forbidden = 403,
/// <summary>
/// 资源不存在
/// </summary>
[Description("资源不存在")]
Status404NotFound = 404,
/// <summary>
/// 系统内部错误(非业务代码里显式抛出的异常,例如由于数据不正确导致空指针异常、数据库异常等等)
/// </summary>
[Description("系统内部错误")]
Status500InternalServerError = 500
}
}

60
Elight.Utility/Enum/EnumExtension.cs

@ -0,0 +1,60 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Utility.Enum
{
/// <summary>
///
/// </summary>
/// Author:mxg
/// CreatedTimed:2022-05-13 06:00 PM
public static class EnumExtension
{
public static string? ToDescription(this System.Enum item)
{
string? name = item.ToString();
var desc = item.GetType().GetField(name)?.GetCustomAttribute<DescriptionAttribute>();
return desc?.Description ?? name;
}
public static long ToInt64(this System.Enum item)
{
return Convert.ToInt64(item);
}
public static List<Dictionary<string, object>> ToList(this System.Enum value, bool ignoreNull = false)
{
var enumType = value.GetType();
if (!enumType.IsEnum)
return null;
return System.Enum.GetValues(enumType).Cast<System.Enum>()
.Where(m => !ignoreNull || !m.ToString().Equals("Null")).Select(x => new Dictionary<string, object?>
{
["Label"] = x.ToDescription(),
["Value"] = x
}).ToList();
}
public static List<Dictionary<string, object>> ToList<T>(bool ignoreNull = false)
{
var enumType = typeof(T);
if (!enumType.IsEnum)
return null;
return System.Enum.GetValues(enumType).Cast<System.Enum>()
.Where(m => !ignoreNull || !m.ToString().Equals("Null")).Select(x => new Dictionary<string, object?>
{
["Label"] = x.ToDescription(),
["Value"] = x
}).ToList();
}
}
}

64
Elight.Utility/Enum/LogLevel.cs

@ -0,0 +1,64 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Utility.Enum
{
/// <summary>
/// 系统日志等级,按照Syslog的标准,将日志等级分为八个等级
/// </summary>
[DataContract]
public enum LogLevel
{
/// <summary>
/// A系统不可用
/// </summary>
[EnumMember]
A系统不可用 = 0,
/// <summary>
/// B紧急事件
/// </summary>
[EnumMember]
B紧急事件 = 1,
/// <summary>
/// C关键事件
/// </summary>
[EnumMember]
C关键事件 = 2,
/// <summary>
/// D错误事件
/// </summary>
[EnumMember]
D错误事件 = 3,
/// <summary>
/// E警告事件
/// </summary>
[EnumMember]
E警告事件 = 4,
/// <summary>
/// F重要事件
/// </summary>
[EnumMember]
F重要事件 = 5,
/// <summary>
/// G有用信息
/// </summary>
[EnumMember]
G有用信息 = 6,
/// <summary>
/// H调试信息
/// </summary>
[EnumMember]
H调试信息 = 7
}
}

655
Elight.Utility/Extensions/StringExtension.cs

@ -0,0 +1,655 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
namespace Elight.Utility.Extensions
{
/// <summary>
///
/// </summary>
/// Author:mxg
/// CreatedTimed:2022-05-13 06:00 PM
public static class StringExtension
{
/// <summary>
/// 判断字符串是否为Null、空
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static bool IsNull(this string? s) => string.IsNullOrWhiteSpace(s);
/// <summary>
/// 判断字符串是否不为Null、空
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static bool NotNull(this string? s) => !string.IsNullOrWhiteSpace(s);
/// <summary>
///
/// </summary>
/// <param name="thisValue"></param>
/// <returns></returns>
public static bool IsNotEmptyOrNull(this object? thisValue)
{
var val = thisValue as string;
return val != "" && val != "undefined" && val != "null";
}
/// <summary>
/// 与字符串进行比较,忽略大小写
/// </summary>
/// <param name="s"></param>
/// <param name="value"></param>
/// <returns></returns>
public static bool EqualsIgnoreCase(this string s, string? value) => s.Equals(value, StringComparison.OrdinalIgnoreCase);
/// <summary>
/// 首字母转小写
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string FirstCharToLower(this string s)
{
if (string.IsNullOrEmpty(s)) return s;
string str = string.Concat(s.First().ToString().ToLower(), s.AsSpan(1));
return str;
}
/// <summary>
/// 首字母转大写
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string FirstCharToUpper(this string s)
{
if (string.IsNullOrEmpty(s)) return s;
string str = string.Concat(s.First().ToString().ToUpper(), s.AsSpan(1));
return str;
}
/// <summary>
/// 转为Base64,UTF-8格式
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string ToBase64(this string s) => s.ToBase64(Encoding.UTF8);
/// <summary>
/// 转为Base64
/// </summary>
/// <param name="s"></param>
/// <param name="encoding">编码</param>
/// <returns></returns>
public static string ToBase64(this string s, Encoding encoding)
{
if (s.IsNull()) return string.Empty;
var bytes = encoding.GetBytes(s);
if (bytes == null)
return null;
else
return Convert.ToBase64String(bytes);
}
/// <summary>
///
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
public static string ToPath(this string s) => s.IsNull() ? string.Empty : s.Replace(@"\", "/");
/// <summary>
///
/// </summary>
/// <param name="str"></param>
/// <param name="obj"></param>
/// <returns></returns>
public static string Format(this string str, object obj)
{
if (str.IsNull()) return str;
string s = str;
if (obj.GetType().Name == "JObject")
{
foreach (var item in (Newtonsoft.Json.Linq.JObject)obj)
{
var k = item.Key.ToString();
string? v = item.Value?.ToString();
s = Regex.Replace(s, "\\{" + k + "\\}", v, RegexOptions.IgnoreCase);
}
}
else
{
foreach (System.Reflection.PropertyInfo p in obj.GetType().GetProperties())
{
var xx = p.Name;
var yy = p.GetValue(obj)?.ToString();
s = Regex.Replace(s, "\\{" + xx + "\\}", yy, RegexOptions.IgnoreCase);
}
}
return s;
}
#region IsXXXX
/// <summary>
///
/// </summary>
/// <param name="guid"></param>
/// <param name="outId"></param>
/// <returns></returns>
public static bool GetGuid(this string guid, out Guid outId) => Guid.TryParse(guid, out outId);
/// <summary>
///
/// </summary>
/// <param name="guid"></param>
/// <returns></returns>
public static bool IsGuid(this string guid) => GetGuid(guid, out _);
/// <summary>
///
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
public static bool IsInt(this object? obj)
{
if (obj == null) return false;
bool result = Int32.TryParse(obj.ToString(), out int number);
return result;
}
/// <summary>
///
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static bool IsDate(this object? str) => IsDate(str, out _);
/// <summary>
///
/// </summary>
/// <param name="str"></param>
/// <param name="dateTime"></param>
/// <returns></returns>
public static bool IsDate(this object? str, out DateTime dateTime)
{
dateTime = DateTime.Now;
if (str == null || str.ToString() == "") return false;
return DateTime.TryParse(str.ToString(), out dateTime);
}
/// <summary>
/// 根据传入格式判断是否为小数
/// </summary>
/// <param name="str"></param>
/// <param name="formatString">18,5</param>
/// <returns></returns>
public static bool IsNumber(this string str, string? formatString)
{
if (string.IsNullOrEmpty(str)) return false;
int precision = 32;
int scale = 5;
try
{
if (string.IsNullOrEmpty(formatString))
{
precision = 10;
scale = 2;
}
else
{
string[] numbers = formatString.Split(',');
precision = Convert.ToInt32(numbers[0]);
scale = numbers.Length == 0 ? 2 : Convert.ToInt32(numbers[1]);
}
}
catch
{
// ignored
}
return IsNumber(str, precision, scale);
}
/// <summary>
/// 判断一个字符串是否为合法数字(指定整数位数和小数位数)
/// </summary>
/// <param name="str">字符串</param>
/// <param name="precision">整数位数</param>
/// <param name="scale">小数位数</param>
/// <returns></returns>
public static bool IsNumber(this string str, int precision, int scale)
{
if ((precision == 0) && (scale == 0)) return false;
string pattern = @"(^\d{1," + precision + "}";
if (scale > 0) pattern += @"\.\d{0," + scale + "}$)|" + pattern;
pattern += "$)";
return Regex.IsMatch(str, pattern);
}
#endregion IsXXXX
//
// Summary:
// Concatenates the members of a constructed System.Collections.Generic.IEnumerable`1
// collection of type System.String, using the specified separator between each
// member. This is a shortcut for string.Join(...)
//
// Parameters:
// source:
// A collection that contains the strings to concatenate.
//
// separator:
// The string to use as a separator. separator is included in the returned string
// only if values has more than one element.
//
// Returns:
// A string that consists of the members of values delimited by the separator string.
// If values has no members, the method returns System.String.Empty.
public static string? JoinAsString(this IEnumerable<string> source, string separator) => string.Join(separator, source);
//
// Summary:
// Concatenates the members of a collection, using the specified separator between
// each member. This is a shortcut for string.Join(...)
//
// Parameters:
// source:
// A collection that contains the objects to concatenate.
//
// separator:
// The string to use as a separator. separator is included in the returned string
// only if values has more than one element.
//
// Type parameters:
// T:
// The type of the members of values.
//
// Returns:
// A string that consists of the members of values delimited by the separator string.
// If values has no members, the method returns System.String.Empty.
public static string JoinAsString<T>(this IEnumerable<T> source, string separator) => string.Join(separator, source);
/// <summary>
/// A string extension method that query if '@this' is null or empty.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <returns>true if null or empty, false if not.</returns>
public static bool IsNullOrEmpty(this string @this) => string.IsNullOrEmpty(@this);
/// <summary>
/// A string extension method that query if '@this' is not null and not empty.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <returns>false if null or empty, true if not.</returns>
public static bool IsNotNullOrEmpty(this string? @this) => !string.IsNullOrEmpty(@this);
/// <summary>
/// A string extension method that query if '@this' is null or whiteSpace.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <returns>true if null or whiteSpace, false if not.</returns>
public static bool IsNullOrWhiteSpace(this string? @this) => string.IsNullOrWhiteSpace(@this);
/// <summary>
/// A string extension method that query if '@this' is not null and not whiteSpace.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <returns>false if null or whiteSpace, true if not.</returns>
public static bool IsNotNullOrWhiteSpace(this string? @this) => !string.IsNullOrWhiteSpace(@this);
/// <summary>
/// Concatenates the elements of an object array, using the specified separator between each element.
/// </summary>
/// <param name="separator">
/// The string to use as a separator. is included in the returned string only if has more
/// than one element.
/// </param>
/// <param name="values">An array that contains the elements to concatenate.</param>
/// <returns>
/// A string that consists of the elements of delimited by the string. If is an empty array, the method
/// returns .
/// </returns>
public static string Join<T>([NotNull] this string separator, IEnumerable<T> values) => string.Join(separator, values);
/// <summary>
/// Indicates whether the specified regular expression finds a match in the specified input string.
/// </summary>
/// <param name="input">The string to search for a match.</param>
/// <param name="pattern">The regular expression pattern to match.</param>
/// <returns>true if the regular expression finds a match; otherwise, false.</returns>
public static bool IsMatch([NotNull] this string input, string pattern) => Regex.IsMatch(input, pattern);
/// <summary>
/// Indicates whether the specified regular expression finds a match in the specified input string, using the
/// specified matching options.
/// </summary>
/// <param name="input">The string to search for a match.</param>
/// <param name="pattern">The regular expression pattern to match.</param>
/// <param name="options">A bitwise combination of the enumeration values that provide options for matching.</param>
/// <returns>true if the regular expression finds a match; otherwise, false.</returns>
public static bool IsMatch([NotNull] this string input, string pattern, RegexOptions options) => Regex.IsMatch(input, pattern, options);
/// <summary>An IEnumerable&lt;string&gt; extension method that concatenates the given this.</summary>
/// <param name="this">The @this to act on.</param>
/// <returns>A string.</returns>
public static string Concatenate([NotNull] this IEnumerable<string> @this)
{
var sb = new StringBuilder();
foreach (var s in @this)
{
sb.Append(s);
}
return sb.ToString();
}
/// <summary>An IEnumerable&lt;T&gt; extension method that concatenates.</summary>
/// <typeparam name="T">Generic type parameter.</typeparam>
/// <param name="source">The source to act on.</param>
/// <param name="func">The function.</param>
/// <returns>A string.</returns>
public static string Concatenate<T>([NotNull] this IEnumerable<T> source, Func<T, string> func)
{
var sb = new StringBuilder();
foreach (var item in source)
{
sb.Append(func(item));
}
return sb.ToString();
}
/// <summary>
/// A string extension method that query if this object contains the given value.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <param name="value">The value.</param>
/// <returns>true if the value is in the string, false if not.</returns>
public static bool Contains([NotNull] this string @this, string value) => @this.IndexOf(value, StringComparison.Ordinal) != -1;
/// <summary>
/// A string extension method that query if this object contains the given value.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <param name="value">The value.</param>
/// <param name="comparisonType">Type of the comparison.</param>
/// <returns>true if the value is in the string, false if not.</returns>
public static bool Contains([NotNull] this string @this, string value, StringComparison comparisonType) => @this.IndexOf(value, comparisonType) != -1;
/// <summary>
/// A string extension method that extracts this object.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <param name="predicate">The predicate.</param>
/// <returns>A string.</returns>
public static string Extract([NotNull] this string @this, Func<char, bool> predicate) => new string(@this.ToCharArray().Where(predicate).ToArray());
/// <summary>
/// A string extension method that removes the letter.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <param name="predicate">The predicate.</param>
/// <returns>A string.</returns>
public static string RemoveWhere([NotNull] this string @this, Func<char, bool> predicate) => new string(@this.ToCharArray().Where(x => !predicate(x)).ToArray());
/// <summary>
/// Replaces the format item in a specified String with the text equivalent of the value of a corresponding
/// Object instance in a specified array.
/// </summary>
/// <param name="this">A String containing zero or more format items.</param>
/// <param name="values">An Object array containing zero or more objects to format.</param>
/// <returns>
/// A copy of format in which the format items have been replaced by the String equivalent of the corresponding
/// instances of Object in args.
/// </returns>
public static string FormatWith([NotNull] this string @this, params object[] values) => string.Format(@this, values);
/// <summary>
/// A string extension method that query if '@this' satisfy the specified pattern.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <param name="pattern">The pattern to use. Use '*' as wildcard string.</param>
/// <returns>true if '@this' satisfy the specified pattern, false if not.</returns>
public static bool IsLike([NotNull] this string @this, string pattern)
{
// Turn the pattern into regex pattern, and match the whole string with ^$
var regexPattern = "^" + Regex.Escape(pattern) + "$";
// Escape special character ?, #, *, [], and [!]
regexPattern = regexPattern.Replace(@"\[!", "[^")
.Replace(@"\[", "[")
.Replace(@"\]", "]")
.Replace(@"\?", ".")
.Replace(@"\*", ".*")
.Replace(@"\#", @"\d");
return Regex.IsMatch(@this, regexPattern);
}
/// <summary>
/// SafeSubstring
/// </summary>
/// <param name="this"></param>
/// <param name="startIndex"></param>
/// <returns></returns>
public static string SafeSubstring([NotNull] this string @this, int startIndex)
{
if (startIndex < 0 || startIndex > @this.Length)
{
return string.Empty;
}
return @this[startIndex..];
}
/// <summary>
/// SafeSubstring
/// </summary>
/// <param name="str"></param>
/// <param name="startIndex"></param>
/// <param name="length"></param>
/// <returns></returns>
public static string SafeSubstring([NotNull] this string str, int startIndex, int length)
{
if (startIndex < 0 || startIndex >= str.Length || length < 0)
{
return string.Empty;
}
return str.Substring(startIndex, Math.Min(str.Length - startIndex, length));
}
/// <summary>
/// Sub, not only substring but support for negative numbers
/// </summary>
/// <param name="this">string to be handled</param>
/// <param name="startIndex">startIndex to substract</param>
/// <returns>substring</returns>
public static string Sub([NotNull] this string @this, int startIndex)
{
if (startIndex >= 0)
{
return @this.SafeSubstring(startIndex);
}
if (Math.Abs(startIndex) > @this.Length)
{
return string.Empty;
}
return @this[(@this.Length + startIndex)..];
}
/// <summary>
/// A string extension method that repeats the string a specified number of times.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <param name="repeatCount">Number of repeats.</param>
/// <returns>The repeated string.</returns>
public static string Repeat([NotNull] this string @this, int repeatCount)
{
if (@this.Length == 1)
{
return new string(@this[0], repeatCount);
}
var sb = new StringBuilder(repeatCount * @this.Length);
while (repeatCount-- > 0)
{
sb.Append(@this);
}
return sb.ToString();
}
/// <summary>
/// A string extension method that reverses the given string.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <returns>The string reversed.</returns>
public static string Reverse([NotNull] this string @this)
{
if (@this.Length <= 1)
{
return @this;
}
var chars = @this.ToCharArray();
Array.Reverse(chars);
return new string(chars);
}
/// <summary>
/// Returns a String array containing the substrings in this string that are delimited by elements of a specified
/// String array. A parameter specifies whether to return empty array elements.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <param name="separator">A string that delimit the substrings in this string.</param>
/// <param name="option">
/// (Optional) Specify RemoveEmptyEntries to omit empty array elements from the array returned,
/// or None to include empty array elements in the array returned.
/// </param>
/// <returns>
/// An array whose elements contain the substrings in this string that are delimited by the separator.
/// </returns>
public static string[] Split([NotNull] this string @this, string separator, StringSplitOptions option = StringSplitOptions.None) => @this.Split(new[] { separator }, option);
/// <summary>
/// A string extension method that converts the @this to a byte array.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <returns>@this as a byte[].</returns>
public static byte[] ToByteArray([NotNull] this string @this) => Encoding.UTF8.GetBytes(@this);
/// <summary>
/// A string extension method that converts the @this to a byte array.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <param name="encoding">encoding</param>
/// <returns>@this as a byte[].</returns>
public static byte[] ToByteArray([NotNull] this string @this, Encoding encoding) => encoding.GetBytes(@this);
public static byte[] GetBytes([NotNull] this string str) => str.GetBytes(Encoding.UTF8);
public static byte[] GetBytes([NotNull] this string? str, Encoding encoding) => encoding.GetBytes(str);
/// <summary>
/// A string extension method that converts the @this to an enum.
/// </summary>
/// <typeparam name="T">Generic type parameter.</typeparam>
/// <param name="this">The @this to act on.</param>
/// <returns>@this as a T.</returns>
public static T ToEnum<T>([NotNull] this string @this) => (T)System.Enum.Parse(typeof(T), @this);
/// <summary>
/// A string extension method that converts the @this to a title case.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <returns>@this as a string.</returns>
public static string ToTitleCase([NotNull] this string @this) => new CultureInfo("en-US").TextInfo.ToTitleCase(@this);
/// <summary>
/// A string extension method that converts the @this to a title case.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <param name="cultureInfo">Information describing the culture.</param>
/// <returns>@this as a string.</returns>
public static string ToTitleCase([NotNull] this string @this, CultureInfo cultureInfo) => cultureInfo.TextInfo.ToTitleCase(@this);
/// <summary>
/// A string extension method that truncates.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <param name="maxLength">The maximum length.</param>
/// <returns>A string.</returns>
public static string Truncate(this string @this, int maxLength) => @this.Truncate(maxLength, "...");
/// <summary>
/// A string extension method that truncates.
/// </summary>
/// <param name="this">The @this to act on.</param>
/// <param name="maxLength">The maximum length.</param>
/// <param name="suffix">The suffix.</param>
/// <returns>A string.</returns>
public static string Truncate(this string @this, int maxLength, string suffix)
{
if (@this == null || @this.Length <= maxLength)
{
return @this;
}
return @this.Substring(0, maxLength - suffix.Length) + suffix;
}
/// <summary>
/// string=>long
/// </summary>
/// <param name="txt"></param>
/// <returns></returns>
public static long? ToLong(this string? @this)
{
bool status = long.TryParse(@this, out long result);
if (status)
return result;
else
return null;
}
#region 处理Windows和Linux 系统下文件路径 处理方法
/// <summary>
/// 处理Windows和Linux 系统下文件路径
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public static string GetRuntimeDirectory(this string path)
{
if (IsLinuxRunTime()) return GetLinuxDirectory(path);
return IsWindowRunTime() ? GetWindowDirectory(path) : path;
}
public static bool IsWindowRunTime() => RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
public static bool IsLinuxRunTime() => RuntimeInformation.IsOSPlatform(OSPlatform.Linux);
private static string GetLinuxDirectory(string path)
{
var pathTemp = Path.Combine(path);
return pathTemp.Replace("\\", "/");
}
private static string GetWindowDirectory(string path)
{
var pathTemp = Path.Combine(path);
return pathTemp.Replace("/", "\\");
}
#endregion 处理Windows和Linux 系统下文件路径 处理方法
}
}

166
Elight.Utility/Paging.cs

@ -0,0 +1,166 @@
using System;
using System.Runtime.Serialization;
namespace Elight.Utility.Code
{
/// <summary>
/// 分页类
/// </summary>
[Serializable]
[DataContract]
public class Paging
{
/// <summary>
/// 页码
/// </summary>
[DataMember]
private int pageIndex = 1;
/// <summary>
/// 页码
/// </summary>
[DataMember]
public int PageIndex
{
get
{
return this.pageIndex;
}
set
{
this.pageIndex = value;
}
}
/// <summary>
/// 页大小
/// </summary>
[DataMember]
private int pageSize = 10;
/// <summary>
/// 页大小(默认10页)
/// </summary>
[DataMember]
public int PageSize
{
get
{
return this.pageSize;
}
set
{
this.pageSize = value;
}
}
/// <summary>
/// 总条数
/// </summary>
[DataMember]
public int RowsCount { get; set; }
/// <summary>
/// 总页数
/// </summary>
[DataMember]
private int pageCount;
/// <summary>
/// 总页数
/// </summary>
[DataMember]
public int PageCount
{
get
{
if (PageSize == 0)
{
return 0;
}
this.pageCount = (this.RowsCount % this.PageSize) == 0
? this.RowsCount / this.PageSize
: (this.RowsCount / this.PageSize) + 1;
return this.pageCount;
}
set
{
this.pageCount = value;
}
}
/// <summary>
/// 是否获取总条数
/// </summary>
[DataMember]
private bool getRowsCount = true;
/// <summary>
/// 排序名
/// </summary>
[DataMember]
public string SortName { get; set; }
/// <summary>
/// 排序方式
/// </summary>
[DataMember]
public string SortType { get; set; }
/// <summary>
/// 实名数量
/// </summary>
[DataMember]
public int RealNameCount { get; set; }
/// <summary>
/// 匿名数量
/// </summary>
[DataMember]
public int AnonymousCount { get; set; }
/// <summary>
/// 开始时间
/// </summary>
[DataMember]
public DateTime? StartTime { get; set; }
/// <summary>
/// 结束时间
/// </summary>
[DataMember]
public DateTime? EndTime { get; set; }
/// <summary>
/// 是否获取总条数
/// </summary>
[DataMember]
public bool GetRowsCount
{
get
{
return this.getRowsCount;
}
set
{
this.getRowsCount = value;
}
}
/// <summary>
/// 开始索引
/// </summary>
public int StratRows => PageSize * ((PageIndex <= 0 ? 1 : PageIndex) - 1) + 1;
/// <summary>
/// 开始索引
/// </summary>
public int EndRows => (PageIndex <= 0 ? 1 : PageIndex) * PageSize;
}
}

48
Elight.Utility/QueryResult.cs

@ -0,0 +1,48 @@
using Elight.Utility.Code;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Utility
{
/// <summary>
/// The query result.
/// </summary>
/// <typeparam name="T">
/// T
/// </typeparam>
[Serializable]
[DataContract]
public class QueryResult<T>
{
/// <summary>
/// Initializes a new instance of the <see cref="QueryResult{T}"/> class.
/// </summary>
/// <param name="paging">
/// The paging.
/// </param>
/// <param name="data">
/// The data.
/// </param>
public QueryResult(Paging paging, IList<T> data)
{
this.Paging = paging;
this.Data = data;
}
/// <summary>
/// 分页信息
/// </summary>
[DataMember]
public Paging Paging { get; set; }
/// <summary>
/// 数据
/// </summary>
[DataMember]
public IList<T> Data { get; set; }
}
}

61
Elight.Utility/Result.cs

@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Text;
namespace Elight.Utility.Code
{
/// <summary>
/// 消息
/// </summary>
[Serializable]
[DataContract]
public class Result
{
/// <summary>
/// 成功/失败
/// </summary>
[DataMember]
public bool IsSucceed { get; set; }
/// <summary>
/// 消息
/// </summary>
[DataMember]
public string Message { get; set; }
/// <summary>
/// 消息
/// </summary>
[DataMember]
public dynamic result { get; set; }
}
/// <summary>
/// 消息
/// </summary>
[Serializable]
[DataContract]
public class ResultData:Result
{
/// <summary>
/// 数据
/// </summary>
[DataMember]
public string Data { get; set; }
}
/// <summary>
/// 处理结果
/// </summary>
/// <typeparam name="T">扩展数据</typeparam>
[Serializable]
[DataContract]
public class Result<T> : Result
{
/// <summary>
/// 扩展数据
/// </summary>
[DataMember]
public T Data { get; set; }
}
}

188
Elight.Utility/TextWriter.cs

@ -0,0 +1,188 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Utility
{
/// <summary>
/// 写入文本
/// </summary>
internal class TextWriter
{
/// <summary>
/// 写入文件路径
/// </summary>
private readonly string fileName;
/// <summary>
/// Initializes a new instance of the <see cref="TextWriter"/> class.
/// </summary>
public TextWriter()
: this(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs"))
{
}
/// <summary>
/// Initializes a new instance of the <see cref="TextWriter"/> class.
/// </summary>
/// <param name="fileName">
/// The file name.
/// </param>
public TextWriter(string fileName)
{
this.fileName = fileName;
}
/// <summary>
/// 写入日志
/// </summary>
/// <param name="logInfo">内容 </param>
/// <returns>结果</returns>
internal bool WriteLog(string logInfo)
{
if (string.IsNullOrWhiteSpace(logInfo))
{
return false;
}
DateTime timeStamp = DateTime.Now;
string path = this.GetFileMainPath(timeStamp);
FileInfo lastFile = GetLastAccessFile(path, timeStamp);
FileStream fileStream = GetFileStream(lastFile, path, timeStamp);
if (fileStream == null)
{
return false;
}
try
{
StreamWriter sw = new StreamWriter(fileStream);
sw.BaseStream.Seek(0, SeekOrigin.End);
sw.Write(logInfo);
sw.Flush();
sw.Close();
return true;
}
finally
{
fileStream.Close();
fileStream.Dispose();
}
}
/// <summary>
/// 获取文件路径
/// </summary>
/// <param name="timeStamp">timeStamp</param>
/// <returns>path</returns>
private string GetFileMainPath(DateTime timeStamp)
{
return Path.Combine(this.fileName, timeStamp.ToString("yyyyMMdd"));
}
/// <summary>
/// 获取最后写入日志的文件
/// </summary>
/// <param name="path">路径</param>
/// <param name="timeStamp">timeStamp</param>
/// <returns>FileInfo</returns>
private static FileInfo GetLastAccessFile(string path, DateTime timeStamp)
{
FileInfo result = null;
DirectoryInfo directoryInfo = new DirectoryInfo(path);
if (directoryInfo.Exists)
{
FileInfo[] fileInfos = directoryInfo.GetFiles();
foreach (FileInfo fileInfo in fileInfos)
{
if (timeStamp.Hour == fileInfo.CreationTime.Hour)
{
result = fileInfo;
break;
}
}
}
else
{
directoryInfo.Create();
}
return result;
}
/// <summary>
/// 获取文件流
/// </summary>
/// <param name="fileInfo">lastFile</param>
/// <param name="path">path</param>
/// <param name="timeStamp">timeStamp</param>
/// <returns>FileStream</returns>
private static FileStream GetFileStream(FileInfo fileInfo, string path, DateTime timeStamp)
{
FileStream result;
if (fileInfo == null)
{
try
{
result = CreateFile(path, GetFileMainName(timeStamp));
}
catch (Exception)
{
return null;
}
}
else if (IsOutOfTimeMaxLength(fileInfo.CreationTime, timeStamp))
{
result = CreateFile(path, GetFileMainName(timeStamp));
}
else
{
try
{
result = fileInfo.OpenWrite();
}
catch
{
result = CreateFile(path, GetFileMainName(timeStamp));
}
}
return result;
}
/// <summary>
/// 创建文件
/// </summary>
/// <param name="path">路径</param>
/// <param name="fileName1">名称</param>
/// <returns>FileStream</returns>
private static FileStream CreateFile(string path, string fileName1)
{
//return File.Create(@"" + path + "\"" + fileName1 + ".log");
return File.Create(path + @"\" + fileName1 + ".log");
}
/// <summary>
/// 获取文件名称
/// </summary>
/// <param name="timeStamp">timeStamp</param>
/// <returns>HHmmssfff</returns>
private static string GetFileMainName(DateTime timeStamp)
{
return timeStamp.ToString("HH");
}
/// <summary>
/// IsOutOfTimeMaxLength
/// </summary>
/// <param name="creationTime">creationTime</param>
/// <param name="timeStamp">timeStamp</param>
/// <returns>bool</returns>
private static bool IsOutOfTimeMaxLength(DateTime creationTime, DateTime timeStamp)
{
return Math.Abs((creationTime - timeStamp).TotalHours) >= 1;
}
}
}

41
Elight.Utility/User.cs

@ -0,0 +1,41 @@
using Elight.Entity;
using Elight.Utility.Extensions;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Utility
{
/// <summary>
/// 用户信息
/// </summary>
/// Author:mxg
/// CreatedTimed:2022-05-15 10:08 PM
public class User
{
#region Identity
private readonly IHttpContextAccessor _accessor;
public User(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
#endregion Identity
public App_Sys_UserModel Userdata()
{
var data = _accessor?.HttpContext?.User?.FindFirst(ClaimTypes.UserData);
var da = JsonConvert.DeserializeObject<App_Sys_UserModel>(data.Value);
return da;
}
}
}

68
Elight.Utility/WebSocketMiddleware.cs

@ -0,0 +1,68 @@
using Elight.Entity;
using Elight.Utility.Code;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.WebSockets;
using System.Text;
using System.Threading.Tasks;
namespace Elight.Utility
{ /// <summary>
/// webSocket
/// </summary>
public class WebSocketMiddleware
{
#region Identity
private static Dictionary<string, WebSocket> CONNECT_POOL = new Dictionary<string, WebSocket>();//用户连接池
private readonly RequestDelegate _next;
App_Sys_UserModel _userdata = new App_Sys_UserModel();//当前用户
Result result = new Result();
public WebSocketMiddleware(User user)
{
_userdata = user.Userdata();
}
#endregion
/// <summary>
/// 构造
/// </summary>
/// <param name="next"></param>
/// <param name="actionPathName">目标路径</param>
public WebSocketMiddleware(RequestDelegate next)
{
_next = next;
}
/// <summary>
/// 中间件调用
/// </summary>
/// <param name="httpContext"></param>
/// <returns></returns>
[HttpGet("/ws")]
public async Task Invoke(HttpContext httpContext)
{
try
{
var socket = await httpContext.WebSockets.AcceptWebSocketAsync();
string user = _userdata.Id;
#region 用户添加连接池
//第一次open时,添加到连接池中
if (!CONNECT_POOL.ContainsKey(user))
CONNECT_POOL.Add(user, socket);//不存在,添加
else
if (socket != CONNECT_POOL[user])//当前对象不一致,更新
CONNECT_POOL[user] = socket;
#endregion
}
catch (Exception ex)
{
var ss = ex.Message;
}
await _next(httpContext);
}
}
}

258
Elight.Utility/logs/LogService.cs

@ -0,0 +1,258 @@
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LogLevel = Elight.Utility.Enum.LogLevel;
namespace Elight.Utility.logs
{
/// <summary>
/// 写入文本日志
/// </summary>
public static class LogService
{
/// <summary>
/// 写日志的等级 默认int最小值
/// </summary>
private static readonly int _logWriteLevel =3;
/// <summary>
/// The obj.
/// </summary>
private static readonly object obj = new object();
/// <summary>
/// 写日志等级设置,默认只写全部日志
/// </summary>
private static LogLevel LogWriteLevel
{
get
{
if (_logWriteLevel < 0 || _logWriteLevel > 7)
{
return LogLevel.H调试信息;
}
else
{
return (LogLevel)_logWriteLevel;
}
}
}
/// <summary>
/// 记录异常文本日志
/// </summary>
/// <param name="ex">异常</param>
/// <param name="remark">备注</param>
public static void WriteLog(Exception ex, string remark)
{
WriteLog(ex, null, remark);
}
/// <summary>
/// Writes the log.
/// </summary>
/// <param name="ex">The ex.</param>
/// <param name="remark">The remark.</param>
/// <param name="logLevel">The log level.</param>
public static void WriteLog(Exception ex, string remark, LogLevel logLevel = LogLevel.D错误事件)
{
if (logLevel > LogWriteLevel)
{
return;
}
else
{
WriteLog(ex, null, remark);
}
}
/// <summary>
/// 记录异常文本日志
/// </summary>
/// <param name="ex">异常</param>
/// <param name="path">日志路径</param>
/// <param name="remark">备注</param>
public static void WriteLog(Exception ex, string path, string remark)
{
var errormessage = CreateErrorMessage(ex, remark);
WriteLog(errormessage.ToString(), path ?? Path.Combine(GetLogPath(), "Logs/ExceptionLog"));
}
/// <summary>
/// 记录异常文本日志
/// </summary>
/// <param name="describe">错误描述</param>
/// <param name="ex">异常</param>
/// <param name="path">日志路径</param>
/// <param name="remark">备注</param>
public static void WriteLog(string describe, Exception ex, string path, string remark)
{
var errormessage = CreateErrorMessage(ex, remark);
WriteLog("Describe:" + describe + " Error:" + errormessage, path ?? Path.Combine(GetLogPath(), "Logs/ExceptionLog"));
}
/// <summary>
/// 创建异常消息
/// </summary>
/// <param name="ex">异常信息</param>
/// <param name="remark">备注</param>
/// <returns>结果</returns>
private static StringBuilder CreateErrorMessage(Exception ex, string remark)
{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("************************Exception Start********************************");
string newLine = Environment.NewLine;
stringBuilder.Append(newLine);
stringBuilder.AppendLine("Exception Remark:" + remark);
Exception innerException = ex.InnerException;
stringBuilder.AppendFormat("Exception Date:{0}{1}", DateTime.Now, Environment.NewLine);
if (innerException != null)
{
stringBuilder.AppendFormat("Inner Exception Type:{0}{1}", innerException.GetType(), newLine);
stringBuilder.AppendFormat("Inner Exception Message:{0}{1}", innerException.Message, newLine);
stringBuilder.AppendFormat("Inner Exception Source:{0}{1}", innerException.Source, newLine);
stringBuilder.AppendFormat("Inner Exception StackTrace:{0}{1}", innerException.StackTrace, newLine);
}
stringBuilder.AppendFormat("Exception Type:{0}{1}", ex.GetType(), newLine);
stringBuilder.AppendFormat("Exception Message:{0}{1}", ex.Message, newLine);
stringBuilder.AppendFormat("Exception Source:{0}{1}", ex.Source, newLine);
stringBuilder.AppendFormat("Exception StackTrace:{0}{1}", ex.StackTrace, newLine);
stringBuilder.Append("************************Exception End************************************");
stringBuilder.Append(newLine);
return stringBuilder;
}
/// <summary>
/// 记录文本日志
/// </summary>
/// <param name="content">日志内容</param>
/// <param name="logLevel">The log level.</param>
public static void WriteLog(string content, LogLevel logLevel = LogLevel.G有用信息)
{
if (logLevel > LogWriteLevel)
{
return;
}
else
{
WriteLog(logLevel.ToString() + "\t" + content, Path.Combine(GetLogPath(), "Logs"));
}
}
/// <summary>
/// 记录文本日志
/// </summary>
/// <param name="content">日志内容</param>
/// <param name="path">日志路径</param>
public static void WriteLog(string content, string path)
{
//Action action = () => Log(content, path);
//action.BeginInvoke(null, null);
//BeginInvoke只能在framework里使用
Task task = Task.Run(() => Log(content, path));
task.Wait();
}
/// <summary>
/// 记录文本日志 大于等于配置的等级 才写日志
/// </summary>
/// <param name="content">日志内容</param>
/// <param name="path">日志路径</param>
/// <param name="logLevel">写日志的等级</param>
public static void WriteLog(string content, string path, LogLevel logLevel = LogLevel.G有用信息)
{
if (logLevel > LogWriteLevel)
{
return;
}
WriteLog(logLevel + "\t" + content, path);
}
/// <summary>
/// 记录日志
/// </summary>
/// <param name="method">调用方法(必填)</param>
/// <param name="request">请求参数</param>
/// <param name="response">输出参数</param>
/// <param name="saveFolder">保存文件夹,默认为CallLog</param>
public static void SaveLog(string method, object request, object response, string saveFolder = "CallLog")
{
//try
//{
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.Append("************************Start********************************");
stringBuilder.Append(Environment.NewLine);
stringBuilder.AppendFormat("Method:{0}{1}", method, Environment.NewLine);
stringBuilder.AppendFormat("Request:{0}{1}", request == null ? string.Empty : JsonConvert.SerializeObject(request), Environment.NewLine);
stringBuilder.AppendFormat("Response:{0}{1}", response == null ? "void" : JsonConvert.SerializeObject(response), Environment.NewLine);
stringBuilder.Append("************************End************************************");
stringBuilder.Append(Environment.NewLine);
var logContent = stringBuilder.ToString();
var path = Path.Combine(GetLogPath(), "Logs/" + saveFolder);
WriteLog(logContent, path);
//}
//catch (Exception ex)
//{
// WriteLog(ex, "记录调用日志异常");
//}
}
/// <summary>
/// The log.
/// </summary>
/// <param name="content">
/// The content.
/// </param>
/// <param name="path">
/// The path.
/// </param>
/// <returns>
/// The
/// </returns>
internal static bool Log(string content, string path)
{
lock (obj)
{
try
{
TextWriter textWriter = new TextWriter(path);
return
textWriter.WriteLog(
DateTime.Now.ToString("日志时间:yyyy-MM-dd HH:mm:ss") + Environment.NewLine + content
+ Environment.NewLine);
}
catch (Exception)
{
return false;
}
}
}
/// <summary>
/// 获取日志路径
/// </summary>
/// <returns>路径</returns>
internal static string GetLogPath()
{
var _path = "/CaseFile/logs";
var dic = Path.Combine(Environment.CurrentDirectory, "wwwroot");
if (!string.IsNullOrEmpty(_path))
dic += _path;
if (string.IsNullOrWhiteSpace(dic))
{
return AppDomain.CurrentDomain.BaseDirectory;
}
else
{
return dic;
}
}
}
}

3
README.md

@ -0,0 +1,3 @@
# MultiDeviceSystem
多设备互联平台

4
desktop.ini

@ -0,0 +1,4 @@
[ViewState]
Mode=
Vid=
FolderType=Generic
Loading…
Cancel
Save