Files

12 KiB
Raw Permalink Blame History

AI Directory Platform — 交付报告

基于 coolchange-ai/toolso-ai-open 二次开发的可复用 AI Directory 基础底座, 按《AI-Directory-Platform开发计划与技术设计文档》完成 MVP + V1 核心能力, 并以 五套不同 UI 的完整站点 完成底座「快速、易用、可用、可靠」验证。

  • 代码位置:AI-Directory-Platform/packages/core/(底座库)+ AI-Directory-Platform/sites/(5 个独立网站)
  • 技术栈:Next.js 16 · React 19 · TypeScript · Tailwind CSS · PostgreSQL + Drizzle ORM · Better Auth · next-intl
  • 验证状态:typecheck 0 错误 · bun test 32/32 通过 · 5 套主题全部构建成功 · 端到端交互测试 PASS

一、仓库结构(monorepo)

AI-Directory-Platform/
├── packages/core/          # @aidir/core —— AI Directory 底座库
│   ├── src/pages/          #   全部页面组件体(1:1 镜像路由树)
│   ├── src/kit/            #   站点外壳工厂(Header/Footer/chrome/首页数据)
│   ├── src/lib|features/   #   ranking/seo/analytics/voting/reviews/... 全部业务
│   ├── content/blog/       #   MDX 文章
│   ├── messages/           #   基础文案(en/zh,546 键)
│   └── scripts/            #   db/seed/生成器/启动器/e2e
└── sites/                  # 5 个独立 Next.js 网站(各自 package.json/构建/部署)
    ├── ai-stack/           #   AI Stack —— Classic 目录        :3001
    ├── launchai/           #   LaunchAI —— Product Hunt 式      :3002
    ├── the-ai-ledger/      #   The AI Ledger —— Editorial 媒体  :3003
    ├── devai-tools/        #   DevAI.tools —— 开发者垂直        :3004
    └── findai/             #   findai —— 极简搜索              :3005

