99 lines
2.8 KiB
C#
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
|
|
}
|
|
});
|
|
}
|
|
}
|