基于 Nuxt 4 + Strapi 5 构建高性能 AI 导航站
摘要:在 AI 工具爆发的今天,如何快速构建一个既具备内容深度(CMS 管理),又有极致交互体验(SSR + 现代化 UI)的导航平台?本文将复盘 Creator AI Hub 的从零开发历程,深度解析 Monorepo 架构设计、Strapi v5 无头 CMS 的灵活应用以及 Nuxt 4 的全栈实践。
🚀 引言:为什么选择这套技术栈?
在构建 Creator AI Hub 时,我们面临几个核心需求:
- 内容为王:需要频繁更新 AI 工具、解决方案和 SOP,且内容结构复杂(包含会员专属字段)。
- SEO 友好:作为导航站,搜索引擎优化至关重要,服务端渲染 (SSR) 是必选项。
- 开发效率:前后端需紧密配合,但又要保持独立部署和维护的灵活性。
基于此,我们采用了 TurboRepo + Nuxt 4 + Strapi 5 的黄金组合。这不仅是一次技术选型的胜利,更是对现代 Web 开发最佳实践的一次完整探索。
![]()
![]()
1. 系统架构概览 (System Architecture)
本项目采用 Monorepo 策略管理全栈代码,基于 TurboRepo 构建高效的工作流。前端采用 Nuxt 4 进行服务端渲染 (SSR),后端使用 Strapi v5 作为 Headless CMS 提供 RESTful API,数据存储在 MySQL 中。
1.1 技术栈 (Tech Stack)
| 领域 | 技术选型 | 版本 | 说明 |
|---|---|---|---|
| Monorepo | TurboRepo | ^2.7.2 |
高性能构建系统,统一管理 apps |
| Package Manager | pnpm | 9.0.0 |
高效的磁盘空间利用与依赖管理 |
| Frontend | Nuxt | ^4.2.2 |
基于 Vue 3 的全栈框架,负责 SSR 与交互 |
| Styling | Tailwind CSS | ^3.4 |
原子化 CSS 框架,通过 @nuxtjs/tailwindcss 集成 |
| Backend | Strapi | 5.33.0 |
灵活的 Headless CMS,提供 API 服务 |
| Database | MySQL | 8.0 |
关系型数据库,通过 mysql2 驱动连接 |
| Docs | VitePress | Latest | 静态文档生成器 |
1.2 目录结构 (Directory Structure)
.
├── apps/
│ ├── api/ # Strapi 后端应用 (Port: 1337)
│ │ ├── src/api/ # 业务逻辑 (Content Types, Controllers, Services)
│ │ └── config/ # 数据库与插件配置
│ ├── web/ # Nuxt 前端应用 (Port: 3000)
│ │ ├── components/ # Vue 组件
│ │ ├── composables/# 组合式函数 (Data Fetching, State)
│ │ └── pages/ # 路由页面
│ └── docs/ # 项目文档 (VitePress)
├── package.json # Workspace 根配置
├── turbo.json # Turbo 构建管线配置
└── pnpm-workspace.yaml
2.3 会员权限设计 (Membership System)
为了区分普通用户与付费会员,我们在 Strapi 后端扩展了 Membership 和 Order 模型。
核心逻辑
-
用户注册: 默认分配为
Authenticated角色,无会员权益。 -
订阅支付: 用户购买会员(月/年/终身)后,后端更新
Membership表,记录过期时间。 -
权限校验: 在获取 Tool 详情时,Controller 会校验当前用户的 Membership 状态。如果过期或未订阅,则剔除
tool.member字段(包含 SOP 和敏感数据)。
// apps/api/src/api/tool/controllers/tool.ts (伪代码示例)
async findOne(ctx) {
const { id } = ctx.params;
const user = ctx.state.user;
// 1. 获取工具完整数据
const entity = await strapi.service('api::tool.tool').findOne(id, { populate: ['member'] });
// 2. 检查用户会员状态
const isMember = await strapi.service('api::membership.membership').checkStatus(user?.id);
// 3. 数据清洗:非会员移除 member 字段
if (!isMember && entity.member) {
delete entity.member;
}
return this.transformResponse(entity);
}
3. 后端设计 (Backend Design) - Strapi v5
后端核心职责是提供结构化的内容管理与 API 服务。
2.1 数据模型 (Content Modeling)
我们定义了多维度的内容类型 (Content Types) 来支撑业务:
-
Collection Types:
-
Tool: AI 工具核心数据(名称、描述、URL、Logo)。 -
Category: 工具分类。 -
Solution: 解决方案文章。
-
-
Single Types:
-
Global: 全局配置(站点标题、SEO 信息、社群二维码)。
-
-
Components:
-
tool.member: 付费会员专属字段(SOP、避坑指南),利用 Strapi 组件功能实现灵活的数据结构。
-
Schema 示例 (Global Config)
// apps/api/src/api/global/content-types/global/schema.json
{
"kind": "singleType",
"collectionName": "globals",
"info": {
"singularName": "global",
"pluralName": "globals",
"displayName": "Global"
},
"attributes": {
"communityGroupTitle": {
"type": "string",
"default": "加入官方交流群"
},
"communityGroupQrCode": {
"type": "media",
"multiple": false,
"allowedTypes": ["images"]
}
}
}
2.2 API 扩展与权限
-
权限控制: 使用
@strapi/plugin-users-permissions管理 Public 与 Authenticated 角色权限。 -
自定义逻辑: 通过覆写 Core Controllers 或增加 Middleware 实现更细粒度的权限控制(如:非会员请求 Tool 详情时过滤掉
tool.member字段)。
3. 前端设计 (Frontend Design) - Nuxt 4
前端应用专注于高性能渲染与极致的用户体验。
3.1 核心特性实现
- 服务端渲染 (SSR): 提升 SEO 表现,首屏加载速度快。
- 组合式开发: 利用 Nuxt Composables 封装业务逻辑。
3.2 关键代码解析
🔐 身份认证与状态管理 (useAuth.ts)
为了保证用户体验,我们封装了统一的认证逻辑,支持注册、登录及 JWT Token 持久化。
// apps/web/composables/useAuth.ts
export const useAuth = () => {
const user = useState<User | null>('user', () => null)
const token = useCookie('auth_token')
const { $strapi } = useNuxtApp()
// 登录逻辑
const login = async (credentials: LoginInput) => {
try {
const { user: userData, jwt } = await $strapi.login(credentials)
token.value = jwt
user.value = userData
return true
} catch (e) {
return false
}
}
// 注册逻辑 (自动关联默认角色)
const register = async (input: RegisterInput) => {
const { user: newUser, jwt } = await $strapi.register(input)
token.value = jwt
user.value = newUser
}
return { user, login, register }
}
全局配置获取 (useGlobal.ts)
为了实现配置动态化,我们封装了 useGlobalConfig,它在应用初始化时从 Strapi 获取配置,并适配 Strapi v5 的响应结构。
// apps/web/composables/useGlobal.ts
export const useGlobalConfig = () => {
return useState('global-config', () => null)
}
export const fetchGlobalConfig = async () => {
const config = useGlobalConfig()
const { find } = useStrapi() // 封装的 Strapi Fetcher
try {
// 适配 Strapi v5 API 响应结构 (dataunwrap)
const response = await find('global', {
populate: '*' // 连表查询所有关联字段 (如图片)
})
config.value = response.data || {}
} catch (error) {
console.error('Failed to fetch global config:', error)
}
}
动态组件渲染 (profile.vue)
![]()
在个人中心页,我们直接绑定从后端获取的配置数据,实现运营内容的实时更新。
<!-- apps/web/pages/profile.vue -->
<script setup lang="ts">
const globalConfig = useGlobalConfig()
// 处理图片 URL 的辅助函数
const getQrCodeUrl = (qrCodeObj: any) => {
// 兼容 Strapi 上传插件的 URL 格式
return qrCodeObj?.url ? `${useStrapiUrl()}${qrCodeObj.url}` : '/default-qr.png'
}
</script>
<template>
<div class="community-card">
<h3>{{ globalConfig?.communityGroupTitle }}</h3>
<img
:src="getQrCodeUrl(globalConfig?.communityGroupQrCode)"
alt="Community QR"
/>
</div>
</template>
5. 部署与运维 (Deployment & DevOps)
4.1 环境变量管理
项目使用 .env 文件管理敏感信息,区分开发与生产环境:
# .env (Root)
STRAPI_URL=http://localhost:1337
NUXT_PUBLIC_API_URL=http://localhost:1337/api
DATABASE_HOST=localhost
DATABASE_PORT=3306
4.2 构建流程
利用 TurboRepo 的缓存机制加速构建:
# 并行构建所有应用
pnpm build
# Turbo 智能缓存示例
# apps/web: cache miss, executing 345ms
# apps/api: cache hit, replaying output 50ms
4.3 生产环境建议
- Process Manager: 使用 PM2 管理 Node.js 进程。
- Reverse Proxy: Nginx 反向代理,配置 SSL 证书与 Gzip 压缩。
- Storage: Strapi 上传文件建议对接 AWS S3 或阿里云 OSS 对象存储。
6. 开发效能与 AI 赋能 (AI-Driven Development)
Creator AI Hub 的诞生本身就是 AI 赋能开发的最佳实践。
⏱️ 惊人的速度:从 0 到 1,仅用 48 小时
如果不借助 AI 工具,这样一个包含全栈架构、CMS 后台、会员系统和 SSR 前端的项目,通常需要 2-3 周的开发周期。但在 AI 辅助下,我们实现了 10 倍提效。
6.1 AI 辅助全流程
- 架构设计: AI 协助选型 TurboRepo + Nuxt 4,并生成了初始的 Monorepo 目录结构。
- Schema 生成: Strapi 的复杂 Content Types(如嵌套组件、关联关系)JSON 配置,由 AI 一键生成,节省了大量手动配置时间。
-
代码编写:
- 前端
useAuth、useGlobal等核心 Composable 逻辑由 AI 快速实现。 - Tailwind CSS 的响应式布局和微交互效果,通过 AI 提示词快速调整。
- 前端
- 文案与文档: 项目文档(包括本文)、SEO 描述、初始测试数据,均由 AI 辅助撰写。
7. 架构扩展性:从导航站到无限可能 (Scalability)
Creator AI Hub 的这套 "Monorepo + Headless CMS + SSR Frontend" 架构,本质上是一个通用的内容变现与知识付费基座。它不仅限于导航站,只需微调数据模型,即可快速裂变出多种应用:
7.1 💡 变体一:付费课程平台
-
改动点: 将
Tool模型改为Course(课程),tool.member改为CourseChapter(课程章节)。 - 功能复用: 会员订阅系统、订单支付、CMS 章节管理、前端视频播放页。
7.2 🛒 变体二:虚拟资源商城
-
改动点: 将
Category细化为资源类型(PPT模板/设计素材/Prompt),增加DownloadLink字段。 - 功能复用: 搜索过滤、资源详情页、下载权限控制(仅会员或单次购买可下载)。
7.3 🏢 变体三:企业内部知识库
- 改动点: 开启 Strapi 的 SSO 单点登录,关闭公开注册。
- 功能复用: 文档层级管理、SOP 标准化流程展示、全站全文检索。
这套架构的最大价值在于**“一次构建,处处复用”**。Monorepo 使得我们可以在 apps/ 目录下轻松添加新的前端应用(如 apps/mobile 或 apps/admin-dashboard),共享同一套后端 API 和 TypeScript 类型定义,极大地降低了多业务线的维护成本。
8. 结语
通过 Nuxt 4 + Strapi 5 的黄金组合,配合 AI 结对编程模式,我们快速构建了一个既有内容深度,又有良好交互体验的 AI 导航平台。这不仅验证了技术栈的先进性,更证明了在 AI 时代,个人的开发潜能可以被无限放大。