vending-machine/backend/src/VendingMachine.Api/Controllers/AdminUserController.cs
2026-04-03 06:07:13 +08:00

99 lines
2.8 KiB
C#

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using VendingMachine.Infrastructure.Data;
namespace VendingMachine.Api.Controllers;
/// <summary>
/// 管理后台 - 用户管理控制器
/// </summary>
[ApiController]
[Route("api/admin/user")]
[Authorize]
public class AdminUserController : ControllerBase
{
private readonly AppDbContext _db;
public AdminUserController(AppDbContext db)
{
_db = db;
}
/// <summary>
/// 获取用户列表(分页、搜索)
/// </summary>
[HttpGet]
public async Task<IActionResult> GetUsers(
[FromQuery] int page = 1,
[FromQuery] int size = 20,
[FromQuery] string? search = null)
{
var query = _db.Users.AsQueryable();
// 按手机号或 UID 搜索
if (!string.IsNullOrWhiteSpace(search))
{
query = query.Where(u => u.Phone.Contains(search) || u.Uid.Contains(search));
}
var total = await query.CountAsync();
var items = await query
.OrderByDescending(u => u.CreatedAt)
.Skip((page - 1) * size)
.Take(size)
.Select(u => new
{
u.Uid,
u.Phone,
u.Nickname,
u.IsMember,
MembershipType = u.MembershipType.ToString(),
u.MembershipExpireAt,
u.PointsBalance,
u.Language,
u.CreatedAt
})
.ToListAsync();
return Ok(new { success = true, data = new { items, total, page, size } });
}
/// <summary>
/// 获取用户详情
/// </summary>
[HttpGet("{uid}")]
public async Task<IActionResult> GetUserDetail(string uid)
{
var user = await _db.Users.FirstOrDefaultAsync(u => u.Uid == uid);
if (user == null)
return NotFound(new { success = false, message = "用户不存在" });
// 获取用户优惠券数量
var couponCount = await _db.UserCoupons.CountAsync(c => c.UserId == uid);
// 获取用户积分记录数量
var pointRecordCount = await _db.PointRecords.CountAsync(p => p.UserId == uid);
return Ok(new
{
success = true,
data = new
{
user.Uid,
user.Phone,
user.Nickname,
user.IsMember,
MembershipType = user.MembershipType.ToString(),
user.MembershipExpireAt,
user.PointsBalance,
user.PointsExpireAt,
user.Language,
user.CreatedAt,
CouponCount = couponCount,
PointRecordCount = pointRecordCount
}
});
}
}