diff --git a/src/UserPointManagement.Application/Services/UserPointService.cs b/src/UserPointManagement.Application/Services/UserPointService.cs new file mode 100644 index 0000000..39afa77 --- /dev/null +++ b/src/UserPointManagement.Application/Services/UserPointService.cs @@ -0,0 +1,54 @@ +using Microsoft.EntityFrameworkCore; +using UserPointManagement.Model; +using UserPointManagement.Model.Dtos.UserPoint; +using UserPointManagement.Model.Entities; +using UserPointManagement.Persistence; + +namespace UserPointManagement.Application.Services; + +public interface IUserPointService +{ + Task> GetUserPoints(GetUserPointDto req); + + Task CreateUserPoint(CreateUserPointDto input); +} + +public class UserPointService : IUserPointService +{ + private readonly IDbContextFactory _dbContextFactory; + + public UserPointService(IDbContextFactory dbContextFactory) + { + _dbContextFactory = dbContextFactory; + } + + public async Task> GetUserPoints(GetUserPointDto req) + { + await using var _userPointManagementDbContext = await _dbContextFactory.CreateDbContextAsync(); + var queryable = from userPoint in _userPointManagementDbContext.UserPoints + join user in _userPointManagementDbContext.Users on userPoint.UserId equals user.Id + select new UserPointDto() + { + UserPointId = userPoint.Id, + UserId = user.Id, + Name = user.Name, + Point = userPoint.Point + }; + + var count = queryable.Count(); + var data = await queryable.Paging(req).ToListAsync().ConfigureAwait(false); + + return new PageResultDto() + { + Items = data, + TotalCount = count + }; + } + + public async Task CreateUserPoint(CreateUserPointDto input) + { + await using var _userPointManagementDbContext = await _dbContextFactory.CreateDbContextAsync(); + _userPointManagementDbContext.UserPoints.Add(new UserPoint(input.UserId, input.Point)); + await _userPointManagementDbContext.SaveChangesAsync().ConfigureAwait(false); + } +} \ No newline at end of file diff --git a/src/UserPointManagement.Application/Services/UserService.cs b/src/UserPointManagement.Application/Services/UserService.cs index 7879bb1..f6d1fa7 100644 --- a/src/UserPointManagement.Application/Services/UserService.cs +++ b/src/UserPointManagement.Application/Services/UserService.cs @@ -11,6 +11,8 @@ public interface IUserService { Task> GetUsers(GetUserDto req); + Task> GetAllUsers(); + Task CreateUser(User input); Task DeleteUser(int userId); @@ -20,21 +22,22 @@ public interface IUserService public class UserService : IUserService { - private readonly UserPointManagementDbContext _userPointManagementDbContext; + private readonly IDbContextFactory _dbContextFactory; - public UserService(UserPointManagementDbContext userPointManagementDbContext) + public UserService(IDbContextFactory dbContextFactory) { - _userPointManagementDbContext = userPointManagementDbContext; + _dbContextFactory = dbContextFactory; } public async Task> GetUsers(GetUserDto req) { + await using var _userPointManagementDbContext = await _dbContextFactory.CreateDbContextAsync(); var queryable = from user in _userPointManagementDbContext.Users select user; var count = queryable.Count(); var data = await queryable.Paging(req).ToListAsync().ConfigureAwait(false); - + return new PageResultDto() { Items = data, @@ -42,14 +45,28 @@ public class UserService : IUserService }; } + public async Task> GetAllUsers() + { + await using var _userPointManagementDbContext = await _dbContextFactory.CreateDbContextAsync(); + var users = await (from user in _userPointManagementDbContext.Users + select new UserDto() + { + Id = user.Id, + Name = user.Name + }).ToListAsync().ConfigureAwait(false); + return users; + } + public async Task CreateUser(User input) { + await using var _userPointManagementDbContext = await _dbContextFactory.CreateDbContextAsync(); _userPointManagementDbContext.Users.Add(input); await _userPointManagementDbContext.SaveChangesAsync().ConfigureAwait(false); } public async Task DeleteUser(int userId) { + await using var _userPointManagementDbContext = await _dbContextFactory.CreateDbContextAsync(); var user = await _userPointManagementDbContext.Users.FirstOrDefaultAsync(x => x.Id == userId) .ConfigureAwait(false); @@ -59,6 +76,7 @@ public class UserService : IUserService public async Task ModifyUser(int userId, ModifyUserDto input) { + await using var _userPointManagementDbContext = await _dbContextFactory.CreateDbContextAsync(); var user = await _userPointManagementDbContext.Users.FirstOrDefaultAsync(x => x.Id == userId) .ConfigureAwait(false); diff --git a/src/UserPointManagement.Model/Dtos/User/UserDto.cs b/src/UserPointManagement.Model/Dtos/User/UserDto.cs new file mode 100644 index 0000000..bc908f2 --- /dev/null +++ b/src/UserPointManagement.Model/Dtos/User/UserDto.cs @@ -0,0 +1,8 @@ +namespace UserPointManagement.Model.Dtos.User; + +public class UserDto +{ + public int Id { get; set; } + + public string Name { get; set; } +} \ No newline at end of file diff --git a/src/UserPointManagement.Model/Dtos/UserPoint/CreateUserPointDto.cs b/src/UserPointManagement.Model/Dtos/UserPoint/CreateUserPointDto.cs new file mode 100644 index 0000000..4e8ae1d --- /dev/null +++ b/src/UserPointManagement.Model/Dtos/UserPoint/CreateUserPointDto.cs @@ -0,0 +1,8 @@ +namespace UserPointManagement.Model.Dtos.UserPoint; + +public class CreateUserPointDto +{ + public int UserId { get; set; } + + public int Point { get; set; } +} \ No newline at end of file diff --git a/src/UserPointManagement.Model/Dtos/UserPoint/GetUserPointDto.cs b/src/UserPointManagement.Model/Dtos/UserPoint/GetUserPointDto.cs new file mode 100644 index 0000000..1e1eeed --- /dev/null +++ b/src/UserPointManagement.Model/Dtos/UserPoint/GetUserPointDto.cs @@ -0,0 +1,6 @@ +namespace UserPointManagement.Model.Dtos.UserPoint; + +public class GetUserPointDto : PageBase +{ + public int? UserId { get; set; } +} \ No newline at end of file diff --git a/src/UserPointManagement.Model/Dtos/UserPoint/UserPointDto.cs b/src/UserPointManagement.Model/Dtos/UserPoint/UserPointDto.cs new file mode 100644 index 0000000..b1479b6 --- /dev/null +++ b/src/UserPointManagement.Model/Dtos/UserPoint/UserPointDto.cs @@ -0,0 +1,14 @@ +namespace UserPointManagement.Model.Dtos.UserPoint; + +public class UserPointDto +{ + public long UserPointId { get; set; } + + public int UserId { get; set; } + + public string Name { get; set; } + + public int Point { get; set; } + + public DateTime CreateTime { get; set; } +} \ No newline at end of file diff --git a/src/UserPointManagement.Web/Pages/UserManagement/UserManagement.razor b/src/UserPointManagement.Web/Pages/UserManagement/UserManagement.razor index 81be1c8..5e6a0ab 100644 --- a/src/UserPointManagement.Web/Pages/UserManagement/UserManagement.razor +++ b/src/UserPointManagement.Web/Pages/UserManagement/UserManagement.razor @@ -1,9 +1,9 @@ -@inherits MyAntDesignAppServer.Pages.UserManagement.UserManagementBase +@inherits UserManagementBase @page "/" -@using UserPointManagement.Application.Services -@using UserPointManagement.Model.Entities @using System.ComponentModel.DataAnnotations @using System.Text.Json +@using global::UserPointManagement.Application.Services +@using global::UserPointManagement.Model.Entities @inject IJSRuntime JS @inject IUserService UserService; diff --git a/src/UserPointManagement.Web/Pages/UserManagement/UserManagement.razor.cs b/src/UserPointManagement.Web/Pages/UserManagement/UserManagement.razor.cs index 8de21ed..8004c25 100644 --- a/src/UserPointManagement.Web/Pages/UserManagement/UserManagement.razor.cs +++ b/src/UserPointManagement.Web/Pages/UserManagement/UserManagement.razor.cs @@ -4,11 +4,10 @@ using System.Threading.Tasks; using AntDesign; using Microsoft.AspNetCore.Components; using UserPointManagement.Application.Services; -using UserPointManagement.Model.Dtos; using UserPointManagement.Model.Dtos.User; using UserPointManagement.Model.Entities; -namespace MyAntDesignAppServer.Pages.UserManagement; +namespace UserPointManagement.Web.Pages.UserManagement; public class UserManagementBase : ComponentBase { diff --git a/src/UserPointManagement.Web/Pages/UserPoint/UserPoint.razor b/src/UserPointManagement.Web/Pages/UserPoint/UserPoint.razor deleted file mode 100644 index cb4101c..0000000 --- a/src/UserPointManagement.Web/Pages/UserPoint/UserPoint.razor +++ /dev/null @@ -1,8 +0,0 @@ -@page "/user-point" - - - - -@code { - -} \ No newline at end of file diff --git a/src/UserPointManagement.Web/Pages/UserPointPage/UserPointManage.razor b/src/UserPointManagement.Web/Pages/UserPointPage/UserPointManage.razor new file mode 100644 index 0000000..a72e116 --- /dev/null +++ b/src/UserPointManagement.Web/Pages/UserPointPage/UserPointManage.razor @@ -0,0 +1,118 @@ +@inherits UserPointManageBase +@page "/user-point" +@using System.ComponentModel.DataAnnotations +@using System.Text.Json +@using global::UserPointManagement.Model.Dtos.User +@using global::UserPointManagement.Model.Dtos.UserPoint + + + + + + + + + + + + + + + + + + + + +
+
+ +@code { + + #region original form coding + + public class Model + { + [Required] + public string Name { get; set; } + + public string Mobile { get; set; } + } + + private Model model = new Model(); + + private void OnFinishFailed(EditContext editContext) + { + Console.WriteLine($"Failed:{JsonSerializer.Serialize(model)}"); + } + + bool loading = false; + + void toggle(bool value) => loading = value; + + #endregion + + #region original modal coding + + bool _visible = false; + + private void ShowModal() + { + _visible = true; + } + + private void HandleCancel(MouseEventArgs e) + { + _visible = false; + } + + #endregion + + /* + * Careful! + * + * next bind submit event to modal OK button + */ + + private Form _form; + + /// + /// when form is submited, close the modal + /// + /// + private void OnFinish(EditContext editContext) + { + Console.WriteLine("e"); + _visible = false; + } + + /// + /// on modal OK button is click, submit form manually + /// + /// + private async Task HandleOk(MouseEventArgs e) + { + _form.Submit(); + // TODO: 添加积分 + await RefreshTable().ConfigureAwait(false); + } + +} \ No newline at end of file diff --git a/src/UserPointManagement.Web/Pages/UserPointPage/UserPointManage.razor.cs b/src/UserPointManagement.Web/Pages/UserPointPage/UserPointManage.razor.cs new file mode 100644 index 0000000..a166375 --- /dev/null +++ b/src/UserPointManagement.Web/Pages/UserPointPage/UserPointManage.razor.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using AntDesign; +using Microsoft.AspNetCore.Components; +using UserPointManagement.Application.Services; +using UserPointManagement.Model.Dtos.User; +using UserPointManagement.Model.Dtos.UserPoint; + +namespace UserPointManagement.Web.Pages.UserPointPage; + +public class UserPointManageBase : ComponentBase +{ + [Inject] private IUserPointService _UserPointService { get; set; } + [Inject] private IUserService _UserService { get; set; } + + protected List _userPoints; + protected List _users; + protected int _pageIndex = 1; + protected int _pageSize = 20; + protected int _total = 0; + protected bool _loading; + protected int? _selectedUserId; + + protected override async Task OnInitializedAsync() + { + _users = await _UserService.GetAllUsers().ConfigureAwait(false); + await RefreshTable(); + } + + protected async Task OnSelectedItemChangedHandler(UserDto arg) + { + _selectedUserId = arg?.Id; + _pageIndex = 1; + await RefreshTable(); + } + + protected async Task RefreshTable() + { + _loading = true; + var res = await _UserPointService.GetUserPoints(new GetUserPointDto() + { + UserId = _selectedUserId, + PageIndex = _pageIndex, + PageSize = _pageSize + }); + + _userPoints = res.Items; + _total = res.TotalCount; + + _loading = false; + } + + protected async Task OnPageIndexChanged(PaginationEventArgs args) + { + _pageIndex = args.Page; + _pageSize = args.PageSize; + await RefreshTable(); + } + + protected async Task OnPageSizeChange(PaginationEventArgs args) + { + _pageIndex = args.Page; + _pageSize = args.PageSize; + await RefreshTable(); + } +} \ No newline at end of file diff --git a/src/UserPointManagement.Web/Properties/launchSettings.json b/src/UserPointManagement.Web/Properties/launchSettings.json index f7c97e3..54d7936 100644 --- a/src/UserPointManagement.Web/Properties/launchSettings.json +++ b/src/UserPointManagement.Web/Properties/launchSettings.json @@ -11,7 +11,6 @@ "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } @@ -19,7 +18,6 @@ "UserPointManagement.Web": { "commandName": "Project", "launchBrowser": true, - "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" }, diff --git a/src/UserPointManagement.Web/Startup.cs b/src/UserPointManagement.Web/Startup.cs index de23de9..00307f6 100644 --- a/src/UserPointManagement.Web/Startup.cs +++ b/src/UserPointManagement.Web/Startup.cs @@ -30,7 +30,7 @@ namespace UserPointManagement.Web services.AddServerSideBlazor(); services.AddAntDesign(); - services.AddDbContext(option => + services.AddDbContextFactory(option => { option.UseNpgsql(Configuration["Connection:UserPointManagement"]) .UseSnakeCaseNamingConvention(); diff --git a/test/UserPointManagement.Application.Tests/Services/UserServiceTest.cs b/test/UserPointManagement.Application.Tests/Services/UserServiceTest.cs index 13cc452..c2cedad 100644 --- a/test/UserPointManagement.Application.Tests/Services/UserServiceTest.cs +++ b/test/UserPointManagement.Application.Tests/Services/UserServiceTest.cs @@ -22,4 +22,11 @@ public class UserServiceTest Assert.NotNull(res); } + + [Fact] + public async Task GetAllUsers() + { + var res = await _userService.GetAllUsers().ConfigureAwait(false); + Assert.NotEmpty(res); + } } \ No newline at end of file