--- sidebar_position: 11 title: 实现进度 sidebar_label: 实现进度 description: Plaza 各 Sprint 任务状态、依赖关系与验收记录 --- # 实现进度 最后更新:2026-06-13(差距补齐修订) ## 当前阶段 **Sprint 5 — 运营后台**(MVP 可用,规格补全中) 目标:内容审核、举报、精选、创作者管理与数据看板可用。 ## 状态图例 | 标记 | 含义 | | --- | --- | | ✅ | 代码已实现且本地验证通过 | | ⚠️ | 部分实现或仅单元测试覆盖 | | ⏳ | 未实现或需生产/联调验收 | | 🔧 | 本次修订中补齐 | ## 总体状态 | 模块 | 状态 | 说明 | | --- | --- | --- | | Sprint 1–4 主链路 | ✅ | 发布、互动、热度、SEO MVP | | DB:reports / featured / audit | ✅ | `schema.sql` Sprint 5 | | 后端 `/api/ops/v1/*` | ✅ | `plaza-ops.mjs` | | 公开举报 API | ✅ | 帖子 + 评论举报 | | Feed 精选合并 | ✅ | trending + `category_top` 分类置顶 | | 前端 `ui/ops/` | ⚠️ | 五页可用;看板图表待增强 | | 运营审核 | ✅ | ops 路径 + admin 路径均写 audit log | | OpenAPI 同步 | ✅ | `ui/h5/openapi.json` + `just check-h5-openapi-schema` | | E2E / 集成测试 | ⚠️ | MySQL 集成 3 项;Playwright E2E 未做 | | CI plaza 任务 | ✅ | `h5-plaza` job(MySQL service + build) | ## 差距追踪(P0–P3) ### P0 — 文档与契约对齐(2026-06-13 已补齐) | 项 | 状态 | | --- | --- | | `08-development-guide` 勾选与 10 一致 | ✅ | | `04-backend-api` `ops_admin` 命名 | ✅ | | `07-seo` 渲染策略与实现对齐 | ✅ | ### P1 — 产品完整性(2026-06-13 已补齐) | 项 | 状态 | | --- | --- | | 二级评论展示(`parent_id` 回复树) | ✅ | | MindSpace 发布:封面 + 允许评论 | ✅ | | Plaza 帖子/评论举报 UI | ✅ | | 分享写入 `share_count` | ✅ | | 分类 Feed 合并 `category_top` | ✅ | | 首页/分类 JSON-LD | ✅ | | `PostGridSkeleton` 接入 loading | ✅ | | Ops 审核 Tab + 批量通过 | ✅ | | admin 审核写 `ops_audit_log` | ✅ | ### P2 — 质量与可持续 | 项 | 状态 | | --- | --- | | MySQL 集成测试(发布→审核→Feed) | ✅ `plaza-integration.test.mjs` | | CI:`plaza-*.test.mjs` + `ui/plaza`/`ui/ops` build | ✅ `.github/workflows/ci.yml` `h5-plaza` job | | OpenAPI 片段生成 | ✅ `ui/h5/openapi.json` 含 Plaza/Ops | | 权限/越权路径测试 | ⚠️ 集成测试覆盖 hide/duplicate;完整矩阵待补 | ### P3 — 增强(后续) | 项 | 状态 | | --- | --- | | Redis 点赞 INCR + 同步 | ⏳ | | 微信 JS-SDK 分享 | ⏳ | | 看板图表 / 小时预聚合表 | ⏳ | | 审核拒绝站内通知 | ⏳ | | `ops_audit_log` 180 天清理 | ⏳ | | 同域 Cookie 联调(:3001/:8080) | ⏳ | | 生产 Redis / 百度推送 / Nginx `/ops` | ⏳ | --- ## Sprint 1 任务拆分 按依赖顺序执行;完成后在「验收」列打勾。 ### Phase A — 数据库(阻塞后续) | ID | 任务 | 文件 | 状态 | | --- | --- | --- | --- | | S1-A1 | `plaza_categories` 表 + 8 条初始分类 | `ui/h5/schema.sql` | ✅ | | S1-A2 | `plaza_posts` 表 + 索引 | `ui/h5/schema.sql` | ✅ | | S1-A3 | `h5_publish_records.plaza_view/like_count` | `ui/h5/db.mjs` | ✅ | | S1-A4 | 迁移幂等验证 | `plaza-integration.test.mjs` + CI MySQL | ✅ | ### Phase B — 后端 API | ID | 任务 | 文件 | 状态 | | --- | --- | --- | --- | | S1-B1 | `createPlazaPostService` repository + service | `ui/h5/plaza-posts.mjs` | ✅ | | S1-B2 | `GET /api/plaza/v1/categories` | `server.mjs` | ✅ | | S1-B3 | `GET /api/plaza/v1/feed`(hot/new,仅 published) | `server.mjs` | ✅ | | S1-B4 | `GET /api/plaza/v1/posts/:id` | `server.mjs` | ✅ | | S1-B5 | `POST /api/plaza/v1/posts` | `server.mjs` | ✅ | | S1-B6 | `PATCH /api/plaza/v1/posts/:id` | `server.mjs` | ✅ | | S1-B7 | `DELETE /api/plaza/v1/posts/:id`(hidden) | `server.mjs` | ✅ | | S1-B8 | publication offline → `plaza_posts.hidden` | `mindspace-publications.mjs` | ✅ | | S1-B9 | 单元/集成测试 | `plaza-posts.test.mjs` | ✅ 单元 | | S1-B10 | OpenAPI 片段更新 | `ui/h5/openapi.json` / generate script | ✅ | ### Phase C — Plaza 前端(Next.js) | ID | 任务 | 文件 | 状态 | | --- | --- | --- | --- | | S1-C1 | 初始化 `ui/plaza` 项目 | `ui/plaza/` | ✅ | | S1-C2 | `/plaza` 首页 SSR + PostGrid | `app/plaza/page.tsx` | ✅ | | S1-C3 | `/plaza/cat/[slug]` | `app/plaza/cat/` | ✅ | | S1-C4 | `/plaza/p/[id]` + iframe embed | `app/plaza/p/` | ✅ | | S1-C5 | `lib/metadata.ts` + 07-seo 规范 | `lib/` | ✅ | | S1-C6 | PostCard 全状态 | `components/` | ✅ | ### Phase D — MindSpace 集成 | ID | 任务 | 文件 | 状态 | | --- | --- | --- | --- | | S1-D1 | 页面详情「发布到广场」对话框 | H5 页面详情组件 | ✅ | | S1-D2 | 调用 `POST /api/plaza/v1/posts` | H5 API 封装 | ✅ | | S1-D3 | 最小审核:auto-approve 或 admin 通过 | env / admin | ✅ | ### Sprint 1 出口验收 - [x] `POST` 发布 → `pending_review` → 审核 → `published` → `GET /feed` 可见(本地 `PLAZA_AUTO_APPROVE`) - [x] 帖子详情 SSR 含标题与 embed - [x] offline publication → `plaza_posts.status = hidden` → feed 不可见 - [x] `node --test plaza-posts.test.mjs` 通过 --- ## Sprint 2 任务拆分 ### Phase A — 数据库 | ID | 任务 | 文件 | 状态 | | --- | --- | --- | --- | | S2-A1 | `plaza_reactions` | `schema.sql` | ✅ | | S2-A2 | `plaza_comments` + `plaza_comment_reactions` | `schema.sql` | ✅ | | S2-A3 | `plaza_follows` | `schema.sql` | ✅ | ### Phase B — 后端 API | ID | 任务 | 文件 | 状态 | | --- | --- | --- | --- | | S2-B1 | `plaza-interactions.mjs` service | `ui/h5/` | ✅ | | S2-B2 | POST/DELETE `/posts/:id/reactions` | `server.mjs` | ✅ | | S2-B3 | GET/POST `/posts/:id/comments` | `server.mjs` | ✅ | | S2-B4 | POST `/comments/:id/reactions` | `server.mjs` | ✅ | | S2-B5 | GET `/users/:slug` + `/posts` + follow | `server.mjs` | ✅ | | S2-B6 | `viewer_reacted` 注入 feed/detail | `plaza-posts.mjs` | ✅ | | S2-B7 | 单元测试 | `plaza-interactions.test.mjs` | ✅ | ### Phase C — Plaza 前端 | ID | 任务 | 文件 | 状态 | | --- | --- | --- | --- | | S2-C1 | `PostActions`(点赞/收藏/分享) | `components/post/` | ✅ | | S2-C2 | `CommentSection` + 登录引导 | `components/comment/` | ✅ | | S2-C3 | `FollowButton` + `UserCard` | `components/user/` | ✅ | | S2-C4 | `/u/[slug]` 用户主页 | `app/u/` | ✅ | | S2-C5 | 帖子详情接入互动 | `app/plaza/p/[id]/` | ✅ | | S2-C6 | `pnpm build` 通过 | `ui/plaza/` | ✅ | ### Sprint 2 出口验收 - [x] 点赞/收藏 API + 前端 optimistic 切换 - [x] 评论列表/发布/点赞 - [x] 关注/取关 + 用户主页作品网格 - [x] 未登录触发 `LoginPrompt` 浮层 - [ ] 同域 Cookie 联调(本地 `:3001` / `:8080` 需反向代理) --- ## Sprint 3 任务拆分 ### Phase A — 数据库与算法 | ID | 任务 | 文件 | 状态 | | --- | --- | --- | --- | | S3-A1 | `plaza_algorithm_config` 表 + 默认权重 | `schema.sql` | ✅ | | S3-A2 | `computeHotScore` + 48h 重算任务 | `plaza-algorithm.mjs` | ✅ | | S3-A3 | 发布/审核通过时写入初始 `hot_score` | `plaza-posts.mjs` | ✅ | ### Phase B — Redis 与定时任务 | ID | 任务 | 文件 | 状态 | | --- | --- | --- | --- | | S3-B1 | Redis 浏览 INCR + IP 24h 去重 | `plaza-redis.mjs` | ✅ | | S3-B2 | 5 分钟计数同步 MySQL | `plaza-tasks.mjs` | ✅ | | S3-B3 | Feed 缓存(hot 5min / new 60s) | `plaza-redis.mjs` + `plaza-posts.mjs` | ✅ | | S3-B4 | publication 统计每小时回写 | `plaza-tasks.mjs` | ✅ | | S3-B5 | 评论频率限制(10 条/小时/帖) | `plaza-interactions.mjs` | ✅ | | S3-B6 | GET 帖子详情记录浏览 | `server.mjs` | ✅ | | S3-B7 | 单元测试 | `plaza-algorithm.test.mjs` | ✅ | ### Phase C — 前端 | ID | 任务 | 文件 | 状态 | | --- | --- | --- | --- | | S3-C1 | Feed 无限滚动(IntersectionObserver) | `FeedLoadMore.tsx` | ✅ | | S3-C2 | FeedTabs / CategoryNav / MobileNav | Sprint 1 已有 | ✅ | ### Sprint 3 出口验收 - [x] 热门 Feed 按 `hot_score DESC` 排序 - [x] 热度公式与文档示例一致(单元测试 ±0.05) - [x] 同一 IP 24h 内对同一帖子只计 1 次浏览(Redis 或进程内降级) - [x] `PLAZA_REDIS_URL` 未配置时 MySQL 降级可用 - [ ] 生产 Redis + 多实例 IP 去重联调 --- ## Sprint 4 任务拆分 ### Phase A — 后端 SEO / 归因 | ID | 任务 | 文件 | 状态 | | --- | --- | --- | --- | | S4-A1 | `plaza_attribution_events` 表 | `schema.sql` | ✅ | | S4-A2 | `GET /api/plaza/v1/seo/sitemap` | `plaza-seo.mjs` | ✅ | | S4-A3 | `POST /api/plaza/v1/attribution/events` | `plaza-seo.mjs` | ✅ | | S4-A4 | 发布时百度 URL 推送 | `plaza-seo.mjs` + `plaza-posts.mjs` | ✅ | | S4-A5 | 注册时 signup 归因(`utm_source`) | `server.mjs` | ✅ | | S4-A6 | 单元测试 | `plaza-seo.test.mjs` | ✅ | ### Phase B — 前端 SEO | ID | 任务 | 文件 | 状态 | | --- | --- | --- | --- | | S4-B1 | `app/sitemap.ts` | `ui/plaza/` | ✅ | | S4-B2 | 动态 OG 图(无封面兜底) | `opengraph-image.tsx` | ✅ | | S4-B3 | 用户主页 JSON-LD | `lib/metadata.ts` | ✅ | | S4-B4 | UTM 落地追踪 | `AttributionTracker.tsx` | ✅ | | S4-B5 | 分享:链接 + OG 图预览 | `PostActions.tsx` | ✅ | | S4-B6 | Footer/登录 UTM 统一 helper | `lib/utm.ts` | ✅ | | S4-B7 | 首屏图片 priority + 骨架屏组件 | `PostCard` / `PostGridSkeleton` | ✅ | ### Sprint 4 出口验收 - [x] `/sitemap.xml` 生成(含分类/帖子/用户 URL) - [x] `robots.txt` 声明 sitemap - [x] 无封面帖子有动态 OG 图 - [x] UTM landing 事件写入 DB - [ ] 生产配置 `PLAZA_BAIDU_PUSH_TOKEN` 并验证推送 - [ ] Google Search Console 提交 sitemap(运维操作) --- ## 环境变量 | 变量 | 默认 | 说明 | | --- | --- | --- | | `PLAZA_AUTO_APPROVE` | `false` | 开发环境 `true` 时扫描通过后自动 `published` | | `PLAZA_REDIS_URL` | - | Redis 浏览计数、Feed 缓存、评论限流 | | `PLAZA_PUBLIC_BASE` | `https://go.tkmind.cn` | 百度推送与 sitemap 公开 URL 前缀 | | `PLAZA_BAIDU_SITE` | `go.tkmind.cn` | 百度搜索资源平台站点 | | `PLAZA_BAIDU_PUSH_TOKEN` | - | 配置后新帖发布自动推送百度 | --- ## Sprint 5 任务拆分 ### Phase A — 数据库与后端 | ID | 任务 | 文件 | 状态 | | --- | --- | --- | --- | | S5-A1 | `plaza_reports` / `plaza_featured` / `ops_audit_log` | `schema.sql` | ✅ | | S5-A2 | `plaza-ops.mjs` service | `ui/h5/` | ✅ | | S5-A3 | `/api/ops/v1/review/*` | `server.mjs` | ✅ | | S5-A4 | `/api/ops/v1/reports/*` + 公开举报 | `server.mjs` | ✅ | | S5-A5 | `/api/ops/v1/featured` | `server.mjs` | ✅ | | S5-A6 | `/api/ops/v1/analytics/overview` | `server.mjs` | ✅ | | S5-A7 | `/api/ops/v1/creators` | `server.mjs` | ✅ | | S5-A8 | Feed 精选合并 | `plaza-posts.mjs` | ✅ | | S5-A9 | 单元测试 | `plaza-ops.test.mjs` | ✅ | ### Phase B — 运营前端 `ui/ops/` | ID | 任务 | 文件 | 状态 | | --- | --- | --- | --- | | S5-B1 | Vite 项目初始化 | `ui/ops/` | ✅ | | S5-B2 | 审核队列页 | `ReviewPage.tsx` | ✅ | | S5-B3 | 举报处理页 | `ReportsPage.tsx` | ✅ | | S5-B4 | 精选管理页 | `FeaturedPage.tsx` | ✅ | | S5-B5 | 数据看板 | `AnalyticsPage.tsx` | ✅ | | S5-B6 | 创作者管理 | `CreatorsPage.tsx` | ✅ | | S5-B7 | Plaza 首页精选轮播 | `FeaturedBanner.tsx` | ✅ | ### Sprint 5 出口验收 - [x] 审核通过/拒绝写入 `ops_audit_log` - [x] ops_role 权限校验(reviewer / editor / ops_admin) - [x] 精选帖在首页 banner 与 hot feed 中展示 - [x] `pnpm build`(ui/ops)通过 - [ ] 生产 Nginx `/ops` 内网限制 - [ ] 为运营账号分配 `ops_role` ### 本地启动 ```bash # 后端 cd ui/h5 && PLAZA_AUTO_APPROVE=false node server.mjs # 运营后台 cd ui/ops && pnpm dev # http://localhost:3002/ops ``` 运营账号需在 DB 中设置:`UPDATE h5_users SET ops_role='reviewer' WHERE username='...'` --- ## 变更日志 ### 2026-06-13(P2 质量) - 新增 `plaza-integration.test.mjs`(MySQL:发布→审核→Feed、越权 hide、重复发布)。 - `ui/h5/openapi.json` 纳入 Plaza + Ops 路由(`scripts/plaza-openapi.mjs`)。 - CI 新增 `h5-plaza` job:MySQL 8 服务、单元/集成测试、`ui/plaza`/`ui/ops` build、OpenAPI 校验。 ### 2026-06-13(差距补齐) - 文档:`08`/`04`/`07`/`10` 与实现对齐,新增差距追踪 P0–P3。 - 后端:评论举报 API、批量审核、`category_top` 分类 Feed 合并、admin 审核写 audit log。 - Plaza 前端:二级评论展示、帖子/评论举报、分享 `share_count`、首页/分类 JSON-LD、`loading.tsx` 骨架屏。 - H5:发布到广场对话框补封面 URL 与允许评论。 - Ops:审核 Tab(待审/已通过/已拒绝)+ 批量通过。 ### 2026-06-13(Sprint 5) - 新增 `plaza-ops.mjs`、ops API、`plaza_reports` / `plaza_featured` / `ops_audit_log` 表。 - 上线 `ui/ops/` 运营 SPA(审核/举报/精选/看板/创作者)。 - Feed 合并精选 trending;Plaza 首页展示 `FeaturedBanner`。 ### 2026-06-13(Sprint 4) - 新增 `plaza-seo.mjs`:sitemap 数据 API、UTM 归因、百度推送。 - Next.js:`sitemap.ts`、帖子 `opengraph-image.tsx`、用户 JSON-LD、UTM 追踪与分享增强。 ### 2026-06-13(Sprint 3) - 新增 `plaza_algorithm_config`、`plaza-algorithm.mjs`(热度公式 + 10 分钟重算)。 - 新增 `plaza-redis.mjs` / `plaza-tasks.mjs`(浏览计数、Feed 缓存、publication 回写)。 - 帖子详情 GET 自动记浏览;评论 10 条/小时/帖限流。 - 前端 `FeedLoadMore` 接入 IntersectionObserver 无限滚动。 ### 2026-06-13(Sprint 2) - 新增 `plaza_reactions` / `plaza_comments` / `plaza_follows` 表与 `plaza-interactions.mjs`。 - 实现互动 API(点赞、收藏、评论、关注)及 `viewer_reacted`。 - Plaza 前端:`PostActions`、`CommentSection`、`FollowButton`、用户主页 `/u/[slug]`,`pnpm build` 通过。 ### 2026-06-13(Sprint 1) - 文档矛盾修复:POST/PATCH 分离、物理表映射、`total_likes` 定义、Cookie 策略、Feed 精选合并、Redis 同步策略。 - 新增本文档;启动 Sprint 1 Phase A/B。 - 实现 `plaza_categories` / `plaza_posts` schema、`plaza-posts.mjs`、6 个 Plaza API、offline 联动、单元测试 4 项通过。 - 完成 `ui/plaza` Next.js(首页/分类/详情 SSR、`pnpm build` 通过)。 - H5 页面详情增加「发布到广场」流程(`listPlazaCategories` + `publishPageToPlaza`)。