Files
sharp-basic/test/NetServer.Test/Examples/Controllers/UserController.cs
T
2025-12-30 09:17:25 +08:00

171 lines
5.1 KiB
C#

using Sharp.NetServer.Attributes;
using Sharp.NetServer.Controllers;
using Sharp.NetServer.Models;
namespace NetServer.Test.Examples.Controllers;
/// <summary>
/// 用户管理控制器示例
/// </summary>
[ApiController]
[Route("api/users")]
[Authorize] // 所有接口默认需要认证
public class UserController : BaseController
{
// 模拟数据库
private static readonly List<User> Users = new()
{
new User { Id = 1, Name = "张三", Email = "zhangsan@example.com", Role = "Admin" },
new User { Id = 2, Name = "李四", Email = "lisi@example.com", Role = "User" },
new User { Id = 3, Name = "王五", Email = "wangwu@example.com", Role = "User" }
};
/// <summary>
/// 获取所有用户(需要 Admin 角色)
/// GET /api/users
/// </summary>
[Authorize(Roles = "Admin")]
[RateLimit(50, RateLimitScope.User)]
[HttpGet]
public async Task GetAllUsersAsync(HttpContext context)
{
await WriteSuccessResponseAsync(context, Users);
}
/// <summary>
/// 获取单个用户
/// GET /api/users/1
/// </summary>
[HttpGet("{id}")]
[ResponseCache(30)] // 缓存 30 秒
public async Task GetUserByIdAsync(HttpContext context)
{
var idStr = context.Request.Url.Segments.LastOrDefault()?.TrimEnd('/');
if (int.TryParse(idStr, out var id))
{
var user = Users.FirstOrDefault(u => u.Id == id);
if (user != null)
{
await WriteSuccessResponseAsync(context, user);
return;
}
}
await NotFoundAsync(context, "用户未找到");
}
/// <summary>
/// 创建用户(需要 Admin 角色)
/// POST /api/users
/// Body: { "name": "赵六", "email": "zhaoliu@example.com", "role": "User" }
/// </summary>
[Authorize(Roles = "Admin")]
[RateLimit(10, RateLimitScope.User)]
[HttpPost]
public async Task CreateUserAsync(HttpContext context)
{
var userData = await ReadJsonBodyAsync<User>(context);
if (userData == null || string.IsNullOrEmpty(userData.Name))
{
await BadRequestAsync(context, "无效的用户数据");
return;
}
userData.Id = Users.Max(u => u.Id) + 1;
Users.Add(userData);
await WriteSuccessResponseAsync(context, userData, "用户创建成功");
}
/// <summary>
/// 更新用户
/// PUT /api/users/1
/// Body: { "name": "新名字", "email": "newemail@example.com" }
/// </summary>
[HttpPut("{id}")]
public async Task UpdateUserAsync(HttpContext context)
{
var idStr = context.Request.Url.Segments.LastOrDefault()?.TrimEnd('/');
if (!int.TryParse(idStr, out var id))
{
await BadRequestAsync(context, "无效的用户ID");
return;
}
var user = Users.FirstOrDefault(u => u.Id == id);
if (user == null)
{
await NotFoundAsync(context, "用户未找到");
return;
}
var updateData = await ReadJsonBodyAsync<User>(context);
if (updateData != null)
{
if (!string.IsNullOrEmpty(updateData.Name))
user.Name = updateData.Name;
if (!string.IsNullOrEmpty(updateData.Email))
user.Email = updateData.Email;
if (!string.IsNullOrEmpty(updateData.Role))
user.Role = updateData.Role;
}
await WriteSuccessResponseAsync(context, user, "用户更新成功");
}
/// <summary>
/// 删除用户(需要 Admin 角色)
/// DELETE /api/users/1
/// </summary>
[Authorize(Roles = "Admin")]
[HttpDelete("{id}")]
public async Task DeleteUserAsync(HttpContext context)
{
var idStr = context.Request.Url.Segments.LastOrDefault()?.TrimEnd('/');
if (!int.TryParse(idStr, out var id))
{
await BadRequestAsync(context, "无效的用户ID");
return;
}
var user = Users.FirstOrDefault(u => u.Id == id);
if (user == null)
{
await NotFoundAsync(context, "用户未找到");
return;
}
Users.Remove(user);
await WriteSuccessResponseAsync(context, new { id }, "用户删除成功");
}
/// <summary>
/// 搜索用户(允许匿名访问)
/// GET /api/users/search?keyword=张
/// </summary>
[AllowAnonymous]
[RateLimit(100, RateLimitScope.Ip)]
[HttpGet("search")]
public async Task SearchUsersAsync(HttpContext context)
{
var keyword = GetQueryParam(context, "keyword", "");
var results = Users.Where(u =>
u.Name.Contains(keyword, StringComparison.OrdinalIgnoreCase) ||
u.Email.Contains(keyword, StringComparison.OrdinalIgnoreCase)
).ToList();
await WriteSuccessResponseAsync(context, results);
}
}
/// <summary>
/// 用户数据模型
/// </summary>
public class User
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public string Email { get; set; } = string.Empty;
public string Role { get; set; } = "User";
}