171 lines
5.1 KiB
C#
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";
|
|
} |