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
+ };
+ }
}
}