15 KiB
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
- 文本编辑页面: 主要编辑界面,包含文本编辑区域、文件名显示、自动保存状态指示器
- 文件列表页面: 显示所有可用文件的列表,包含文件名、创建时间,以及口令输入表单
- 错误提示页面: 显示各种错误信息,如文件访问被拒绝、文件不存在等
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
- 使用Vite初始化Vue3项目,配置TypeScript
- 创建文本编辑组件,包含textarea元素占据主要界面空间
- 实现基本的数据绑定,将textarea内容绑定到Vue响应式变量
- 添加简单的CSS样式,确保编辑区域美观易用
- 配置开发服务器,能够在本地运行并访问
Story 1.2: 后端项目初始化与文件API开发
作为 开发者
我想要 搭建Python FastAPI项目并实现文件读写API
以便 为前端提供文件存储服务
Acceptance Criteria
- 创建FastAPI项目,配置必要的依赖(fastapi, uvicorn, python-multipart)
- 实现GET
/api/notes/{filename}接口:读取文件内容,文件不存在时创建空文件 - 实现POST
/api/notes/{filename}接口:接收文本内容并保存到文件 - 配置文件存储目录(如
./data/notes/),确保目录存在 - 添加CORS配置,允许前端跨域访问
- 实现基本的错误处理,返回适当的HTTP状态码和错误信息
Story 1.3: URL路由与文件加载集成
作为 用户
我想要 通过URL访问特定文件并加载其内容
以便 直接编辑特定的文本文件
Acceptance Criteria
- 使用Vue Router配置路由,支持
/notes/{filename}格式 - 从URL参数中提取文件名,调用后端API加载文件内容
- 文件存在时,将内容显示在编辑区域
- 文件不存在时,创建新文件并显示空白编辑区域
- 在界面上方显示当前文件名
- 处理URL编码/解码,支持中文文件名
Story 1.4: 自动保存功能实现
作为 用户
我想要 编辑的内容能够自动保存
以便 无需手动操作即可保留我的更改
Acceptance Criteria
- 监听文本编辑器的input事件,检测内容变化
- 实现防抖机制,用户停止输入500ms后触发保存
- 调用后端API将当前内容保存到文件
- 在界面上显示保存状态指示器("已保存"、"保存中..."、"保存失败")
- 保存成功后更新状态为"已保存"
- 保存失败时显示错误提示,并提供重试机制
Story 1.5: WebSocket实时通信集成
作为 用户
我想要 通过WebSocket实现实时自动保存
以便 获得更快的响应和更好的实时体验
Acceptance Criteria
- 后端集成WebSocket支持,使用FastAPI的websocket功能
- 前端建立WebSocket连接,保持长连接
- 通过WebSocket发送文本内容到后端,实现实时保存
- 后端接收到内容后立即写入文件
- 实现连接断开后自动重连机制
- 显示WebSocket连接状态(已连接、断开连接、重连中)
7. Epic 2: 文件管理与安全控制
Epic Goal: 实现文件列表页面,展示所有txt文件,并添加后端口令验证机制,保护文件管理功能的安全性。
Story 2.1: 文件列表API开发
作为 开发者
我想要 实现后端API返回所有txt文件列表
以便 前端可以展示文件列表页面
Acceptance Criteria
- 实现GET
/api/files/list接口,遍历文件存储目录 - 返回所有
.txt文件的列表,包含文件名和创建时间 - 按创建时间倒序排列,最新文件显示在最前面
- 添加分页支持,每页显示50个文件
- 返回数据格式为JSON,包含文件总数和当前页信息
Story 2.2: 文件列表页面UI开发
作为 用户
我想要 查看所有可编辑的文件列表
以便 快速找到并打开需要的文档
Acceptance Criteria
- 创建文件列表页面组件
/file-list - 调用后端API获取文件列表并展示
- 每个文件项显示文件名和创建时间(格式化显示)
- 点击文件名跳转到对应的编辑页面(
/notes/{filename}) - 实现加载状态指示器,API调用期间显示加载中
- 处理空列表情况,显示友好提示信息
Story 2.3: 后端口令验证机制
作为 用户
我想要 文件列表页面需要口令验证
以便 保护我的文件不被未经授权的访问
Acceptance Criteria
- 配置文件列表访问口令(如环境变量
FILE_LIST_PASSWORD) - 修改
/api/files/list接口,要求请求包含正确的口令 - 实现POST
/api/files/verify-password接口,验证口令是否正确 - 口令验证通过后,返回访问令牌(简单token)
- 后续文件列表请求需要携带令牌才能访问
- 令牌设置过期时间(如24小时)
Story 2.4: 前端口令验证UI
作为 用户
我想要 在文件列表页面输入口令进行验证
以便 访问我的文件列表
Acceptance Criteria
- 访问文件列表页面时,如果未验证,显示口令输入表单
- 用户输入口令后,调用后端验证API
- 验证成功后,保存令牌到localStorage
- 使用令牌调用文件列表API,显示文件列表
- 验证失败时显示错误消息
- 提供"记住我"选项,保持登录状态
8. Epic 3: 边界条件处理与部署优化
Epic Goal: 完善应用的异常处理和边界条件,实现输入验证、文件大小限制、错误处理,并配置Docker部署方案。
Story 3.1: 输入验证与安全过滤
作为 开发者
我想要 对文件名进行严格的验证和过滤
以便 防止安全漏洞和非法访问
Acceptance Criteria
- 实现文件名验证函数,阻止包含特殊字符的文件名(
/,\\,..,:等) - 限制文件名长度不超过200个字符
- 对URL中的文件名进行解码和验证
- 验证失败时返回400 Bad Request错误
- 记录验证失败的请求,便于安全审计
- 前端同步实现文件名验证,提供实时反馈
Story 3.2: 文件大小限制实现
作为 用户
我想要 系统限制文件大小不超过10万字符
以便 防止单个文件过大影响性能
Acceptance Criteria
- 后端实现文件大小检查,读取文件时如果超过10万字符返回错误
- 前端实现字符计数器,实时显示当前字符数
- 当接近限制(如9.5万字符)时显示警告
- 达到10万字符限制时,阻止用户继续输入并显示提示
- 保存时检查内容长度,超过限制返回413 Payload Too Large错误
- 提供友好的用户提示,说明文件大小限制
Story 3.3: 异常处理与错误提示
作为 用户
我想要 清晰的错误提示信息
以便 了解发生了什么问题和如何解决
Acceptance Criteria
- 定义错误码和对应的用户友好消息
- 实现全局错误处理组件,捕获并显示错误
- 网络错误:显示"网络连接失败,请检查网络"提示
- 文件访问错误:显示"无法访问文件,请重试或联系管理员"
- 权限错误:显示"访问被拒绝,请确认您有权限访问此文件"
- 提供"重试"按钮,允许用户重新尝试失败的操作
Story 3.4: Docker部署配置
作为 运维人员
我想要 使用Docker部署应用
以便 简化部署流程和环境管理
Acceptance Criteria
- 创建前端Dockerfile,基于Node.js镜像构建Vue3应用
- 创建后端Dockerfile,基于Python 3.10+镜像运行FastAPI
- 配置docker-compose.yml,编排前后端服务
- 配置Nginx作为反向代理,服务前端静态文件和API请求
- 设置环境变量配置(文件存储路径、口令、端口等)
- 编写部署文档,说明如何在Ubuntu物理机上部署
Story 3.5: 性能优化与监控
作为 开发者
我想要 添加性能监控和优化措施
以便 确保应用在生产环境稳定运行
Acceptance Criteria
- 后端添加请求日志,记录API调用时间、状态码
- 实现健康检查接口
/health,返回服务状态 - 前端添加性能监控,测量页面加载时间、保存响应时间
- 配置Gunicorn/Uvicorn参数,优化并发性能
- 实现文件缓存机制,减少重复读取
- 添加内存使用监控,防止内存泄漏
9. Next Steps
UX Expert Prompt
基于本PRD文档,设计Vue3 + Python Notepad应用的用户界面架构,包括:
- 文本编辑页面的布局和交互设计
- 文件列表页面的视觉设计和用户体验
- 响应式设计策略,适配不同设备
- UI组件库选择和设计系统定义
Architect Prompt
基于本PRD文档,设计Vue3 + Python Notepad应用的技术架构,包括:
- 前后端项目结构和代码组织
- API设计细节和WebSocket通信协议
- 文件存储策略和数据模型
- Docker部署架构和配置
- 安全策略和性能优化方案