Nookfolio — 个人网站与内容管理系统
一套基于 Nuxt 4、Vue 3、PostgreSQL 和 Prisma 的个人网站解决方案,包含个人主页、项目展示、博客、在线简历、人生时间线和统一管理后台。
开源许可证
项目程序源码及其配套开发文档采用 MIT License 开源,允许使用、修改、分发和商用;复制或再发布源码时须保留原始版权声明和许可证文本。
授权范围说明: MIT 授权针对本仓库的软件源码及配套开发文档。个人博客文章、个人资料、用户上传的图片或其他内容、第三方商标与素材,不因使用 Nookfolio 软件而自动获得 MIT 授权;相关内容的使用须遵守其各自的权利声明或取得权利人许可。本项目依赖的第三方软件仍遵守各自的开源许可证。
功能特性
个人主页
- 展示个人名称、简介、头像与社交链接
- 自定义首页导航入口、描述、排序和打开方式
- 导航图标支持媒体库上传或远程图片地址
- 站点角标支持自定义文字与图片
- 响应式布局与滚动进入动画
项目展示
- 项目列表与独立详情页
- 项目状态、技术栈、源码地址和演示地址
- 支持 Markdown 项目说明
- 项目卡片触点光斑与轻微倾斜交互
- 后台创建、编辑、删除和排序
博客
- Markdown 文章发布与渲染
- 文章分类、归档、阅读量和字数统计
- 评论、嵌套回复与审核状态管理
- 独立留言板与私密留言
- 友情链接展示、申请与审核
- RSS、Sitemap 和基础 SEO 元数据
- 邮箱验证与防滥用频率限制
个人资料
- 在线简历与打印样式
- 工作经历、教育经历和技能分组
- 精选项目关联
- 人生时间线与相关媒体、链接
- 个人资料均可在后台持续维护
管理后台
- 文章、分类和项目管理
- 评论、留言和友情链接管理
- 首页资料、个人简历与时间线管理
- 媒体上传、替代文字和文件删除
- 站点访问数据概览
- 分组侧边导航、保存提醒与响应式布局
技术架构
┌─────────────────────────────────────────────────────┐
│ Nuxt 4 Web App │
│ Home · Projects · Blog · CV · Timeline · Admin │
└──────────────────────────┬──────────────────────────┘
│ /api/v1
▼
┌─────────────────────────────────────────────────────┐
│ Nitro Server Routes │
│ Services · Repositories · Validation │
└──────────────────────────┬──────────────────────────┘
│ Prisma
▼
┌──────────────┐
│ PostgreSQL 16│
└──────────────┘
图片与附件 ──► 本地持久化目录
邮件验证 ──► SMTP 服务(可选)
生产入口 ──► Nginx / Docker Compose
应用技术栈
| 技术 | 说明 |
|---|---|
| Nuxt 4 | 全栈应用框架与服务端渲染 |
| Vue 3 | 前端界面与交互 |
| TypeScript | 类型安全的应用代码 |
| Nitro | 服务端路由与生产运行时 |
| Prisma ORM | 数据模型、迁移与数据库访问 |
| PostgreSQL 16 | 关系型数据库 |
| Zod | 请求数据校验 |
| Marked + sanitize-html | Markdown 渲染与内容清洗 |
| Nodemailer | 邮件验证发送 |
工程与部署
| 技术 | 说明 |
|---|---|
| Vitest | 单元测试与数据库集成测试 |
| Playwright | 浏览器端到端测试 |
| ESLint + Prettier | 代码质量与格式检查 |
| GitHub Actions | 持续集成 |
| Docker Compose | 生产服务编排 |
| Nginx | HTTPS 入口与反向代理 |
项目结构
nookfolio/
├── app/ # 页面、布局、组件与前端样式
├── server/
│ ├── api/ # HTTP API
│ ├── repositories/ # 数据访问层
│ ├── services/ # 业务逻辑
│ └── utils/ # 服务端工具
├── shared/ # 前后端共享结构与常量
├── prisma/
│ ├── migrations/ # 数据库迁移
│ ├── schema.prisma # 数据模型
│ └── seed.ts # 管理员初始化入口
├── tests/ # 单元、集成与端到端测试
├── docker/ # 容器入口与 Nginx 配置
├── scripts/ # 初始化、备份与维护脚本
├── docker-compose.yml # 本地 PostgreSQL
└── docker-compose.production.yml
快速开始
环境要求
| 环境 | 版本要求 |
|---|---|
| Node.js | 24.14.0 |
| pnpm | 11.15.1 |
| PostgreSQL | 16 |
1. 克隆项目
git clone https://github.com/Jov3c/nookfolio.git
cd nookfolio
2. 安装依赖
corepack enable
corepack prepare pnpm@11.15.1 --activate
pnpm install --frozen-lockfile
3. 配置环境变量
PowerShell:
Copy-Item .env.example .env
Linux / macOS:
cp .env.example .env
至少需要修改以下配置:
| 配置项 | 说明 |
|---|---|
DATABASE_URL |
PostgreSQL 连接地址 |
ADMIN_EMAIL |
初始管理员邮箱 |
ADMIN_PASSWORD |
初始管理员密码 |
ADMIN_DISPLAY_NAME |
管理员显示名称 |
PUBLIC_SITE_URL |
网站公开地址 |
后台登录采用“邮箱和密码 + 六位邮箱验证码”两步验证,因此生产环境必须配置
SMTP_HOST、SMTP_PORT、SMTP_SECURE、SMTP_USER、SMTP_PASSWORD、
SMTP_FROM_NAME 和 SMTP_FROM_EMAIL。验证码有效期为 5 分钟,且只能使用一次。
留言提交不依赖邮箱发送服务:邮箱可留空,新留言会先进入后台审核队列,审核通过后才公开显示。 评论和友链申请仍保留各自的邮箱验证流程。
请只在服务器环境变量或权限受限的环境文件中保存 SMTP 密钥,不要将真实邮箱、密码、授权码、 验证码或会话令牌写入源码、日志和版本控制。
4. 启动数据库
pnpm db:up
5. 初始化应用
pnpm prisma:generate
pnpm prisma:migrate:deploy
pnpm admin:bootstrap
pnpm site:init
site:init 仅补充缺失的教程占位内容,不覆盖已经存在的数据。
6. 启动开发服务器
pnpm dev
访问地址:
| 页面 | 地址 |
|---|---|
| 前台网站 | http://localhost:3000 |
| 管理后台 | http://localhost:3000/admin |
生产部署
Docker Compose
复制生产环境配置:
Copy-Item .env.production.example .env.production
启动服务:
docker compose --env-file .env.production -f docker-compose.production.yml up -d --build
部署前必须替换数据库密码、管理员密码、会话密钥、公开站点地址、端口和持久化目录。生产数据默认保存在仓库之外。
更新应用
git pull --ff-only
docker compose --env-file .env.production -f docker-compose.production.yml up -d --build
应用容器启动时会执行已提交的数据库迁移。
常用命令
| 命令 | 说明 |
|---|---|
pnpm dev |
启动开发服务器 |
pnpm build |
构建生产应用 |
pnpm lint |
检查代码规范 |
pnpm typecheck |
检查 TypeScript 类型 |
pnpm test |
运行单元测试 |
pnpm test:integration |
运行数据库集成测试 |
pnpm test:e2e |
运行浏览器端到端测试 |
pnpm verify |
执行本地完整质量检查 |
pnpm prisma:studio |
打开 Prisma 数据管理界面 |
pnpm db:logs |
查看本地数据库日志 |
pnpm db:down |
停止本地数据库 |
数据与安全
.env、生产密钥和真实用户数据不会提交到 Git。- 数据库、上传文件、TLS 证书和备份通过外部目录持久化。
- 管理员密码使用 Argon2 哈希保存,会话 Cookie 仅保存不可逆令牌哈希。
- 用户提交的 Markdown 会在输出前清洗。
- 评论、留言、友链申请和登录接口包含频率限制。
公开仓库仅保留应用源码、数据库迁移、自动化测试和部署配置,不包含本地运行数据、上传内容、构建产物或过程文档。