每个站点应用只有三类自己的代码:

  1. src/site/brand.tsx —— 品牌/导航/页脚/SEO 文案(SiteConfig)
  2. src/site/home.tsx —— 站点首页组件
  3. src/app/** —— 薄路由(约 56 个文件,全部为 re-export 底座页面组件 + 内联路由段配置)

站点之间零重复业务代码;新增第 6 个网站 = 在生成器 SITES 里加一个条目并运行 bun packages/core/scripts/generate-site.mjs <key>,零 Core 代码修改。

一'、快速开始

cd AI-Directory-Platform

bun install                          # workspace 安装(root 一次)

# 数据库(五个网站共享同一套 PostgreSQL —— 设计文档 §42)
cd packages/core && cp .env.example .env.local && bun run db:push && bun run seed:platform && cd ../..

# 构建 5 个网站(构建时数据库需在线;构建期间不要运行站点,避免连接数耗尽)
for s in ai-stack launchai the-ai-ledger devai-tools findai; do (cd sites/$s && cp -n .env.example .env.local && bun run build); done

# 一键启动(或分别 cd sites/<name> && bun run start)
bash packages/core/scripts/start-all-sites.sh

# 注意:构建期间数据库需在线,且不要同时运行站点(Next 构建 worker 会占满 PG 连接)
# 注意:修改 .env 后需 rm -rf .next 再构建(Turbopack 构建缓存不感知 env 变化)

# 质量
bun test packages/core/tests         # 32 个单元测试
bun run typecheck                    # core + 5 站全部 0 错误

演示账号(种子内置,密码均为 password123):

账号 角色
admin@aidirectory.dev 管理员(可访问 /admin 全部后台)
alice@demo.dev 等 5 个 普通用户

二、与设计文档验收标准对照

UI(§74)

要求 状态
所有图标 SVG / Lucide,无 Emoji、Unicode 图标、字符箭头 ✅ 全部使用 lucide-react;种子分类 icon 置空;唯一例外是种子工具名 "DALL·E 3" 的 · 为产品名本身
Responsive(375/768/1280/1440 实测截图) ✅ Mobile First,Header 移动端汉堡抽屉 + 搜索
Light/Dark/System ✅ 继承底座 next-themes,全组件适配

Functional(§74 / MVP §57)

要求 实现位置
Google Login ✅ 底座已有(env 门控)
GitHub Login ✅ src/lib/auth.ts(env 门控)+ 登录页按钮
Vote ✅ src/features/voting/(登录投票、原子 toggle、滑动窗口限流 40 次/10min、乐观 UI、/api/tools/:id/vote)
Favorite ✅ 底座已有
Review ✅ src/features/reviews/(评分/优缺点/使用场景/Helpful/每用户一条/聚合评分回写)
Submit ✅ src/features/submission/(提交 → Admin 审批自动发布 → 域名重复检测)
Claim ✅ src/features/claim/(认领申请 → 审批 → Owner 徽标 + 白名单字段编辑 ownerUpdateTool)
Search ✅ /api/search(PostgreSQL 多维 ILIKE + 热度排序 + search 埋点)
Filter ✅ 分类 / 定价 / Use Case / Audience / 排序(最新、最热)
Ranking ✅ src/lib/ranking/(七个榜单 + Ranking Engine 独立)

SEO(§74 / §23 / §24 / §52)

要求 实现
SSR / ISR ✅ 全站 RSC + ISR(1h)+ 变更 revalidatePath
Metadata / Canonical / hreflang ✅ src/lib/metadata.ts(继承底座)
Sitemap ✅ src/app/sitemap.ts 扩展至 270 条:工具 / 分类 / 用例 / 受众 / 合集 / Top20 Alternatives / 对比页
Schema ✅ SoftwareApplication(+AggregateRating) / Review 数据 / FAQPage / BreadcrumbList / ItemList / CollectionPage / WebSite / Organization
Programmatic SEO ✅ src/lib/seo/page-generator.ts:由实体真实数据生成 Title/H1/Intro/FAQ(避免低质模板页:Alternatives/Comparison 只为 Top 工具生成)
内链系统 ✅ Tool ↔ Category ↔ Use Case ↔ Audience ↔ Alternatives ↔ Best ↔ Blog 的 SEO Graph

Performance(§47)

Server Components First、ISR、next/image、分页、数据库索引(vote/rating/domain 等 7 个新索引)。构建产物静态化率见构建输出(SSG 为主,交互 API 为 ƒ)。

Security(§74)

RBAC(requireAdmin/isAdmin)、Zod 全量输入校验、投票限流 + pending 唯一索引防重、认领 pending 唯一约束、Vote Audit 审计页(用户/IP/来源/速度告警)、外链 nofollow + 跳转埋点。


三、底座架构(Core 与 Site 分离)

src/
├── lib/
│   ├── ranking/          # Ranking Engine(score.ts 纯函数 + queries.ts SQL + boards.ts)
│   ├── seo/              # Programmatic SEO 页面生成器
│   ├── analytics/        # 事件埋点(recordEvent/recordToolView)
│   ├── tools/duplicate.ts# 重复工具检测(域名归一化/slug/名称)
│   └── db/schema/        # community(投票/评论/提交/认领) discovery(用例/受众/合集) analytics(事件)
├── features/             # Feature-First:voting / reviews / submission / claim / discovery / alternatives
├── themes/               # ★ Site Theme 层:registry + chrome + shared + 5 套主题
│   ├── classic/          # AI Stack —— 专业目录(Clean/Dense/Professional)
│   ├── product/          # LaunchAI —— Product Hunt 式每日发布社区
│   ├── editorial/        # The AI Ledger —— 媒体型(Featured Story/编辑精选/购买指南)
│   ├── niche/            # DevAI.tools —— 垂直(AI for Developers,终端风 Hero)
│   └── minimal/          # findai —— 极简搜索引擎(一个框 + 热门搜索)
└── app/[locale]/         # 路由:/tools /rankings /best /ai-tools-for /submit /admin/* /api/*

五套站点 = 同一套数据库、认证、Admin、Tool 模型、Vote/Review、Ranking、Search、SEO、Analytics, 只改变 Theme/Layout/Navigation/Content/Brand —— 即设计文档 §42 的验证标准。新增第 6 个站点只需 在 src/themes/ 增加一个目录并注册 registry,零 Core 代码修改。

主题在构建时注入(SITE_THEME=<id> NEXT_DIST_DIR=.next-<id> bun run build), 一次构建对应一个站点部署,SSG/ISR 性能不受影响。


四、五个网站验证结论(§41 / 最终要求)

网站 目录 线上地址 本地端口 定位 首页形态
AI Stack sites/ai-stack https://ai-stack.opentest.cc 3001 标准目录 Hero 搜索 + Trending/分类/新工具/用例/合集/评论
LaunchAI sites/launchai https://launchai.opentest.cc 3002 产品社区 今日发布 Feed + 大投票块 + Leaderboard 侧栏
The AI Ledger sites/the-ai-ledger https://the-ai-ledger.opentest.cc 3003 AI 媒体 Featured Story + 编辑精选 + 购买指南 + 社区引语
DevAI.tools sites/devai-tools https://devai-tools.opentest.cc 3004 开发者垂直 终端风 Hero + 工作流/用例/技术栈
findai sites/findai https://findai.opentest.cc 3005 极简搜索 居中大搜索框 + 热门搜索 + Trending

域名与部署:五个子域名经 ldns 配置 Cloudflare DNS(Proxied)+ Nginx 反向代理 (/etc/nginx/conf.d/<site>.conf → 127.0.0.1:300X);各站点 .env.local 的 NEXT_PUBLIC_APP_URL / BETTER_AUTH_URL 指向各自 https 域名, canonical / sitemap / JSON-LD / OAuth 回调输出均为线上域名。

验证结果:5 个网站是 5 个独立 Next.js 应用(独立 package.json、独立 .next 构建、独立进程/端口), 共享同一套 PostgreSQL / Better Auth / Admin(§42 验证标准)。站点间零 if site === "xxx" 分支; 每站均通过构建、11 条路由 × 5 站 = 55 项 200 冒烟、1440/390 双断点截图、控制台 0 报错、 登录→投票(DB 3→4→3)→重复提交检测 e2e PASS。


五、端到端验证记录

验证项 结果
19 条核心路由冒烟(含 zh、sitemap、search API、outbound 307 跳转) ✅ 全部 200
JSON-LD(SoftwareApplication+AggregateRating/FAQPage/Breadcrumb/ItemList) ✅ 详情页实测输出
Sitemap 270 条(含用例/受众/合集/alternatives/vs) ✅
登录(alice@demo.dev)→ 投票 toggle(DB 3→4→3,按钮同步) ✅ PASS
重复提交检测(提交 chatgpt.com 被拦截并列出已有工具) ✅ PASS
评论表单(已有评论回显编辑模式、星级、优缺点) ✅ 截图验证
五主题品牌/版式差异化(AI Stack/LaunchAI/The AI Ledger/DevAI.tools/findai) ✅ 截图验证
bun test(ranking 评分/贝叶斯/路由解析/域名归一化/SEO 生成器) ✅ 32/32
bun run typecheck ✅ 0 错误
bun run build × 5 主题 ✅ 全部成功

截图存档:/tmp/aidir-shots/(16 张,含移动端 390×844)。


六、API 一览(§45)

POST/DELETE /api/tools/:id/vote     投票/取消(登录,限流)
GET        /api/search?q=           PostgreSQL 搜索(含埋点)
GET        /api/outbound?tool=slug  外链跳转 + tool_click 埋点 + 计数
GET        /api/tools(列表查询走 server actions:getPublishedTools 支持 category/pricing/usecase/audience/sort)
POST       /api/auth/[...all]       Better Auth(邮箱密码 + Google + GitHub)

提交/认领/评论/收藏走 Server Actions(features/*/actions.ts),与 REST 共存。


