first commit

This commit is contained in:
yanpeng200212
2026-10-08 10:43:59 +08:00
commit 8430ba0452
288 changed files with 29595 additions and 0 deletions
@@ -0,0 +1,96 @@
using FreeSql;
using F9WebAiTest.Application.Dtos.Common;
using F9WebAiTest.Application.Dtos.SYS.RBAC.Users;
using F9WebAiTest.Application.Interfaces.Repositories.SYS.RBAC.Users;
using F9WebAiTest.Domain.Entities.SYS.Departments;
using F9WebAiTest.Domain.Entities.SYS.RBAC;
namespace F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.RBAC.Users;
internal class UserReadRepository : F9RepositoryBase, IUserReadRepository
{
public UserReadRepository(IFreeSql fsql) : base(fsql) { }
public async Task<UserReadDto_Login> GetByLoginNameAsync(string loginName)
=> await Orm.Select<User>()
.Where(x => x.LoginName == loginName && x.DeletedAt == null)
.FirstAsync(x => new UserReadDto_Login(x.Id, x.UserName, x.LoginName, x.PasswordHash, x.DepartmentId));
public async Task<UserReadDto_Login> GetByPhoneAsync(string phone)
=> await Orm.Select<User>()
.Where(x => x.PhoneNumber == phone && x.DeletedAt == null)
.FirstAsync(x => new UserReadDto_Login(x.Id, x.UserName, x.LoginName, x.PasswordHash, x.DepartmentId));
public async Task<UserReadDto_Edit> GetByIdAsync(long id)
=> await Orm.Select<User>()
.Where(x => x.Id == id && x.DeletedAt == null)
.FirstAsync(x => new UserReadDto_Edit(x.Id, x.UserName, x.PhoneNumber, x.LoginName, x.DepartmentId, x.SortOrder));
public async Task<List<UserReadDto_Edit>> GetByIdsAsync(List<long> ids)
=> await Orm.Select<User>()
.Where(x => ids.Contains(x.Id) && x.DeletedAt == null)
.ToListAsync(x => new UserReadDto_Edit(x.Id, x.UserName, x.PhoneNumber, x.LoginName, x.DepartmentId, x.SortOrder));
public async Task<PagedResult<UserReadDto_View>> GetPagedAsync(long departmentId, string like, int page = 1, int pageSize = 10)
{
var query = Orm.Select<User, Department>()
.LeftJoin((u, d) => u.DepartmentId == d.Id)
.Where((u, d) => u.DeletedAt == null);
if (departmentId > 0)
query = query.Where((u, d) => u.DepartmentId == departmentId);
if (!string.IsNullOrWhiteSpace(like))
query = query.Where((u, d) => u.UserName.Contains(like) || u.LoginName.Contains(like) || u.PhoneNumber.Contains(like));
var total = await query.CountAsync();
var list = await query
.OrderBy((u, d) => u.SortOrder)
.Page(page, pageSize)
.ToListAsync((u, d) => new
{
u.Id, u.UserName, u.PhoneNumber, u.LoginName,
DepartmentName = d.Name,
u.LastLoginAt, u.SortOrder, u.IsActive
});
// 批量查角色名,避免 N+1
var userIds = list.Select(x => x.Id).ToList();
var roleDict = await GetRoleNameDictAsync(userIds);
var items = list.Select(x => new UserReadDto_View(
x.Id, x.UserName, x.PhoneNumber, x.LoginName,
x.DepartmentName,
roleDict.TryGetValue(x.Id, out var roleName) ? roleName : "",
x.LastLoginAt?.ToString("yyyy-MM-dd HH:mm:ss") ?? "",
x.SortOrder, x.IsActive)).ToList();
return new PagedResult<UserReadDto_View>(items, page, pageSize, total);
}
public async Task<List<UserRoleReadDto_Cache>> GetUserRolesByUserId(long userId)
=> await Orm.Select<UserRole, Role>()
.InnerJoin((x, y) => x.RoleId == y.Id && y.DeletedAt == null)
.Where((x, y) => x.UserId == userId)
.ToListAsync((x, y) => new UserRoleReadDto_Cache(x.Id, x.UserId, x.RoleId, y.Name));
public async Task<List<UserReadDto_Edit>> GetByRoleIdsAsync(List<long> roleIds)
=> await Orm.Select<User, UserRole, Role>()
.InnerJoin((u, x, y) => u.Id == x.UserId)
.InnerJoin((u, x, y) => x.RoleId == y.Id && y.DeletedAt == null)
.Where((u, x, y) => roleIds.Contains(x.RoleId) && u.DeletedAt == null)
.ToListAsync((u, x, y) => new UserReadDto_Edit(u.Id, u.UserName, u.PhoneNumber, u.LoginName, u.DepartmentId, u.SortOrder));
private async Task<Dictionary<long, string>> GetRoleNameDictAsync(List<long> userIds)
{
if (userIds.Count == 0) return new Dictionary<long, string>();
var list = await Orm.Select<UserRole, Role>()
.InnerJoin((x, y) => x.RoleId == y.Id && y.DeletedAt == null)
.Where((x, y) => userIds.Contains(x.UserId))
.ToListAsync((x, y) => new { x.UserId, y.Name });
return list.GroupBy(x => x.UserId)
.ToDictionary(g => g.Key, g => string.Join(",", g.Select(v => v.Name)));
}
}
@@ -0,0 +1,21 @@
using FreeSql;
using F9WebAiTest.Domain.Entities.SYS.RBAC;
using F9WebAiTest.Domain.Interfaces.SYS.RBAC.Users;
namespace F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.RBAC.Users;
internal class UserRoleWriteRepository : F9RepositoryBase, IUserRoleWriteRepository
{
public UserRoleWriteRepository(IFreeSql fsql) : base(fsql) { }
public async Task<bool> AssignAsync(UserRole userRole)
{
userRole.CreatedAt = DateTime.Now;
return await Orm.Insert(userRole).ExecuteAffrowsAsync() > 0;
}
public async Task<bool> RemoveAsync(long userid, long roleId)
=> await Orm.Delete<UserRole>()
.Where(x => x.UserId == userid && x.RoleId == roleId)
.ExecuteAffrowsAsync() > 0;
}
@@ -0,0 +1,51 @@
using FreeSql;
using F9WebAiTest.Domain.Entities.SYS.RBAC;
using F9WebAiTest.Domain.Interfaces.SYS.RBAC.Users;
namespace F9WebAiTest.Infrastructure.FreeSqls.Repositories.SYS.RBAC.Users;
internal class UserWriteRepository : F9RepositoryBase, IUserWriteRepository
{
public UserWriteRepository(IFreeSql fsql) : base(fsql) { }
public async Task<User> GetByIdAsync(long id)
=> await Orm.Select<User>().Where(x => x.Id == id ).FirstAsync();
public async Task<bool> AddAsync(User user)
{
user.CreatedAt = DateTime.Now;
return await Orm.Insert(user).ExecuteAffrowsAsync() > 0;
}
public async Task<bool> UpdateAsync(User user)
{
user.UpdatedAt = DateTime.Now;
return await Orm.Update<User>().SetSource(user).ExecuteAffrowsAsync() > 0;
}
public async Task<bool> SoftDeleteAsync(long id)
=> await Orm.Update<User>()
.Set(x => x.IsDeleted, true)
.Where(x => x.Id == id )
.ExecuteAffrowsAsync() > 0;
public async Task<bool> ActiveOrDeactive(long id, bool active)
=> await Orm.Update<User>()
.Set(x => x.IsActive, active)
.Set(x => x.UpdatedAt, DateTime.Now)
.Where(x => x.Id == id)
.ExecuteAffrowsAsync() > 0;
public async Task<bool> UpdatePassworkdAsync(long id, string passwordHash)
=> await Orm.Update<User>()
.Set(x => x.PasswordHash, passwordHash)
.Set(x => x.UpdatedAt, DateTime.Now)
.Where(x => x.Id == id)
.ExecuteAffrowsAsync() > 0;
public async Task<bool> UpdateLastLoginAtAsync(long id, DateTime dt)
=> await Orm.Update<User>()
.Set(x => x.LastLoginAt, dt)
.Where(x => x.Id == id)
.ExecuteAffrowsAsync() > 0;
}