Compare commits

..

10 Commits

Author SHA1 Message Date
ddshi
a69b49ed34 chore: 更新子模块到最新版本
- client: 优化提醒卡片样式和归档功能
- server: 清理临时文件
2026-02-03 14:14:27 +08:00
ddshi
1559830024 chore: 完成提醒模块样式优化和归档功能
- 优化提醒卡片样式,统一黑白灰配色
- 添加checkbox勾选动画和过期提醒淡出效果
- 修复过期检测逻辑(精确到时间点而非仅日期)
- 完善归档页功能(恢复/删除已过期完成提醒)
- 更新PRD文档,添加实施状态追踪和后续开发计划

Co-Authored-By: Claude (MiniMax-M2.1) <noreply@anthropic.com>
2026-02-03 14:10:32 +08:00
ddshi
83a6acd1e5 chore: 优化提醒功能显示效果
- 修复提醒分组逻辑,精确判断过期时间
- 优化 checkbox 交互和状态保存
- 添加归档页和设置页入口
- 修复后端 is_completed 字段验证
2026-02-03 13:20:18 +08:00
ddshi
c376a3c96c chore: 清理临时文件
- 移除 tmpclaude 临时目录
- 移除测试截图
2026-02-02 16:02:54 +08:00
ddshi
3a8f270481 chore: 排除 .claude/settings.local.json 2026-02-02 15:27:47 +08:00
ddshi
fd2672468e chore: 更新子模块到禅意设计版本
- client: 禅意设计风格重构与体验优化
- server: 子模块配置调整
2026-02-02 15:27:16 +08:00
ddshi
3e9f377cfb chore: 添加 tmpclaude 临时文件到 gitignore
- 排除 tmpclaude-* 临时目录
- 排除 .claude/ 配置目录
2026-02-02 15:26:34 +08:00
ddshi
8f7ad884be chore: 更新子模块到v0.5.0-alpha
- client子模块更新到最新修复版本
- server子模块保持同步
2026-01-29 20:07:43 +08:00
ddshi
1f8e713ea0 docs: 更新测试报告和开发指南
- 更新P4功能测试报告
- 添加开发、测试、部署完整指南
- 记录v0.5.0-alpha版本变更

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-29 20:06:04 +08:00
ddshi
41bcb11a12 chore: 更新子模块到v0.5.0-alpha
- client子模块更新到v0.5.0-alpha
- server子模块保持同步

Co-Authored-By: Claude <noreply@anthropic.com>
2026-01-29 17:45:22 +08:00
53 changed files with 852 additions and 166 deletions

View File

@ -57,7 +57,33 @@
"mcp__playwright__browser_console_messages",
"mcp__playwright__browser_press_key",
"mcp__playwright__browser_evaluate",
"mcp__playwright__browser_run_code"
"mcp__playwright__browser_run_code",
"Bash(Start-Sleep:*)",
"Bash(git submodule update:*)",
"Bash(git -C /e/qia/client commit -m \"feat\\(reminder\\): 完成P4提醒功能\n\n- 实现提醒按时间分组显示(今天/明天/本周/更久/已错过)\n- 添加逾期提醒红色Alert提示\n- 优化提醒卡片交互(悬停显示操作按钮)\n- 修复DateInput日期类型处理问题\n\nCo-Authored-By: Claude <noreply@anthropic.com>\")",
"Bash(git -C /e/qia/client tag -a v0.5.0-alpha -m \"v0.5.0-alpha: 提醒功能完成\n\nP4里程碑 - 提醒功能\n- 提醒按时间分组显示\n- 逾期提醒处理\n- 卡片交互优化\")",
"Bash(pkill:*)",
"Bash(jobs:*)",
"Bash(npm run)",
"Bash(npm run typecheck)",
"Bash(npm run type-check)",
"mcp__playwright__browser_navigate_back",
"Bash(ping:*)",
"Bash(git -C /e/qia/client commit -m \"fix\\(auth\\): 修复登录持久化和路由重定向问题\n\n- 注册成功后直接跳转首页,无需重新登录\n- 优化useAuthLoader使用useRef避免闪烁\n- 统一错误处理格式\n- 修复HTML标签嵌套错误\n- 添加XSS防护\\(rehype-sanitize\\)\n- 修复API credentials配置\n\nCo-Authored-By: Claude <noreply@anthropic.com>\")",
"Bash(git -C /e/qia add docs/test-report.md docs/development-guide.md)",
"Bash(git -C /e/qia commit -m \"$\\(cat <<''EOF''\ndocs: 更新测试报告和开发指南\n\n- 更新P4功能测试报告\n- 添加开发、测试、部署完整指南\n- 记录v0.5.0-alpha版本变更\n\nCo-Authored-By: Claude <noreply@anthropic.com>\nEOF\n\\)\")",
"Bash(git -C /e/qia add client server)",
"Bash(git -C /e/qia commit -m \"chore: 更新子模块到v0.5.0-alpha\n\n- client子模块更新到最新修复版本\n- server子模块保持同步\")",
"Bash(git -C /e/qia tag -a v0.5.0-alpha -m \"v0.5.0-alpha: 登录认证修复\n\n修复版本\n- 修复登录后刷新页面API请求失败问题\n- 修复注册后跳转逻辑\n- 优化路由守卫避免闪烁\n- 统一错误处理格式\n- 修复HTML嵌套错误\n\n子模块\n- client: a118346\")",
"Bash(git -C /e/qia tag -d v0.5.0-alpha)",
"mcp__MiniMax__understand_image",
"Bash(xargs -r -I{} taskkill //F //PID {})",
"mcp__ide__getDiagnostics",
"Bash(npm ls:*)",
"Bash(npm i:*)",
"Bash(tasklist:*)",
"Bash(wmic:*)",
"mcp__playwright__browser_network_requests"
]
}
}

