性格类型排名
@@ -79,14 +76,12 @@ else
var labels = [@Html.Raw(string.Join(",", Model.Items.Select(x => $"\"{x.CategoryName}\"")))];
var scores = [@Html.Raw(string.Join(",", Model.Items.Select(x => x.Score.ToString("F0"))))];
- var totalScore = @Model.TotalScore.ToString("F0");
var maxScore = Math.ceil(Math.max(...scores) / 2) * 2 + 2;
var barLabels = [@Html.Raw(string.Join(",", Model.ItemsByScore.Select(x => $"\"{x.CategoryName}\"")))];
var barScores = [@Html.Raw(string.Join(",", Model.ItemsByScore.Select(x => x.Score.ToString("F0"))))];
var barMax = Math.ceil(Math.max(...barScores) / 2) * 2 + 2;
- // 5种颜色
var colors = ['#4A90E2', '#52A06A', '#F5A623', '#E88B9C', '#2ABFBF'];
var colorsAlpha = ['rgba(74,144,226,0.7)', 'rgba(82,160,106,0.7)', 'rgba(245,166,35,0.7)', 'rgba(232,139,156,0.7)', 'rgba(42,191,191,0.7)'];
@@ -117,23 +112,8 @@ else
var ctxDonut = document.getElementById('donutChart').getContext('2d');
new Chart(ctxDonut, {
type: 'doughnut',
- data: {
- labels: labels,
- datasets: [{
- data: scores,
- backgroundColor: colors,
- borderWidth: 2,
- borderColor: '#fff'
- }]
- },
- options: {
- responsive: false,
- cutout: '50%',
- plugins: {
- legend: { display: false }
- },
- layout: { padding: 40 }
- },
+ data: { labels: labels, datasets: [{ data: scores, backgroundColor: colors, borderWidth: 2, borderColor: '#fff' }] },
+ options: { responsive: false, cutout: '50%', plugins: { legend: { display: false } }, layout: { padding: 40 } },
plugins: [donutLabelPlugin]
});
@@ -142,93 +122,19 @@ else
var ctxRadar = document.getElementById('radarChart').getContext('2d');
new Chart(ctxRadar, {
type: 'radar',
- data: {
- labels: labels,
- datasets: [{
- data: scores,
- backgroundColor: 'rgba(232,139,156,0.12)',
- borderColor: 'rgba(232,139,156,0.8)',
- borderWidth: 2,
- pointBackgroundColor: 'rgba(232,139,156,0.9)',
- pointBorderColor: '#fff',
- pointRadius: 4,
- pointBorderWidth: 1
- }]
- },
- options: {
- responsive: false,
- plugins: { legend: { display: false } },
- scales: {
- r: {
- beginAtZero: true,
- max: maxScore,
- ticks: { stepSize: 2, font: { size: 10 }, backdropColor: 'transparent', color: '#999' },
- pointLabels: { font: { size: 12, weight: '500' }, color: '#333', padding: 8 },
- grid: { color: 'rgba(0,0,0,0.06)' },
- angleLines: { color: 'rgba(0,0,0,0.06)' }
- }
- }
- },
- plugins: [{
- afterDatasetsDraw: function(chart) {
- var meta = chart.getDatasetMeta(0);
- var ctx2 = chart.ctx;
- ctx2.font = 'bold 11px sans-serif';
- ctx2.fillStyle = radarColor;
- ctx2.textBaseline = 'middle';
- meta.data.forEach(function(point, i) {
- var val = scores[i];
- var cx = chart.scales.r.xCenter;
- var cy = chart.scales.r.yCenter;
- var dx = point.x - cx, dy = point.y - cy;
- var dist = Math.sqrt(dx*dx+dy*dy) || 1;
- ctx2.textAlign = 'center';
- ctx2.fillText(val, point.x + (dx/dist)*14, point.y + (dy/dist)*14);
- });
- }
- }]
+ data: { labels: labels, datasets: [{ data: scores, backgroundColor: 'rgba(232,139,156,0.12)', borderColor: 'rgba(232,139,156,0.8)', borderWidth: 2, pointBackgroundColor: 'rgba(232,139,156,0.9)', pointBorderColor: '#fff', pointRadius: 4, pointBorderWidth: 1 }] },
+ options: { responsive: false, plugins: { legend: { display: false } }, scales: { r: { beginAtZero: true, max: maxScore, ticks: { stepSize: 2, font: { size: 10 }, backdropColor: 'transparent', color: '#999' }, pointLabels: { font: { size: 12, weight: '500' }, color: '#333', padding: 8 }, grid: { color: 'rgba(0,0,0,0.06)' }, angleLines: { color: 'rgba(0,0,0,0.06)' } } } },
+ plugins: [{ afterDatasetsDraw: function(chart) { var meta = chart.getDatasetMeta(0); var ctx2 = chart.ctx; ctx2.font = 'bold 11px sans-serif'; ctx2.fillStyle = radarColor; ctx2.textBaseline = 'middle'; meta.data.forEach(function(point, i) { var val = scores[i]; var cx = chart.scales.r.xCenter; var cy = chart.scales.r.yCenter; var dx = point.x - cx, dy = point.y - cy; var dist = Math.sqrt(dx*dx+dy*dy) || 1; ctx2.textAlign = 'center'; ctx2.fillText(val, point.x + (dx/dist)*14, point.y + (dy/dist)*14); }); } }]
});
// ---- 竖向柱状图 ----
- var barDataLabelPlugin = {
- id: 'barDataLabels',
- afterDatasetsDraw: function(chart) {
- var ctx = chart.ctx;
- var meta = chart.getDatasetMeta(0);
- var dataset = chart.data.datasets[0];
- ctx.font = 'bold 12px "Microsoft YaHei", sans-serif';
- ctx.textAlign = 'center';
- ctx.textBaseline = 'bottom';
- meta.data.forEach(function(bar, i) {
- ctx.fillStyle = '#333';
- ctx.fillText(dataset.data[i], bar.x, bar.y - 4);
- });
- }
- };
+ var barDataLabelPlugin = { id: 'barDataLabels', afterDatasetsDraw: function(chart) { var ctx = chart.ctx; var meta = chart.getDatasetMeta(0); var dataset = chart.data.datasets[0]; ctx.font = 'bold 12px "Microsoft YaHei", sans-serif'; ctx.textAlign = 'center'; ctx.textBaseline = 'bottom'; meta.data.forEach(function(bar, i) { ctx.fillStyle = '#333'; ctx.fillText(dataset.data[i], bar.x, bar.y - 4); }); } };
var ctxBar = document.getElementById('barChart').getContext('2d');
new Chart(ctxBar, {
type: 'bar',
- data: {
- labels: barLabels,
- datasets: [{
- data: barScores,
- backgroundColor: colorsAlpha,
- borderColor: colors,
- borderWidth: 0,
- borderRadius: 3,
- barThickness: 40
- }]
- },
- options: {
- responsive: false,
- plugins: { legend: { display: false } },
- scales: {
- y: { beginAtZero: true, max: barMax, ticks: { stepSize: 2, font: { size: 10 }, color: '#999' }, grid: { color: 'rgba(0,0,0,0.05)' } },
- x: { ticks: { font: { size: 11 }, color: '#666' }, grid: { display: false } }
- },
- layout: { padding: { top: 20 } }
- },
+ data: { labels: barLabels, datasets: [{ data: barScores, backgroundColor: colorsAlpha, borderColor: colors, borderWidth: 0, borderRadius: 3, barThickness: 40 }] },
+ options: { responsive: false, plugins: { legend: { display: false } }, scales: { y: { beginAtZero: true, max: barMax, ticks: { stepSize: 2, font: { size: 10 }, color: '#999' }, grid: { color: 'rgba(0,0,0,0.05)' } }, x: { ticks: { font: { size: 11 }, color: '#666' }, grid: { display: false } } }, layout: { padding: { top: 20 } } },
plugins: [barDataLabelPlugin]
});
diff --git a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/CharacterTypes.cshtml.cs b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/CharacterTypes.cshtml.cs
index 3f78ee1..4c1d5ee 100644
--- a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/CharacterTypes.cshtml.cs
+++ b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/CharacterTypes.cshtml.cs
@@ -6,7 +6,7 @@ using MiAssessment.Model.Models.Report;
namespace MiAssessment.Api.Pages.Report;
///
-/// 性格类型分析页 PageModel
+/// 性格类型分析页 PageModel(三图+结论卡片版)
/// 路由:/report/character-types?recordId=3
/// CategoryType=7:孔雀(表达型)、老虎(支配型)、猫头鹰(精准型)、变色龙(整合型)、考拉(耐心型)
///
diff --git a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/CharacterTypesChart.cshtml b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/CharacterTypesChart.cshtml
new file mode 100644
index 0000000..62fdc60
--- /dev/null
+++ b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/CharacterTypesChart.cshtml
@@ -0,0 +1,152 @@
+@page "/report/character-types-chart"
+@model MiAssessment.Api.Pages.Report.CharacterTypesChartModel
+@{
+ ViewData["Title"] = "性格类型";
+ ViewData["PageTitle"] = null;
+ ViewData["PageNumber"] = null;
+}
+
+@if (!Model.IsSuccess)
+{
+
+}
+else
+{
+
+}
+
+@section Styles {
+
+}
+
+@section Scripts {
+
+
+}
diff --git a/server/MiAssessment/src/MiAssessment.Api/Pages/Report/CharacterTypesChart.cshtml.cs b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/CharacterTypesChart.cshtml.cs
new file mode 100644
index 0000000..303b2c5
--- /dev/null
+++ b/server/MiAssessment/src/MiAssessment.Api/Pages/Report/CharacterTypesChart.cshtml.cs
@@ -0,0 +1,48 @@
+using MiAssessment.Core.Interfaces;
+using MiAssessment.Model.Data;
+using MiAssessment.Model.Models.Report;
+
+namespace MiAssessment.Api.Pages.Report;
+
+///
+/// 性格类型分析-图表页 PageModel(雷达图+横向柱状图,无结论卡片)
+/// 路由:/report/character-types-chart?recordId=3
+/// CategoryType=7
+///
+public class CharacterTypesChartModel : ReportPageModelBase
+{
+ ///
+ /// 按 CategoryId 排序(雷达图用)
+ ///
+ public List
Items { get; set; } = new();
+
+ ///
+ /// 按分数降序(柱状图用)
+ ///
+ public List ItemsByScore { get; set; } = new();
+
+ public CharacterTypesChartModel(IReportDataService reportDataService)
+ : base(reportDataService)
+ {
+ }
+
+ protected override Task OnDataLoadedAsync()
+ {
+ if (ReportData?.ResultsByType == null ||
+ !ReportData.ResultsByType.TryGetValue(7, out var allItems))
+ {
+ ErrorMessage = "缺少性格类型数据";
+ return Task.CompletedTask;
+ }
+
+ Items = allItems.OrderBy(x => x.CategoryId).ToList();
+ if (Items.Count == 0)
+ {
+ ErrorMessage = "未找到性格类型数据";
+ return Task.CompletedTask;
+ }
+
+ ItemsByScore = Items.OrderByDescending(x => x.Score).ToList();
+ return Task.CompletedTask;
+ }
+}
diff --git a/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/character-types-chart.css b/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/character-types-chart.css
new file mode 100644
index 0000000..3d1a75b
--- /dev/null
+++ b/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/character-types-chart.css
@@ -0,0 +1,40 @@
+/* ============================================
+ 性格类型-图表页(雷达图+横向柱状图)
+ 页面固定尺寸:1309×926px
+ ============================================ */
+
+.ctc-page {
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+ height: 100%;
+ gap: 12px;
+}
+
+.ctc-section-title {
+ font-size: 22px;
+ font-weight: 700;
+ color: #E67E73;
+}
+
+.ctc-charts {
+ display: flex;
+ gap: 20px;
+ flex: 1;
+ align-items: flex-start;
+}
+
+.ctc-chart-panel {
+ flex: 1;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.ctc-chart-title {
+ font-size: 16px;
+ font-weight: 700;
+ color: #E67E73;
+ margin-bottom: 4px;
+ text-align: center;
+}
diff --git a/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/character-types.css b/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/character-types.css
index d906b2e..a74867c 100644
--- a/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/character-types.css
+++ b/server/MiAssessment/src/MiAssessment.Api/wwwroot/css/pages/character-types.css
@@ -1,7 +1,6 @@
/* ============================================
- 性格类型分析页
+ 性格类型分析页(三图+结论卡片版)
页面固定尺寸:1309×926px
- 三图(环形+雷达+柱状)+ 两结论卡片
============================================ */
.ct-page {
@@ -18,7 +17,6 @@
color: #E67E73;
}
-/* ---- 上半部分:三图并排 ---- */
.ct-charts {
display: flex;
gap: 20px;
@@ -32,9 +30,7 @@
align-items: center;
}
-.ct-panel-donut {
- flex: 0.9;
-}
+.ct-panel-donut { flex: 0.9; }
.ct-chart-title {
font-size: 16px;
@@ -44,7 +40,6 @@
text-align: center;
}
-/* ---- 下半部分:结论卡片 ---- */
.ct-conclusions {
display: flex;
gap: 30px;
@@ -68,8 +63,8 @@
}
.ct-card-weak {
- border-color: #999999;
- background: #F8F8F8;
+ border-color: #E67E73;
+ background: #FFF5F5;
}
.ct-badge {
@@ -87,7 +82,7 @@
}
.ct-badge-strong { background: #C0392B; }
-.ct-badge-weak { background: #999999; }
+.ct-badge-weak { background: #C0392B; }
.ct-conclusion-content {
font-size: 13px;