intelligent-leads-dashboard.canvas.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import React from "react";
  2. type Metric = {
  3. label: string;
  4. value: string;
  5. sub: string;
  6. };
  7. type TaskCard = {
  8. name: string;
  9. region: string;
  10. completed: number;
  11. assigned: number;
  12. converted: number;
  13. progress: number;
  14. due: string;
  15. source: string;
  16. };
  17. const metrics: Metric[] = [
  18. { label: "已发现线索", value: "1,286", sub: "较昨日 +6.2%" },
  19. { label: "已生成客户", value: "372", sub: "客户转化率 28.9%" },
  20. { label: "高意向客户", value: "94", sub: "7日提升 +14" },
  21. { label: "运行中任务", value: "5", sub: "2 个高优先级" },
  22. { label: "平均触达成本", value: "¥18.7", sub: "较上周 -9.4%" },
  23. ];
  24. const tasks: TaskCard[] = [
  25. {
  26. name: "中东SSD寻客",
  27. region: "中东 · 区域渠道",
  28. completed: 168,
  29. assigned: 840,
  30. converted: 26,
  31. progress: 65,
  32. due: "2026-03-18 20:00",
  33. source: "LinkedIn",
  34. },
  35. {
  36. name: "欧洲企业级存储",
  37. region: "欧洲 · 企业分销",
  38. completed: 93,
  39. assigned: 520,
  40. converted: 14,
  41. progress: 43,
  42. due: "2026-03-17 14:00",
  43. source: "Google Leads",
  44. },
  45. {
  46. name: "东南亚分销商",
  47. region: "东南亚 · 行业扩展",
  48. completed: 47,
  49. assigned: 310,
  50. converted: 9,
  51. progress: 29,
  52. due: "2026-03-18 18:00",
  53. source: "Alibaba",
  54. },
  55. ];
  56. const styles = {
  57. page: {
  58. background: "#0B1220",
  59. color: "#D7E1F6",
  60. minHeight: "100vh",
  61. padding: 20,
  62. fontFamily: "Inter, PingFang SC, Microsoft YaHei, sans-serif",
  63. },
  64. sectionTitle: { fontSize: 16, fontWeight: 700, margin: "8px 0 12px 0" },
  65. cardGrid: { display: "grid", gridTemplateColumns: "repeat(5, 1fr)", gap: 12 },
  66. metricCard: {
  67. background: "#111B32",
  68. border: "1px solid #253458",
  69. borderRadius: 12,
  70. padding: 14,
  71. },
  72. value: { fontSize: 24, fontWeight: 800, color: "#F4F7FF", margin: "6px 0" },
  73. sub: { color: "#8CA0C9", fontSize: 12 },
  74. board: { display: "grid", gridTemplateColumns: "repeat(3, 1fr)", gap: 12, marginTop: 12 },
  75. taskCard: {
  76. background: "#111B32",
  77. border: "1px solid #253458",
  78. borderRadius: 12,
  79. padding: 14,
  80. },
  81. progressBg: {
  82. height: 8,
  83. borderRadius: 999,
  84. background: "#1B2745",
  85. overflow: "hidden",
  86. marginTop: 8,
  87. },
  88. progressBar: (p: number) => ({
  89. width: `${p}%`,
  90. height: "100%",
  91. background: "linear-gradient(90deg,#6A5CFF,#5AA3FF)",
  92. }),
  93. chip: {
  94. display: "inline-block",
  95. border: "1px solid #33508A",
  96. color: "#8FB1FF",
  97. borderRadius: 999,
  98. padding: "2px 8px",
  99. fontSize: 11,
  100. marginTop: 8,
  101. },
  102. };
  103. export default function IntelligentLeadsDashboardCanvas() {
  104. return (
  105. <div style={styles.page}>
  106. <div style={styles.sectionTitle}>智能寻客 - 经营总览</div>
  107. <div style={styles.cardGrid}>
  108. {metrics.map((m) => (
  109. <div key={m.label} style={styles.metricCard}>
  110. <div style={{ color: "#9AB0DA", fontSize: 12 }}>{m.label}</div>
  111. <div style={styles.value}>{m.value}</div>
  112. <div style={styles.sub}>{m.sub}</div>
  113. </div>
  114. ))}
  115. </div>
  116. <div style={{ ...styles.sectionTitle, marginTop: 18 }}>进行中的任务</div>
  117. <div style={styles.board}>
  118. {tasks.map((t) => (
  119. <div key={t.name} style={styles.taskCard}>
  120. <div style={{ fontSize: 15, fontWeight: 700, color: "#F0F4FF" }}>{t.name}</div>
  121. <div style={{ color: "#8CA0C9", fontSize: 12, marginTop: 4 }}>{t.region}</div>
  122. <div style={{ display: "flex", gap: 14, marginTop: 12, fontSize: 12 }}>
  123. <span>已采集 {t.completed}</span>
  124. <span>已分配 {t.assigned}</span>
  125. <span>已转化 {t.converted}</span>
  126. </div>
  127. <div style={styles.progressBg}>
  128. <div style={styles.progressBar(t.progress)} />
  129. </div>
  130. <div style={{ display: "flex", justifyContent: "space-between", marginTop: 8, fontSize: 12, color: "#8CA0C9" }}>
  131. <span>进度 {t.progress}%</span>
  132. <span>截止 {t.due}</span>
  133. </div>
  134. <span style={styles.chip}>来源: {t.source}</span>
  135. </div>
  136. ))}
  137. </div>
  138. </div>
  139. );
  140. }