From df3520272e74583a39d434c5314749f1e0bcf78e Mon Sep 17 00:00:00 2001 From: root Date: Sat, 7 Dec 2024 18:17:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BB=BB=E5=8A=A1=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E5=92=8C=E7=94=A8=E6=88=B7=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Controllers/ManagementController.cs | 126 ++++++++++++++++++++++++ src/Services/DatabaseGateService.cs | 42 ++++++++ 2 files changed, 168 insertions(+) diff --git a/src/Controllers/ManagementController.cs b/src/Controllers/ManagementController.cs index 65e9be8..4a3ba2f 100644 --- a/src/Controllers/ManagementController.cs +++ b/src/Controllers/ManagementController.cs @@ -475,5 +475,131 @@ namespace iFileProxy.Controllers }); } } + + /// + /// 模糊搜索任务 + /// + [HttpGet("SearchTasks")] + public async Task> SearchTasks( + [FromQuery] string keyword, + [FromQuery] int page = 1, + [FromQuery] int pageSize = 10) + { + try + { + var result = await _dbGateService.SearchTasksAsync(keyword, page, pageSize); + + // 更新队列位置信息 + foreach (var task in result.Data) + { + if (task.Status == TaskState.Queuing) + { + task.QueuePosition = _taskManager.GetQueuePosition(task.TaskId); + } + } + + return Ok(new CommonRsp + { + Retcode = 0, + Message = "success", + Data = result + }); + } + catch (Exception ex) + { + _logger.Error(ex, "搜索任务失败"); + return Ok(new CommonRsp + { + Retcode = 1, + Message = "搜索任务失败" + }); + } + } + + /// + /// 添加新用户 + /// + [Authorize(UserMask.Admin, UserMask.SuperAdmin)] + [HttpPost("AddUser")] + public async Task> AddUser([FromBody] AddUserRequest request) + { + try + { + // 获取当前操作者信息 + var operatorId = HttpContext.Items["User"]?.ToString(); + var operator_ = await _dbGateService.GetUserByIdAsync(operatorId); + + // 检查权限 + if (operator_?.Mask == UserMask.Admin && request.Mask > UserMask.Admin) + { + return Ok(new CommonRsp + { + Retcode = 1, + Message = "管理员只能创建普通管理员及以下权限的用户" + }); + } + + // 检查用户名和邮箱是否已存在 + if (await _dbGateService.UserExistsAsync(request.Username, request.Email)) + { + return Ok(new CommonRsp + { + Retcode = 1, + Message = "用户名或电子邮件已存在" + }); + } + + // 创建新用户 + var user = new User + { + Username = request.Username, + PasswordHash = BCrypt.Net.BCrypt.HashPassword(request.Password), + Nickname = request.Nickname, + Email = request.Email, + Mask = request.Mask, + LastLoginIP = "N/A" + }; + + // 保存用户 + var success = await _dbGateService.CreateUserAsync(user); + + // 记录操作事件 + if (success) + { + var userEvent = new UserEvent + { + UserId = user.UserId, + EventType = UserEventType.Registry, + EventIP = HttpContext.Connection.RemoteIpAddress?.ToString() ?? "unknown", + EventDetail = $"用户由管理员 {operator_?.Username} 创建" + }; + await _dbGateService.CreateUserEventAsync(userEvent); + } + + return Ok(new CommonRsp + { + Retcode = success ? 0 : 1, + Message = success ? "用户创建成功" : "用户创建失败" + }); + } + catch (Exception ex) + { + _logger.Error(ex, "创建用户失败"); + return Ok(new CommonRsp + { + Retcode = 1, + Message = "创建用户失败" + }); + } + } + + public class AddUserRequest + { + 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 UserMask Mask { get; set; } = UserMask.User; + } } } diff --git a/src/Services/DatabaseGateService.cs b/src/Services/DatabaseGateService.cs index b434be5..73461d5 100644 --- a/src/Services/DatabaseGateService.cs +++ b/src/Services/DatabaseGateService.cs @@ -1102,5 +1102,47 @@ namespace iFileProxy.Services var result = await ExecuteNonQueryAsync(sql, parameters); return result > 0; } + + public async Task> SearchTasksAsync(string keyword, int page, int pageSize) + { + var sql = new StringBuilder(@" + SELECT * FROM t_tasks_info + WHERE file_name LIKE @keyword + OR url LIKE @keyword + OR client_ip LIKE @keyword + OR tid LIKE @keyword + OR tag LIKE @keyword"); + + var parameters = new Dictionary + { + { "@keyword", $"%{keyword}%" }, + { "@offset", (page - 1) * pageSize }, + { "@limit", pageSize } + }; + + // 添加分页 + sql.Append(" ORDER BY add_time DESC LIMIT @offset, @limit"); + + // 获取总记录数 + var countSql = @" + SELECT COUNT(*) FROM t_tasks_info + WHERE file_name LIKE @keyword + OR url LIKE @keyword + OR client_ip LIKE @keyword + OR tid LIKE @keyword + OR tag LIKE @keyword"; + + var totalCount = await ExecuteScalarAsync(countSql, parameters); + var tasks = await ExecuteQueryAsync(sql.ToString(), parameters); + + return new PagedResult + { + Total = totalCount, + PageSize = pageSize, + CurrentPage = page, + TotalPages = (int)Math.Ceiling(totalCount / (double)pageSize), + Data = tasks + }; + } } }