fix: evaluation report P0/P1/P2 fixes, remove Docker, add upload UI

Backend:
- Add NotFoundException + BusinessException, return correct HTTP status (404/400)
- Add @Index on reports.project_id and reports.upload_time
- Add fileSize column to reports, populate on upload, return in DTO
- Cascade delete: deleting project now removes all reports (DB + files + PDFs)
- Delete report: also clean up pre-rendered PDF
- File upload MIME validation (extension + Content-Type)
- Remove duplicate @ExceptionHandler from ReportController
- Switch from System.err to SLF4J logger
- Handle MethodArgumentNotValid, MissingServletRequestPart, etc.

Frontend:
- Remove all Docker files (project uses 宝塔 panel deployment)
- Upgrade axios 1.6.8 -> 1.7.7 (CVE-2024-39338)
- Remove unused @vue-office/pptx + vue-demi (see CHANGELOG for rationale)
- Fix vite proxy port 37821 -> 30081
- Remove mock data fallback in production
- Add upload report UI (button + modal in ProjectDetail)
- Add create project UI (button + modal in ProjectList)
- Add filename search box in ProjectDetail
- New useApi methods: createProject, uploadReport, deleteProject, deleteReport
- FilePreview/ReportCard: show fileSize (was undefined before)

Docs:
- Add README.md (overview, quick start, structure)
- Add CHANGELOG.md (full change log + pptx removal rationale)
- Include EVALUATION_REPORT.md and blog-vibe-coding.md

Tests:
- All 73 backend tests pass
- All 43 frontend tests pass
- Updated test fixtures for new API contract
This commit is contained in:
2026-06-01 21:35:13 +08:00
parent 7000c186e2
commit afcd18c54f
77 changed files with 1498 additions and 2886 deletions
+116
View File
@@ -0,0 +1,116 @@
# publish(AI日报分发平台)评测报告
**评测时间**2026-06-01 08:27
**项目路径**`D:\Idea Project\publish`
**项目定位**:AI日报私有化分发平台,单用户使用,无登录系统
**技术栈**Spring Boot 3.2.5 + Vue 3.4 + SQLite + Docker + nginx
---
## 综合评分
| 维度 | 评分 | 状态 |
|------|------|------|
| 代码质量与架构 | 69/100 | ✅ verifier通过(95%准确率) |
| 产品设计与用户体验 | P0×1 / P1×5+ | ✅ verifier通过 |
---
## 一、代码质量与架构评测 — 69/100
### P0 严重(必须修复)
**1. axios 已知漏洞**
- 存在已知 CVE,需升级 axios 版本
- **修复**:检查 `package.json` / `pom.xml` 确认具体版本
**2. `reports.project_id` 无数据库索引**
- 查询报表列表时 `WHERE project_id` 无索引,性能瓶颈
- **修复**:添加索引 `CREATE INDEX idx_reports_project_id ON reports(project_id)`
**3. 级联删除缺失**
- 删除项目后,`reports` 中的关联记录变成孤立数据
- **修复**JPA entity 添加 `@OnDelete(DeleteAction.CASCADE)` 或手动清理
### P1 高风险
| # | 问题 | 说明 |
|---|------|------|
| 1 | `ddl-auto: update` 生产危险 | 字段变更可能导致数据丢失 |
| 2 | exception handler 重复 | 各 controller 重复 try-catch,应统一 |
| 3 | N+1 查询 | 列表查询未做 JOIN FETCH |
| 4 | 文件上传 MIME 校验缺失 | 仅检查后缀,类型可伪造 |
| 5 | 无单元/集成测试 | 核心业务逻辑无测试覆盖 |
### 误报修正(verifier 发现)
- ❌ 端口冲突(30081 vs 37821)→ 实际不冲突,30081 在 Docker 内被正确忽略
- ❌ iframe sandbox 安全gap → iframe sandbox 默认阻止脚本,实际安全
- ✅ vite proxy 与后端端口不一致 → 确认需使用 docker-compose 端口
### 亮点
- ✅ HTML iframe sandbox 隔离(安全)
- ✅ PPTX 转 PDF 预渲染机制(阅读体验好)
- ✅ API 文档完整(API.md
- ✅ 分层清晰(controller → service → repository
- ✅ 私有化部署完整(Dockerfile + docker-compose + nginx
---
## 二、产品设计与用户体验评测
### P0 致命(阻塞性)
**前端完全缺失上传报告 UI**
- 后端 API 完整(`POST /api/reports` + multipart 上传)
- **前端 UI 断链**:用户打开页面只能看,无法发布报告
- 这与「发布平台」的定位根本矛盾
- **修复**:补充前端上传 UIfile input + project selector + submit button
### P1 高风险
| # | 问题 | 说明 |
|---|------|------|
| 1 | 报告管理无搜索/筛选 | 报告多了无法快速找到 |
| 2 | Docker volume 路径硬编码 | 部署时路径不灵活 |
| 3 | 单用户场景无密码保护 | 虽无认证需求,但文件上传无任何保护 |
| 4 | 报告阅读体验优秀 | HTML/MD/PPTX 预览完整,视觉质量高 |
### 亮点
- ✅ 阅读体验:HTML/MD/PPTX 预览完整,视觉质量高
- ✅ Docker 一键部署基本可用
- ✅ 无登录需求判断正确(单用户私有化)
---
## 修复优先级
### 本周(阻塞项)
1. **补充前端上传 UI**P0,平台核心功能缺失)
2. **升级 axios**P0,安全漏洞)
3. **添加 reports.project_id 索引**P0,性能)
### 下月(重要)
1. 级联删除修复
2. 文件上传 MIME 校验
3. 添加基础测试覆盖
---
## 关键文件索引
| 文件 | 作用 |
|------|------|
| `src/main/java/.../controller/ReportController.java` | 报告 API(上传/列表/详情/删除) |
| `src/main/java/.../entity/Report.java` | 报告实体(无索引) |
| `src/main/java/.../config/` | CORS + Docker 配置 |
| `frontend/src/views/` | Vue 前端视图(缺上传页) |
| `docker-compose.yml` | 容器编排(缺 health check |
| `nginx.conf` | 前端反向代理配置 |
| `deploy/package.ps1` | 部署打包脚本 |
---
*报告生成时间:2026-06-01 08:33Cycle 1 · 代码+产品设计 verifier 均通过)*