From 1f1f714f5a38b65d01c06c1c33a513111788e8ae Mon Sep 17 00:00:00 2001 From: root Date: Sat, 28 Dec 2024 23:06:28 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=86=E5=8C=96=E5=88=86=E7=B1=BB=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=A8=A1=E5=9E=8B=EF=BC=8C=E6=9B=B4=E6=94=B9=E9=83=A8?= =?UTF-8?q?=E5=88=86service=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Attributes/AuthorizeAttribute.cs | 3 +- src/Controllers/ManagementController.cs | 8 +- src/Controllers/StreamProxyController.cs | 2 +- src/Controllers/UserController.cs | 25 +---- .../VisitorManagementController.cs | 4 +- src/Controllers/iProxyController.cs | 8 +- src/Handlers/CommandLine/CorsPolicy.cs | 13 +++ src/Handlers/CommandLine/EnableDevLogger.cs | 2 +- src/Handlers/CommandLine/HelpHandler.cs | 10 +- src/Handlers/CommandLineArgumentDispatcher.cs | 4 +- src/Helpers/FileDownloadHelper.cs | 3 +- src/Helpers/MasterHelper.cs | 2 +- src/Middlewares/ErrorHandlerMiddleware.cs | 2 +- src/Middlewares/IPAccessLimitMiddleware.cs | 5 +- src/Middlewares/JwtMiddleware.cs | 2 +- src/Models/ClientInfo.cs | 6 -- src/Models/Other/ClientInfo.cs | 9 ++ src/Models/Other/ConnectionPoolInfo.cs | 33 +++++++ .../{ => Other}/HttpContextDebugInfo.cs | 10 +- src/Models/Other/MysqlProcessListInfo.cs | 48 ++++++++++ src/Models/{ => Other}/ProcessInfo.cs | 4 +- src/Models/{ => Other}/Security.cs | 2 +- src/Models/Other/ServerTaskLoadInfo.cs | 17 ++++ src/Models/Other/SystemLog.cs | 25 +++++ src/Models/{ => Other}/User.cs | 27 +----- src/Models/PagedResult.cs | 31 ------- src/Models/Request/User.cs | 49 ++++++++++ src/Models/{ => Response}/CommonRsp.cs | 2 +- src/Models/Response/PagedResult.cs | 35 +++++++ src/Models/SystemLog.cs | 22 ----- src/Models/Task/DownloadFileInfo.cs | 14 +++ src/Models/Task/DownloadHistory.cs | 16 ++++ src/Models/{Task.cs => Task/TaskAddState.cs} | 77 +--------------- src/Models/{Db.cs => Task/TaskInfo.cs} | 91 +------------------ src/Models/Task/TaskState.cs | 49 ++++++++++ src/Program.cs | 28 ++++-- .../PublishProfiles/FolderProfile.pubxml | 2 +- src/SerilogConfig.cs | 1 - src/Services/AppConfigService.cs | 2 + src/Services/AuthService.cs | 18 ++-- src/Services/DatabaseGateService.cs | 9 +- ....cs => LocalCacheLifeManagementService.cs} | 11 ++- ...askManager.cs => TaskManagementService.cs} | 13 +-- 43 files changed, 412 insertions(+), 332 deletions(-) create mode 100644 src/Handlers/CommandLine/CorsPolicy.cs delete mode 100644 src/Models/ClientInfo.cs create mode 100644 src/Models/Other/ClientInfo.cs create mode 100644 src/Models/Other/ConnectionPoolInfo.cs rename src/Models/{ => Other}/HttpContextDebugInfo.cs (95%) create mode 100644 src/Models/Other/MysqlProcessListInfo.cs rename src/Models/{ => Other}/ProcessInfo.cs (98%) rename src/Models/{ => Other}/Security.cs (83%) create mode 100644 src/Models/Other/ServerTaskLoadInfo.cs create mode 100644 src/Models/Other/SystemLog.cs rename src/Models/{ => Other}/User.cs (82%) delete mode 100644 src/Models/PagedResult.cs create mode 100644 src/Models/Request/User.cs rename src/Models/{ => Response}/CommonRsp.cs (93%) create mode 100644 src/Models/Response/PagedResult.cs delete mode 100644 src/Models/SystemLog.cs create mode 100644 src/Models/Task/DownloadFileInfo.cs create mode 100644 src/Models/Task/DownloadHistory.cs rename src/Models/{Task.cs => Task/TaskAddState.cs} (51%) rename src/Models/{Db.cs => Task/TaskInfo.cs} (55%) create mode 100644 src/Models/Task/TaskState.cs rename src/Services/{LocalCacheManager.cs => LocalCacheLifeManagementService.cs} (94%) rename src/Services/{TaskManager.cs => TaskManagementService.cs} (98%) diff --git a/src/Attributes/AuthorizeAttribute.cs b/src/Attributes/AuthorizeAttribute.cs index ee46930..645effb 100644 --- a/src/Attributes/AuthorizeAttribute.cs +++ b/src/Attributes/AuthorizeAttribute.cs @@ -1,4 +1,5 @@ -using iFileProxy.Models; +using iFileProxy.Models.Response; +using iFileProxy.Models.Other; using iFileProxy.Services; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; diff --git a/src/Controllers/ManagementController.cs b/src/Controllers/ManagementController.cs index 0283aef..f745001 100644 --- a/src/Controllers/ManagementController.cs +++ b/src/Controllers/ManagementController.cs @@ -1,20 +1,22 @@ using iFileProxy.Config; -using iFileProxy.Models; +using iFileProxy.Models.Other; using iFileProxy.Services; using Microsoft.AspNetCore.Mvc; using Serilog; using System.Text.Json; using iFileProxy.Attributes; using Serilog.Events; +using iFileProxy.Models.Task; +using iFileProxy.Models.Response; namespace iFileProxy.Controllers { [Authorize(UserMask.Admin,UserMask.SuperAdmin)] [Route("[controller]")] [ApiController] - public class ManagementController(TaskManager taskManager, DatabaseGateService dbGateService, Dictionary> ipAccessLimitData) : ControllerBase + public class ManagementController(TaskManagementService taskManager, DatabaseGateService dbGateService, Dictionary> ipAccessLimitData) : ControllerBase { - public TaskManager _taskManager = taskManager; + public TaskManagementService _taskManager = taskManager; public DatabaseGateService _dbGateService = dbGateService; private readonly Serilog.ILogger _logger = Log.Logger.ForContext(); diff --git a/src/Controllers/StreamProxyController.cs b/src/Controllers/StreamProxyController.cs index 9e1290b..4beb7de 100644 --- a/src/Controllers/StreamProxyController.cs +++ b/src/Controllers/StreamProxyController.cs @@ -1,5 +1,5 @@ using iFileProxy.Config; -using iFileProxy.Models; +using iFileProxy.Models.Task; using Microsoft.AspNetCore.Mvc; using Serilog; using System.Web; diff --git a/src/Controllers/UserController.cs b/src/Controllers/UserController.cs index 4bbb554..d840f34 100644 --- a/src/Controllers/UserController.cs +++ b/src/Controllers/UserController.cs @@ -1,7 +1,9 @@ using iFileProxy.Attributes; using iFileProxy.Config; using iFileProxy.Helpers; -using iFileProxy.Models; +using iFileProxy.Models.Response; +using iFileProxy.Models.Request; +using iFileProxy.Models.Other; using iFileProxy.Services; using Microsoft.AspNetCore.Mvc; @@ -572,27 +574,6 @@ namespace iFileProxy.Controllers }); } } - - public class UpdateUserMaskRequest - { - public UserMask NewMask { get; set; } - } - - public class UpdateNicknameRequest - { - public string NewNickname { get; set; } = string.Empty; - } - - public class UpdatePasswordRequest - { - public string OldPassword { get; set; } = string.Empty; - public string NewPassword { get; set; } = string.Empty; - } - - public class ResetPasswordRequest - { - public string NewPassword { get; set; } = string.Empty; - } } } \ No newline at end of file diff --git a/src/Controllers/VisitorManagementController.cs b/src/Controllers/VisitorManagementController.cs index f650dde..4aa8fc3 100644 --- a/src/Controllers/VisitorManagementController.cs +++ b/src/Controllers/VisitorManagementController.cs @@ -1,10 +1,10 @@ using iFileProxy.Helpers; using iFileProxy.Services; -using iFileProxy.Models; -using iFileProxy.Config; +using iFileProxy.Models.Response; using Microsoft.AspNetCore.Mvc; using Newtonsoft.Json; using Serilog; +using iFileProxy.Models.Task; namespace iFileProxy.Controllers { diff --git a/src/Controllers/iProxyController.cs b/src/Controllers/iProxyController.cs index 9e4dede..f46e638 100644 --- a/src/Controllers/iProxyController.cs +++ b/src/Controllers/iProxyController.cs @@ -1,6 +1,8 @@ using iFileProxy.Config; using iFileProxy.Helpers; -using iFileProxy.Models; +using iFileProxy.Models.Task; +using iFileProxy.Models.Response; + using iFileProxy.Services; using Serilog; using Microsoft.AspNetCore.Mvc; @@ -10,14 +12,14 @@ namespace iFileProxy.Controllers { public class iProxyController : ControllerBase { - private readonly TaskManager _taskManager; + private readonly TaskManagementService _taskManager; private AppConfig _appConfig; private readonly DatabaseGateService _dbGate; private readonly static Serilog.ILogger _logger = Log.Logger.ForContext(); - public iProxyController(TaskManager taskManager, AppConfigService appConfigService, DatabaseGateService databaseGateService) + public iProxyController(TaskManagementService taskManager, AppConfigService appConfigService, DatabaseGateService databaseGateService) { _taskManager = taskManager; _appConfig = appConfigService.AppConfig; diff --git a/src/Handlers/CommandLine/CorsPolicy.cs b/src/Handlers/CommandLine/CorsPolicy.cs new file mode 100644 index 0000000..e155abe --- /dev/null +++ b/src/Handlers/CommandLine/CorsPolicy.cs @@ -0,0 +1,13 @@ +using iFileProxy.Attributes; +using iFileProxy.Interfaces; + +namespace iFileProxy.Handlers.CommandLine +{ + [CommandLineArgument(FullArgumentName = "--cors-allowed-domains", ShortArgumentName = "-A", Description = "自定义Cors跨域策略,参数为url格式,使用英文分号分割多个url", NeedValue = true)] + public class CorsPolicy(string[] args) : ICommandLineHandler + { + public void Process() + { + } + } +} diff --git a/src/Handlers/CommandLine/EnableDevLogger.cs b/src/Handlers/CommandLine/EnableDevLogger.cs index 39ac720..a85107b 100644 --- a/src/Handlers/CommandLine/EnableDevLogger.cs +++ b/src/Handlers/CommandLine/EnableDevLogger.cs @@ -8,7 +8,7 @@ namespace iFileProxy.Handlers.CommandLine { public void Process() { - Console.WriteLine("dev level logging is enabled."); + Console.WriteLine("dev level logging has enabled."); // 具体的实现在SerilogConfig.cs中 此处仅作提示 } } diff --git a/src/Handlers/CommandLine/HelpHandler.cs b/src/Handlers/CommandLine/HelpHandler.cs index fcb78e1..643b1e8 100644 --- a/src/Handlers/CommandLine/HelpHandler.cs +++ b/src/Handlers/CommandLine/HelpHandler.cs @@ -21,13 +21,21 @@ namespace iFileProxy.Handlers.CommandLine int maxKeyLength = helpText.Keys.Max(key => key.Length); // 打印表头 - Console.WriteLine("参数(短参数, 长参数)\t解释"); + Console.WriteLine("参数: "); // 打印每一行的帮助信息,确保对齐 foreach (var ht in helpText) { Console.WriteLine($" {ht.Key}{new string(' ', maxKeyLength - ht.Key.Length)}\t{ht.Value}"); } + Console.WriteLine(); + + Console.WriteLine("示例: "); + + Console.WriteLine($" --cors-allowed-domains=https://www.example.com;http://api.example.com:4433"); + Console.WriteLine($" -B=http://0.0.0.0:5000"); + + Console.WriteLine(new string('\n',2)); Console.WriteLine($"程序编译日期(UTC+8): {MasterHelper.GetBuildTime(Assembly.GetExecutingAssembly())}"); diff --git a/src/Handlers/CommandLineArgumentDispatcher.cs b/src/Handlers/CommandLineArgumentDispatcher.cs index cbc0256..4292d60 100644 --- a/src/Handlers/CommandLineArgumentDispatcher.cs +++ b/src/Handlers/CommandLineArgumentDispatcher.cs @@ -68,9 +68,9 @@ namespace iFileProxy.Handlers { throw new ArgumentException("该参数长短参数名均为空 请联系软件开发者反馈"); } - else if (!attribute.NeedValue && attribute.FullArgumentName.Trim() == string.Empty) + else if (!attribute.NeedValue && attribute.FullArgumentName.Trim() == string.Empty) // 只有短参且不需要值 return attribute.ShortArgumentName ; - else if (!attribute.NeedValue && attribute.ShortArgumentName.Trim() == string.Empty) + else if (!attribute.NeedValue && attribute.ShortArgumentName.Trim() == string.Empty)// 只有长参且不需要值 return $"{attribute.ShortArgumentName} {attribute.FullArgumentName}"; else return $"{attribute.ShortArgumentName},{attribute.FullArgumentName}"; diff --git a/src/Helpers/FileDownloadHelper.cs b/src/Helpers/FileDownloadHelper.cs index f0c1ed3..c015e80 100644 --- a/src/Helpers/FileDownloadHelper.cs +++ b/src/Helpers/FileDownloadHelper.cs @@ -1,7 +1,6 @@ -using iFileProxy.Models; +using iFileProxy.Models.Task; using Serilog; using System.Net.Http.Headers; -using System.Text.Json; namespace iFileProxy.Helpers { diff --git a/src/Helpers/MasterHelper.cs b/src/Helpers/MasterHelper.cs index 2536ffd..95bcc12 100644 --- a/src/Helpers/MasterHelper.cs +++ b/src/Helpers/MasterHelper.cs @@ -1,5 +1,5 @@ using iFileProxy.Config; -using iFileProxy.Models; +using iFileProxy.Models.Other; using Serilog; using System.Globalization; using System.Net; diff --git a/src/Middlewares/ErrorHandlerMiddleware.cs b/src/Middlewares/ErrorHandlerMiddleware.cs index fa4c83c..a779bb7 100644 --- a/src/Middlewares/ErrorHandlerMiddleware.cs +++ b/src/Middlewares/ErrorHandlerMiddleware.cs @@ -1,5 +1,5 @@ using iFileProxy.Helpers; -using iFileProxy.Models; +using iFileProxy.Models.Response; using Serilog; using System.Net; using System.Text.Json; diff --git a/src/Middlewares/IPAccessLimitMiddleware.cs b/src/Middlewares/IPAccessLimitMiddleware.cs index 5ccd5c5..aafb99c 100644 --- a/src/Middlewares/IPAccessLimitMiddleware.cs +++ b/src/Middlewares/IPAccessLimitMiddleware.cs @@ -1,6 +1,5 @@ -using iFileProxy.Config; -using iFileProxy.Helpers; -using iFileProxy.Models; +using iFileProxy.Helpers; +using iFileProxy.Models.Response; using iFileProxy.Services; using System.Text.Json; diff --git a/src/Middlewares/JwtMiddleware.cs b/src/Middlewares/JwtMiddleware.cs index 0f857fa..45d9c36 100644 --- a/src/Middlewares/JwtMiddleware.cs +++ b/src/Middlewares/JwtMiddleware.cs @@ -1,5 +1,5 @@ using iFileProxy.Helpers; -using iFileProxy.Models; +using iFileProxy.Models.Response; using Microsoft.IdentityModel.Tokens; using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; diff --git a/src/Models/ClientInfo.cs b/src/Models/ClientInfo.cs deleted file mode 100644 index 7b62e9b..0000000 --- a/src/Models/ClientInfo.cs +++ /dev/null @@ -1,6 +0,0 @@ -public class ClientInfo -{ - public string IP { get; set; } = string.Empty; - public string UserAgent { get; set; } = string.Empty; - public string Fingerprint { get; set; } = string.Empty; // 浏览器指纹 -} \ No newline at end of file diff --git a/src/Models/Other/ClientInfo.cs b/src/Models/Other/ClientInfo.cs new file mode 100644 index 0000000..e59ebf2 --- /dev/null +++ b/src/Models/Other/ClientInfo.cs @@ -0,0 +1,9 @@ +namespace iFileProxy.Models.Other +{ + public class ClientInfo + { + public string IP { get; set; } = string.Empty; + public string UserAgent { get; set; } = string.Empty; + public string Fingerprint { get; set; } = string.Empty; // 浏览器指纹 + } +} diff --git a/src/Models/Other/ConnectionPoolInfo.cs b/src/Models/Other/ConnectionPoolInfo.cs new file mode 100644 index 0000000..4b925fe --- /dev/null +++ b/src/Models/Other/ConnectionPoolInfo.cs @@ -0,0 +1,33 @@ +namespace iFileProxy.Models.Other +{ + /// + /// 数据库连接池信息 + /// + public class ConnectionPoolInfo + { + /// + /// 当前总连接数 + /// + public long TotalConnections { get; set; } + + /// + /// 活跃连接数 + /// + public long ActiveConnections { get; set; } + + /// + /// 空闲连接数 + /// + public long SleepingConnections { get; set; } + + /// + /// 连接池最大连接数 + /// + public uint MaxPoolSize { get; set; } + + /// + /// 连接详情列表 + /// + public List Connections { get; set; } = []; + } +} diff --git a/src/Models/HttpContextDebugInfo.cs b/src/Models/Other/HttpContextDebugInfo.cs similarity index 95% rename from src/Models/HttpContextDebugInfo.cs rename to src/Models/Other/HttpContextDebugInfo.cs index b9b0883..4a4270c 100644 --- a/src/Models/HttpContextDebugInfo.cs +++ b/src/Models/Other/HttpContextDebugInfo.cs @@ -1,6 +1,6 @@ using System.Text.Json; -namespace iFileProxy.Models +namespace iFileProxy.Models.Other { public class HttpContextDebugInfo { @@ -84,10 +84,10 @@ namespace iFileProxy.Models /// public override string ToString() { - return JsonSerializer.Serialize(this, new JsonSerializerOptions - { - WriteIndented = true + return JsonSerializer.Serialize(this, new JsonSerializerOptions + { + WriteIndented = true }); } } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/Models/Other/MysqlProcessListInfo.cs b/src/Models/Other/MysqlProcessListInfo.cs new file mode 100644 index 0000000..689e550 --- /dev/null +++ b/src/Models/Other/MysqlProcessListInfo.cs @@ -0,0 +1,48 @@ +namespace iFileProxy.Models.Other +{ + /// + /// MySQL 进程列表信息 + /// + public class ProcessListInfo + { + /// + /// 连接ID + /// + public long Id { get; set; } + + /// + /// 用户名 + /// + public string User { get; set; } = string.Empty; + + /// + /// 主机信息 + /// + public string Host { get; set; } = string.Empty; + + /// + /// 数据库名 + /// + public string Db { get; set; } = string.Empty; + + /// + /// 命令类型 + /// + public string Command { get; set; } = string.Empty; + + /// + /// 执行时间(秒) + /// + public long Time { get; set; } + + /// + /// 连接状态 + /// + public string State { get; set; } = string.Empty; + + /// + /// 执行的SQL + /// + public string Info { get; set; } = string.Empty; + } +} diff --git a/src/Models/ProcessInfo.cs b/src/Models/Other/ProcessInfo.cs similarity index 98% rename from src/Models/ProcessInfo.cs rename to src/Models/Other/ProcessInfo.cs index 64daeed..c5fc67f 100644 --- a/src/Models/ProcessInfo.cs +++ b/src/Models/Other/ProcessInfo.cs @@ -1,7 +1,7 @@ using System.Diagnostics; using ThreadState = System.Diagnostics.ThreadState; -namespace iFileProxy.Models +namespace iFileProxy.Models.Other { /// /// 进程详细信息模型 @@ -74,4 +74,4 @@ namespace iFileProxy.Models /// public ThreadPriorityLevel Priority { get; set; } } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/Models/Security.cs b/src/Models/Other/Security.cs similarity index 83% rename from src/Models/Security.cs rename to src/Models/Other/Security.cs index f6cc279..24d89cf 100644 --- a/src/Models/Security.cs +++ b/src/Models/Other/Security.cs @@ -1,4 +1,4 @@ -namespace iFileProxy.Models +namespace iFileProxy.Models.Other { /// /// 计算文件Hash类型 diff --git a/src/Models/Other/ServerTaskLoadInfo.cs b/src/Models/Other/ServerTaskLoadInfo.cs new file mode 100644 index 0000000..94d4ff7 --- /dev/null +++ b/src/Models/Other/ServerTaskLoadInfo.cs @@ -0,0 +1,17 @@ +namespace iFileProxy.Models.Other +{ + /// + /// 任务负载信息 + /// + public class ServerTaskLoadInfo + { + /// + /// 正在运行的任务数 + /// + public int Running { get; set; } + /// + /// 正在队列中的任务数 + /// + public int Queuing { get; set; } + } +} diff --git a/src/Models/Other/SystemLog.cs b/src/Models/Other/SystemLog.cs new file mode 100644 index 0000000..4bd2bf2 --- /dev/null +++ b/src/Models/Other/SystemLog.cs @@ -0,0 +1,25 @@ +namespace iFileProxy.Models.Other +{ + using Newtonsoft.Json; + + public class SystemLog + { + [JsonProperty("log_id")] + public string LogId { get; set; } = Guid.NewGuid().ToString(); + + [JsonProperty("level")] + public string Level { get; set; } = string.Empty; + + [JsonProperty("message")] + public string Message { get; set; } = string.Empty; + + [JsonProperty("exception")] + public string? Exception { get; set; } + + [JsonProperty("properties")] + public string Properties { get; set; } = "{}"; + + [JsonProperty("timestamp")] + public DateTime Timestamp { get; set; } + } +} \ No newline at end of file diff --git a/src/Models/User.cs b/src/Models/Other/User.cs similarity index 82% rename from src/Models/User.cs rename to src/Models/Other/User.cs index b0dadf9..c8aca6a 100644 --- a/src/Models/User.cs +++ b/src/Models/Other/User.cs @@ -1,6 +1,6 @@ using Newtonsoft.Json; -namespace iFileProxy.Models +namespace iFileProxy.Models.Other { public enum UserMask { @@ -139,29 +139,4 @@ namespace iFileProxy.Models [JsonProperty("nickname")] public string Nickname { get; set; } = string.Empty; } - - - /// - /// 注册请求数据结构 - /// - public class RegisterRequest - { - public string Username { get; set; } = string.Empty; - public string Password { get; set; } = string.Empty; - public string NickName { get; set; } = string.Empty; - public string Email { get; set; } = string.Empty; - } - - /// - /// 登录请求数据结构 - /// - public class LoginRequest - { - /// - /// 用户名或邮箱 - /// - public string Username { get; set; } = string.Empty; - public string Account { get; set; } = string.Empty; - public string Password { get; set; } = string.Empty; - } } diff --git a/src/Models/PagedResult.cs b/src/Models/PagedResult.cs deleted file mode 100644 index a6a4a9b..0000000 --- a/src/Models/PagedResult.cs +++ /dev/null @@ -1,31 +0,0 @@ -/// -/// 通用分页结果模型 -/// -/// 数据项类型 -public class PagedResult -{ - /// - /// 总记录数 - /// - public long Total { get; set; } - - /// - /// 每页数量 - /// - public int PageSize { get; set; } - - /// - /// 当前页码 - /// - public int CurrentPage { get; set; } - - /// - /// 总页数 - /// - public int TotalPages { get; set; } - - /// - /// 当前页的数据列表 - /// - public List Data { get; set; } = new(); -} \ No newline at end of file diff --git a/src/Models/Request/User.cs b/src/Models/Request/User.cs new file mode 100644 index 0000000..49cc115 --- /dev/null +++ b/src/Models/Request/User.cs @@ -0,0 +1,49 @@ +using iFileProxy.Models.Other; + +namespace iFileProxy.Models.Request +{ + /// + /// 注册请求数据结构 + /// + public class RegisterRequest + { + public string Username { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + public string NickName { get; set; } = string.Empty; + public string Email { get; set; } = string.Empty; + } + + /// + /// 登录请求数据结构 + /// + public class LoginRequest + { + /// + /// 用户名或邮箱 + /// + public string Username { get; set; } = string.Empty; + public string Account { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + } + + public class UpdateUserMaskRequest + { + public UserMask NewMask { get; set; } + } + + public class UpdateNicknameRequest + { + public string NewNickname { get; set; } = string.Empty; + } + + public class UpdatePasswordRequest + { + public string OldPassword { get; set; } = string.Empty; + public string NewPassword { get; set; } = string.Empty; + } + + public class ResetPasswordRequest + { + public string NewPassword { get; set; } = string.Empty; + } +} diff --git a/src/Models/CommonRsp.cs b/src/Models/Response/CommonRsp.cs similarity index 93% rename from src/Models/CommonRsp.cs rename to src/Models/Response/CommonRsp.cs index 5e74b48..1af9f82 100644 --- a/src/Models/CommonRsp.cs +++ b/src/Models/Response/CommonRsp.cs @@ -1,7 +1,7 @@ using Newtonsoft.Json; using System.Text.Json.Serialization; -namespace iFileProxy.Models +namespace iFileProxy.Models.Response { /// /// 通用Http Response diff --git a/src/Models/Response/PagedResult.cs b/src/Models/Response/PagedResult.cs new file mode 100644 index 0000000..f1d471a --- /dev/null +++ b/src/Models/Response/PagedResult.cs @@ -0,0 +1,35 @@ +namespace iFileProxy.Models.Response +{ + /// + /// 通用分页结果模型 + /// + /// 数据项类型 + public class PagedResult + { + /// + /// 总记录数 + /// + public long Total { get; set; } + + /// + /// 每页数量 + /// + public int PageSize { get; set; } + + /// + /// 当前页码 + /// + public int CurrentPage { get; set; } + + /// + /// 总页数 + /// + public int TotalPages { get; set; } + + /// + /// 当前页的数据列表 + /// + public List Data { get; set; } = new(); + } +} + diff --git a/src/Models/SystemLog.cs b/src/Models/SystemLog.cs deleted file mode 100644 index 4472ce1..0000000 --- a/src/Models/SystemLog.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Newtonsoft.Json; - -public class SystemLog -{ - [JsonProperty("log_id")] - public string LogId { get; set; } = Guid.NewGuid().ToString(); - - [JsonProperty("level")] - public string Level { get; set; } = string.Empty; - - [JsonProperty("message")] - public string Message { get; set; } = string.Empty; - - [JsonProperty("exception")] - public string? Exception { get; set; } - - [JsonProperty("properties")] - public string Properties { get; set; } = "{}"; - - [JsonProperty("timestamp")] - public DateTime Timestamp { get; set; } -} \ No newline at end of file diff --git a/src/Models/Task/DownloadFileInfo.cs b/src/Models/Task/DownloadFileInfo.cs new file mode 100644 index 0000000..52cdf5a --- /dev/null +++ b/src/Models/Task/DownloadFileInfo.cs @@ -0,0 +1,14 @@ +namespace iFileProxy.Models.Task +{ + public class DownloadFileInfo + { + /// + /// 文件名 + /// + public string FileName { get; set; } + /// + /// 文件大小 + /// + public long Size { get; set; } + } +} diff --git a/src/Models/Task/DownloadHistory.cs b/src/Models/Task/DownloadHistory.cs new file mode 100644 index 0000000..8fdf731 --- /dev/null +++ b/src/Models/Task/DownloadHistory.cs @@ -0,0 +1,16 @@ +using Newtonsoft.Json; + +namespace iFileProxy.Models.Task +{ + public class DownloadHistory + { + [JsonProperty("tid")] + public string TaskId { get; set; } = string.Empty; + + [JsonProperty("time")] + public DateTime Time { get; set; } + + [JsonProperty("client_ip")] + public string ClientIP { get; set; } = string.Empty; + } +} diff --git a/src/Models/Task.cs b/src/Models/Task/TaskAddState.cs similarity index 51% rename from src/Models/Task.cs rename to src/Models/Task/TaskAddState.cs index e107903..8cd0067 100644 --- a/src/Models/Task.cs +++ b/src/Models/Task/TaskAddState.cs @@ -1,54 +1,11 @@ -namespace iFileProxy.Models +namespace iFileProxy.Models.Task { - /// - /// 任务状态 - /// - public enum TaskState { - /// - /// 还未初始化 - /// - NoInit = 0, - /// - /// 正在进行 - /// - Running = 1, - /// - /// 任务执行时候发生错误 已经结束 - /// - Error = 2, - /// - /// 任务正常结束 - /// - End = 3, - /// - /// 要下载的内容已经缓存 - /// - Cached = 4, - /// - /// 内容过期已被清理 - /// - Cleaned = 5, - /// - /// 正在排队 - /// - Queuing = 6, - /// - /// 任务因为各种原因被取消 - /// - Canceled = 7, - /// - /// 流任务 - /// - Stream = 8, - /// - /// 其他 - /// - Other = 999 - } + /// /// 任务添加状态 /// - public enum TaskAddState { + public enum TaskAddState + { /// /// 成功 /// @@ -114,28 +71,4 @@ /// ErrKeywordForbidden = 15, } - public class DownloadFileInfo { - /// - /// 文件名 - /// - public string FileName { get; set; } - /// - /// 文件大小 - /// - public long Size { get; set; } - } - - /// - /// 任务负载信息 - /// - public class ServerTaskLoadInfo { - /// - /// 正在运行的任务数 - /// - public int Running { get; set; } - /// - /// 正在队列中的任务数 - /// - public int Queuing { get; set; } - } -} \ No newline at end of file +} diff --git a/src/Models/Db.cs b/src/Models/Task/TaskInfo.cs similarity index 55% rename from src/Models/Db.cs rename to src/Models/Task/TaskInfo.cs index 2ec69bc..e58b885 100644 --- a/src/Models/Db.cs +++ b/src/Models/Task/TaskInfo.cs @@ -2,7 +2,7 @@ using System.Diagnostics; using System.Text.Json; using System.Text.Json.Serialization; -namespace iFileProxy.Models +namespace iFileProxy.Models.Task { public class TaskInfo { @@ -106,93 +106,4 @@ namespace iFileProxy.Models public static string iFileProxy = "iFileProxy_Db"; } - - /// - /// 数据库连接池信息 - /// - public class ConnectionPoolInfo - { - /// - /// 当前总连接数 - /// - public long TotalConnections { get; set; } - - /// - /// 活跃连接数 - /// - public long ActiveConnections { get; set; } - - /// - /// 空闲连接数 - /// - public long SleepingConnections { get; set; } - - /// - /// 连接池最大连接数 - /// - public uint MaxPoolSize { get; set; } - - /// - /// 连接详情列表 - /// - public List Connections { get; set; } = []; - } - - /// - /// MySQL 进程列表信息 - /// - public class ProcessListInfo - { - /// - /// 连接ID - /// - public long Id { get; set; } - - /// - /// 用户名 - /// - public string User { get; set; } = string.Empty; - - /// - /// 主机信息 - /// - public string Host { get; set; } = string.Empty; - - /// - /// 数据库名 - /// - public string Db { get; set; } = string.Empty; - - /// - /// 命令类型 - /// - public string Command { get; set; } = string.Empty; - - /// - /// 执行时间(秒) - /// - public long Time { get; set; } - - /// - /// 连接状态 - /// - public string State { get; set; } = string.Empty; - - /// - /// 执行的SQL - /// - public string Info { get; set; } = string.Empty; - } - - public class DownloadHistory - { - [JsonProperty("tid")] - public string TaskId { get; set; } = string.Empty; - - [JsonProperty("time")] - public DateTime Time { get; set; } - - [JsonProperty("client_ip")] - public string ClientIP { get; set; } = string.Empty; - } } diff --git a/src/Models/Task/TaskState.cs b/src/Models/Task/TaskState.cs new file mode 100644 index 0000000..42f2c4d --- /dev/null +++ b/src/Models/Task/TaskState.cs @@ -0,0 +1,49 @@ +namespace iFileProxy.Models.Task +{ + /// + /// 任务状态 + /// + public enum TaskState + { + /// + /// 还未初始化 + /// + NoInit = 0, + /// + /// 正在进行 + /// + Running = 1, + /// + /// 任务执行时候发生错误 已经结束 + /// + Error = 2, + /// + /// 任务正常结束 + /// + End = 3, + /// + /// 要下载的内容已经缓存 + /// + Cached = 4, + /// + /// 内容过期已被清理 + /// + Cleaned = 5, + /// + /// 正在排队 + /// + Queuing = 6, + /// + /// 任务因为各种原因被取消 + /// + Canceled = 7, + /// + /// 流任务 + /// + Stream = 8, + /// + /// 其他 + /// + Other = 999 + } +} diff --git a/src/Program.cs b/src/Program.cs index eb0061f..30e66b4 100644 --- a/src/Program.cs +++ b/src/Program.cs @@ -22,12 +22,12 @@ namespace iFileProxy Serilog.ILogger logger = Log.Logger.ForContext(); - CommandLineArgsHelper argsHelper = new(args); + CommandLineArgsHelper cmdlineArgsHelper = new(args); // 解析命令行参数 CommandLineArgumentDispatcher.Parse(args); - if (argsHelper.GetBooleanValue("--version") || argsHelper.GetBooleanValue("-v")) + if (cmdlineArgsHelper.GetBooleanValue("--version") || cmdlineArgsHelper.GetBooleanValue("-v")) { var buildTime = MasterHelper.GetBuildTime(Assembly.GetEntryAssembly()); StringBuilder sb = new StringBuilder(); @@ -43,6 +43,15 @@ namespace iFileProxy var builder = WebApplication.CreateBuilder(); + string[] allowDomains = []; + string? arg = cmdlineArgsHelper.GetStringValue("--cors-allowed-domains|-A"); + + if (arg != null) + { + allowDomains =arg.Split(";", StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + logger.Information($"当前正使用自定义Cors策略, Allowed: {string.Join(',',allowDomains)}"); + } + // CORS配置 builder.Services.AddCors(options => { @@ -50,7 +59,7 @@ namespace iFileProxy builder => { builder - .WithOrigins("http://localhost:3000", "http://admin.gitdl.cn", "https://admin.gitdl.cn", "https://github.linxi.info", "http://github.linxi.info/", "http://localhost:4173") + .WithOrigins(allowDomains) .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials(); @@ -69,7 +78,7 @@ namespace iFileProxy builder.Services.AddSingleton(); builder.Services.AddSingleton(AppConfig.GetCurrConfig()); builder.Services.AddSingleton(); - builder.Services.AddSingleton(); + builder.Services.AddSingleton(); builder.Services.AddSingleton>>(); // 添加验证服务 @@ -95,13 +104,13 @@ namespace iFileProxy var app = builder.Build(); // 初始化缓存管理服务 - LocalCacheManager localCacheManager = new(app.Services); + LocalCacheLifeManagementService localCacheManager = new(app.Services); // 开启配置热重载 app.Services.GetRequiredService().EnableHotReload(); - if (!argsHelper.GetBooleanValue("--disable-startup-check|-D")) + if (!cmdlineArgsHelper.GetBooleanValue("--disable-startup-check|-D")) // 初始化验证配置文件 AppConfig.CheckAppConfig(app.Services); @@ -154,13 +163,13 @@ namespace iFileProxy var dbGateService = app.Services.GetRequiredService(); SerilogConfig.CreateLogger(dbGateService, args); - if (!argsHelper.GetStringValue("--bind-url|-B").IsNullOrEmpty()) - app.Run(argsHelper.GetStringValue("--bind-url|-B")); + if (!cmdlineArgsHelper.GetStringValue("--bind-url|-B").IsNullOrEmpty()) + app.Run(cmdlineArgsHelper.GetStringValue("--bind-url|-B")); else app.Run(); } - + #region 全局异常处理 private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { var logger = Log.ForContext(); @@ -192,5 +201,6 @@ namespace iFileProxy // 优雅退出应用程序 Environment.Exit(1); } + #endregion } } diff --git a/src/Properties/PublishProfiles/FolderProfile.pubxml b/src/Properties/PublishProfiles/FolderProfile.pubxml index 8285a16..1296e0c 100644 --- a/src/Properties/PublishProfiles/FolderProfile.pubxml +++ b/src/Properties/PublishProfiles/FolderProfile.pubxml @@ -15,7 +15,7 @@ https://go.microsoft.com/fwlink/?LinkID=208121. <_TargetId>Folder net8.0 - win-x64 + linux-x64 e343bd8a-27ed-47e2-b50d-e3000730e65e false true diff --git a/src/SerilogConfig.cs b/src/SerilogConfig.cs index 17b166f..ee54752 100644 --- a/src/SerilogConfig.cs +++ b/src/SerilogConfig.cs @@ -6,7 +6,6 @@ using iFileProxy.Sinks; using iFileProxy.Services; using iFileProxy.Helpers; - using Microsoft.IdentityModel.Tokens; public static class SerilogConfig { diff --git a/src/Services/AppConfigService.cs b/src/Services/AppConfigService.cs index 55ad2b0..7c01b5d 100644 --- a/src/Services/AppConfigService.cs +++ b/src/Services/AppConfigService.cs @@ -28,8 +28,10 @@ namespace iFileProxy.Services public AppConfigService(string configFilePath = "iFileProxy.json") { + _logger.Debug($"initializing {this.GetType().Name}..."); _appConfigPath = configFilePath; LoadAppConfig(); + _logger.Debug($"{this.GetType().Name} init successful."); } diff --git a/src/Services/AuthService.cs b/src/Services/AuthService.cs index 9032874..9ed9b5e 100644 --- a/src/Services/AuthService.cs +++ b/src/Services/AuthService.cs @@ -1,9 +1,11 @@ -using BCrypt.Net; -using iFileProxy.Models; using System.Security.Claims; using System.IdentityModel.Tokens.Jwt; using Microsoft.IdentityModel.Tokens; using System.Text; +using Serilog; +using iFileProxy.Models.Other; +using iFileProxy.Models.Request; + namespace iFileProxy.Services { @@ -11,13 +13,15 @@ namespace iFileProxy.Services { private readonly DatabaseGateService _dbGateService; private readonly IConfiguration _configuration; - private readonly ILogger _logger; + private readonly Serilog.ILogger _logger = Log.Logger.ForContext(); - public AuthService(DatabaseGateService dbGateService, IConfiguration configuration, ILogger logger) + + public AuthService(DatabaseGateService dbGateService, IConfiguration configuration) { + _logger.Debug($"{GetType().Name} initializing..."); _dbGateService = dbGateService; _configuration = configuration; - _logger = logger; + _logger.Debug($"{this.GetType().Name} init successful."); } public async Task<(bool success, string message)> RegisterAsync(RegisterRequest request, string ipAddr) @@ -62,7 +66,7 @@ namespace iFileProxy.Services } catch (Exception ex) { - _logger.LogError(ex, "用户注册失败"); + _logger.Warning(ex, "用户注册失败"); return (false, "注册失败"); } } @@ -114,7 +118,7 @@ namespace iFileProxy.Services } catch (Exception ex) { - _logger.LogError(ex, "用户登录失败"); + _logger.Warning(ex, "用户登录失败"); return (false, string.Empty, "登录失败"); } } diff --git a/src/Services/DatabaseGateService.cs b/src/Services/DatabaseGateService.cs index 9eac600..e3fb402 100644 --- a/src/Services/DatabaseGateService.cs +++ b/src/Services/DatabaseGateService.cs @@ -3,10 +3,13 @@ using Serilog; using System.Data; using iFileProxy.Helpers; using MySql.Data.MySqlClient; -using iFileProxy.Models; using Newtonsoft.Json; using System.Text; using Serilog.Events; +using iFileProxy.Models.Task; +using iFileProxy.Models.Other; +using iFileProxy.Models.Response; + namespace iFileProxy.Services { @@ -28,13 +31,13 @@ namespace iFileProxy.Services public DatabaseGateService(AppConfigService appConfigService) { - _logger.Information("Initializing DatabaseGateService..."); + _logger.Debug($"Initializing {this.GetType().Name}..."); _appConfig = appConfigService.AppConfig; _db = _appConfig.Database; appConfigService.AppConfigurationChanged += AppConfigService_AppConfigurationChanged; LoadDbDict(); - _logger.Information("Done."); + _logger.Debug($"{this.GetType().Name} init successful."); } diff --git a/src/Services/LocalCacheManager.cs b/src/Services/LocalCacheLifeManagementService.cs similarity index 94% rename from src/Services/LocalCacheManager.cs rename to src/Services/LocalCacheLifeManagementService.cs index e6835af..b2bc282 100644 --- a/src/Services/LocalCacheManager.cs +++ b/src/Services/LocalCacheLifeManagementService.cs @@ -5,18 +5,19 @@ using Newtonsoft.Json; using Serilog; using MySql.Data.MySqlClient; using System.Data; +using iFileProxy.Models.Task; namespace iFileProxy.Services { /// /// 本地缓存管理器 /// - public class LocalCacheManager + public class LocalCacheLifeManagementService { // 禁用空警告 因为初始化的时候就已经检查过相关的内容了 #pragma warning disable CS8601 private readonly AppConfig _appConfig = AppConfig.GetCurrConfig(); - private readonly static Serilog.ILogger _logger = Log.Logger.ForContext(); + private readonly static Serilog.ILogger _logger = Log.Logger.ForContext(); private readonly object _lock = new (); private readonly Timer _timer; @@ -26,9 +27,9 @@ namespace iFileProxy.Services /// /// 缓存管理器 /// - public LocalCacheManager(IServiceProvider serviceProvider) + public LocalCacheLifeManagementService(IServiceProvider serviceProvider) { - _logger.Information("Initializing LocalCacheManager."); + _logger.Debug($"Initializing {this.GetType().Name}..."); CACHE_LIFETIME = _appConfig.DownloadOptions.CacheLifetime; _dbGateService = serviceProvider.GetRequiredService(); @@ -42,7 +43,7 @@ namespace iFileProxy.Services CheckAndCleanCache(); } }, null, TimeSpan.FromSeconds(6), TimeSpan.FromSeconds(60)); - _logger.Information("succ."); + _logger.Debug($"{this.GetType().Name} init successful."); } private void LocalCacheManager_AppConfigurationChange(object sender, AppConfig appConfig) diff --git a/src/Services/TaskManager.cs b/src/Services/TaskManagementService.cs similarity index 98% rename from src/Services/TaskManager.cs rename to src/Services/TaskManagementService.cs index 8336734..596ca90 100644 --- a/src/Services/TaskManager.cs +++ b/src/Services/TaskManagementService.cs @@ -1,6 +1,7 @@ using iFileProxy.Config; using iFileProxy.Helpers; -using iFileProxy.Models; +using iFileProxy.Models.Other; +using iFileProxy.Models.Task; using Serilog; using System.Diagnostics; using System.Text.Json; @@ -10,7 +11,7 @@ namespace iFileProxy.Services /// /// 下载任务管理器 /// - public class TaskManager + public class TaskManagementService { // 定义事件 public event EventHandler? TaskCompleted; @@ -60,16 +61,16 @@ namespace iFileProxy.Services } - private readonly static Serilog.ILogger _logger = Log.Logger.ForContext(); + private readonly static Serilog.ILogger _logger = Log.Logger.ForContext(); private AppConfig _appConfig = AppConfig.GetCurrConfig("iFileProxy.json"); private readonly DatabaseGateService _dbGateService; private Dictionary _runningTasks = []; private Queue _pendingTasks = new(); private readonly object _taskLock = new(); - public TaskManager(DatabaseGateService dbGateService, AppConfigService appConfigService) + public TaskManagementService(DatabaseGateService dbGateService, AppConfigService appConfigService) { - _logger.Information("Initializing TaskManager..."); + _logger.Debug($"Initializing {this.GetType().Name}..."); if (_appConfig != null) { _dbGateService = dbGateService; @@ -88,7 +89,7 @@ namespace iFileProxy.Services appConfigService.AppConfigurationChanged += AppConfigService_AppConfigurationChanged; - _logger.Information("TaskManager init succ."); + _logger.Debug($"{this.GetType().Name} init successful."); } private void AppConfigService_AppConfigurationChanged(object sender, AppConfig appConfig)