# 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部署架构和配置 - 安全策略和性能优化方案