From 988241c2c478c0d17508c2051a43e5a2c963ad5a Mon Sep 17 00:00:00 2001 From: zpc Date: Tue, 24 Mar 2026 01:40:36 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/UserBusinessService.cs | 196 ++++++++++-------- .../src/views/business/config/index.vue | 12 +- .../src/views/business/user/index.vue | 6 +- .../src/MiAssessment.Admin/appsettings.json | 2 +- .../Pages/Report/BrainTypes.cshtml | 23 +- .../Pages/Report/Disclaimer.cshtml | 6 +- .../Pages/Report/StrongerIntelligence.cshtml | 11 +- .../Report/StrongerIntelligence.cshtml.cs | 10 +- .../wwwroot/css/pages/brain-types.css | 2 +- 9 files changed, 153 insertions(+), 115 deletions(-) diff --git a/server/MiAssessment/src/MiAssessment.Admin.Business/Services/UserBusinessService.cs b/server/MiAssessment/src/MiAssessment.Admin.Business/Services/UserBusinessService.cs index 985a947..39b80ee 100644 --- a/server/MiAssessment/src/MiAssessment.Admin.Business/Services/UserBusinessService.cs +++ b/server/MiAssessment/src/MiAssessment.Admin.Business/Services/UserBusinessService.cs @@ -10,7 +10,7 @@ using User = MiAssessment.Admin.Business.Entities.User; namespace MiAssessment.Admin.Business.Services; /// -/// �û�ҵ�����ʵ�� +/// 用户业务服务实现 /// public class UserBusinessService : IUserBusinessService { @@ -18,29 +18,29 @@ public class UserBusinessService : IUserBusinessService private readonly ILogger _logger; /// - /// �û��ȼ�����ӳ�� + /// 用户等级名称映射 /// private static readonly Dictionary UserLevelNames = new() { - { 1, "��ͨ�û�" }, - { 2, "�ϻ���" }, - { 3, "�����ϻ���" } + { 1, "普通用户" }, + { 2, "合伙人" }, + { 3, "渠道合伙人" } }; /// - /// ״̬����ӳ�� + /// 状态名称映射 /// private static readonly Dictionary StatusNames = new() { - { 0, "����" }, - { 1, "����" } + { 0, "禁用" }, + { 1, "正常" } }; /// - /// ���캯�� + /// 构造函数 /// - /// ���ݿ������� - /// ��־��¼�� + /// 数据库上下文 + /// 日志记录器 public UserBusinessService( AdminBusinessDbContext dbContext, ILogger logger) @@ -49,45 +49,60 @@ public class UserBusinessService : IUserBusinessService _logger = logger; } - #region �û��б������飨�½ӿ� - Requirements 9.1-9.7�� + #region 用户列表与详情(新接口 - Requirements 9.1-9.7) /// public async Task> GetUserListAsync(UserQueryRequest request) { - // ������ѯ��������ɾ����¼ + // 构建查询,过滤软删除记录 var query = _dbContext.Users .AsNoTracking() .Where(u => !u.IsDeleted); - // Ӧ�ù������� + // 应用过滤条件 query = ApplyUserQueryFilters(query, request); - // ��ȡ���� + // 获取总数 var total = await query.CountAsync(); - // ��ҳ��ѯ��������ʱ�併������ - var items = await query + // 分页查询,先查数据库,再在内存中映射名称 + var users = await query .OrderByDescending(u => u.CreateTime) .Skip(request.Skip) .Take(request.PageSize) - .Select(u => new UserDto + .Select(u => new { - 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 + u.Id, + u.Uid, + u.Phone, + u.Nickname, + u.Avatar, + u.UserLevel, + u.Balance, + u.TotalIncome, + u.Status, + u.CreateTime, + u.LastLoginTime }) .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.Create(items, total, request.Page, request.PageSize); } @@ -104,7 +119,7 @@ public class UserBusinessService : IUserBusinessService return null; } - // ��ȡ�ϼ��û���Ϣ + // 获取上级用户信息 string? parentUserNickname = null; string? parentUserUid = null; if (user.ParentUserId.HasValue) @@ -122,17 +137,17 @@ public class UserBusinessService : IUserBusinessService } } - // ��ȡ�������� + // 获取订单数量 var orderCount = await _dbContext.Orders .AsNoTracking() .CountAsync(o => o.UserId == id && !o.IsDeleted); - // ��ȡ������������������������ + // 获取测评数量(已支付及以上状态的测评订单) var assessmentCount = await _dbContext.Orders .AsNoTracking() .CountAsync(o => o.UserId == id && o.OrderType == 1 && o.Status >= 2 && !o.IsDeleted); - // ��ȡ�������� + // 获取邀请人数 var inviteCount = await _dbContext.Users .AsNoTracking() .CountAsync(u => u.ParentUserId == id && !u.IsDeleted); @@ -171,7 +186,7 @@ public class UserBusinessService : IUserBusinessService if (user == null) { - throw new BusinessException(ErrorCodes.UserNotFound, "�û�������"); + throw new BusinessException(ErrorCodes.UserNotFound, "用户不存在"); } user.Status = status; @@ -179,7 +194,7 @@ public class UserBusinessService : IUserBusinessService await _dbContext.SaveChangesAsync(); - _logger.LogInformation("�����û�״̬�ɹ���ID: {UserId}, ״̬: {Status}", id, status); + _logger.LogInformation("更新用户状态成功,ID: {UserId}, 状态: {Status}", id, status); return true; } @@ -193,7 +208,7 @@ public class UserBusinessService : IUserBusinessService if (user == null) { - throw new BusinessException(ErrorCodes.UserNotFound, "�û�������"); + throw new BusinessException(ErrorCodes.UserNotFound, "用户不存在"); } user.UserLevel = userLevel; @@ -201,7 +216,7 @@ public class UserBusinessService : IUserBusinessService await _dbContext.SaveChangesAsync(); - _logger.LogInformation("�����û��ȼ��ɹ���ID: {UserId}, �ȼ�: {UserLevel}", id, userLevel); + _logger.LogInformation("更新用户等级成功,ID: {UserId}, 等级: {UserLevel}", id, userLevel); return true; } @@ -209,35 +224,50 @@ public class UserBusinessService : IUserBusinessService /// public async Task> ExportUsersAsync(UserQueryRequest request) { - // ������ѯ��������ɾ����¼ + // 构建查询,过滤软删除记录 var query = _dbContext.Users .AsNoTracking() .Where(u => !u.IsDeleted); - // Ӧ�ù������� + // 应用过滤条件 query = ApplyUserQueryFilters(query, request); - // ��ѯ����ƥ����û�������ҳ�� - var items = await query + // 查询所有匹配用户,先查数据库,再在内存中映射名称 + var users = await query .OrderByDescending(u => u.CreateTime) - .Select(u => new UserDto + .Select(u => new { - 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 + u.Id, + u.Uid, + u.Phone, + u.Nickname, + u.Avatar, + u.UserLevel, + u.Balance, + u.TotalIncome, + u.Status, + u.CreateTime, + u.LastLoginTime }) .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); return items; @@ -287,7 +317,7 @@ public class UserBusinessService : IUserBusinessService #endregion - #region �ɽӿڣ����ݣ� + #region 旧接口(保留) /// public Task> GetUserListAsync(UserListRequest request) @@ -299,88 +329,88 @@ public class UserBusinessService : IUserBusinessService /// public Task SetUserStatusAsync(long userId, int status) { - // �ɽӿ���ʱ���� false + // 旧接口暂时返回 false return Task.FromResult(false); } /// public Task SetTestAccountAsync(long userId, int isTest) { - // �ɽӿ���ʱ���� false + // 旧接口暂时返回 false return Task.FromResult(false); } /// public Task ClearMobileAsync(long userId) { - // �ɽӿ���ʱ���� false + // 旧接口暂时返回 false return Task.FromResult(false); } /// public Task ClearWeChatAsync(long userId) { - // �ɽӿ���ʱ���� false + // 旧接口暂时返回 false return Task.FromResult(false); } /// public Task> GetUserIpLogsAsync(long userId, int page, int pageSize) { - // �ɽӿ���ʱ���ؿս�� + // 旧接口暂时返回空结果 return Task.FromResult(PagedResult.Empty(page, pageSize)); } /// public Task BindMobileAsync(long userId, string mobile) { - // �ɽӿ���ʱ���� false + // 旧接口暂时返回 false return Task.FromResult(false); } #endregion - #region ˽�з��� + #region 私有方法 /// - /// Ӧ���û���ѯ�������� + /// 应用用户查询过滤条件 /// - /// ��ѯ - /// ���� - /// ���˺�IJ�ѯ + /// 查询 + /// 请求 + /// 过滤后的查询 private IQueryable ApplyUserQueryFilters(IQueryable query, UserQueryRequest request) { - // ��UID���� + // 按UID筛选 if (!string.IsNullOrWhiteSpace(request.Uid)) { query = query.Where(u => u.Uid == request.Uid); } - // ���ֻ������� + // 按手机号筛选 if (!string.IsNullOrWhiteSpace(request.Phone)) { query = query.Where(u => u.Phone != null && u.Phone.Contains(request.Phone)); } - // ���dz����� + // 按昵称筛选 if (!string.IsNullOrWhiteSpace(request.Nickname)) { query = query.Where(u => u.Nickname != null && u.Nickname.Contains(request.Nickname)); } - // ���û��ȼ�ɸѡ + // 按用户等级筛选 if (request.UserLevel.HasValue) { query = query.Where(u => u.UserLevel == request.UserLevel.Value); } - // ��״̬ɸѡ + // 按状态筛选 if (request.Status.HasValue) { query = query.Where(u => u.Status == request.Status.Value); } - // ������ʱ�䷶Χɸѡ + // 按创建时间范围筛选 if (request.CreateTimeStart.HasValue) { query = query.Where(u => u.CreateTime >= request.CreateTimeStart.Value); @@ -395,23 +425,23 @@ public class UserBusinessService : IUserBusinessService } /// - /// ��ȡ�û��ȼ����� + /// 获取用户等级名称 /// - /// �û��ȼ� - /// �ȼ����� + /// 用户等级 + /// 等级名称 private static string GetUserLevelName(int userLevel) { - return UserLevelNames.TryGetValue(userLevel, out var name) ? name : "δ֪"; + return UserLevelNames.TryGetValue(userLevel, out var name) ? name : "未知"; } /// - /// ��ȡ״̬���� + /// 获取状态名称 /// - /// ״ֵ̬ - /// ״̬���� + /// 状态值 + /// 状态名称 private static string GetStatusName(int status) { - return StatusNames.TryGetValue(status, out var name) ? name : "δ֪"; + return StatusNames.TryGetValue(status, out var name) ? name : "未知"; } #endregion diff --git a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/config/index.vue b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/config/index.vue index d5addd8..2969c3b 100644 --- a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/config/index.vue +++ b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/config/index.vue @@ -201,6 +201,9 @@ const RICH_TEXT_CONFIG_KEYS = ['user_agreement', 'privacy_policy', 'about_us_con // 图片配置键列表 const IMAGE_CONFIG_KEYS = ['service_qrcode'] +// 隐藏的配置键列表(暂未实际使用的配置项) +const HIDDEN_CONFIG_KEYS = ['service_phone', 'service_wechat', 'about_us_content', 'assessment_price'] + // ============ State ============ const state = reactive({ @@ -326,8 +329,13 @@ async function loadConfigList() { try { const res = await getConfigList() 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 { throw new Error(res.message || '获取配置列表失败') } diff --git a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/user/index.vue b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/user/index.vue index b050218..a430fd2 100644 --- a/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/user/index.vue +++ b/server/MiAssessment/src/MiAssessment.Admin/admin-web/src/views/business/user/index.vue @@ -96,7 +96,11 @@ - + + + diff --git a/server/MiAssessment/src/MiAssessment.Admin/appsettings.json b/server/MiAssessment/src/MiAssessment.Admin/appsettings.json index 838b480..9c5a6fe 100644 --- a/server/MiAssessment/src/MiAssessment.Admin/appsettings.json +++ b/server/MiAssessment/src/MiAssessment.Admin/appsettings.json @@ -18,7 +18,7 @@ } }, "SiteSettings": { - "ApiBaseUrl": "https://api.nxt.shhmkjgs.cn" + "ApiBaseUrl": "http://localhost:5238" }, "AllowedHosts": "*", "Serilog": { diff --git a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/BrainTypes.cshtml b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/BrainTypes.cshtml index 8fac90b..97fca28 100644 --- a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/BrainTypes.cshtml +++ b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/BrainTypes.cshtml @@ -98,19 +98,26 @@ else var meta = chart.getDatasetMeta(0); var dataset = chart.data.datasets[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'; meta.data.forEach(function(arc, i) { var pct = (dataset.data[i] / total * 100).toFixed(2) + '%'; var name = chart.data.labels[i]; var angle = (arc.startAngle + arc.endAngle) / 2; - var r = (arc.outerRadius + arc.innerRadius) / 2; - var x = arc.x + Math.cos(angle) * (arc.outerRadius + 30); - var y = arc.y + Math.sin(angle) * (arc.outerRadius + 30); + var labelR = arc.outerRadius + 18; + var x = arc.x + Math.cos(angle) * labelR; + 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.textAlign = 'center'; - ctx.fillText(name, x, y - 8); - ctx.fillText(pct, x, y + 8); + ctx.fillText(name, x, y - 7); + ctx.fillText(pct, x, y + 7); }); } }; @@ -133,7 +140,7 @@ else plugins: { legend: { display: false } }, - layout: { padding: 40 } + layout: { padding: { top: 44, bottom: 44, left: 50, right: 50 } } }, plugins: [donutLabelPlugin] }); diff --git a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/Disclaimer.cshtml b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/Disclaimer.cshtml index 1b81859..2e8f7fa 100644 --- a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/Disclaimer.cshtml +++ b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/Disclaimer.cshtml @@ -17,11 +17,7 @@ - - + @section Styles { diff --git a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/StrongerIntelligence.cshtml b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/StrongerIntelligence.cshtml index 20697ac..2a70015 100644 --- a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/StrongerIntelligence.cshtml +++ b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/StrongerIntelligence.cshtml @@ -17,7 +17,7 @@ else
- @Model.LevelName@(MiAssessment.Api.Pages.Report.StrongerIntelligenceModel.GetStarChinese(Model.StarLevel))星 + @Model.LevelName@(MiAssessment.Api.Pages.Report.StrongerIntelligenceModel.GetStarChinese(Model.StarLevel))智能
@@ -26,14 +26,7 @@ else @Model.LevelName—@Model.IntelligenceName
- @for (var i = 0; i < Model.StarLevel; i++) - { - - } - @for (var i = Model.StarLevel; i < 5; i++) - { - - } +
diff --git a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/StrongerIntelligence.cshtml.cs b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/StrongerIntelligence.cshtml.cs index a061bf3..56efeac 100644 --- a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/StrongerIntelligence.cshtml.cs +++ b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/StrongerIntelligence.cshtml.cs @@ -85,11 +85,11 @@ public class StrongerIntelligenceModel : ReportPageModelBase /// public static string GetStarChinese(int starLevel) => starLevel switch { - 5 => "五", - 4 => "四", - 3 => "三", - 2 => "二", - 1 => "一", + // 5 => "五", + // 4 => "四", + // 3 => "三", + // 2 => "二", + // 1 => "一", _ => "" }; } diff --git a/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/brain-types.css b/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/brain-types.css index b1d52c8..7e98bb7 100644 --- a/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/brain-types.css +++ b/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/brain-types.css @@ -33,7 +33,7 @@ } .bt-panel-donut { - flex: 0.9; + flex: 1; } .bt-chart-title {