From 593f13ca155b78f940f360c6fae5cdcb93f35804 Mon Sep 17 00:00:00 2001 From: zpc Date: Mon, 16 Mar 2026 01:01:38 +0800 Subject: [PATCH] 312 --- docs/报告页面开发清单.md | 4 +- .../Pages/Report/LearningTypes.cshtml | 244 ++++++++++++++++- .../Pages/Report/LearningTypes.cshtml.cs | 115 +++++++- .../Pages/Report/SubAbilityDetail.cshtml | 253 +++++++++++++++++ .../Pages/Report/SubAbilityDetail.cshtml.cs | 193 +++++++++++++ .../Pages/Report/SubAbilityDetailV.cshtml | 254 ++++++++++++++++++ .../Pages/Report/SubAbilityDetailV.cshtml.cs | 16 ++ .../wwwroot/css/pages/learning-types.css | 107 ++++++++ .../wwwroot/css/pages/sub-ability-detail.css | 115 ++++++++ 9 files changed, 1294 insertions(+), 7 deletions(-) create mode 100644 server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetail.cshtml create mode 100644 server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetail.cshtml.cs create mode 100644 server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetailV.cshtml create mode 100644 server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetailV.cshtml.cs create mode 100644 server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/learning-types.css create mode 100644 server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/sub-ability-detail.css diff --git a/docs/报告页面开发清单.md b/docs/报告页面开发清单.md index 44cbe7b..46d2e3e 100644 --- a/docs/报告页面开发清单.md +++ b/docs/报告页面开发清单.md @@ -13,7 +13,9 @@ | 7 | 个人特质分析 | `/report/personality-traits` | 网页截图 | CategoryType=2 结果+结论 | ⬜ 骨架 | | 8 | 40项细分能力分析 | `/report/sub-abilities?recordId=3` | 网页截图 | CategoryType=3 雷达图(40项分数) | ✅ 已完成 | | 8.1 | 细分能力排序TOP10 | `/report/sub-abilities-ranking?recordId=3` | 网页截图 | CategoryType=3 最强/偏弱TOP10柱状图+排名 | ✅ 已完成 | -| 9 | 先天学习类型分析 | `/report/learning-types` | 网页截图 | CategoryType=4 结果+结论 | ⬜ 骨架 | +| 8.2 | 细分能力精准分析(×8) | `/report/sub-ability-detail?recordId=3&parentId=1` | 网页截图 | 单智能5项子能力雷达图+柱状图+结论 | ✅ 已完成 | +| 8.3 | 细分能力精准分析-竖向柱状图(×8) | `/report/sub-ability-detail-v?recordId=3&parentId=8` | 网页截图 | 单智能5项子能力雷达图+竖向柱状图+结论 | ✅ 已完成 | +| 9 | 先天学习类型分析 | `/report/learning-types?recordId=3` | 网页截图 | CategoryType=4 雷达图+竖向柱状图(多色)+结论 | ✅ 已完成 | | 10 | 学习关键能力分析 | `/report/learning-abilities` | 网页截图 | CategoryType=5 结果+结论 | ⬜ 骨架 | | 11 | 科学大脑类型分析 | `/report/brain-types` | 网页截图 | CategoryType=6 结果+结论 | ⬜ 骨架 | | 12 | 性格类型分析 | `/report/character-types` | 网页截图 | CategoryType=7 结果+结论 | ⬜ 骨架 | diff --git a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/LearningTypes.cshtml b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/LearningTypes.cshtml index 2fa7456..43ea1e3 100644 --- a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/LearningTypes.cshtml +++ b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/LearningTypes.cshtml @@ -1,8 +1,9 @@ @page "/report/learning-types" @model MiAssessment.Api.Pages.Report.LearningTypesModel @{ - ViewData["Title"] = "先天学习类型分析"; - ViewData["PageTitle"] = "先天学习类型分析"; + ViewData["Title"] = "先天学习类型"; + ViewData["PageTitle"] = null; + ViewData["PageNumber"] = null; } @if (!Model.IsSuccess) @@ -13,7 +14,242 @@ } else { -
-

先天学习类型分析占位 - 具体内容后续实现

+
+ +
4、先天学习类型
+ + +
+ +
+
先天学习类型
+ +
+ + +
+
先天学习类型排名
+ +
+
+ + +
+ +
+
最强能力解读
+
+ @if (Model.StrongestConclusion != null) + { + 【@Model.StrongestName】 + @Html.Raw(Model.StrongestConclusion.Content?.Replace("\n", "
") ?? "暂无结论") + } + else + { + 暂无结论数据 + } +
+
+ + +
+
较弱能力解读
+
+ @if (Model.WeakestConclusion != null) + { + @Html.Raw(Model.WeakestConclusion.Content?.Replace("\n", "
") ?? "暂无结论") + } + else + { + 暂无结论数据 + } +
+
+
} + +@section Styles { + +} + +@section Scripts { + + +} diff --git a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/LearningTypes.cshtml.cs b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/LearningTypes.cshtml.cs index e0df603..961b2d7 100644 --- a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/LearningTypes.cshtml.cs +++ b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/LearningTypes.cshtml.cs @@ -1,14 +1,125 @@ +using Microsoft.EntityFrameworkCore; using MiAssessment.Core.Interfaces; +using MiAssessment.Model.Data; +using MiAssessment.Model.Models.Report; namespace MiAssessment.Api.Pages.Report; /// -/// 先天学习类型分析 PageModel +/// 先天学习类型分析页 PageModel +/// 路由:/report/learning-types?recordId=3 +/// CategoryType=4 的5种学习类型:视觉型、思考型、全脑型、体察型、听觉型 /// public class LearningTypesModel : ReportPageModelBase { - public LearningTypesModel(IReportDataService reportDataService) + /// + /// 学习类型列表(按 CategoryId 排序,雷达图用) + /// + public List Items { get; set; } = new(); + + /// + /// 按分数降序排列(柱状图用) + /// + public List ItemsByScore { get; set; } = new(); + + /// + /// 平均分 + /// + public decimal AverageScore { get; set; } + + /// + /// 最强类型名称 + /// + public string StrongestName { get; set; } = ""; + + /// + /// 最强类型结论 + /// + public ConclusionDataDto? StrongestConclusion { get; set; } + + /// + /// 较弱类型名称 + /// + public string WeakestName { get; set; } = ""; + + /// + /// 较弱类型结论 + /// + public ConclusionDataDto? WeakestConclusion { get; set; } + + private readonly MiAssessmentDbContext _dbContext; + + public LearningTypesModel(IReportDataService reportDataService, MiAssessmentDbContext dbContext) : base(reportDataService) { + _dbContext = dbContext; + } + + protected override async Task OnDataLoadedAsync() + { + if (ReportData?.ResultsByType == null || + !ReportData.ResultsByType.TryGetValue(4, out var allItems)) + { + ErrorMessage = "缺少先天学习类型数据"; + return; + } + + Items = allItems.OrderBy(x => x.CategoryId).ToList(); + + if (Items.Count == 0) + { + ErrorMessage = "未找到先天学习类型数据"; + return; + } + + ItemsByScore = Items.OrderByDescending(x => x.Score).ToList(); + AverageScore = Math.Round(Items.Average(x => x.Score), 1); + + // 最强类型结论 + var strongest = ItemsByScore.First(); + StrongestName = strongest.CategoryName; + if (ReportData.ConclusionsByCategory.TryGetValue(strongest.CategoryId, out var sc)) + { + StrongestConclusion = sc; + } + else + { + StrongestConclusion = await GetTemplateConclusionAsync(strongest.CategoryId, 1); + } + + // 较弱类型结论 + var weakest = ItemsByScore.Last(); + WeakestName = weakest.CategoryName; + if (ReportData.ConclusionsByCategory.TryGetValue(weakest.CategoryId, out var wc)) + { + WeakestConclusion = wc; + } + else + { + WeakestConclusion = await GetTemplateConclusionAsync(weakest.CategoryId, 4); + } + } + + /// + /// 从 report_conclusions 模板表查询结论(fallback) + /// + private async Task GetTemplateConclusionAsync(long categoryId, int conclusionType) + { + var template = await _dbContext.ReportConclusions + .AsNoTracking() + .FirstOrDefaultAsync(t => + t.CategoryId == categoryId && + t.ConclusionType == conclusionType && + !t.IsDeleted); + + if (template == null) return null; + + return new ConclusionDataDto + { + CategoryId = template.CategoryId, + ConclusionType = template.ConclusionType, + Title = template.Title, + Content = template.Content + }; } } diff --git a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetail.cshtml b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetail.cshtml new file mode 100644 index 0000000..a2ddbb8 --- /dev/null +++ b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetail.cshtml @@ -0,0 +1,253 @@ +@page "/report/sub-ability-detail" +@model MiAssessment.Api.Pages.Report.SubAbilityDetailModel +@{ + ViewData["Title"] = "细分能力精准分析"; + ViewData["PageTitle"] = null; + ViewData["PageNumber"] = null; +} + +@if (!Model.IsSuccess) +{ +
+

@Model.ErrorMessage

+
+} +else +{ +
+ +
3.@(Model.SectionIndex)、个人40项细分能力精准分析
+ + +
+ +
+
@(Model.ParentName)能力分析
+ +
+ + +
+
@(Model.ParentName)能力分析排序
+ +
+
+ + +
+ +
+
最强能力解读
+
@Model.StrongestName
+
+ @if (Model.StrongestConclusion != null) + { + @Html.Raw(Model.StrongestConclusion.Content?.Replace("\n", "
") ?? "暂无结论") + } + else + { + 暂无结论数据 + } +
+
+ + +
+
较弱能力解读
+
@Model.WeakestName
+
+ @if (Model.WeakestConclusion != null) + { + @Html.Raw(Model.WeakestConclusion.Content?.Replace("\n", "
") ?? "暂无结论") + } + else + { + 暂无结论数据 + } +
+
+
+
+} + +@section Styles { + +} + +@section Scripts { + + +} diff --git a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetail.cshtml.cs b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetail.cshtml.cs new file mode 100644 index 0000000..bbfd967 --- /dev/null +++ b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetail.cshtml.cs @@ -0,0 +1,193 @@ +using Microsoft.EntityFrameworkCore; +using MiAssessment.Core.Interfaces; +using MiAssessment.Model.Data; +using MiAssessment.Model.Models.Report; + +namespace MiAssessment.Api.Pages.Report; + +/// +/// 40项细分能力精准分析页 PageModel +/// 按父分类(八大智能)展示该智能下5项子能力的雷达图、柱状图和结论 +/// 路由:/report/sub-ability-detail?recordId=3&parentId=1 +/// +public class SubAbilityDetailModel : ReportPageModelBase +{ + /// + /// 父分类ID(八大智能之一),从 query string 绑定 + /// + [Microsoft.AspNetCore.Mvc.BindProperty(SupportsGet = true, Name = "parentId")] + public long ParentId { get; set; } + + /// + /// 父分类名称(如"语言智能") + /// + public string ParentName { get; set; } = ""; + + /// + /// 该智能下的子能力列表(按 CategoryId 排序) + /// + public List SubItems { get; set; } = new(); + + /// + /// 按分数降序排列(用于柱状图) + /// + public List SubItemsByScore { get; set; } = new(); + + /// + /// 平均分 + /// + public decimal AverageScore { get; set; } + + /// + /// 最强能力结论(ConclusionType=1 或 2,取分数最高的) + /// + public ConclusionDataDto? StrongestConclusion { get; set; } + + /// + /// 最强能力名称 + /// + public string StrongestName { get; set; } = ""; + + /// + /// 较弱能力结论(ConclusionType=3 或 4,取分数最低的) + /// + public ConclusionDataDto? WeakestConclusion { get; set; } + + /// + /// 较弱能力名称 + /// + public string WeakestName { get; set; } = ""; + + /// + /// 序号(1-8,用于标题显示) + /// + public int SectionIndex { get; set; } + + /// + /// 统计图主色(根据 parentId 不同) + /// + public string ChartColor { get; set; } = "#4A90E2"; + + /// + /// 统计图主色透明版 + /// + public string ChartColorAlpha { get; set; } = "rgba(74, 144, 226, 0.6)"; + + private readonly MiAssessmentDbContext _dbContext; + + public SubAbilityDetailModel(IReportDataService reportDataService, MiAssessmentDbContext dbContext) + : base(reportDataService) + { + _dbContext = dbContext; + } + + protected override async Task OnDataLoadedAsync() + { + if (ParentId <= 0) + { + ErrorMessage = "缺少父分类参数"; + return; + } + + if (ReportData?.ResultsByType == null || + !ReportData.ResultsByType.TryGetValue(3, out var allItems)) + { + ErrorMessage = "缺少细分能力数据"; + return; + } + + // 筛选该父分类下的子能力 + SubItems = allItems + .Where(x => x.ParentId == ParentId) + .OrderBy(x => x.CategoryId) + .ToList(); + + if (SubItems.Count == 0) + { + ErrorMessage = $"未找到父分类 {ParentId} 的子能力数据"; + return; + } + + // 按分数降序(柱状图用) + SubItemsByScore = SubItems.OrderByDescending(x => x.Score).ToList(); + + // 平均分 + AverageScore = Math.Round(SubItems.Average(x => x.Score), 1); + + // 父分类名称 — 从 CategoryType=1 的结果中查找 + if (ReportData.ResultsByType.TryGetValue(1, out var type1Items)) + { + var parent = type1Items.FirstOrDefault(x => x.CategoryId == ParentId); + if (parent != null) + { + ParentName = parent.CategoryName; + } + } + + // 序号 + SectionIndex = (int)ParentId; + + // 按智能类型设置统计图配色 + (ChartColor, ChartColorAlpha) = ParentId switch + { + 1 => ("#4A90E2", "rgba(74, 144, 226, 0.6)"), // 语言 - 蓝色 + 2 => ("#2ABFBF", "rgba(42, 191, 191, 0.6)"), // 逻辑数学 - 青色 + 3 => ("#87CEEB", "rgba(135, 206, 235, 0.6)"), // 音乐 - 天蓝色 + 4 => ("#E88B9C", "rgba(232, 139, 156, 0.6)"), // 自然探索 - 粉色 + 5 => ("#52A06A", "rgba(82, 160, 106, 0.6)"), // 人际交往(社交) - 绿色 + 6 => ("#F5A623", "rgba(245, 166, 35, 0.6)"), // 自我察觉 - 黄色 + 7 => ("#E8913A", "rgba(232, 145, 58, 0.6)"), // 视觉空间 - 橙色 + 8 => ("#4A90E2", "rgba(74, 144, 226, 0.6)"), // 肢体运动 - 蓝色 + _ => ("#4A90E2", "rgba(74, 144, 226, 0.6)") + }; + + // 最强能力结论(分数最高的子能力) + var strongest = SubItemsByScore.First(); + StrongestName = strongest.CategoryName; + if (ReportData.ConclusionsByCategory.TryGetValue(strongest.CategoryId, out var sc)) + { + StrongestConclusion = sc; + } + else + { + // 从模板表查 ConclusionType=1(最强)的结论 + StrongestConclusion = await GetTemplateConclusionAsync(strongest.CategoryId, 1); + } + + // 较弱能力结论(分数最低的子能力) + var weakest = SubItemsByScore.Last(); + WeakestName = weakest.CategoryName; + if (ReportData.ConclusionsByCategory.TryGetValue(weakest.CategoryId, out var wc)) + { + WeakestConclusion = wc; + } + else + { + // 从模板表查 ConclusionType=4(最弱)的结论 + WeakestConclusion = await GetTemplateConclusionAsync(weakest.CategoryId, 4); + } + } + + /// + /// 从 report_conclusions 模板表查询结论(fallback) + /// + private async Task GetTemplateConclusionAsync(long categoryId, int conclusionType) + { + var template = await _dbContext.ReportConclusions + .AsNoTracking() + .FirstOrDefaultAsync(t => + t.CategoryId == categoryId && + t.ConclusionType == conclusionType && + !t.IsDeleted); + + if (template == null) return null; + + return new ConclusionDataDto + { + CategoryId = template.CategoryId, + ConclusionType = template.ConclusionType, + Title = template.Title, + Content = template.Content + }; + } +} diff --git a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetailV.cshtml b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetailV.cshtml new file mode 100644 index 0000000..57b9ccc --- /dev/null +++ b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetailV.cshtml @@ -0,0 +1,254 @@ +@page "/report/sub-ability-detail-v" +@model MiAssessment.Api.Pages.Report.SubAbilityDetailVModel +@{ + ViewData["Title"] = "细分能力精准分析"; + ViewData["PageTitle"] = null; + ViewData["PageNumber"] = null; +} + +@if (!Model.IsSuccess) +{ +
+

@Model.ErrorMessage

+
+} +else +{ +
+ +
3.@(Model.SectionIndex)、个人40项细分能力精准分析
+ + +
+ +
+
@(Model.ParentName)能力分析
+ +
+ + +
+
@(Model.ParentName)能力分析排序
+ +
+
+ + +
+ +
+
最强能力解读
+
@Model.StrongestName
+
+ @if (Model.StrongestConclusion != null) + { + @Html.Raw(Model.StrongestConclusion.Content?.Replace("\n", "
") ?? "暂无结论") + } + else + { + 暂无结论数据 + } +
+
+ + +
+
较弱能力解读
+
@Model.WeakestName
+
+ @if (Model.WeakestConclusion != null) + { + @Html.Raw(Model.WeakestConclusion.Content?.Replace("\n", "
") ?? "暂无结论") + } + else + { + 暂无结论数据 + } +
+
+
+
+} + +@section Styles { + +} + +@section Scripts { + + +} diff --git a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetailV.cshtml.cs b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetailV.cshtml.cs new file mode 100644 index 0000000..bc63637 --- /dev/null +++ b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/SubAbilityDetailV.cshtml.cs @@ -0,0 +1,16 @@ +using MiAssessment.Core.Interfaces; +using MiAssessment.Model.Data; + +namespace MiAssessment.Api.Pages.Report; + +/// +/// 40项细分能力精准分析页(竖向柱状图版本) +/// 路由:/report/sub-ability-detail-v?recordId=3&parentId=8 +/// +public class SubAbilityDetailVModel : SubAbilityDetailModel +{ + public SubAbilityDetailVModel(IReportDataService reportDataService, MiAssessmentDbContext dbContext) + : base(reportDataService, dbContext) + { + } +} diff --git a/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/learning-types.css b/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/learning-types.css new file mode 100644 index 0000000..b9a12bf --- /dev/null +++ b/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/learning-types.css @@ -0,0 +1,107 @@ +/* ============================================ + 先天学习类型分析页 + 页面固定尺寸:1309×926px + report-page padding: 40px 50px → 可用 1209×846px + ============================================ */ + +.lt-page { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + gap: 20px; +} + +/* 板块标题 */ +.lt-section-title { + font-size: 22px; + font-weight: 700; + color: #E67E73; +} + +/* ---- 上半部分:雷达图 + 柱状图并排 ---- */ +.lt-charts { + display: flex; + gap: 40px; + align-items: flex-start; +} + +.lt-chart-panel { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; +} + +/* 图表小标题 */ +.lt-chart-title { + font-size: 18px; + font-weight: 700; + color: #E67E73; + margin-bottom: 8px; + text-align: center; +} + +/* ---- 下半部分:结论卡片并排 ---- */ +.lt-conclusions { + display: flex; + gap: 40px; + flex: 1; + min-height: 0; +} + +.lt-conclusion-card { + flex: 1; + border: 3px solid; + border-radius: 12px; + padding: 34px 24px 18px; + position: relative; + display: flex; + flex-direction: column; +} + +.lt-card-strong { + border-color: #E67E73; + background: #FFF5F5; +} + +.lt-card-weak { + border-color: #999999; + background: #F8F8F8; +} + +/* 结论标签 badge */ +.lt-badge { + position: absolute; + top: 0px; + left: 50%; + transform: translateX(-50%) translateY(-1px); + padding: 5px 28px; + border-radius: 0 0 8px 8px; + font-size: 17px; + font-weight: 700; + color: #fff; + white-space: nowrap; + letter-spacing: 2px; +} + +.lt-badge-strong { + background: #C0392B; +} + +.lt-badge-weak { + background: #999999; +} + +/* 结论内容 */ +.lt-conclusion-content { + font-size: 13px; + line-height: 1.8; + color: var(--text-secondary); + font-weight: 600; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 8; + -webkit-box-orient: vertical; +} diff --git a/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/sub-ability-detail.css b/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/sub-ability-detail.css new file mode 100644 index 0000000..ac40f17 --- /dev/null +++ b/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/sub-ability-detail.css @@ -0,0 +1,115 @@ +/* ============================================ + 40项细分能力精准分析 - 单智能详情页 + 页面固定尺寸:1309×926px + report-page padding: 40px 50px → 可用 1209×846px + ============================================ */ + +.sad-page { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + gap: 20px; +} + +/* 板块标题 */ +.sad-section-title { + font-size: 22px; + font-weight: 700; + color: var(--text-color); +} + +/* ---- 上半部分:雷达图 + 柱状图并排 ---- */ +.sad-charts { + display: flex; + gap: 40px; + align-items: flex-start; +} + +.sad-chart-panel { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; +} + +/* 图表小标题(颜色由 inline style 控制) */ +.sad-chart-title { + font-size: 18px; + font-weight: 700; + margin-bottom: 8px; + text-align: center; +} + +/* ---- 下半部分:结论卡片并排 ---- */ +.sad-conclusions { + display: flex; + gap: 40px; + flex: 1; + min-height: 0; +} + +.sad-conclusion-card { + flex: 1; + border: 3px solid; + border-radius: 12px; + padding: 34px 24px 18px; + position: relative; + display: flex; + flex-direction: column; +} + +.sad-card-strong { + border-color: #E67E73; + background: #FFF5F5; +} + +.sad-card-weak { + border-color: #999999; + background: #F8F8F8; +} + +/* 结论标签 badge(实底背景) */ +.sad-badge { + position: absolute; + top: 0px; + left: 50%; + transform: translateX(-50%) translateY(-1px); + padding: 5px 28px; + border-radius: 0 0 8px 8px; + font-size: 17px; + font-weight: 700; + color: #fff; + white-space: nowrap; + letter-spacing: 2px; +} + +.sad-badge-strong { + background: #C0392B; +} + +.sad-badge-weak { + background: #999999; +} + +/* 结论能力名称 */ +.sad-ability-name { + font-size: 15px; + font-weight: 600; + color: var(--text-color); + margin-bottom: 6px; + text-align: center; +} + +/* 结论内容 */ +.sad-conclusion-content { + font-size: 13px; + line-height: 1.8; + color: var(--text-secondary); + font-weight: 600; + overflow: hidden; + text-overflow: ellipsis; + display: -webkit-box; + -webkit-line-clamp: 8; + -webkit-box-orient: vertical; +}