Index.cshtml.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using Application.Abstractions.Data;
  2. using SharedKernel.Helpers;
  3. using Microsoft.AspNetCore.Mvc;
  4. using Microsoft.AspNetCore.Mvc.RazorPages;
  5. using Microsoft.EntityFrameworkCore;
  6. using System.ComponentModel;
  7. using System.ComponentModel.DataAnnotations;
  8. namespace Admin.Pages.Paper.Accounts;
  9. // 모의투자 계좌 모니터 (읽기 전용) — d4 §⑤ /Paper/Accounts
  10. public class IndexModel(IAppDbContext db) : PageModel
  11. {
  12. [BindProperty(SupportsGet = true)]
  13. public QueryParams Query { get; set; } = new();
  14. public sealed class QueryParams
  15. {
  16. [Range(1, int.MaxValue)]
  17. public int PageNum { get; set; } = 1;
  18. [Range(1, 100)]
  19. public ushort PerPage { get; set; } = 20;
  20. // 1 = 회원 SID, 2 = 닉네임
  21. [DisplayName("검색 조건")]
  22. [Range(1, 2, ErrorMessage = "{0}이(가) 올바르지 않습니다.")]
  23. public int? Search { get; set; }
  24. [DisplayName("검색어")]
  25. [MaxLength(100)]
  26. public string? Keyword { get; set; }
  27. }
  28. public int Total { get; set; }
  29. public List<(
  30. int Num,
  31. int ID,
  32. string SID,
  33. string? Nickname,
  34. decimal Token,
  35. decimal ReservedToken,
  36. decimal Units,
  37. decimal TotalDeposited,
  38. decimal TotalWithdrawn,
  39. string CreatedAt
  40. )> List { get; set; } = [];
  41. public Pagination? Pagination { get; set; }
  42. public async Task OnGetAsync(CancellationToken ct)
  43. {
  44. if (!ModelState.IsValid)
  45. {
  46. return;
  47. }
  48. var query = from a in db.PaperAccount.AsNoTracking()
  49. join m in db.Member.AsNoTracking() on a.MemberID equals m.ID
  50. select new
  51. {
  52. a.ID,
  53. m.SID,
  54. Nickname = m.Name,
  55. a.Token,
  56. a.ReservedToken,
  57. a.Units,
  58. a.TotalDeposited,
  59. a.TotalWithdrawn,
  60. a.CreatedAt
  61. };
  62. if (!string.IsNullOrWhiteSpace(Query.Keyword))
  63. {
  64. var keyword = Query.Keyword.Trim();
  65. query = Query.Search switch
  66. {
  67. 1 => query.Where(c => c.SID == keyword),
  68. 2 => query.Where(c => c.Nickname != null && c.Nickname.Contains(keyword)),
  69. _ => query
  70. };
  71. }
  72. Total = await query.CountAsync(ct);
  73. var skip = (Query.PageNum - 1) * Query.PerPage;
  74. var rows = await query.OrderByDescending(c => c.ID).Skip(skip).Take(Query.PerPage).ToListAsync(ct);
  75. var num = skip + 1;
  76. List = [.. rows.Select(c => (
  77. Num: num++,
  78. c.ID,
  79. c.SID,
  80. c.Nickname,
  81. c.Token,
  82. c.ReservedToken,
  83. c.Units,
  84. c.TotalDeposited,
  85. c.TotalWithdrawn,
  86. CreatedAt: c.CreatedAt.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss")
  87. ))];
  88. Pagination = new Pagination(Total, Query.PageNum, Query.PerPage);
  89. }
  90. }