# 产品需求文档 (PRD):TierMaster 动态内容分级系统
| 文档版本 | 修改日期 | 修改人 | 修改内容 |
| :--- | :--- | :--- | :--- |
| V1.0 | 2024-05-XX | PM | 初始版本:包含核心拖拽、动态配置、导入导出功能 |
---
## 1. 项目概述 (Overview)
### 1.1 项目背景
在当前的互联网语境下,用户热衷于对各类事物(游戏角色、消费品、社会现象等)进行主观分级(如:T0/T1、人上人/下水道)。现有的分级工具大多模板固定,无法满足“梗”文化的快速更迭(如“夯”、“拉完了”等自定义标签),且缺乏高度的视觉定制能力和数据复用能力。
### 1.2 项目目标
构建一个 **Web端动态内容分级工具**。
* **高度可配置**:用户可自定义分级层级数量、名称、颜色。
* **极致交互**:支持流畅的拖拽排序、跨层级移动。
* **数据便携**:支持配置数据的导入导出(JSON),支持生成图片分享。
* **视觉美感**:具备沉浸式体验,能够自适应展示内容。
### 1.3 适用平台
* Web 端(PC 浏览器为主,兼容移动端查看与简单操作)。
---
## 2. 用户流程图 (User Flow)
```text
进入页面
-> [默认加载初始模板(S/A/B/C)]
-> 用户上传图片/输入文字 (进入待分类池)
-> 用户调整分级设置 (增删改层级、改色)
-> 拖拽物品进行分类/排序
-> 导出图片 (分享)
-> 导出配置 (JSON保存)
```
---
## 3. 功能详情 (Functional Requirements)
### 3.1 模块一:分级层级管理 (Tier Management)
支持用户对“容器”进行完全自定义。
| 功能点 | 详细描述 | 交互/逻辑说明 |
| :--- | :--- | :--- |
| **动态添加层级** | 支持在列表底部追加新的分级行。 | 点击底部大按钮 `[+ 添加分级]`。新增行默认使用随机预设颜色,名称默认为“新分级”。 |
| **层级排序** | 支持上下拖动调整层级顺序。 | 每行左侧/右侧设有**拖拽手柄**,拖动可交换整行位置。 |
| **层级配置** | 修改层级的名称和背景色。 | 点击层级左侧标签区域,弹出 **Popover配置面板**:
1. 输入框修改名称(如“顶尖”)。
2. 颜色选择器(预设色板+自定义Hex)。 |
| **删除层级** | 删除不再需要的层级。 | 在配置面板中点击 `[删除]`。
**兜底逻辑**:若该层级内有物品,**必须**将所有物品自动移动到“待分类池”,不可直接删除物品。 |
| **清空层级** | 快速移除某一层级的所有物品。 | 在配置面板中点击 `[清空内容]`,物品全部返回池子。 |
### 3.2 模块二:物品管理与待分类池 (Item & Pool)
待分类池是物品的“暂存区”。
| 功能点 | 详细描述 | 交互/逻辑说明 |
| :--- | :--- | :--- |
| **待分类池展示** | 页面底部固定的区域,存放未分类物品。 | 采用 **Sticky Footer (吸底)** 设计,确保页面滚动时该区域始终可见。支持折叠/展开。 |
| **添加物品** | 支持上传图片或添加纯文本。 | 1. **图片上传**:支持批量选择本地图片,自动裁剪为正方形。
2. **文本添加**:输入文字生成卡片。 |
| **删除物品** | 移除不需要的物品。 | 选中物品或右键点击,选择删除。 |
### 3.3 模块三:核心交互 (Interaction)
本项目的核心体验。
| 功能点 | 详细描述 | 交互/逻辑说明 |
| :--- | :--- | :--- |
| **跨域拖拽** | 物品可以在“池子”与“层级”之间、以及“层级”与“层级”之间自由移动。 | 拖拽过程中,目标区域高亮提示(Drop Zone Highlight)。 |
| **行内排序** | 同一层级内的物品可以左右拖动调整顺序。 | 拖动时其他物品自动让位(利用 `Flip` 动画算法)。 |
| **视觉反馈** | 拖拽时的动态效果。 | 1. **抓起 (DragStart)**:卡片放大 1.05倍,阴影加深。
2. **放下 (Drop)**:卡片带有弹簧回弹动画。 |
### 3.4 模块四:数据与持久化 (Data & I/O)
满足复用与分享需求。
| 功能点 | 详细描述 | 交互/逻辑说明 |
| :--- | :--- | :--- |
| **导出配置 (JSON)** | 将当前的分级定义和物品位置保存为文件。 | 点击 `[导出配置]`,浏览器下载 `.json` 文件。包含 `tiers` 结构和 `items` 数据。 |
| **导入配置 (JSON)** | 读取本地文件还原现场。 | 点击 `[导入配置]`,选择文件。解析成功后,**立即重绘**页面所有状态。 |
| **生成图片** | 将当前的分级榜单保存为图片。 | 点击 `[保存图片]`。利用 `html2canvas` 截图,**注意**:需包含完整的长列表,忽略底部的操作栏。 |
---
## 4. 界面与视觉规范 (UI/UX Specifications)
### 4.1 整体风格
* **主题**:**深色模式 (Dark Mode)** 为主。背景色推荐 `#121212` 或深灰色。
* **配色**:层级标签颜色需高饱和度,内容区域保持低调,确保内容突出。
### 4.2 布局结构
* **Header**:Logo、标题、工具栏(导入/导出/保存)。
* **Main Body**:垂直排列的分级行(Tier Rows)。
* *左侧*:标签块(Label),固定宽度,垂直居中文字。
* *右侧*:内容容器(Container),Flex 布局,自动换行。
* **Footer (Sticky)**:待分类池(Unranked Pool),横向排列,支持横向滚动。
### 4.3 响应式设计
* **PC端**:完整展示。
* **移动端**:
* 层级标签显示简化(如仅显示首字母或缩窄宽度)。
* 待分类池默认为折叠状态,点击通过“抽屉 (Bottom Sheet)”浮层弹出。
---
## 5. 数据结构定义 (JSON Schema)
开发需严格遵守此结构,以保证导入导出的兼容性。
```json
{
"meta": {
"appName": "TierMaster",
"version": "1.0",
"title": "2024互联网热词分级",
"createdAt": 1715000000
},
"config": {
"tiers": [
{
"id": "uuid-001",
"label": "顶尖",
"color": "#FF7F7F"
// 顺序由数组索引决定
},
{
"id": "uuid-002",
"label": "夯",
"color": "#FFBF7F"
}
]
},
"items": [
{
"id": "item-001",
"type": "image", // or 'text'
"content": "https://base64-or-url...", // 图片地址或文本内容
"tierId": "uuid-001" // 关联到具体的层级ID
},
{
"id": "item-002",
"type": "text",
"content": "疯狂星期四",
"tierId": "pool" // 特殊ID,代表在待分类池
}
]
}
```
---
## 6. 技术栈推荐 (Technical Stack)
为了实现上述的高交互需求,推荐以下技术选型:
* **前端框架**: React (更推荐) 或 Vue 3。
* **拖拽引擎**:
* React: **@dnd-kit/core** (搭配 `@dnd-kit/sortable`) —— *性能最佳,定制性最强。*
* Vue: **vue-draggable-plus** (基于 Sortablejs)。
* **样式库**: Tailwind CSS (快速构建布局和配色)。
* **状态管理**: Zustand (React) 或 Pinia (Vue)。
* **工具库**:
* `uuid`: 生成唯一ID。
* `html2canvas`: 截图生成功能。
* `file-saver`: 处理文件下载。
---
## 7. 异常处理与边缘情况 (Edge Cases)
1. **图片加载失败**:显示默认占位符图标。
2. **层级过多**:当层级超过 20 个,颜色循环使用预设色板。
3. **JSON 格式错误**:导入时若 JSON 校验失败,弹窗提示“文件格式已损坏”,不覆盖当前页面。
4. **空行截图**:生成图片时,即便某一行是空的,也应当保留该行展示(除非用户在截图设置中选择“隐藏空行”)。
---
## 8. 验收标准 (Acceptance Criteria)
1. 用户能否顺利创建一个包含 10 个层级、50 个物品的榜单?
2. 删除一个包含物品的层级时,物品是否自动回到了底部池子?
3. 导出的 JSON 文件能否在另一台电脑的浏览器中完美还原?
4. 生成的图片是否清晰,且没有被滚动条遮挡?
5. 在手机浏览器上能否完成基本的拖拽操作?