636 lines
25 KiB
Markdown
636 lines
25 KiB
Markdown
# Sub-Store 前端功能规划文档
|
||
|
||
> 基于原项目 `ref/sub-store-cloudflare/frontend` 的交互分析,规划 Go 重构版前端。
|
||
> 核心原则:**上下布局,PC 优先**,弃用移动端 swipe/popup/floating-button 交互模式。
|
||
|
||
---
|
||
|
||
## 1. 原前端交互痛点分析
|
||
|
||
### 1.1 移动端优先的架构问题
|
||
|
||
| 痛点 | 原项目实现 | PC 上的问题 |
|
||
|------|-----------|-------------|
|
||
| **Swipe 手势操作** | `SubListItem` 用 `nut-swipe` 左/右滑动暴露 复制/下载/删除 按钮 | 桌面端无触屏,swipe 不触发,操作隐藏在不可见区域 |
|
||
| **底部 TabBar** | `TabBar.vue` 3 个 tab 固定底部,768px+ 才切换为侧边栏 | PC 上侧边栏是浮动定位 (`position: fixed`),非真正双栏布局 |
|
||
| **底部 Popup 弹窗** | 添加订阅、模板编辑、目标选择均用 `nut-popup position="bottom"` | 占满下半屏,PC 上极不协调,无法利用横向空间 |
|
||
| **浮动按钮** | `nut-drag` 可拖拽的刷新/添加按钮,固定在屏幕边缘 | PC 上浮动按钮遮挡内容,拖拽行为多余 |
|
||
| **单列滚动列表** | 源和集合在同一个页面上下排列,tag 筛选条横排 | PC 宽屏下大量留白,列表项信息密度低 |
|
||
| **编辑器 Tab 横滚** | SubEditor 的 display/content/actions 三个 tab 横向排列 | PC 上应该用左右分栏或垂直 Tab |
|
||
| **SubEditor 巨型组件** | 单文件 2174 行,混合 source/collection 两种编辑逻辑 | 维护困难,状态管理混乱 |
|
||
| **全屏预览覆盖** | Preview.vue 用 `position: fixed; inset: 0` 全屏覆盖 | PC 上应该是侧面板或分栏,不离开当前上下文 |
|
||
| **无键盘快捷键** | 所有操作只能点击 | PC 用户期望 Ctrl+S 保存、Esc 关闭等 |
|
||
| **无右键菜单** | 操作按钮散落在列表项内部 | PC 用户期望右键弹出操作菜单 |
|
||
| **Tools 页面粗糙** | 转换器/分享/回收站堆在一个页面,原生 HTML 控件 | 功能孤立,与主流程割裂 |
|
||
|
||
### 1.2 信息架构问题
|
||
|
||
- 源 (Source) 和集合 (Collection) 混在同一列表,靠标题区分,概念不清
|
||
- 模板管理藏在 "My" 设置页,与集合编辑中的模板选择脱节
|
||
- 分享 (Share) 和回收站 (Recycle Bin) 被丢进 Tools 工具页,而非关联到对应资源
|
||
- 预览/对比需要跳路由或弹全屏,丢失列表上下文
|
||
- 下载链接生成操作分散:列表项有复制链接,编辑页有链接生成,Tools 有分享创建
|
||
|
||
---
|
||
|
||
## 2. 整体布局设计:上下布局
|
||
|
||
```
|
||
┌──────────────────────────────────────────────────────────────────┐
|
||
│ TopBar (h: 48px) │
|
||
│ [Logo] Sub-Store [搜索框] [刷新] [主题] [语言] [设置] │
|
||
├──────────────────────────────────────────────────────────────────┤
|
||
│ NavBar (h: 40px) │
|
||
│ [订阅源] [集合] [模板] [工具] [回收站] [+ 新建 ▾] │
|
||
├──────────────────────────────────────────────────────────────────┤
|
||
│ │
|
||
│ Main Content Area (flex: 1, overflow: auto) │
|
||
│ │
|
||
│ ┌──────────────────────┐ ┌──────────────────────────────────┐ │
|
||
│ │ Left Panel │ │ Right Panel / Detail │ │
|
||
│ │ (列表区, 固定宽度) │ │ (编辑/预览/详情, flex: 1) │ │
|
||
│ │ w: 360px │ │ │ │
|
||
│ │ │ │ │ │
|
||
│ │ [搜索] [筛选 tag] │ │ │ │
|
||
│ │ ┌─────────────────┐ │ │ │ │
|
||
│ │ │ Source/Col Card │ │ │ │ │
|
||
│ │ ├─────────────────┤ │ │ │ │
|
||
│ │ │ Source/Col Card │ │ │ │ │
|
||
│ │ ├─────────────────┤ │ │ │ │
|
||
│ │ │ ... │ │ │ │ │
|
||
│ │ └─────────────────┘ │ │ │ │
|
||
│ └──────────────────────┘ └──────────────────────────────────┘ │
|
||
│ │
|
||
├──────────────────────────────────────────────────────────────────┤
|
||
│ StatusBar (h: 28px, 可选) │
|
||
│ ● 已连接 · 12 源 · 3 集合 · v1.0.0 [最后同步: 2分钟前] │
|
||
└──────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
### 2.1 布局规则
|
||
|
||
- **TopBar**: 始终固定顶部,包含全局搜索、全局操作(刷新/主题/语言/设置)
|
||
- **NavBar**: 水平标签栏,切换主功能区域,当前页高亮
|
||
- **Main Content**: 根据当前 Tab 显示不同内容,内部可左右分栏
|
||
- **StatusBar**: 底部状态栏,显示连接状态/数据统计/同步时间(可选关闭)
|
||
- **最小宽度**: 1024px(PC 优先),窄屏降级为单列+抽屉
|
||
|
||
### 2.2 响应式策略
|
||
|
||
| 宽度 | 布局 | 说明 |
|
||
|------|------|------|
|
||
| ≥1280px | 双栏 (列表+详情) | 详情区常驻右侧 |
|
||
| 1024-1279px | 双栏 (列表+详情) | 列表区缩窄至 320px |
|
||
| 768-1023px | 单栏 + 右抽屉 | 详情从右侧滑入抽屉 |
|
||
| <768px | 单栏 + 全屏推入 | 详情全屏推入(移动端兼容) |
|
||
|
||
---
|
||
|
||
## 3. 功能模块规划
|
||
|
||
### 3.1 订阅源管理 (Sources)
|
||
|
||
#### 3.1.1 源列表 (Left Panel)
|
||
|
||
**功能点**:
|
||
- 卡片式列表,每张卡片显示:名称、类型徽章 (remote/local)、启用开关、流量摘要、标签
|
||
- 顶部工具栏:搜索框(实时过滤名称/URL)、标签筛选条、排序按钮
|
||
- 列表项右键菜单:编辑、复制链接、预览、克隆、删除、创建分享
|
||
- 拖拽排序(HTML5 drag API,非 vuedraggable touch 模式)
|
||
- 选中状态:单击选中(高亮),双击打开编辑
|
||
- 多选:Ctrl+Click 多选,批量启用/禁用/删除/导出
|
||
- 列表底部:显示总数和已加载数
|
||
|
||
**卡片信息层次**:
|
||
```
|
||
┌──────────────────────────────────────┐
|
||
│ [●] 机场A [remote] │
|
||
│ https://example.com/sub... [⚡] │
|
||
│ ↑ 12.3GB ↓ 89.7GB / 100GB │
|
||
│ [HK] [JP] [⋮] │
|
||
└──────────────────────────────────────┘
|
||
```
|
||
|
||
#### 3.1.2 源编辑 (Right Panel / Drawer)
|
||
|
||
**布局**: 垂直分区,非 Tab 切换
|
||
|
||
**区域 1 - 基本信息**:
|
||
- ID(创建后只读)、显示名、备注、标签(逗号分隔或 chip 输入)
|
||
- 图标 URL、图标彩色开关
|
||
|
||
**区域 2 - 数据源**:
|
||
- 类型切换:Remote / Local(radio button 横排)
|
||
- Remote: URL 文本域(支持多行多 URL)、UA 输入、passThrough UA 开关、subUserinfo 输入
|
||
- Local: 全屏代码编辑器按钮 + 文件导入按钮 + 内容验证按钮 + CodeMirror 编辑器(内嵌)
|
||
|
||
**区域 3 - 节点处理** (Filter Pipeline):
|
||
- 可视化流水线编辑器,每个 filter 是一个可折叠卡片
|
||
- 拖拽排序 filter 执行顺序
|
||
- 每个 filter 类型有专属配置表单:
|
||
- **Region Filter**: 复选框组 (HK/JP/SG/US/UK/DE/KR/TW),keep/exclude 开关
|
||
- **Type Filter**: 复选框组 (ss/vmess/vless/trojan/...),keep/exclude 开关
|
||
- **Regex Filter**: 正则输入框(支持多个),keep/exclude 开关,字段选择
|
||
- **Regex Rename**: 表格式输入 (表达式 → 替换为)
|
||
- **Regex Delete**: 正则输入框(支持多个),字段选择
|
||
- **Regex Sort**: 优先级正则列表 + 方向选择
|
||
- **Handle Duplicate**: 去重字段选择、动作 (delete/rename)、后缀模板、连接符、位置
|
||
- **Sort**: 方向选择 (asc/desc/random)
|
||
- **Flag Operator**: 模式 (add/remove)、台湾旗配置
|
||
- **Quick Setting**: UDP/TFO/scert/useless/vmess-aead 下拉选择
|
||
- **Resolve Domain**: DNS provider 选择、记录类型、过滤模式、自定义 URL、EDNS、并发数
|
||
- **Script**: 脚本选择下拉(从注册表加载)、参数表单(根据 metadata.parameters 动态生成)
|
||
- 新增 filter 按钮 → 下拉菜单选择类型
|
||
- 每个 filter 可启用/禁用(开关)、删除(按钮)
|
||
|
||
**区域 4 - 操作栏** (底部固定):
|
||
- [预览] [对比] [保存] [另存为]
|
||
- Ctrl+S 快捷键保存
|
||
|
||
#### 3.1.3 源预览
|
||
|
||
**功能**: 调用 `/api/preview/source` 显示原始节点 vs 处理后节点
|
||
|
||
**布局**: 右侧面板内的分栏视图
|
||
- 左栏:原始节点列表(可搜索、可排序)
|
||
- 右栏:处理后节点列表
|
||
- 顶部:节点数量统计 (原始 N → 处理后 M, 跳过 K)
|
||
- 每个节点显示:名称、类型、服务器:端口、协议详情
|
||
- 支持展开节点查看完整字段
|
||
|
||
#### 3.1.4 源下载链接
|
||
|
||
**功能**: 生成各目标的下载链接
|
||
|
||
**交互**: 点击列表项的"复制链接"按钮 → 弹出链接面板(右侧抽屉或 popover)
|
||
- 目标选择:13 种目标客户端(下拉或 grid 按钮)
|
||
- 链接显示:只读文本框 + 复制按钮
|
||
- 二维码生成(可选)
|
||
- 临时覆盖选项:URL/content/UA 输入框(展开式高级选项)
|
||
|
||
---
|
||
|
||
### 3.2 集合管理 (Collections)
|
||
|
||
#### 3.2.1 集合列表 (Left Panel)
|
||
|
||
**与源列表同结构**,但卡片额外显示:
|
||
- 包含的源数量/名称摘要
|
||
- 关联的模板名
|
||
- ignoreFailed 状态徽章
|
||
|
||
#### 3.2.2 集合编辑 (Right Panel / Drawer)
|
||
|
||
**区域 1 - 基本信息**: 同源编辑
|
||
|
||
**区域 2 - 集合配置**:
|
||
- 模板选择:下拉选择(内置 6 套 + 自定义),旁边"管理模板"链接
|
||
- 源选择器:双栏穿梭框 (Transfer) 布局
|
||
- 左栏:所有可用源(可搜索、可按 tag 筛选)
|
||
- 右栏:已选源(可拖拽排序)
|
||
- 全选/反选/清空按钮
|
||
- 空选择 = 包含所有 enabled 源(需明确提示)
|
||
- ignoreFailed 切换:下拉选择 (跳过失败源 / 全部要求成功)
|
||
|
||
**区域 3 - 节点处理**: 同源编辑的 Filter Pipeline(集合级 filter)
|
||
|
||
**区域 4 - 操作栏**: 同源编辑
|
||
|
||
#### 3.2.3 集合预览
|
||
|
||
**功能**: 调用 `/api/preview/collection`,显示合并后的节点
|
||
|
||
**布局**: 同源预览,但显示多源合并信息
|
||
- 额外显示:各源的节点数量、失败源列表
|
||
- 可按来源分组显示
|
||
|
||
---
|
||
|
||
### 3.3 模板管理 (Templates)
|
||
|
||
**独立 Tab 页**,非隐藏在设置中。
|
||
|
||
#### 3.3.1 模板列表
|
||
|
||
- 表格布局:名称、目标客户端、类型 (内置/自定义)、操作
|
||
- 内置模板:只读,可查看不可编辑/删除
|
||
- 自定义模板:编辑、删除、克隆
|
||
- 新建按钮、从文件导入按钮 (JSON/YAML)
|
||
|
||
#### 3.3.2 模板编辑
|
||
|
||
**布局**: 右侧面板或模态对话框
|
||
|
||
**区域 1 - 元信息**:
|
||
- ID(创建后只读)、名称、目标客户端选择
|
||
|
||
**区域 2 - 配置编辑器**:
|
||
- CodeMirror JSON/YAML 编辑器(全宽)
|
||
- 语法高亮、格式化按钮、校验按钮
|
||
- 可视化预览(可选):解析 proxy-groups 和 rules,以树形图展示
|
||
|
||
**区域 3 - 内置模板预览**:
|
||
- 点击内置模板 → 只读模式显示配置 + 结构说明
|
||
|
||
---
|
||
|
||
### 3.4 工具 (Tools)
|
||
|
||
**独立 Tab 页**,包含三大工具,内部用子 Tab 或卡片分区。
|
||
|
||
#### 3.4.1 格式转换器
|
||
|
||
**功能**: 一次性代理/规则转换 (`/api/proxy/parse`, `/api/rule/parse`)
|
||
|
||
**布局**: 左右分栏
|
||
- 左栏:输入
|
||
- 类型切换:代理转换 / 规则转换
|
||
- 目标选择:下拉
|
||
- 输入文本域(支持粘贴 URI/YAML/JSON)
|
||
- 从文件导入按钮
|
||
- [转换] 按钮
|
||
- 右栏:输出
|
||
- 输出文本域(只读)
|
||
- 统计信息:解析 N / 输出 M / 跳过 K
|
||
- 复制按钮、下载按钮
|
||
|
||
#### 3.4.2 分享管理 (Shares)
|
||
|
||
**功能**: 创建/管理 download grants
|
||
|
||
**布局**: 列表 + 表单
|
||
|
||
**列表区**:
|
||
- 表格:资源类型、资源 ID、目标、过期时间、状态、操作
|
||
- 操作:启用/禁用切换、删除、复制链接
|
||
- 按资源类型筛选
|
||
|
||
**创建表单** (右侧面板或顶部展开):
|
||
- 资源类型:source / collection
|
||
- 资源 ID:下拉选择(从现有数据加载)
|
||
- 目标:下拉(auto 或指定)
|
||
- 过期时间:数字 + 单位(小时/天),或永不过期
|
||
- [创建] → 生成 token + URL,显示并可复制
|
||
|
||
#### 3.4.3 节点信息查询
|
||
|
||
**功能**: 调用 `/api/utils/node-info` 查询 IP 信息
|
||
|
||
**布局**: 简单表单 + 结果卡片
|
||
- 输入:服务器地址
|
||
- 结果:IP、国家、地区、城市、连接信息
|
||
|
||
---
|
||
|
||
### 3.5 回收站 (Recycle Bin)
|
||
|
||
**独立 Tab 页**。
|
||
|
||
**布局**: 表格 + 详情抽屉
|
||
|
||
**列表**:
|
||
- 表格:资源类型、资源 ID、删除时间、操作
|
||
- 操作:恢复、彻底删除
|
||
- 按资源类型筛选
|
||
- 显示总数 / 上限 50 提示
|
||
|
||
**恢复逻辑**:
|
||
- 恢复时检查 ID 冲突(后端已处理,前端需展示友好错误)
|
||
- 恢复成功后刷新对应列表
|
||
|
||
---
|
||
|
||
### 3.6 设置 (Settings)
|
||
|
||
**模态对话框或独立全屏页**,非当前 My.vue 的卡片堆叠。
|
||
|
||
**布局**: 左侧分类菜单 + 右侧设置表单
|
||
|
||
**分类**:
|
||
|
||
#### 3.6.1 请求设置
|
||
- 默认 User-Agent
|
||
- 默认流量 User-Agent
|
||
- 默认超时 (ms)
|
||
- 后端请求并发数
|
||
- 并发等待时间 (ms)
|
||
- 远程缓存 TTL (s)
|
||
- 缓存错误降级开关
|
||
- 节点信息 API URL
|
||
|
||
#### 3.6.2 外观设置
|
||
- 主题选择(8 套主题)
|
||
- 简单模式开关
|
||
- 图标显示开关
|
||
- 图标彩色开关
|
||
- 列表视图模式(单列/双列)
|
||
- 浮动按钮开关(移动端兼容用)
|
||
- 编辑器分组模式
|
||
|
||
#### 3.6.3 数据管理
|
||
- 导出备份(下载 JSON)
|
||
- 导入备份(上传 JSON)
|
||
- Admin Token 设置
|
||
- 下载 Token 显示
|
||
|
||
#### 3.6.4 关于
|
||
- 后端类型、版本、存储引擎
|
||
- GitHub 链接
|
||
- 文档链接
|
||
|
||
---
|
||
|
||
## 4. 全局交互设计
|
||
|
||
### 4.1 键盘快捷键
|
||
|
||
| 快捷键 | 功能 |
|
||
|--------|------|
|
||
| `Ctrl+K` | 聚焦全局搜索 |
|
||
| `Ctrl+N` | 新建(当前 Tab 对应类型) |
|
||
| `Ctrl+S` | 保存当前编辑 |
|
||
| `Ctrl+Shift+S` | 另存为 |
|
||
| `Ctrl+P` | 预览当前选中项 |
|
||
| `Ctrl+D` | 复制下载链接 |
|
||
| `Delete` | 删除选中项(需确认) |
|
||
| `Esc` | 关闭面板/对话框/取消选中 |
|
||
| `↑↓` | 列表中上下移动选中 |
|
||
| `Enter` | 打开选中项编辑 |
|
||
| `Space` | 切换选中项启用/禁用 |
|
||
|
||
### 4.2 右键菜单
|
||
|
||
**列表项右键**:
|
||
- 编辑
|
||
- 预览节点
|
||
- 复制下载链接 ▸ (子菜单:mihomo / sing-box / surge / ...)
|
||
- 创建分享
|
||
- 克隆
|
||
- 导出
|
||
- 删除
|
||
|
||
**空白区域右键**:
|
||
- 新建源
|
||
- 新建集合
|
||
- 粘贴导入
|
||
- 刷新列表
|
||
|
||
### 4.3 拖放操作
|
||
|
||
- **列表内拖拽**: 排序(显示插入位置指示线)
|
||
- **跨列表拖拽**: 源拖入集合(自动添加到集合的 sourceIds)
|
||
- **文件拖入**: 拖入 JSON/YAML 文件 → 导入备份或模板
|
||
|
||
### 4.4 通知系统
|
||
|
||
- **Toast**: 操作成功/失败(右上角,自动消失)
|
||
- **通知中心**: 右上角铃铛图标,记录历史通知
|
||
- **内联状态**: 列表项上的流量加载状态、同步状态
|
||
|
||
### 4.5 确认对话框
|
||
|
||
- 删除操作:模态确认框,显示资源名称
|
||
- 导入覆盖:模态确认框,显示将影响的数据统计
|
||
- 离开未保存编辑:路由守卫拦截,提示保存
|
||
|
||
---
|
||
|
||
## 5. 数据流与状态管理
|
||
|
||
### 5.1 Store 结构(Pinia)
|
||
|
||
```
|
||
stores/
|
||
├── global.ts # 全局状态:环境信息、连接状态、主题
|
||
├── sources.ts # 源列表、CRUD、排序
|
||
├── collections.ts # 集合列表、CRUD、排序
|
||
├── templates.ts # 模板列表、CRUD
|
||
├── shares.ts # 分享列表、CRUD
|
||
├── recycleBin.ts # 回收站列表、恢复/删除
|
||
├── settings.ts # 应用设置
|
||
├── scripts.ts # 脚本注册表元数据
|
||
└── notify.ts # 通知队列
|
||
```
|
||
|
||
### 5.2 API 层
|
||
|
||
保持原项目的 axios 拦截器模式,但简化适配层:
|
||
|
||
```typescript
|
||
// api/client.ts — axios 实例 + 拦截器
|
||
// api/sources.ts — 源 CRUD
|
||
// api/collections.ts — 集合 CRUD
|
||
// api/templates.ts — 模板 CRUD
|
||
// api/shares.ts — 分享 CRUD
|
||
// api/recycle.ts — 回收站
|
||
// api/settings.ts — 设置 + 导出/导入
|
||
// api/tools.ts — 转换器、节点信息
|
||
// api/env.ts — 环境
|
||
```
|
||
|
||
**关键简化**: 原项目的 `api/app/index.ts` (705 行) 包含大量 UI ↔ API 的 filter 格式转换逻辑 (`toApiFilters` / `fromApiFilters` / `toActionMeta`)。重构版应将此逻辑移入编辑器组件的 model 层,API 层只做纯 HTTP 调用。
|
||
|
||
### 5.3 Filter Pipeline 数据模型
|
||
|
||
```typescript
|
||
// 编辑器内部的 UI 模型(与原项目 UiProcess 一致)
|
||
type FilterAction = {
|
||
id: string; // 前端 UUID
|
||
type: ActionType; // 'Region Filter' | 'Type Filter' | ...
|
||
args: Record<string, any>;
|
||
customName?: string;
|
||
disabled: boolean;
|
||
};
|
||
|
||
// 提交到后端时转换为 FilterRule[]
|
||
// 从后端加载时转换为 FilterAction[]
|
||
// 转换逻辑封装在 composables/useFilterTransform.ts
|
||
```
|
||
|
||
---
|
||
|
||
## 6. 技术选型建议
|
||
|
||
### 6.1 框架与 UI 库
|
||
|
||
| 组件 | 原项目 | 重构建议 | 理由 |
|
||
|------|--------|----------|------|
|
||
| 框架 | Vue 3 | Vue 3 | 保持一致 |
|
||
| UI 库 | NutUI (移动端) | Naive UI / PrimeVue | PC 优先,需数据表格/穿梭框/树形组件 |
|
||
| 状态管理 | Pinia | Pinia | 保持一致 |
|
||
| 路由 | Vue Router | Vue Router | 保持一致 |
|
||
| HTTP | Axios | Axios 或 ofetch | 保持 Axios 即可 |
|
||
| 代码编辑器 | CodeMirror 5 | CodeMirror 6 / Monaco | CM6 更现代,Monaco 更强大 |
|
||
| 拖拽 | vuedraggable (SortableJS) | 原生 HTML5 Drag API + vue-draggable-plus | PC 用原生拖拽更可靠 |
|
||
| i18n | vue-i18n | vue-i18n | 保持一致 |
|
||
| 图标 | Font Awesome + NutUI Icon | Lucide / Tabler Icons | 更现代的图标集 |
|
||
| 样式 | SCSS + CSS 变量 | UnoCSS / Tailwind CSS | 原子化 CSS,开发更快 |
|
||
| 主题 | 8 套主题 (SCSS 变量) | CSS 变量 + 暗色模式 | 简化主题系统 |
|
||
|
||
### 6.2 组件库选择考量
|
||
|
||
**Naive UI** (推荐):
|
||
- Vue 3 原生,TypeScript 友好
|
||
- 内置数据表格、穿梭框、树形、抽屉、右键菜单
|
||
- 暗色模式原生支持
|
||
- 中文社区活跃
|
||
|
||
**PrimeVue**:
|
||
- 组件最全(含 CodeMirror 集成)
|
||
- 主题系统强大
|
||
- 但体积较大
|
||
|
||
---
|
||
|
||
## 7. 页面路由规划
|
||
|
||
```
|
||
/ → 重定向到 /sources
|
||
/sources → 订阅源管理(列表 + 右侧详情/编辑)
|
||
/sources/:id → 订阅源管理(选中指定源,右侧显示编辑)
|
||
/collections → 集合管理
|
||
/collections/:id → 集合管理(选中指定集合)
|
||
/templates → 模板管理
|
||
/templates/:id → 模板管理(选中指定模板)
|
||
/tools → 工具(默认显示转换器)
|
||
/tools/converter → 格式转换器
|
||
/tools/shares → 分享管理
|
||
/tools/node-info → 节点信息查询
|
||
/recycle-bin → 回收站
|
||
/settings → 设置(模态对话框,非独立路由)
|
||
/preview/:type/:id → 预览(可选独立路由,用于书签/分享)
|
||
```
|
||
|
||
**路由模式**:
|
||
- 列表+详情使用嵌套路由,详情区为子路由 `<router-view>`
|
||
- 预览使用 query 参数 `?preview=true` 或子路由,避免全屏覆盖
|
||
|
||
---
|
||
|
||
## 8. 功能优先级
|
||
|
||
### P0 — MVP 必须实现
|
||
|
||
1. 上下布局框架(TopBar + NavBar + Main + StatusBar)
|
||
2. 订阅源列表 + 编辑(基本表单 + URL/Content + Filter Pipeline)
|
||
3. 集合列表 + 编辑(源选择器 + 模板选择 + Filter Pipeline)
|
||
4. 源/集合预览(原始 vs 处理后节点对比)
|
||
5. 下载链接生成 + 复制
|
||
6. 模板列表 + 查看(内置只读)
|
||
7. 设置(请求设置 + Admin Token)
|
||
8. 导出/导入备份
|
||
9. 键盘快捷键(Ctrl+S, Ctrl+K, Esc)
|
||
10. 暗色模式
|
||
|
||
### P1 — 增强体验
|
||
|
||
1. 模板创建/编辑(CodeMirror 编辑器)
|
||
2. 分享管理(创建/列表/启停/删除)
|
||
3. 回收站(列表/恢复/彻底删除)
|
||
4. 格式转换器工具
|
||
5. 节点信息查询工具
|
||
6. 右键菜单
|
||
7. 拖拽排序 + 跨列表拖拽
|
||
8. 多选批量操作
|
||
9. 全局搜索(跨类型搜索源/集合/模板)
|
||
|
||
### P2 — 高级功能
|
||
|
||
1. 脚本参数动态表单
|
||
2. 节点信息内联展示(预览中展开节点详情)
|
||
3. 拖入文件导入
|
||
4. 二维码生成
|
||
5. 通知中心
|
||
6. 自定义主题
|
||
7. 移动端响应式降级
|
||
|
||
---
|
||
|
||
## 9. 与后端 API 的对接
|
||
|
||
### 9.1 API 端点映射
|
||
|
||
| 前端功能 | 后端 API | 方法 |
|
||
|----------|----------|------|
|
||
| 源列表 | `/api/sources` | GET |
|
||
| 创建源 | `/api/sources` | POST |
|
||
| 更新源 | `/api/sources/:name` | PATCH |
|
||
| 删除源 | `/api/sources/:name` | DELETE |
|
||
| 排序源 | `/api/sources` (PUT) 或 `/api/sort/sources` (POST) | PUT/POST |
|
||
| 集合列表 | `/api/collections` | GET |
|
||
| 创建集合 | `/api/collections` | POST |
|
||
| 更新集合 | `/api/collections/:name` | PATCH |
|
||
| 删除集合 | `/api/collections/:name` | DELETE |
|
||
| 排序集合 | `/api/collections` (PUT) 或 `/api/sort/collections` (POST) | PUT/POST |
|
||
| 模板列表 | `/api/templates` | GET |
|
||
| 创建模板 | `/api/templates` | POST |
|
||
| 更新模板 | `/api/templates/:name` | PATCH |
|
||
| 删除模板 | `/api/templates/:name` | DELETE |
|
||
| 预览源 | `/api/preview/source` | POST |
|
||
| 预览集合 | `/api/preview/collection` | POST |
|
||
| 下载链接 | `/api/link/source/:name`, `/api/link/collection/:name` | GET |
|
||
| 流量信息 | `/api/source/flow/:name` | GET |
|
||
| 转换器 | `/api/proxy/parse`, `/api/rule/parse` | POST |
|
||
| 分享列表 | `/api/shares` | GET |
|
||
| 创建分享 | `/api/shares` | POST |
|
||
| 更新分享 | `/api/shares/:id` | PATCH |
|
||
| 删除分享 | `/api/shares/:id` | DELETE |
|
||
| 回收站列表 | `/api/recycle-bin` | GET |
|
||
| 恢复 | `/api/recycle-bin/:id/restore` | POST |
|
||
| 彻底删除 | `/api/recycle-bin/:id` | DELETE |
|
||
| 设置 | `/api/settings` | GET/PATCH |
|
||
| 导出 | `/api/storage` | GET |
|
||
| 导入 | `/api/storage` | POST |
|
||
| 环境 | `/api/env` | GET |
|
||
| 脚本列表 | `/api/scripts` | GET |
|
||
| 节点信息 | `/api/utils/node-info` | POST |
|
||
|
||
### 9.2 鉴权
|
||
|
||
- 所有 `/api/*` 请求携带 `Authorization: Bearer <token>` 头
|
||
- Token 存储在 localStorage,可通过 URL `?token=` 参数初始化
|
||
- 401 响应 → 清除 Token,显示重新输入界面
|
||
|
||
### 9.3 响应格式适配
|
||
|
||
统一响应包络:
|
||
```json
|
||
{ "status": "success", "data": <T> }
|
||
{ "status": "failed", "error": { "code": <number>, "message": <string> } }
|
||
```
|
||
|
||
前端 axios 拦截器:
|
||
- 成功:解包 `response.data.data`
|
||
- 失败:提取 `response.data.error.message`,Toast 通知
|
||
|
||
---
|
||
|
||
## 10. 原项目功能对照清单
|
||
|
||
| 原项目功能 | 重构状态 | 说明 |
|
||
|-----------|----------|------|
|
||
| 源列表 + swipe 操作 | ✅ 保留,改右键菜单 | 弃用 swipe |
|
||
| 集合列表 + swipe 操作 | ✅ 保留,改右键菜单 | 弃用 swipe |
|
||
| 源编辑 (SubEditor) | ✅ 保留,拆分组件 | 2174 行 → 拆为 3-4 个子组件 |
|
||
| 集合编辑 | ✅ 保留,穿梭框选源 | 弃用 checkbox+draggable |
|
||
| Filter Pipeline 编辑 | ✅ 保留,改进交互 | 可视化流水线 + 专属配置表单 |
|
||
| 预览/对比 | ✅ 保留,右侧面板 | 弃用全屏覆盖 |
|
||
| 下载链接 | ✅ 保留,popover | 弃用 PreviewPanel 弹窗 |
|
||
| 模板管理 | ✅ 提升为独立 Tab | 从 My 页移出 |
|
||
| 设置 (My.vue) | ✅ 保留,改模态/独立页 | 分类菜单 + 表单 |
|
||
| 备份导出/导入 | ✅ 保留 | 移入设置-数据管理 |
|
||
| 工具页 | ✅ 保留,增强 | 转换器+分享+节点信息 |
|
||
| 回收站 | ✅ 提升为独立 Tab | 从 Tools 移出 |
|
||
| 分享管理 | ✅ 提升为 Tools 子页 | 从 Tools 移出 |
|
||
| 浮动按钮 | ❌ 移除 | PC 不需要 |
|
||
| 底部 TabBar | ❌ 移除 | 改为顶部 NavBar |
|
||
| 底部 Popup | ❌ 移除 | 改为右侧抽屉/模态 |
|
||
| 主题系统 | ✅ 保留,简化 | 8 套 → 暗色/亮色 + 配色变量 |
|
||
| i18n | ✅ 保留 | 中/英双语 |
|
||
| 标签筛选 | ✅ 保留 | 列表顶部 chip 筛选 |
|
||
| 拖拽排序 | ✅ 保留,原生 HTML5 | 弃用 vuedraggable |
|
||
| CodeMirror 编辑 | ✅ 保留,升级 CM6 | 本地内容/模板编辑 |
|
||
| 脚本参数 | ✅ 保留,动态表单 | 根据 metadata.parameters 生成 |
|
||
| 流量信息 | ✅ 保留 | 卡片内联显示 |
|
||
| 节点信息查询 | ✅ 保留 | Tools 子功能 |
|