# 成果发布模块优化 — 设计方案

> 所属端：超管端
> 状态：已实现（待验收）
> 创建日期：2026-03-27
> 最后更新：2026-03-27

---

## 1. 背景与问题

成果发布是活动全生命周期的最后一环，超管需要监控"哪些活动发布了成果、哪些还没有"。当前模块保留两层结构合理（第一层看活动维度的发布状态，第二层看获奖名单），但存在以下问题：

| 问题 | 说明 |
|------|------|
| 第一层有冗余的个人/团队 Tab | 成果发布不需要按参与方式分 Tab，发布状态是活动级别的 |
| 缺少统计概览 | 没有已发布/未发布的数量统计 |
| 写操作未隔离 | 详情页有"发布成果/撤回发布"按钮，超管不应有 |
| 搜索能力不足 | 只有活动名称，缺少发布状态筛选 |
| 样式不一致 | 主色 `#1890ff` |

---

## 2. 现状分析

### 2.1 第一层：成果发布列表（results/Index.vue）

- 个人/团队 Tab（冗余）
- 数据来源：`contestsApi.getList()` 按活动类型过滤
- 搜索：仅活动名称
- 表格列：序号/活动名称/主办机构/报名人数/提交作品数/发布状态/操作
- 操作：详情 → 跳转 Detail

### 2.2 第二层：成果详情（results/Detail.vue）

- 数据来源：`resultsApi.getResults(contestId)`
- 搜索：作品编号/报名账号
- 表格列：序号/作品编号/评委评分/姓名/账号/机构信息/指导老师
- 写操作："发布成果"/"撤回发布"按钮

---

## 3. 设计方案

### 3.1 整体思路

保留两层结构（活动维度 → 获奖名单），但优化超管视角：第一层去掉 Tab + 增加统计卡片 + 增加发布状态筛选，第二层隐藏写操作。机构端保持不变。

### 3.2 第一层优化

```
┌─ 标题卡片 ──────────────────────────────────────────────┐
│  成果发布                                                │
└─────────────────────────────────────────────────────────┘

┌─ 统计卡片 ──────────────────────────────────────────────┐
│ [全部 12] [已发布 8] [未发布 4]                           │
└─────────────────────────────────────────────────────────┘

┌─ 筛选栏 ────────────────────────────────────────────────┐
│ 活动名称:[______] 发布状态:[下拉] 主办机构:[下拉]         │
│                                     [搜索] [重置]        │
└─────────────────────────────────────────────────────────┘

┌─ 数据表格 ──────────────────────────────────────────────┐
│ 活动名称 | 主办机构 | 活动类型 | 报名人数 | 作品数 |      │
│ 发布状态 | 发布时间 | 操作                               │
└─────────────────────────────────────────────────────────┘
```

**统计卡片**（3 张）：

| 卡片 | 数据 | 颜色 |
|------|------|------|
| 全部 | 所有已发布状态的活动数 | 主色 |
| 已发布 | resultState='published' | 绿色 |
| 未发布 | resultState!='published' | 灰色 |

统计基于 contests 列表的 resultState 在前端计算即可，无需新增后端接口。

**筛选栏**：

| 筛选项 | 组件 | 说明 |
|--------|------|------|
| 活动名称 | Input | 模糊搜索 |
| 发布状态 | Select | 已发布 / 未发布 |
| 主办机构 | Select | 下拉搜索，复用租户列表 |

**表格列**（超管端）：

| 列 | 宽度 | 说明 |
|----|------|------|
| 序号 | 60 | |
| 活动名称 | 200 | |
| 主办机构 | 120 | creatorTenant.name |
| 活动类型 | 90 | Tag 个人/团队 |
| 报名人数 | 80 | _count.registrations |
| 作品数 | 80 | _count.works |
| 发布状态 | 90 | Tag 已发布（绿）/ 未发布（灰）|
| 发布时间 | 150 | resultPublishTime，未发布显示"-" |
| 操作 | 100 | 查看详情 |

去掉个人/团队 Tab，所有活动放在一个列表中。

### 3.3 第二层优化

超管进入成果详情页时：
- **隐藏"发布成果/撤回发布"按钮**（通过 isSuperAdmin 判断）
- 其他保持不变（获奖列表 + 搜索 + 作品详情弹框）
- 样式修复为 `#6366f1`

### 3.4 后端改动

无新增接口。现有 `contestsApi.getList()` 返回的数据已包含 `resultState` 和 `resultPublishTime`。

---

## 4. 前端改动

| 文件 | 操作 | 说明 |
|------|------|------|
| `frontend/src/views/contests/results/Index.vue` | 修改 | 超管端去掉 Tab + 增加统计卡片 + 发布状态/机构筛选 + 优化表格列 + 样式修复 |
| `frontend/src/views/contests/results/Detail.vue` | 修改 | 超管端隐藏"发布/撤回"按钮 + 样式修复 |

---

## 5. 实施记录

### 2026-03-27 — 首次实现

**后端改动：无**

**前端改动（2 个文件）：**
- `frontend/src/views/contests/results/Index.vue` — 超管端去掉个人/团队 Tab，改为统计卡片（全部/已发布/未发布）+ 发布状态和机构筛选 + 优化表格列（增加活动类型、发布时间），机构端保持不变；样式修复为 #6366f1
- `frontend/src/views/contests/results/Detail.vue` — 超管端隐藏"发布成果/撤回发布"按钮（v-if="!isSuperAdmin"）；样式修复为 #6366f1
