调整页面
This commit is contained in:
parent
faca50a972
commit
988241c2c4
|
|
@ -10,7 +10,7 @@ using User = MiAssessment.Admin.Business.Entities.User;
|
||||||
namespace MiAssessment.Admin.Business.Services;
|
namespace MiAssessment.Admin.Business.Services;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// <EFBFBD>û<EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD><EFBFBD>
|
/// 用户业务服务实现
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class UserBusinessService : IUserBusinessService
|
public class UserBusinessService : IUserBusinessService
|
||||||
{
|
{
|
||||||
|
|
@ -18,29 +18,29 @@ public class UserBusinessService : IUserBusinessService
|
||||||
private readonly ILogger<UserBusinessService> _logger;
|
private readonly ILogger<UserBusinessService> _logger;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// <EFBFBD>û<EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD>
|
/// 用户等级名称映射
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static readonly Dictionary<int, string> UserLevelNames = new()
|
private static readonly Dictionary<int, string> UserLevelNames = new()
|
||||||
{
|
{
|
||||||
{ 1, "<EFBFBD><EFBFBD>ͨ<EFBFBD>û<EFBFBD>" },
|
{ 1, "普通用户" },
|
||||||
{ 2, "<EFBFBD>ϻ<EFBFBD><EFBFBD><EFBFBD>" },
|
{ 2, "合伙人" },
|
||||||
{ 3, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϻ<EFBFBD><EFBFBD><EFBFBD>" }
|
{ 3, "渠道合伙人" }
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><EFBFBD>
|
/// 状态名称映射
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private static readonly Dictionary<int, string> StatusNames = new()
|
private static readonly Dictionary<int, string> StatusNames = new()
|
||||||
{
|
{
|
||||||
{ 0, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" },
|
{ 0, "禁用" },
|
||||||
{ 1, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>" }
|
{ 1, "正常" }
|
||||||
};
|
};
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// <EFBFBD><EFBFBD><EFBFBD>캯<EFBFBD><EFBFBD>
|
/// 构造函数
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="dbContext"><EFBFBD><EFBFBD><EFBFBD>ݿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
/// <param name="dbContext">数据库上下文</param>
|
||||||
/// <param name="logger"><EFBFBD><EFBFBD>־<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD></param>
|
/// <param name="logger">日志记录器</param>
|
||||||
public UserBusinessService(
|
public UserBusinessService(
|
||||||
AdminBusinessDbContext dbContext,
|
AdminBusinessDbContext dbContext,
|
||||||
ILogger<UserBusinessService> logger)
|
ILogger<UserBusinessService> logger)
|
||||||
|
|
@ -49,45 +49,60 @@ public class UserBusinessService : IUserBusinessService
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region <EFBFBD>û<EFBFBD><EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>飨<EFBFBD>½ӿ<EFBFBD> - Requirements 9.1-9.7<EFBFBD><EFBFBD>
|
#region 用户列表与详情(新接口 - Requirements 9.1-9.7)
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public async Task<PagedResult<UserDto>> GetUserListAsync(UserQueryRequest request)
|
public async Task<PagedResult<UserDto>> GetUserListAsync(UserQueryRequest request)
|
||||||
{
|
{
|
||||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
|
// 构建查询,过滤软删除记录
|
||||||
var query = _dbContext.Users
|
var query = _dbContext.Users
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.Where(u => !u.IsDeleted);
|
.Where(u => !u.IsDeleted);
|
||||||
|
|
||||||
// Ӧ<EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// 应用过滤条件
|
||||||
query = ApplyUserQueryFilters(query, request);
|
query = ApplyUserQueryFilters(query, request);
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// 获取总数
|
||||||
var total = await query.CountAsync();
|
var total = await query.CountAsync();
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>併<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// 分页查询,先查数据库,再在内存中映射名称
|
||||||
var items = await query
|
var users = await query
|
||||||
.OrderByDescending(u => u.CreateTime)
|
.OrderByDescending(u => u.CreateTime)
|
||||||
.Skip(request.Skip)
|
.Skip(request.Skip)
|
||||||
.Take(request.PageSize)
|
.Take(request.PageSize)
|
||||||
.Select(u => new UserDto
|
.Select(u => new
|
||||||
{
|
{
|
||||||
Id = u.Id,
|
u.Id,
|
||||||
Uid = u.Uid,
|
u.Uid,
|
||||||
Phone = u.Phone,
|
u.Phone,
|
||||||
Nickname = u.Nickname,
|
u.Nickname,
|
||||||
Avatar = u.Avatar,
|
u.Avatar,
|
||||||
UserLevel = u.UserLevel,
|
u.UserLevel,
|
||||||
UserLevelName = GetUserLevelName(u.UserLevel),
|
u.Balance,
|
||||||
Balance = u.Balance,
|
u.TotalIncome,
|
||||||
TotalIncome = u.TotalIncome,
|
u.Status,
|
||||||
Status = u.Status,
|
u.CreateTime,
|
||||||
StatusName = GetStatusName(u.Status),
|
u.LastLoginTime
|
||||||
CreateTime = u.CreateTime,
|
|
||||||
LastLoginTime = u.LastLoginTime
|
|
||||||
})
|
})
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
|
var items = users.Select(u => new UserDto
|
||||||
|
{
|
||||||
|
Id = u.Id,
|
||||||
|
Uid = u.Uid,
|
||||||
|
Phone = u.Phone,
|
||||||
|
Nickname = u.Nickname,
|
||||||
|
Avatar = u.Avatar,
|
||||||
|
UserLevel = u.UserLevel,
|
||||||
|
UserLevelName = GetUserLevelName(u.UserLevel),
|
||||||
|
Balance = u.Balance,
|
||||||
|
TotalIncome = u.TotalIncome,
|
||||||
|
Status = u.Status,
|
||||||
|
StatusName = GetStatusName(u.Status),
|
||||||
|
CreateTime = u.CreateTime,
|
||||||
|
LastLoginTime = u.LastLoginTime
|
||||||
|
}).ToList();
|
||||||
|
|
||||||
return PagedResult<UserDto>.Create(items, total, request.Page, request.PageSize);
|
return PagedResult<UserDto>.Create(items, total, request.Page, request.PageSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -104,7 +119,7 @@ public class UserBusinessService : IUserBusinessService
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD>ȡ<EFBFBD>ϼ<EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>Ϣ
|
// 获取上级用户信息
|
||||||
string? parentUserNickname = null;
|
string? parentUserNickname = null;
|
||||||
string? parentUserUid = null;
|
string? parentUserUid = null;
|
||||||
if (user.ParentUserId.HasValue)
|
if (user.ParentUserId.HasValue)
|
||||||
|
|
@ -122,17 +137,17 @@ public class UserBusinessService : IUserBusinessService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// 获取订单数量
|
||||||
var orderCount = await _dbContext.Orders
|
var orderCount = await _dbContext.Orders
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.CountAsync(o => o.UserId == id && !o.IsDeleted);
|
.CountAsync(o => o.UserId == id && !o.IsDeleted);
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// 获取测评数量(已支付及以上状态的测评订单)
|
||||||
var assessmentCount = await _dbContext.Orders
|
var assessmentCount = await _dbContext.Orders
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.CountAsync(o => o.UserId == id && o.OrderType == 1 && o.Status >= 2 && !o.IsDeleted);
|
.CountAsync(o => o.UserId == id && o.OrderType == 1 && o.Status >= 2 && !o.IsDeleted);
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// 获取邀请人数
|
||||||
var inviteCount = await _dbContext.Users
|
var inviteCount = await _dbContext.Users
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.CountAsync(u => u.ParentUserId == id && !u.IsDeleted);
|
.CountAsync(u => u.ParentUserId == id && !u.IsDeleted);
|
||||||
|
|
@ -171,7 +186,7 @@ public class UserBusinessService : IUserBusinessService
|
||||||
|
|
||||||
if (user == null)
|
if (user == null)
|
||||||
{
|
{
|
||||||
throw new BusinessException(ErrorCodes.UserNotFound, "<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
throw new BusinessException(ErrorCodes.UserNotFound, "用户不存在");
|
||||||
}
|
}
|
||||||
|
|
||||||
user.Status = status;
|
user.Status = status;
|
||||||
|
|
@ -179,7 +194,7 @@ public class UserBusinessService : IUserBusinessService
|
||||||
|
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
|
|
||||||
_logger.LogInformation("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>״̬<EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>ID: {UserId}, ״̬: {Status}", id, status);
|
_logger.LogInformation("更新用户状态成功,ID: {UserId}, 状态: {Status}", id, status);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -193,7 +208,7 @@ public class UserBusinessService : IUserBusinessService
|
||||||
|
|
||||||
if (user == null)
|
if (user == null)
|
||||||
{
|
{
|
||||||
throw new BusinessException(ErrorCodes.UserNotFound, "<EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
throw new BusinessException(ErrorCodes.UserNotFound, "用户不存在");
|
||||||
}
|
}
|
||||||
|
|
||||||
user.UserLevel = userLevel;
|
user.UserLevel = userLevel;
|
||||||
|
|
@ -201,7 +216,7 @@ public class UserBusinessService : IUserBusinessService
|
||||||
|
|
||||||
await _dbContext.SaveChangesAsync();
|
await _dbContext.SaveChangesAsync();
|
||||||
|
|
||||||
_logger.LogInformation("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD>ɹ<EFBFBD><EFBFBD><EFBFBD>ID: {UserId}, <20>ȼ<EFBFBD>: {UserLevel}", id, userLevel);
|
_logger.LogInformation("更新用户等级成功,ID: {UserId}, 等级: {UserLevel}", id, userLevel);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
@ -209,35 +224,50 @@ public class UserBusinessService : IUserBusinessService
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public async Task<List<UserDto>> ExportUsersAsync(UserQueryRequest request)
|
public async Task<List<UserDto>> ExportUsersAsync(UserQueryRequest request)
|
||||||
{
|
{
|
||||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>¼
|
// 构建查询,过滤软删除记录
|
||||||
var query = _dbContext.Users
|
var query = _dbContext.Users
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.Where(u => !u.IsDeleted);
|
.Where(u => !u.IsDeleted);
|
||||||
|
|
||||||
// Ӧ<EFBFBD>ù<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// 应用过滤条件
|
||||||
query = ApplyUserQueryFilters(query, request);
|
query = ApplyUserQueryFilters(query, request);
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ<EFBFBD><EFBFBD>
|
// 查询所有匹配用户,先查数据库,再在内存中映射名称
|
||||||
var items = await query
|
var users = await query
|
||||||
.OrderByDescending(u => u.CreateTime)
|
.OrderByDescending(u => u.CreateTime)
|
||||||
.Select(u => new UserDto
|
.Select(u => new
|
||||||
{
|
{
|
||||||
Id = u.Id,
|
u.Id,
|
||||||
Uid = u.Uid,
|
u.Uid,
|
||||||
Phone = u.Phone,
|
u.Phone,
|
||||||
Nickname = u.Nickname,
|
u.Nickname,
|
||||||
Avatar = u.Avatar,
|
u.Avatar,
|
||||||
UserLevel = u.UserLevel,
|
u.UserLevel,
|
||||||
UserLevelName = GetUserLevelName(u.UserLevel),
|
u.Balance,
|
||||||
Balance = u.Balance,
|
u.TotalIncome,
|
||||||
TotalIncome = u.TotalIncome,
|
u.Status,
|
||||||
Status = u.Status,
|
u.CreateTime,
|
||||||
StatusName = GetStatusName(u.Status),
|
u.LastLoginTime
|
||||||
CreateTime = u.CreateTime,
|
|
||||||
LastLoginTime = u.LastLoginTime
|
|
||||||
})
|
})
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
|
var items = users.Select(u => new UserDto
|
||||||
|
{
|
||||||
|
Id = u.Id,
|
||||||
|
Uid = u.Uid,
|
||||||
|
Phone = u.Phone,
|
||||||
|
Nickname = u.Nickname,
|
||||||
|
Avatar = u.Avatar,
|
||||||
|
UserLevel = u.UserLevel,
|
||||||
|
UserLevelName = GetUserLevelName(u.UserLevel),
|
||||||
|
Balance = u.Balance,
|
||||||
|
TotalIncome = u.TotalIncome,
|
||||||
|
Status = u.Status,
|
||||||
|
StatusName = GetStatusName(u.Status),
|
||||||
|
CreateTime = u.CreateTime,
|
||||||
|
LastLoginTime = u.LastLoginTime
|
||||||
|
}).ToList();
|
||||||
|
|
||||||
_logger.LogInformation("导出用户列表成功,数量: {Count}", items.Count);
|
_logger.LogInformation("导出用户列表成功,数量: {Count}", items.Count);
|
||||||
|
|
||||||
return items;
|
return items;
|
||||||
|
|
@ -287,7 +317,7 @@ public class UserBusinessService : IUserBusinessService
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region <EFBFBD>ɽӿڣ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>
|
#region 旧接口(保留)
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public Task<PagedResult<UserListResponse>> GetUserListAsync(UserListRequest request)
|
public Task<PagedResult<UserListResponse>> GetUserListAsync(UserListRequest request)
|
||||||
|
|
@ -299,88 +329,88 @@ public class UserBusinessService : IUserBusinessService
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public Task<bool> SetUserStatusAsync(long userId, int status)
|
public Task<bool> SetUserStatusAsync(long userId, int status)
|
||||||
{
|
{
|
||||||
// <EFBFBD>ɽӿ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
|
// 旧接口暂时返回 false
|
||||||
return Task.FromResult(false);
|
return Task.FromResult(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public Task<bool> SetTestAccountAsync(long userId, int isTest)
|
public Task<bool> SetTestAccountAsync(long userId, int isTest)
|
||||||
{
|
{
|
||||||
// <EFBFBD>ɽӿ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
|
// 旧接口暂时返回 false
|
||||||
return Task.FromResult(false);
|
return Task.FromResult(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public Task<bool> ClearMobileAsync(long userId)
|
public Task<bool> ClearMobileAsync(long userId)
|
||||||
{
|
{
|
||||||
// <EFBFBD>ɽӿ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
|
// 旧接口暂时返回 false
|
||||||
return Task.FromResult(false);
|
return Task.FromResult(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public Task<bool> ClearWeChatAsync(long userId)
|
public Task<bool> ClearWeChatAsync(long userId)
|
||||||
{
|
{
|
||||||
// <EFBFBD>ɽӿ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
|
// 旧接口暂时返回 false
|
||||||
return Task.FromResult(false);
|
return Task.FromResult(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public Task<PagedResult<IpLogItem>> GetUserIpLogsAsync(long userId, int page, int pageSize)
|
public Task<PagedResult<IpLogItem>> GetUserIpLogsAsync(long userId, int page, int pageSize)
|
||||||
{
|
{
|
||||||
// <EFBFBD>ɽӿ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ؿս<EFBFBD><EFBFBD>
|
// 旧接口暂时返回空结果
|
||||||
return Task.FromResult(PagedResult<IpLogItem>.Empty(page, pageSize));
|
return Task.FromResult(PagedResult<IpLogItem>.Empty(page, pageSize));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public Task<bool> BindMobileAsync(long userId, string mobile)
|
public Task<bool> BindMobileAsync(long userId, string mobile)
|
||||||
{
|
{
|
||||||
// <EFBFBD>ɽӿ<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD> false
|
// 旧接口暂时返回 false
|
||||||
return Task.FromResult(false);
|
return Task.FromResult(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region ˽<EFBFBD>з<EFBFBD><EFBFBD><EFBFBD>
|
#region 私有方法
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Ӧ<EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD><EFBFBD>ѯ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
/// 应用用户查询过滤条件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="query"><EFBFBD><EFBFBD>ѯ</param>
|
/// <param name="query">查询</param>
|
||||||
/// <param name="request"><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
|
/// <param name="request">请求</param>
|
||||||
/// <returns><EFBFBD><EFBFBD><EFBFBD>˺<EFBFBD>IJ<EFBFBD>ѯ</returns>
|
/// <returns>过滤后的查询</returns>
|
||||||
private IQueryable<User> ApplyUserQueryFilters(IQueryable<User> query, UserQueryRequest request)
|
private IQueryable<User> ApplyUserQueryFilters(IQueryable<User> query, UserQueryRequest request)
|
||||||
{
|
{
|
||||||
// <EFBFBD><EFBFBD>UID<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// 按UID筛选
|
||||||
if (!string.IsNullOrWhiteSpace(request.Uid))
|
if (!string.IsNullOrWhiteSpace(request.Uid))
|
||||||
{
|
{
|
||||||
query = query.Where(u => u.Uid == request.Uid);
|
query = query.Where(u => u.Uid == request.Uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// 按手机号筛选
|
||||||
if (!string.IsNullOrWhiteSpace(request.Phone))
|
if (!string.IsNullOrWhiteSpace(request.Phone))
|
||||||
{
|
{
|
||||||
query = query.Where(u => u.Phone != null && u.Phone.Contains(request.Phone));
|
query = query.Where(u => u.Phone != null && u.Phone.Contains(request.Phone));
|
||||||
}
|
}
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD><EFBFBD>dz<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
// 按昵称筛选
|
||||||
if (!string.IsNullOrWhiteSpace(request.Nickname))
|
if (!string.IsNullOrWhiteSpace(request.Nickname))
|
||||||
{
|
{
|
||||||
query = query.Where(u => u.Nickname != null && u.Nickname.Contains(request.Nickname));
|
query = query.Where(u => u.Nickname != null && u.Nickname.Contains(request.Nickname));
|
||||||
}
|
}
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><EFBFBD>ȼ<EFBFBD>ɸѡ
|
// 按用户等级筛选
|
||||||
if (request.UserLevel.HasValue)
|
if (request.UserLevel.HasValue)
|
||||||
{
|
{
|
||||||
query = query.Where(u => u.UserLevel == request.UserLevel.Value);
|
query = query.Where(u => u.UserLevel == request.UserLevel.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD>״̬ɸѡ
|
// 按状态筛选
|
||||||
if (request.Status.HasValue)
|
if (request.Status.HasValue)
|
||||||
{
|
{
|
||||||
query = query.Where(u => u.Status == request.Status.Value);
|
query = query.Where(u => u.Status == request.Status.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
// <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>䷶Χɸѡ
|
// 按创建时间范围筛选
|
||||||
if (request.CreateTimeStart.HasValue)
|
if (request.CreateTimeStart.HasValue)
|
||||||
{
|
{
|
||||||
query = query.Where(u => u.CreateTime >= request.CreateTimeStart.Value);
|
query = query.Where(u => u.CreateTime >= request.CreateTimeStart.Value);
|
||||||
|
|
@ -395,23 +425,23 @@ public class UserBusinessService : IUserBusinessService
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// <EFBFBD><EFBFBD>ȡ<EFBFBD>û<EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
/// 获取用户等级名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="userLevel"><EFBFBD>û<EFBFBD><EFBFBD>ȼ<EFBFBD></param>
|
/// <param name="userLevel">用户等级</param>
|
||||||
/// <returns><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
|
/// <returns>等级名称</returns>
|
||||||
private static string GetUserLevelName(int userLevel)
|
private static string GetUserLevelName(int userLevel)
|
||||||
{
|
{
|
||||||
return UserLevelNames.TryGetValue(userLevel, out var name) ? name : "δ֪";
|
return UserLevelNames.TryGetValue(userLevel, out var name) ? name : "未知";
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// <EFBFBD><EFBFBD>ȡ״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
/// 获取状态名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="status">״ֵ̬</param>
|
/// <param name="status">状态值</param>
|
||||||
/// <returns>״̬<EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
|
/// <returns>状态名称</returns>
|
||||||
private static string GetStatusName(int status)
|
private static string GetStatusName(int status)
|
||||||
{
|
{
|
||||||
return StatusNames.TryGetValue(status, out var name) ? name : "δ֪";
|
return StatusNames.TryGetValue(status, out var name) ? name : "未知";
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
|
||||||
|
|
@ -201,6 +201,9 @@ const RICH_TEXT_CONFIG_KEYS = ['user_agreement', 'privacy_policy', 'about_us_con
|
||||||
// 图片配置键列表
|
// 图片配置键列表
|
||||||
const IMAGE_CONFIG_KEYS = ['service_qrcode']
|
const IMAGE_CONFIG_KEYS = ['service_qrcode']
|
||||||
|
|
||||||
|
// 隐藏的配置键列表(暂未实际使用的配置项)
|
||||||
|
const HIDDEN_CONFIG_KEYS = ['service_phone', 'service_wechat', 'about_us_content', 'assessment_price']
|
||||||
|
|
||||||
// ============ State ============
|
// ============ State ============
|
||||||
|
|
||||||
const state = reactive<ConfigPageState>({
|
const state = reactive<ConfigPageState>({
|
||||||
|
|
@ -326,8 +329,13 @@ async function loadConfigList() {
|
||||||
try {
|
try {
|
||||||
const res = await getConfigList()
|
const res = await getConfigList()
|
||||||
if (res.code === 0) {
|
if (res.code === 0) {
|
||||||
state.configGroups = res.data || []
|
// 过滤隐藏的配置项,移除空分组
|
||||||
state.activeGroups = state.configGroups.map(group => group.configType)
|
const groups = (res.data || []).map((group: ConfigGroup) => ({
|
||||||
|
...group,
|
||||||
|
items: group.items.filter((item: ConfigItem) => !HIDDEN_CONFIG_KEYS.includes(item.configKey))
|
||||||
|
})).filter((group: ConfigGroup) => group.items.length > 0)
|
||||||
|
state.configGroups = groups
|
||||||
|
state.activeGroups = groups.map((group: ConfigGroup) => group.configType)
|
||||||
} else {
|
} else {
|
||||||
throw new Error(res.message || '获取配置列表失败')
|
throw new Error(res.message || '获取配置列表失败')
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -96,7 +96,11 @@
|
||||||
<el-table-column prop="uid" label="UID" width="120" show-overflow-tooltip />
|
<el-table-column prop="uid" label="UID" width="120" show-overflow-tooltip />
|
||||||
|
|
||||||
<!-- 手机号 -->
|
<!-- 手机号 -->
|
||||||
<el-table-column prop="phone" label="手机号" width="130" show-overflow-tooltip />
|
<el-table-column prop="phone" label="手机号" width="130" show-overflow-tooltip>
|
||||||
|
<template #default="{ row }">
|
||||||
|
{{ row.phone || '-' }}
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
|
||||||
<!-- 昵称 -->
|
<!-- 昵称 -->
|
||||||
<el-table-column prop="nickname" label="昵称" min-width="120" show-overflow-tooltip />
|
<el-table-column prop="nickname" label="昵称" min-width="120" show-overflow-tooltip />
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"SiteSettings": {
|
"SiteSettings": {
|
||||||
"ApiBaseUrl": "https://api.nxt.shhmkjgs.cn"
|
"ApiBaseUrl": "http://localhost:5238"
|
||||||
},
|
},
|
||||||
"AllowedHosts": "*",
|
"AllowedHosts": "*",
|
||||||
"Serilog": {
|
"Serilog": {
|
||||||
|
|
|
||||||
|
|
@ -98,19 +98,26 @@ else
|
||||||
var meta = chart.getDatasetMeta(0);
|
var meta = chart.getDatasetMeta(0);
|
||||||
var dataset = chart.data.datasets[0];
|
var dataset = chart.data.datasets[0];
|
||||||
var total = dataset.data.reduce(function(a, b) { return a + b; }, 0);
|
var total = dataset.data.reduce(function(a, b) { return a + b; }, 0);
|
||||||
ctx.font = 'bold 12px "Microsoft YaHei", sans-serif';
|
ctx.font = 'bold 10px "Microsoft YaHei", sans-serif';
|
||||||
ctx.textBaseline = 'middle';
|
ctx.textBaseline = 'middle';
|
||||||
meta.data.forEach(function(arc, i) {
|
meta.data.forEach(function(arc, i) {
|
||||||
var pct = (dataset.data[i] / total * 100).toFixed(2) + '%';
|
var pct = (dataset.data[i] / total * 100).toFixed(2) + '%';
|
||||||
var name = chart.data.labels[i];
|
var name = chart.data.labels[i];
|
||||||
var angle = (arc.startAngle + arc.endAngle) / 2;
|
var angle = (arc.startAngle + arc.endAngle) / 2;
|
||||||
var r = (arc.outerRadius + arc.innerRadius) / 2;
|
var labelR = arc.outerRadius + 18;
|
||||||
var x = arc.x + Math.cos(angle) * (arc.outerRadius + 30);
|
var x = arc.x + Math.cos(angle) * labelR;
|
||||||
var y = arc.y + Math.sin(angle) * (arc.outerRadius + 30);
|
var y = arc.y + Math.sin(angle) * labelR;
|
||||||
|
// 根据角度调整文字对齐,避免左右超出
|
||||||
|
if (Math.cos(angle) < -0.1) {
|
||||||
|
ctx.textAlign = 'right';
|
||||||
|
} else if (Math.cos(angle) > 0.1) {
|
||||||
|
ctx.textAlign = 'left';
|
||||||
|
} else {
|
||||||
|
ctx.textAlign = 'center';
|
||||||
|
}
|
||||||
ctx.fillStyle = dataset.backgroundColor[i];
|
ctx.fillStyle = dataset.backgroundColor[i];
|
||||||
ctx.textAlign = 'center';
|
ctx.fillText(name, x, y - 7);
|
||||||
ctx.fillText(name, x, y - 8);
|
ctx.fillText(pct, x, y + 7);
|
||||||
ctx.fillText(pct, x, y + 8);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
@ -133,7 +140,7 @@ else
|
||||||
plugins: {
|
plugins: {
|
||||||
legend: { display: false }
|
legend: { display: false }
|
||||||
},
|
},
|
||||||
layout: { padding: 40 }
|
layout: { padding: { top: 44, bottom: 44, left: 50, right: 50 } }
|
||||||
},
|
},
|
||||||
plugins: [donutLabelPlugin]
|
plugins: [donutLabelPlugin]
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -17,11 +17,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 底部:机构信息 -->
|
|
||||||
<div class="disc-footer">
|
|
||||||
<span class="disc-footer-left">天赋全能测评-本部</span>
|
|
||||||
<span class="disc-footer-right">公众号【天赋测评研究所】</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@section Styles {
|
@section Styles {
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@ else
|
||||||
<div class="si-page">
|
<div class="si-page">
|
||||||
<!-- 顶部标签 -->
|
<!-- 顶部标签 -->
|
||||||
<div class="si-top-badge">
|
<div class="si-top-badge">
|
||||||
<span class="si-badge-text">@Model.LevelName@(MiAssessment.Api.Pages.Report.StrongerIntelligenceModel.GetStarChinese(Model.StarLevel))星</span>
|
<span class="si-badge-text">@Model.LevelName@(MiAssessment.Api.Pages.Report.StrongerIntelligenceModel.GetStarChinese(Model.StarLevel))智能</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 名称标签(左)+ 星级(右)同一行 -->
|
<!-- 名称标签(左)+ 星级(右)同一行 -->
|
||||||
|
|
@ -26,14 +26,7 @@ else
|
||||||
<span>@Model.LevelName—@Model.IntelligenceName</span>
|
<span>@Model.LevelName—@Model.IntelligenceName</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="si-stars">
|
<div class="si-stars">
|
||||||
@for (var i = 0; i < Model.StarLevel; i++)
|
|
||||||
{
|
|
||||||
<span class="si-star">★</span>
|
|
||||||
}
|
|
||||||
@for (var i = Model.StarLevel; i < 5; i++)
|
|
||||||
{
|
|
||||||
<span class="si-star si-star-empty">★</span>
|
|
||||||
}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,11 +85,11 @@ public class StrongerIntelligenceModel : ReportPageModelBase
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static string GetStarChinese(int starLevel) => starLevel switch
|
public static string GetStarChinese(int starLevel) => starLevel switch
|
||||||
{
|
{
|
||||||
5 => "五",
|
// 5 => "五",
|
||||||
4 => "四",
|
// 4 => "四",
|
||||||
3 => "三",
|
// 3 => "三",
|
||||||
2 => "二",
|
// 2 => "二",
|
||||||
1 => "一",
|
// 1 => "一",
|
||||||
_ => ""
|
_ => ""
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.bt-panel-donut {
|
.bt-panel-donut {
|
||||||
flex: 0.9;
|
flex: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
.bt-chart-title {
|
.bt-chart-title {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user