diff --git a/src/components/task/Avatar.jsx b/src/components/task/Avatar.jsx
new file mode 100644
index 0000000..8575fcd
--- /dev/null
+++ b/src/components/task/Avatar.jsx
@@ -0,0 +1,22 @@
+// 负责人头像: 姓氏首字 + 按名字稳定的底色; 未指派灰色圆点
+const COLORS = ['#1677ff', '#00b578', '#ff8f1f', '#a855f7', '#14b8a6', '#f43f9e', '#5a6a80']
+
+export default function Avatar({ name, size = 18 }) {
+ const seed = [...(name || '')].reduce((a, ch) => a + ch.charCodeAt(0), 0)
+ const color = COLORS[seed % COLORS.length]
+ return (
+
+ {name ? name.slice(0, 1) : '·'}
+
+ )
+}
diff --git a/src/components/task/TaskCard.jsx b/src/components/task/TaskCard.jsx
index 37f1a9c..e2aff52 100644
--- a/src/components/task/TaskCard.jsx
+++ b/src/components/task/TaskCard.jsx
@@ -1,4 +1,5 @@
import StatusDot from './StatusDot.jsx'
+import Avatar from './Avatar.jsx'
import { kindColor } from '../../pages/task/kind.js'
// 看板卡片 (T-UI-02): 轻量化
@@ -50,9 +51,7 @@ export default function TaskCard({
{task.kind}
)}
-
- {task.assignee?.name || '未指派'}
-
+
{task.members?.length > 0 && (
+ {task.members.map((m) => m.name).join('、')}
)}
diff --git a/src/components/task/TaskRow.jsx b/src/components/task/TaskRow.jsx
index 8fcd006..2d4c0d8 100644
--- a/src/components/task/TaskRow.jsx
+++ b/src/components/task/TaskRow.jsx
@@ -1,4 +1,5 @@
import StatusDot from './StatusDot.jsx'
+import Avatar from './Avatar.jsx'
import { kindColor } from '../../pages/task/kind.js'
const statusLabel = (s) => (s === 'done' ? '完成' : s === 'doing' ? '执行中' : '未开始')
@@ -65,9 +66,7 @@ export default function TaskRow({
onClick={(e) => { e.stopPropagation(); onMore?.(task) }}
onPointerDown={(e) => e.stopPropagation()}
>⋯
-
- {task.assignee?.name || '未指派'}
-
+
>
)}