七、事件与分析(§37/§38)

event 表统一采集 10 类事件:tool_view / tool_click / tool_vote / tool_unvote / tool_favorite / tool_review / tool_share / search / category_view / submit_tool / claim_tool。 详情页浏览与外链点击自动同步 tool.viewCount/clickCount 冗余列; /admin/analytics 输出近 30 天事件总量、工具 CTR 排行(views≥10)、热门搜索词。


八、已知边界与后续(V2 路线)

  1. 主题文案 i18n:五套主题的 Brand 文案当前为英文(品牌层);核心页面(工具/榜单/表单/后台)中英双语完整。后续可把主题文案迁入 messages/<locale>.json。
  2. OAuth 凭据:Google/GitHub 登录需在生产配置真实 Client ID/Secret(env 门控,缺省自动隐藏按钮)。
  3. V2 待办(按设计文档 §59):Meilisearch 语义搜索、AI 推荐、自动分类、爬虫导入、Monetization 层。
  4. 评论可信度(§19):已实现 Verified User(邮箱认证徽标)+ Helpful 投票;Verified Usage/Purchase 留待 V2。
  5. 上游遗留兼容性升级:framer-motion 11→12(本次已升级以修复 React 19 类型)。

九、Git 状态

全部改动已在 core/ 仓库本地提交(见 git log),上游远程 origin 保留, 可随时 diff 审查或推送 fork。