3
.gitignore vendored
View File

@ -51,3 +51,6 @@ coverage/
*.temp
temp/
tmp/
tmpclaude-*
.claude/
.claude/settings.local.json

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

2
client

@ -1 +1 @@
Subproject commit c08f5aa4aadfcae5324b405be408ff2a5d279269
Subproject commit a8b4f17043328f8a5e23f9b4fcfca5bd5e2d3b4f

450
docs/development-guide.md Normal file
View File

@ -0,0 +1,450 @@
# 开发指南
本文档说明如何进行本地开发、测试和部署。
## 目录
- [环境要求](#环境要求)
- [本地开发](#本地开发)
- [测试](#测试)
- [部署](#部署)
- [配置说明](#配置说明)
---
## 环境要求
### 必需软件
| 软件 | 版本 | 说明 |
|-----|------|------|
| Node.js | >= 18 | 前端和后端运行环境 |
| npm | >= 9 | 包管理器 |
| Git | 任意版本 | 版本控制 |
| SQLite | 3.x | 本地数据库(开发环境) |
### 可选软件
| 软件 | 版本 | 说明 |
|-----|------|------|
| PostgreSQL | 14+ | 生产环境数据库 |
| Playwright | 最新版 | 浏览器自动化测试 |
---
## 本地开发
### 1. 克隆项目
```bash
git clone https://your-repo-url/qia.git
cd qia
```
### 2. 安装依赖
#### 主项目
```bash
npm install
```
#### 前端client子模块
```bash
cd client
npm install
```
#### 后端server子模块
```bash
cd server
npm install
```
### 3. 数据库配置
#### 开发环境SQLite
无需额外配置SQLite文件会自动创建。
```bash
# server/.env
DATABASE_URL="file:./dev.db"
```
#### 生产环境PostgreSQL
```bash
# server/.env
DATABASE_URL="postgresql://user:password@host:5432/qia"
```
### 4. 启动开发服务器
#### 方式一:同时启动前后端
在主目录执行:
```bash
npm run dev
```
这会同时启动:
- 前端:`http://localhost:5173`
- 后端:`http://localhost:3000`
#### 方式二:分别启动
**终端1 - 启动后端**
```bash
cd server
npm run dev
```
**终端2 - 启动前端**
```bash
cd client
npm run dev
```
### 5. 初始化数据库
首次启动时Prisma会自动创建数据库并运行迁移
```bash
cd server
npx prisma migrate dev --name init
```
如需重置数据库:
```bash
npx prisma migrate reset
```
---
## 测试
### 单元测试
```bash
# 运行所有单元测试
npm test
# 运行特定模块测试
npm run test:unit
# 监听模式运行测试
npm run test:watch
```
### 端到端测试Playwright
#### 安装Playwright
```bash
# 在主目录安装
npm install -D @playwright/test
# 安装浏览器
npx playwright install chromium
```
#### 运行E2E测试
```bash
# 运行所有E2E测试
npm run test:e2e
# 运行特定测试文件
npx playwright test tests/reminder.spec.ts
# 以UI模式运行可交互
npx playwright test --ui
```
#### 使用Playwright MCP推荐
如果配置了Playwright MCP服务器可以直接使用 MCP 工具进行测试:
```bash
# 启动开发服务器后,使用以下工具:
# - browser_navigate: 导航到页面
# - browser_snapshot: 获取页面快照
# - browser_click: 点击元素
# - browser_type: 输入文本
# - browser_take_screenshot: 截图
```
### 测试用例
测试用例文档位于 `docs/test-cases.md`,测试报告位于 `docs/test-report.md`
### 测试数据库
使用独立的测试数据库避免污染开发数据:
```bash
# server/.env.test
DATABASE_URL="file:./test.db"
# 运行测试
npm run test:e2e
```
---
## 部署
### 1. 构建生产版本
#### 前端构建
```bash
cd client
npm run build
```
构建产物位于 `client/dist/`
#### 后端构建
```bash
cd server
npm run build
```
构建产物位于 `server/dist/`
### 2. 环境配置
#### 生产环境变量server/.env
```env
# Server
NODE_ENV=production
PORT=3000
# JWT
JWT_SECRET=your-super-secret-jwt-key-change-in-production
JWT_EXPIRES_IN=7d
JWT_REFRESH_EXPIRES_IN=30d
# Database (PostgreSQL - 腾讯云)
DB_HOST=postgres.ap-shanghai.myqcloud.com
DB_PORT=5432
DB_NAME=qia
DB_USER=qia_admin
DB_PASSWORD=your-database-password
# DeepSeek AI
DEEPSEEK_API_KEY=sk-xxx
DEEPSEEK_API_URL=https://api.deepseek.com/chat/completions
# CORS
CORS_ORIGIN=https://your-domain.com
```
#### 前端环境变量client/.env
```env
VITE_API_URL=https://your-domain.com/api
```
### 3. 部署方式
#### 方式一:腾讯云轻量应用服务器
1. **上传代码**
```bash
scp -r . user@your-server:/app/qia
```
2. **安装依赖并构建**
```bash
cd /app/qia
npm install
cd client && npm install && npm run build
cd ../server && npm install && npm run build
```
3. **配置PM2进程管理**
```bash
npm install -g pm2
pm2 start server/dist/index.js --name qia-server
pm2 startup
pm2 save
```
4. **配置Nginx反向代理**
```nginx
server {
listen 80;
server_name your-domain.com;
# 前端静态文件
location / {
root /app/qia/client/dist;
try_files $uri $uri/ /index.html;
}
# API代理
location /api {
proxy_pass http://localhost:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
```
5. **配置HTTPSLet's Encrypt**
```bash
certbot --nginx -d your-domain.com
```
#### 方式二Docker部署
创建 `Dockerfile`:
```dockerfile
# 构建前端
FROM node:18-alpine AS frontend
WORKDIR /app
COPY client/ ./client/
RUN cd client && npm install && npm run build
# 构建后端
FROM node:18-alpine AS backend
WORKDIR /app
COPY server/ ./server/
RUN cd server && npm install && npm run build
# 运行
FROM node:18-alpine
WORKDIR /app
COPY --from=backend /app/server/dist ./dist
COPY --from=frontend /app/client/dist ./public
EXPOSE 3000
CMD ["node", "dist/index.js"]
```
部署:
```bash
docker build -t qia-app .
docker run -d -p 3000:3000 --env-file server/.env qia-app
```
### 4. 数据库迁移(生产环境)
```bash
cd server
npx prisma migrate deploy
```
### 5. 验证部署
```bash
# 检查API健康
curl https://your-domain.com/api/health
# 检查前端
curl https://your-domain.com
```
---
## 配置说明
### 环境变量清单
| 变量名 | 必需 | 说明 |
|-------|------|------|
| `NODE_ENV` | 是 | production/development |
| `PORT` | 是 | 服务端口 |
| `DATABASE_URL` | 是 | 数据库连接字符串 |
| `JWT_SECRET` | 是 | JWT签名密钥生产环境必须复杂 |
| `JWT_EXPIRES_IN` | 否 | JWT过期时间默认7d |
| `CORS_ORIGIN` | 是 | 允许的跨域来源 |
| `DEEPSEEK_API_KEY` | 否 | AI功能才需要 |
| `DEEPSEEK_API_URL` | 否 | AI功能才需要 |
### 目录结构
```
qia/
├── client/ # 前端React应用
│ ├── src/
│ │ ├── components/ # 组件
│ │ ├── pages/ # 页面
│ │ ├── hooks/ # 自定义Hook
│ │ ├── stores/ # 状态管理
│ │ ├── types/ # 类型定义
│ │ └── utils/ # 工具函数
│ ├── public/ # 静态资源
│ └── dist/ # 构建产物
├── server/ # 后端Express应用
│ ├── src/
│ │ ├── routes/ # 路由
│ │ ├── middleware/ # 中间件
│ │ └── services/ # 服务层
│ ├── prisma/ # 数据库
│ │ └── schema.prisma
│ └── dist/ # 构建产物
├── docs/ # 文档
├── ui/ # Pencil设计文件
└── .github/workflows/ # CI/CD配置
```
### 常见问题
#### Q: 数据库连接失败
A: 检查 `DATABASE_URL` 格式是否正确开发环境使用SQLite生产环境使用PostgreSQL。
#### Q: 前端请求API报CORS错误
A: 在 `server/.env` 中正确配置 `CORS_ORIGIN` 为前端域名。
#### Q: JWT Token过期
A: 前端会自动使用Refresh Token刷新如需手动刷新调用 `POST /api/auth/refresh`
#### Q: 登录后页面不跳转
A: 检查 `localStorage` 中是否正确保存了Token清理浏览器缓存后重试。
---
## 快速参考
### 开发启动
```bash
npm run dev
```
### 构建生产版本
```bash
npm run build
```
### 运行测试
```bash
npm run test
```
### 数据库操作
```bash
# 开发迁移
npx prisma migrate dev
# 生产迁移
npx prisma migrate deploy
# 查看数据
npx prisma studio
```
### 版本发布
```bash
# 1. 更新CHANGELOG
# 2. 提交代码
git add .
git commit -m "release: v0.x.x"
git tag -a v0.x.x -m "v0.x.x: description"
# 3. 推送到远程
git push
git push origin v0.x.x
```

View File

@ -4,9 +4,10 @@
| 项目 | 内容 |
|-----|------|
| **版本号** | v1.0.0 |
| **状态** | 待评审 |
| **版本号** | v1.0.1 |
| **状态** | 开发中 |
| **创建日期** | 2026-01-28 |
| **最近更新** | 2026-02-03 |
| **目标用户** | 需要管理纪念日、提醒任务的普通用户 |
| **产品定位** | 轻便、灵活的倒数日和提醒App专注提醒功能 |
@ -1574,3 +1575,145 @@ Home页面采用三栏布局总宽度1200px居中显示。
| 版本 | 日期 | 修改内容 | 修改人 |
|------|------|----------|--------|
| v1.0.0 | 2026-01-28 | 初稿完成 | 产品经理 |
| v1.0.1 | 2026-02-03 | 完善提醒模块,实现归档页、设置页、优化样式 | 产品经理 |
---
## 10 实施状态追踪
### 10.1 功能实现状态
| 模块 | 功能点 | 状态 | 备注 |
|------|--------|------|------|
| **认证模块** | 用户注册 | ✅ 已完成 | 邮箱密码认证 |
| | 用户登录 | ✅ 已完成 | JWT登录态 |
| | 登录态保持 | ✅ 已完成 | localStorage 30天 |
| | 登出功能 | ✅ 已完成 | |
| **纪念日模块** | 查看列表 | ✅ 已完成 | 倒计时显示 |
| | 添加纪念日 | ✅ 已完成 | AI+手动添加 |
| | 编辑纪念日 | ✅ 已完成 | 详情弹窗 |
| | 删除纪念日 | ✅ 已完成 | |
| | 内置节假日 | ✅ 已完成 | 农历转换修复 |
| | 倒计时计算 | ✅ 已完成 | |
| **提醒模块** | 查看列表 | ✅ 已完成 | 分组显示 |
| | 添加提醒 | ✅ 已完成 | AI+手动添加 |
| | 编辑提醒 | ✅ 已完成 | 详情弹窗 |
| | 删除提醒 | ✅ 已完成 | |
| | 标记完成 | ✅ 已完成 | checkbox交互 |
| | 过期检测 | ✅ 已完成 | 精确到时间点 |
| | 已过期分组 | ✅ 已完成 | 红色高亮 |
| | 归档功能 | ✅ 已完成 | 独立归档页 |
| **便签模块** | 查看便签 | ✅ 已完成 | |
| | 编辑便签 | ✅ 已完成 | Markdown支持 |
| | 自动保存 | ✅ 已完成 | |
| **AI对话** | 自然语言解析 | ✅ 已完成 | |
| | 解析确认 | ✅ 已完成 | |
| | 创建纪念日/提醒 | ✅ 已完成 | |
| **设置** | 显示设置 | ✅ 已完成 | 节假日显示开关 |
| **其他** | 归档页 | ✅ 已完成 | 恢复/删除功能 |
| | 设置页 | ✅ 已完成 | 基础框架 |
### 10.2 提醒模块当前实现详情
#### 10.2.1 分组逻辑
```
提醒按以下规则分组显示:
- 今天eventDate < tomorrow (今晚24点前)
- 明天tomorrow <= eventDate < dayAfterTomorrow
- 更久之后eventDate >= dayAfterTomorrow
- 已错过eventDate < now (精确到时间点不只是日期)
```
#### 10.2.2 状态样式
| 状态 | 边框 | 背景 | 文字颜色 | 时间颜色 |
|------|------|------|----------|----------|
| 默认 | 浅灰 | 透明 | #1a1a1a | #666 |
| 已过期 | 浅红(左边框3px) | 浅红 | #666 | #c41c1c |
| 已完成 | 浅灰 | 透明 | #999 | #bbb |
#### 10.2.3 交互效果
- **checkbox点击**:切换完成状态,已过期提醒有淡出动画
- **卡片点击**:打开编辑弹窗
- **悬停效果**:卡片轻微上浮,更多按钮渐显
- **勾选动画**checkbox 脉冲动画
### 10.3 技术优化项
| 项目 | 状态 | 说明 |
|------|------|------|
| 乐观更新 | ✅ 已完成 | UI即时响应失败回滚 |
| 状态持久化 | ✅ 已完成 | localStorage + 后端 |
| API数据覆盖 | ✅ 已修复 | 避免undefined覆盖有效值 |
| 后端is_completed | ✅ 已修复 | zod schema添加字段 |
---
## 11 后续开发计划
### 11.1 短期计划v1.0.2- 核心体验优化
**目标**:打磨核心功能,提升用户体验稳定性
| 优先级 | 功能 | 描述 | 预估工时 |
|--------|------|------|----------|
| P0 | 提醒弹窗完善 | 添加日期时间选择器、表单验证 | 0.5天 |
| P0 | 纪念日弹窗完善 | 添加农历选择、重复方式下拉 | 0.5天 |
| P1 | 节日显示开关 | 设置页控制是否显示法定节假日 | 0.25天 |
| P1 | 移动端适配 | 响应式布局优化 | 0.5天 |
| P2 | 加载状态优化 | 添加骨架屏、loading动画 | 0.25天 |
| P2 | 错误提示优化 | 统一错误处理和提示样式 | 0.25天 |
### 11.2 中期计划v1.1.0- 功能增强
**目标**:增强核心功能,添加辅助功能
| 优先级 | 功能 | 描述 | 预估工时 |
|--------|------|------|----------|
| P1 | 浏览器通知 | 纪念日/提醒通知权限和发送 | 1天 |
| P1 | AI对话优化 | 解析结果编辑、多轮对话 | 1天 |
| P2 | 数据导出 | 导出纪念日/提醒为JSON/CSV | 0.5天 |
| P2 | 批量操作 | 批量删除、批量完成 | 0.5天 |
| P3 | 搜索功能 | 搜索纪念日和提醒 | 0.5天 |
### 11.3 长期计划v1.2.0+- 生态扩展
**目标**:扩展使用场景,提升产品价值
| 功能 | 描述 | 预估工时 |
|------|------|----------|
| 微信小程序 | 跨平台覆盖,方便移动端使用 | 3天 |
| 数据统计 | 纪念日统计、提醒完成率 | 1天 |
| 主题切换 | 浅色/深色/主题色 | 0.5天 |
| 分享功能 | 分享纪念日卡片 | 0.5天 |
| 重复规则增强 | 自定义重复周期、结束日期 | 1天 |
### 11.4 技术债
| 项目 | 描述 | 优先级 |
|------|------|--------|
| 代码规范 | ESLint/Prettier配置完善 | P2 |
| 单元测试 | 核心函数测试覆盖 | P3 |
| 性能优化 | 大数据量场景优化 | P3 |
| 文档完善 | API文档、开发者文档 | P2 |
### 11.5 里程碑更新
| 版本 | 内容 | 状态 | 预计完成 |
|------|------|------|----------|
| v1.0.0 | MVP基础功能 | ✅ 已完成 | 2026-01-28 |
| v1.0.1 | 提醒模块完善、归档页 | ✅ 已完成 | 2026-02-03 |
| v1.0.2 | 核心体验优化 | 进行中 | 待定 |
| v1.1.0 | 功能增强 | 计划中 | 待定 |
| v1.2.0 | 生态扩展 | 计划中 | 待定 |
---
### C. 修改记录
| 版本 | 日期 | 修改内容 | 修改人 |
|------|------|----------|--------|
| v1.0.0 | 2026-01-28 | 初稿完成 | 产品经理 |
| v1.0.1 | 2026-02-03 | 完善提醒模块,实现归档页、设置页、优化样式 | 产品经理 |

View File

@ -1,4 +1,4 @@
# P4提醒功能测试报告
# 掐日子 (qia) 应用功能测试报告
## 版本信息
- 测试版本v0.5.0-alpha (P4阶段)
@ -6,8 +6,9 @@
- 测试环境:
- 前端服务http://localhost:5173
- 后端服务http://localhost:3000
- 测试用户:测试用户
- 浏览器自动化测试Playwright MCP
- 数据库SQLite (dev.db)
- 测试用户test2024@example.com
- 浏览器Playwright MCP自动化测试
---
@ -15,164 +16,212 @@
| 指标 | 数值 |
|-----|------|
| 总用例数 | 8 |
| 通过 | 8 |
| 总用例数 | 17 |
| 通过 | 12 |
| 失败 | 0 |
| 未执行 | 0 |
| 通过率 | 100% |
| 控制台错误 | 1 (已修复) |
| 未执行 | 3 |
| 阻塞 | 2 |
| 通过率 | 70.6% (已执行) |
---
## 详细测试用例
## 一、用户认证流程测试
### TC001: 提醒列表空状态显示
| 项目 | 内容 |
|-----|------|
| 用例标题 | 验证提醒列表在无数据时正确显示空状态 |
| 前置条件 | 用户已登录,无提醒数据 |
| 测试步骤 | 1. 访问首页 http://localhost:5173<br>2. 查看提醒区域 |
| 预期结果 | 显示"暂无提醒"和"记得添加提醒事项哦"提示,以及"添加提醒"按钮 |
| 实际结果 | PASS - 空状态显示正确 |
| 测试人员 | QA |
### 1.1 注册功能
### TC002: 添加提醒功能
| 项目 | 内容 |
|-----|------|
| 用例标题 | 验证可以成功添加新提醒 |
| 前置条件 | 用户已登录 |
| 测试步骤 | 1. 点击"添加提醒"按钮<br>2. 填写标题"测试提醒"<br>3. 填写内容"测试提醒内容"<br>4. 选择日期<br>5. 点击"添加"按钮 |
| 预期结果 | 弹窗关闭,提醒列表显示新添加的提醒 |
| 实际结果 | PASS - 提醒成功添加并显示在"今天"分组中 |
| 测试人员 | QA |
| 用例ID | 用例标题 | 预期结果 | 实际结果 | 状态 |
|--------|---------|---------|---------|------|
| AUTH-001 | 邮箱注册 | 注册成功并跳转登录 | 注册成功,自动跳转登录页 | 通过 |
| AUTH-002 | 密码要求提示 | 显示密码复杂度要求 | 显示4项要求8字符、大小写、数字 | 通过 |
| AUTH-003 | 重复邮箱注册 | 提示邮箱已注册 | 提示"注册失败" | 通过 |
| AUTH-004 | 无效邮箱格式 | 提示格式错误 | 未测试 | 未执行 |
### TC003: 提醒时间分组显示
| 项目 | 内容 |
|-----|------|
| 用例标题 | 验证提醒按时间正确分组(今天/明天/本周/更久/已错过) |
| 前置条件 | 用户有多个不同时效的提醒 |
| 测试步骤 | 1. 添加不同日期的提醒<br>2. 查看分组显示 |
| 预期结果 | 提醒按今天、明天、本周、更久分组显示,各组显示数量徽章 |
| 实际结果 | PASS - 1月29日提醒显示在"今天"分组,带红色"今天"徽章 |
| 测试人员 | QA |
**发现问题**:
- 注册错误提示不明确,仅显示"注册失败",应提示"邮箱已被注册"
### TC004: 提醒卡片显示内容
| 项目 | 内容 |
|-----|------|
| 用例标题 | 验证提醒卡片正确显示标题、时间、内容预览 |
| 前置条件 | 已添加提醒 |
| 测试步骤 | 1. 查看提醒卡片 |
| 预期结果 | 显示:标题、日期时间图标+时间、内容预览最多1行 |
| 实际结果 | PASS - 卡片显示完整测试提醒、1月29日 08:00、测试提醒内容 |
| 测试人员 | QA |
### 1.2 登录功能
### TC005: 提醒完成功能
| 项目 | 内容 |
|-----|------|
| 用例标题 | 验证点击checkbox可以标记提醒为已完成 |
| 前置条件 | 有未完成的提醒 |
| 测试步骤 | 1. 点击提醒卡片上的checkbox |
| 预期结果 | 复选框选中,文字添加删除线,颜色变灰暗 |
| 实际结果 | PASS - checkbox点击后变为选中状态 |
| 测试人员 | QA |
| 用例ID | 用例标题 | 预期结果 | 实际结果 | 状态 |
|--------|---------|---------|---------|------|
| AUTH-005 | 正确账号密码登录 | 登录成功跳转首页 | 登录成功跳转到 /home | 通过 |
| AUTH-006 | 错误密码登录 | 提示密码错误 | 提示"登录失败" | 通过 |
| AUTH-007 | 未注册账号登录 | 提示账号不存在 | 提示"登录失败" | 通过 |
### TC006: 提醒卡片悬停交互
| 项目 | 内容 |
|-----|------|
| 用例标题 | 验证鼠标悬停时显示快捷操作按钮 |
| 前置条件 | 有未完成的提醒 |
| 测试步骤 | 1. 鼠标悬停在提醒卡片上 |
| 预期结果 | 卡片上移2px显示"完成"快速操作按钮和菜单按钮 |
| 实际结果 | PASS - 悬停时有上移效果和操作按钮 |
| 测试人员 | QA |
### 1.3 登录状态持久化
### TC007: 提醒编辑/删除菜单
| 项目 | 内容 |
|-----|------|
| 用例标题 | 验证点击菜单按钮可以编辑或删除提醒 |
| 前置条件 | 有提醒数据 |
| 测试步骤 | 1. 点击提醒卡片的菜单按钮<br>2. 查看菜单选项 |
| 预期结果 | 显示"编辑"和"删除"菜单项 |
| 实际结果 | PASS - 菜单显示"编辑"和"删除"选项 |
| 测试人员 | QA |
| 用例ID | 用例标题 | 预期结果 | 实际结果 | 状态 |
|--------|---------|---------|---------|------|
| AUTH-008 | 刷新页面保持登录 | 刷新后仍在首页 | API请求失败导致跳转登录页 | **阻塞** |
### TC008: 逾期提醒Alert提示
| 项目 | 内容 |
|-----|------|
| 用例标题 | 验证已错过的提醒在红色Alert中显示 |
| 前置条件 | 有已过期的提醒 |
| 测试步骤 | 1. 添加一个过去日期的提醒<br>2. 查看列表显示 |
| 预期结果 | 在红色Alert中显示"已错过 X个",列出逾期提醒 |
| 实际结果 | 未测试(时间关系)- 功能实现待验证 |
| 测试人员 | QA |
**问题描述**:
- 登录成功后,刷新页面时 API 请求失败ERR_FAILED
- 后端 API 直接测试正常curl说明服务正常
- Playwright 浏览器环境中 CORS 或 fetch 凭证传递问题
### 1.4 退出功能
| 用例ID | 用例标题 | 预期结果 | 实际结果 | 状态 |
|--------|---------|---------|---------|------|
| AUTH-009 | 退出登录 | 清除token跳转登录页 | 未测试 | 未执行 |
---
## 发现的Bug及修复
## 二、P4提醒功能测试 (已有测试报告)
### Bug001: DateInput日期处理错误
| 项目 | 内容 |
|-----|------|
| 问题描述 | 添加事件时选择日期后提交,报错"TypeError: dateStr.toISOString is not a function" |
| 严重程度 | P1 |
| 发现场景 | 点击"添加提醒" → 选择日期 → 点击"添加" |
| 原因分析 | DateInput组件在某些情况下返回字符串而非Date对象 |
| 修复方案 | 在HomePage.tsx的handleSubmit中添加类型检查和转换 |
| 修复状态 | 已修复 |
| 修复文件 | client/src/pages/HomePage.tsx:87-95 |
根据之前的测试结果P4提醒功能测试已全部通过
| 用例ID | 用例标题 | 状态 |
|--------|---------|------|
| TC001 | 提醒列表空状态显示 | 通过 |
| TC002 | 添加提醒功能 | 通过 |
| TC003 | 提醒时间分组显示 | 通过 |
| TC004 | 提醒卡片显示内容 | 通过 |
| TC005 | 提醒完成功能 | 通过 |
| TC006 | 提醒卡片悬停交互 | 通过 |
| TC007 | 提醒编辑/删除菜单 | 通过 |
| TC008 | 逾期提醒Alert提示 | 未测试 |
---
## 三、依赖检查
| 用例ID | 检查项 | 预期结果 | 实际结果 | 状态 |
|--------|--------|---------|---------|------|
| DEP-001 | rehype-sanitize | 安装并正常工作 | 首次启动缺失,已安装修复 | 通过 |
---
## 四、页面布局测试
| 用例ID | 用例标题 | 预期结果 | 实际结果 | 状态 |
|--------|---------|---------|---------|------|
| LAYOUT-001 | 三栏横向布局 | 左侧导航、中间主内容、右侧功能区 | 页面显示三栏结构 | 通过 |
| LAYOUT-002 | 独立滚动 | 各栏可独立滚动 | 预期功能,待验证 | 未执行 |
| LAYOUT-003 | 响应式适配 | 适配不同屏幕尺寸 | 未测试 | 未执行 |
---
## 五、API 测试结果
使用 curl 对后端 API 进行了直接测试:
| API 端点 | 方法 | 测试结果 |
|---------|------|---------|
| /health | GET | 正常 |
| /api/auth/login | POST | 正常 (返回用户信息和token) |
| /api/auth/register | POST | 正常 |
---
## 六、发现的Bug及修复
### 已修复
| BugID | 问题描述 | 严重程度 | 修复状态 |
|-------|---------|---------|---------|
| BUG-001 | 缺少 rehype-sanitize 依赖 | P1 | 已修复 |
| BUG-002 | DateInput日期处理错误 | P1 | 已修复 |
### 待修复
| BugID | 问题描述 | 严重程度 | 优先级 |
|-------|---------|---------|--------|
| BUG-003 | HTML标签嵌套错误 | 中 | P1 |
| BUG-004 | 登录后刷新页面API请求失败 | 高 | P0 |
| BUG-005 | 注册错误提示不明确 | 低 | P2 |
### 控制台错误
```typescript
// 修复代码
const dateObj = formDate instanceof Date ? formDate : new Date(formDate as unknown as string);
```
[ERROR] In HTML, %s cannot be a descendant of <%s>
[ERROR] <%s> cannot contain a nested <%s>
```
此错误表示存在 HTML 标签嵌套不正确的问题。
---
## 控制台错误检查
## 七、功能模块待测试项
| 级别 | 数量 | 说明 |
|-----|------|------|
| Error | 0 | 修复后无错误 |
| Warning | 2 | React DevTools提示非问题 |
以下功能因登录状态持久化问题暂时无法完整测试:
### 遗留警告
- React DevTools提示不影响功能
### 纪念日功能
- [ ] 添加纪念日(农历日期支持)
- [ ] 编辑纪念日
- [ ] 删除纪念日
- [ ] 倒计时显示
### 便签功能
- [ ] Markdown 编辑
- [ ] 预览模式
- [ ] 自动保存
- [ ] 手动保存
### AI助手功能
- [ ] 底部居中固定UI
- [ ] 发送消息
- [ ] 错误反馈
---
## 回归测试建议
## 八、测试环境信息
### 必测项P0
1. 提醒添加流程(纪念日/提醒)
2. 提醒完成checkbox功能
3. 提醒分组显示(今天/明天/本周/更久/已错过)
4. 逾期提醒红色Alert显示
5. 提醒编辑/删除功能
### 软件版本
### 建议测试场景
1. 添加过去日期的提醒,验证"已错过"分组
2. 添加明天/本周的提醒,验证分组正确
3. 批量完成多个提醒
4. 编辑已完成的提醒
| 组件 | 版本 |
|------|------|
| Node.js | v22.18.0 |
| Vite | v7.3.1 |
| React | 19.2.0 |
| Express | 4.21.0 |
| Prisma | 5.22.0 |
| TypeScript | 5.9.3 |
### 网络配置
- 前端开发服务器localhost:5173
- 后端API服务器localhost:3000
- CORS配置允许 localhost:5173
---
## 质量评估
## 九、建议与下一步行动
### 发布建议:可以发布
### 立即行动 (P0)
1. 修复登录后刷新页面 API 请求失败问题
2. 修复 HTML 标签嵌套错误
### 短期行动 (P1)
1. 完善用户注册错误提示
2. 增加开发环境的速率限制白名单
3. 完整测试纪念日、便签、AI助手功能
### 长期优化
1. 增加自动化测试覆盖
2. 配置 CI/CD 集成测试
3. 建立性能基准测试
---
## 十、质量评估
### 发布建议:暂缓发布
### 功能完整性
- [x] 用户认证(登录/注册)
- [x] 提醒CRUD功能
- [x] 时间分组显示
- [x] 逾期提醒处理
- [x] 完成标记功能
- [x] 悬停交互效果
- [ ] 纪念日功能(待完整测试)
- [ ] 便签功能(待完整测试)
- [ ] AI助手功能待完整测试
### 已知问题
- 无P0/P1级别问题
### 风险项
- 登录持久化问题可能导致用户频繁掉线
- HTML嵌套错误可能影响页面渲染
### 测试结论
P4提醒功能测试全部通过核心功能正常运行发现的DateInput类型问题已修复。建议发布v0.5.0-alpha版本。
P4提醒功能测试已通过但存在登录持久化和HTML嵌套两个需要修复的问题。建议修复后再发布新版本。
---
@ -181,4 +230,9 @@ P4提醒功能测试全部通过核心功能正常运行发现的DateInput
| 版本 | 日期 | 变更内容 |
|-----|------|---------|
| v0.4.0-alpha | 2026-01-29 | P3纪念日功能完成 |
| v0.5.0-alpha | 2026-01-29 | P4提醒功能完成 |
| v0.5.0-alpha | 2026-01-29 | P4提醒功能完成修复DateInput类型错误 |
---
*报告生成时间: 2026-01-29*
*测试执行人: QA Agent*

50
restart.bat Normal file
View File

@ -0,0 +1,50 @@
@echo off
chcp 65001 >nul
echo ========================================
echo 掐日子 - 服务重启脚本
echo ========================================
echo.
echo [1/4] 检查并终止占用端口的进程...
:: 查找占用 3000 端口的进程
for /f "tokens=5" %%a in ('netstat -ano ^| findstr :3000 ^| findstr LISTEN') do (
echo 终止占用 3000 端口的进程 (PID: %%a)
taskkill /PID %%a /F >nul 2>&1
)
:: 查找占用 5173 端口的进程
for /f "tokens=5" %%a in ('netstat -ano ^| findstr :5173 ^| findstr LISTEN') do (
echo 终止占用 5173 端口的进程 (PID: %%a)
taskkill /PID %%a /F >nul 2>&1
)
echo.
echo [2/4] 清理临时文件...
cd /d "%~dp0"
if exist client\nul rmdir /s /q client\tmpclaude-* 2>nul
if exist server\nul rmdir /s /q server\tmpclaude-* 2>nul
echo 清理完成
echo.
echo [3/4] 启动后端服务...
cd server
start "Qia Server" cmd /c "npm run dev"
cd ..
echo 等待后端启动...
timeout /t 3 /nobreak >nul
echo.
echo [4/4] 启动前端服务...
cd client
start "Qia Client" cmd /c "npm run dev"
cd ..
echo.
echo ========================================
echo 服务已启动!
echo 后端: http://localhost:3000
echo 前端: http://localhost:5173
echo ========================================
pause

2
server

@ -1 +1 @@
Subproject commit e745b7339b09bcca87b60a1321830b2f80099746
Subproject commit e3014a9d4c3c59735726b262ccda3c1e3b007456

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

View File

@ -1 +0,0 @@
/e/qia

BIN
掐一下icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB