notepad/docs/prd.md

400 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Vue3 + Python Notepad 应用 - 产品需求文档 (PRD)
**文档版本**: 1.0
**创建日期**: 2025-12-18
**作者**: BMad Analyst
**项目状态**: Greenfield (全新开发)
---
## 1. Goals and Background Context
### 1.1 Goals
- 提供一个简单、实时的在线文本编辑器通过URL直接访问特定文件
- 实现自动保存功能,无需用户手动操作
- 提供文件列表页面,方便用户管理和访问所有文档
- 确保应用安全、稳定,能够处理各种边界情况
- 支持在Ubuntu物理机上通过Docker部署
### 1.2 Background Context
本项目旨在开发一个轻量级的在线Notepad应用结合Vue3前端和Python后端技术栈。用户可以通过URL直接访问和编辑文本文件所有更改会自动保存到服务器。应用设计遵循简单、实时、URL驱动的理念适合个人或小型团队快速记录和分享文本内容。
该应用解决了传统文本编辑器需要手动保存、文件共享不便的问题,通过浏览器即可访问,无需安装额外软件。特别适合需要快速记录、跨设备访问文本内容的场景。
### 1.3 Change Log
| 日期 | 版本 | 描述 | 作者 |
|------|------|------|------|
| 2025-12-18 | 1.0 | 初始PRD文档创建 | BMad Analyst |
---
## 2. Requirements
### 2.1 Functional Requirements
**FR1**: 用户可以通过URL路径访问特定文本文件URL格式为 `/notes/{filename}.txt`
**FR2**: 如果访问的文件不存在,系统自动创建空白文件;如果文件已存在,加载并显示内容
**FR3**: 提供文本编辑区域支持用户输入和编辑内容文件大小限制为10万字符
**FR4**: 实现自动保存功能,当用户停止输入或内容发生变化时自动保存到服务器
**FR5**: 提供文件列表页面 `/file-list`显示所有txt文件的列表文件名、创建时间
**FR6**: 文件列表页面需要后端口令验证只有通过POST请求提供正确口令才能访问
**FR7**: 从文件列表页面点击文件名可以直接跳转到对应的编辑页面
**FR8**: 对URL中的文件名进行验证和过滤阻止包含特殊字符`/`, `\\`, `..`)的文件名
**FR9**: 当文件达到10万字符限制时阻止用户继续输入并显示提示信息
**FR10**: 提供适当的错误处理和用户提示,包括网络错误、保存失败、文件访问错误等
**FR11**: 支持中文文件名正确处理URL编码和解码
**FR12**: 文件列表页面支持分页或滚动加载,以处理大量文件的情况
### 2.2 Non-Functional Requirements
**NFR1**: 应用响应时间应在100ms以内不包括网络延迟
**NFR2**: 自动保存操作应在用户停止输入后500ms内触发
**NFR3**: 系统应支持至少100个并发用户编辑不同文件
**NFR4**: 应用应部署在Docker容器中支持在Ubuntu物理机上运行
**NFR5**: 前端资源应优化加载首屏加载时间不超过2秒
**NFR6**: 应用日志应记录关键操作(文件创建、保存、访问)以便故障排查
**NFR7**: 系统应具备基本的错误恢复能力,网络断开后能自动重连
---
## 3. User Interface Design Goals
### 3.1 Overall UX Vision
创建一个简洁、直观的文本编辑体验,界面设计遵循极简主义原则。用户打开页面即可立即开始编辑,无需复杂的设置或学习成本。编辑区域占据主要空间,提供舒适的阅读和写作环境。
### 3.2 Key Interaction Paradigms
- **直接编辑**: 页面加载完成后,光标自动定位到编辑区域,用户可以立即开始输入
- **实时反馈**: 自动保存状态通过视觉指示器显示(如"已保存"、"保存中..."
- **URL驱动导航**: 用户可以通过修改URL直接访问不同文件支持浏览器前进/后退
- **无缝文件管理**: 从文件列表到编辑页面的切换应流畅自然,保持用户体验一致性
### 3.3 Core Screens and Views
1. **文本编辑页面**: 主要编辑界面,包含文本编辑区域、文件名显示、自动保存状态指示器
2. **文件列表页面**: 显示所有可用文件的列表,包含文件名、创建时间,以及口令输入表单
3. **错误提示页面**: 显示各种错误信息,如文件访问被拒绝、文件不存在等
### 3.4 Accessibility
**WCAG AA** - 遵循WCAG 2.1 AA级标准确保文本对比度、键盘导航、屏幕阅读器兼容性
### 3.5 Branding
- 采用现代、简洁的设计风格
- 使用系统默认字体,确保跨平台一致性
- 配色方案:浅色背景 + 深色文本,高对比度确保可读性
### 3.6 Target Device and Platforms
**Web Responsive** - 主要面向桌面浏览器,同时支持平板和手机的基本访问功能
---
## 4. Technical Assumptions
### 4.1 Repository Structure
**Monorepo** - 前端和后端代码存放在同一个仓库中,便于协调开发和部署
### 4.2 Service Architecture
**Monolith** - 采用单体架构Python后端提供API服务和静态文件服务Vue3前端构建为静态资源
### 4.3 Testing Requirements
**Unit + Integration** - 编写单元测试覆盖核心功能,以及集成测试验证端到端流程
### 4.4 Additional Technical Assumptions and Requests
- **前端框架**: Vue 3 (Composition API) - 选择理由:现代、轻量、易学、生态系统完善
- **后端框架**: FastAPI - 选择理由高性能、自动API文档、内置WebSocket支持、类型注解
- **实时通信**: WebSocket - 用于实现实时自动保存和状态同步
- **文件存储**: 本地文件系统 - 简单直接,无需数据库,符合项目轻量级定位
- **部署方式**: Docker容器化 - 便于在Ubuntu物理机上部署和管理
- **静态文件服务**: Nginx或Python后端直接服务 - 根据性能需求决定
- **开发语言**: TypeScript (前端) + Python 3.10+ (后端) - 类型安全、现代特性
- **构建工具**: Vite - 快速的开发服务器和构建工具
- **包管理器**: npm/pnpm (前端) + pip/poetry (后端)
---
## 5. Epic List
### Epic 1: 基础架构与核心编辑功能
建立项目基础架构,实现核心文本编辑和自动保存功能
### Epic 2: 文件管理与安全控制
实现文件列表页面和后端口令验证功能
### Epic 3: 边界条件处理与部署优化
完善异常处理、输入验证配置Docker部署
---
## 6. Epic 1: 基础架构与核心编辑功能
**Epic Goal**: 建立前后端项目基础架构实现核心文本编辑功能、URL路由和自动保存机制为应用提供基本可用的文本编辑能力。
### Story 1.1: 前端项目初始化与基础UI搭建
**作为** 开发者
**我想要** 初始化Vue3项目并创建基础文本编辑界面
**以便** 为用户提供文本编辑功能
#### Acceptance Criteria
1. 使用Vite初始化Vue3项目配置TypeScript
2. 创建文本编辑组件包含textarea元素占据主要界面空间
3. 实现基本的数据绑定将textarea内容绑定到Vue响应式变量
4. 添加简单的CSS样式确保编辑区域美观易用
5. 配置开发服务器,能够在本地运行并访问
### Story 1.2: 后端项目初始化与文件API开发
**作为** 开发者
**我想要** 搭建Python FastAPI项目并实现文件读写API
**以便** 为前端提供文件存储服务
#### Acceptance Criteria
1. 创建FastAPI项目配置必要的依赖fastapi, uvicorn, python-multipart
2. 实现GET `/api/notes/{filename}` 接口:读取文件内容,文件不存在时创建空文件
3. 实现POST `/api/notes/{filename}` 接口:接收文本内容并保存到文件
4. 配置文件存储目录(如 `./data/notes/`),确保目录存在
5. 添加CORS配置允许前端跨域访问
6. 实现基本的错误处理返回适当的HTTP状态码和错误信息
### Story 1.3: URL路由与文件加载集成
**作为** 用户
**我想要** 通过URL访问特定文件并加载其内容
**以便** 直接编辑特定的文本文件
#### Acceptance Criteria
1. 使用Vue Router配置路由支持 `/notes/{filename}` 格式
2. 从URL参数中提取文件名调用后端API加载文件内容
3. 文件存在时,将内容显示在编辑区域
4. 文件不存在时,创建新文件并显示空白编辑区域
5. 在界面上方显示当前文件名
6. 处理URL编码/解码,支持中文文件名
### Story 1.4: 自动保存功能实现
**作为** 用户
**我想要** 编辑的内容能够自动保存
**以便** 无需手动操作即可保留我的更改
#### Acceptance Criteria
1. 监听文本编辑器的input事件检测内容变化
2. 实现防抖机制用户停止输入500ms后触发保存
3. 调用后端API将当前内容保存到文件
4. 在界面上显示保存状态指示器("已保存"、"保存中..."、"保存失败"
5. 保存成功后更新状态为"已保存"
6. 保存失败时显示错误提示,并提供重试机制
### Story 1.5: WebSocket实时通信集成
**作为** 用户
**我想要** 通过WebSocket实现实时自动保存
**以便** 获得更快的响应和更好的实时体验
#### Acceptance Criteria
1. 后端集成WebSocket支持使用FastAPI的websocket功能
2. 前端建立WebSocket连接保持长连接
3. 通过WebSocket发送文本内容到后端实现实时保存
4. 后端接收到内容后立即写入文件
5. 实现连接断开后自动重连机制
6. 显示WebSocket连接状态已连接、断开连接、重连中
---
## 7. Epic 2: 文件管理与安全控制
**Epic Goal**: 实现文件列表页面展示所有txt文件并添加后端口令验证机制保护文件管理功能的安全性。
### Story 2.1: 文件列表API开发
**作为** 开发者
**我想要** 实现后端API返回所有txt文件列表
**以便** 前端可以展示文件列表页面
#### Acceptance Criteria
1. 实现GET `/api/files/list` 接口,遍历文件存储目录
2. 返回所有 `.txt` 文件的列表,包含文件名和创建时间
3. 按创建时间倒序排列,最新文件显示在最前面
4. 添加分页支持每页显示50个文件
5. 返回数据格式为JSON包含文件总数和当前页信息
### Story 2.2: 文件列表页面UI开发
**作为** 用户
**我想要** 查看所有可编辑的文件列表
**以便** 快速找到并打开需要的文档
#### Acceptance Criteria
1. 创建文件列表页面组件 `/file-list`
2. 调用后端API获取文件列表并展示
3. 每个文件项显示文件名和创建时间(格式化显示)
4. 点击文件名跳转到对应的编辑页面(`/notes/{filename}`
5. 实现加载状态指示器API调用期间显示加载中
6. 处理空列表情况,显示友好提示信息
### Story 2.3: 后端口令验证机制
**作为** 用户
**我想要** 文件列表页面需要口令验证
**以便** 保护我的文件不被未经授权的访问
#### Acceptance Criteria
1. 配置文件列表访问口令(如环境变量 `FILE_LIST_PASSWORD`
2. 修改 `/api/files/list` 接口,要求请求包含正确的口令
3. 实现POST `/api/files/verify-password` 接口,验证口令是否正确
4. 口令验证通过后返回访问令牌简单token
5. 后续文件列表请求需要携带令牌才能访问
6. 令牌设置过期时间如24小时
### Story 2.4: 前端口令验证UI
**作为** 用户
**我想要** 在文件列表页面输入口令进行验证
**以便** 访问我的文件列表
#### Acceptance Criteria
1. 访问文件列表页面时,如果未验证,显示口令输入表单
2. 用户输入口令后调用后端验证API
3. 验证成功后保存令牌到localStorage
4. 使用令牌调用文件列表API显示文件列表
5. 验证失败时显示错误消息
6. 提供"记住我"选项,保持登录状态
---
## 8. Epic 3: 边界条件处理与部署优化
**Epic Goal**: 完善应用的异常处理和边界条件实现输入验证、文件大小限制、错误处理并配置Docker部署方案。
### Story 3.1: 输入验证与安全过滤
**作为** 开发者
**我想要** 对文件名进行严格的验证和过滤
**以便** 防止安全漏洞和非法访问
#### Acceptance Criteria
1. 实现文件名验证函数,阻止包含特殊字符的文件名(`/`, `\\`, `..`, `:`等)
2. 限制文件名长度不超过200个字符
3. 对URL中的文件名进行解码和验证
4. 验证失败时返回400 Bad Request错误
5. 记录验证失败的请求,便于安全审计
6. 前端同步实现文件名验证,提供实时反馈
### Story 3.2: 文件大小限制实现
**作为** 用户
**我想要** 系统限制文件大小不超过10万字符
**以便** 防止单个文件过大影响性能
#### Acceptance Criteria
1. 后端实现文件大小检查读取文件时如果超过10万字符返回错误
2. 前端实现字符计数器,实时显示当前字符数
3. 当接近限制如9.5万字符)时显示警告
4. 达到10万字符限制时阻止用户继续输入并显示提示
5. 保存时检查内容长度超过限制返回413 Payload Too Large错误
6. 提供友好的用户提示,说明文件大小限制
### Story 3.3: 异常处理与错误提示
**作为** 用户
**我想要** 清晰的错误提示信息
**以便** 了解发生了什么问题和如何解决
#### Acceptance Criteria
1. 定义错误码和对应的用户友好消息
2. 实现全局错误处理组件,捕获并显示错误
3. 网络错误:显示"网络连接失败,请检查网络"提示
4. 文件访问错误:显示"无法访问文件,请重试或联系管理员"
5. 权限错误:显示"访问被拒绝,请确认您有权限访问此文件"
6. 提供"重试"按钮,允许用户重新尝试失败的操作
### Story 3.4: Docker部署配置
**作为** 运维人员
**我想要** 使用Docker部署应用
**以便** 简化部署流程和环境管理
#### Acceptance Criteria
1. 创建前端Dockerfile基于Node.js镜像构建Vue3应用
2. 创建后端Dockerfile基于Python 3.10+镜像运行FastAPI
3. 配置docker-compose.yml编排前后端服务
4. 配置Nginx作为反向代理服务前端静态文件和API请求
5. 设置环境变量配置(文件存储路径、口令、端口等)
6. 编写部署文档说明如何在Ubuntu物理机上部署
### Story 3.5: 性能优化与监控
**作为** 开发者
**我想要** 添加性能监控和优化措施
**以便** 确保应用在生产环境稳定运行
#### Acceptance Criteria
1. 后端添加请求日志记录API调用时间、状态码
2. 实现健康检查接口 `/health`,返回服务状态
3. 前端添加性能监控,测量页面加载时间、保存响应时间
4. 配置Gunicorn/Uvicorn参数优化并发性能
5. 实现文件缓存机制,减少重复读取
6. 添加内存使用监控,防止内存泄漏
---
## 9. Next Steps
### UX Expert Prompt
基于本PRD文档设计Vue3 + Python Notepad应用的用户界面架构包括
- 文本编辑页面的布局和交互设计
- 文件列表页面的视觉设计和用户体验
- 响应式设计策略,适配不同设备
- UI组件库选择和设计系统定义
### Architect Prompt
基于本PRD文档设计Vue3 + Python Notepad应用的技术架构包括
- 前后端项目结构和代码组织
- API设计细节和WebSocket通信协议
- 文件存储策略和数据模型
- Docker部署架构和配置
- 安全策略和性能优化方案