---
url: /packages/logger.md
---
# @fullstackpack/logger
通用的日志工具包,支持时间戳显示和应用前缀配置。
## 特性
* ✅ 可配置时间戳显示
* ✅ 可配置应用前缀
* ✅ 支持颜色输出(终端)
* ✅ 支持多种日志级别:debug, info, warn, error
* ✅ TypeScript 完整支持
* ✅ 零依赖
## 安装
```bash
pnpm add @fullstackpack/logger
```
## 使用
### 基础用法
```typescript
import { createLogger } from '@fullstackpack/logger'
const logger = createLogger({
prefix: 'web',
showTime: true,
enableColors: true
})
logger.info('Server started')
logger.warn('This is a warning')
logger.error('An error occurred')
```
### 配置选项
```typescript
interface LoggerOptions {
/** 应用前缀,例如 'web', 'server' */
prefix?: string
/** 是否显示时间戳 */
showTime?: boolean
/** 是否启用颜色输出 */
enableColors?: boolean
}
```
### 示例输出
```
[2024-01-01T12:00:00.000Z] [INFO] [web] Server started
[2024-01-01T12:00:01.000Z] [WARN] [web] This is a warning
[2024-01-01T12:00:02.000Z] [ERROR] [web] An error occurred
```
## API
### createLogger(options?)
创建一个新的 Logger 实例。
### Logger 方法
* `logger.debug(message, ...args)` - 调试信息
* `logger.info(message, ...args)` - 一般信息
* `logger.warn(message, ...args)` - 警告信息
* `logger.error(message, ...args)` - 错误信息
---
---
url: /packages/shared.md
---
# @fullstackpack/shared
共享类型和 schemas 包,提供跨应用的类型定义和验证。
## 特性
* ✅ Zod schemas - 数据验证
* ✅ TypeScript 类型 - 类型定义
* ✅ 工具函数 - 认证工具等
* ✅ 错误码定义 - 统一错误码
## 安装
```bash
pnpm add @fullstackpack/shared
```
## 使用
### Schemas
```typescript
import { loginSchema, registerSchema } from '@fullstackpack/shared/schemas/auth'
const loginData = loginSchema.parse({ email: 'user@example.com', password: 'password' })
```
### 类型
```typescript
import type { LoginInput, RegisterInput } from '@fullstackpack/shared/schemas/auth'
```
### 认证工具
```typescript
import {
extractTokenFromHash,
clearTokenFromHash,
redirectToAuthPortal,
redirectToAuthPortalForLogout
} from '@fullstackpack/shared'
// 从 URL hash 提取 token
const token = extractTokenFromHash()
// 清除 URL hash 中的 token
clearTokenFromHash()
// 跳转到认证门户
redirectToAuthPortal('http://app.example.com/dashboard')
// 退出登录
redirectToAuthPortalForLogout()
```
## 目录结构
```
packages/shared/
├── src/
│ ├── schemas/ # Zod schemas
│ ├── types/ # TypeScript 类型
│ ├── lib/ # 工具函数
│ └── errors/ # 错误码定义
```
---
---
url: /apps/auth-portal.md
---
# Auth Portal
认证门户是统一登录入口,提供 SSO 单点登录功能。
## 特性
* ✅ **统一登录** - 所有应用共享同一个登录入口
* ✅ **自动跳转** - 登录后自动跳转回目标应用
* ✅ **SSO 支持** - 已登录用户自动识别,无需重复登录
* ✅ **统一注销** - 退出登录统一处理
## 技术栈
* **React 19** + **TypeScript**
* **Vite** - 构建工具
* **shadcn/ui** - UI 组件库
* **TanStack Query** - 数据获取
* **Zustand** - 状态管理
## 开发
```bash
pnpm dev
```
访问:`http://localhost:7777`
## 构建
```bash
pnpm build
```
## 部署
```bash
pnpm deploy
```
## 使用方式
### 1. 从其他应用跳转
其他应用未登录时,会自动跳转到认证门户:
```
http://auth.example.com?redirect=http://app.example.com/dashboard
```
### 2. 登录后跳转
登录成功后,会自动跳转回目标应用,并在 URL hash 中传递 token:
```
http://app.example.com/dashboard#token=xxx
```
### 3. 统一注销
退出登录时,会跳转到认证门户进行统一注销:
```
http://auth.example.com?logout=true
```
## 环境变量
详细环境变量配置请查看 [Auth Portal README](/apps/auth-portal#环境变量)。
**可选:**
* `VITE_API_URL` - 后端 API 地址(开发环境自动使用代理)
---
---
url: /deployment/cicd.md
---
# CI/CD 配置
## GitHub Actions
项目已配置 GitHub Actions,push 到 `main` 分支后会自动部署到 Cloudflare。
## 配置步骤
### 1. 配置 GitHub Secrets
在 GitHub 仓库 Settings → Secrets and variables → Actions 中添加:
**部署相关(必需):**
* `CLOUDFLARE_API_TOKEN` - Cloudflare API Token(需要 `Account:Cloudflare Workers:Edit` 权限)
* `CLOUDFLARE_ACCOUNT_ID` - Cloudflare Account ID(可在 Dashboard 右侧找到)
**构建时环境变量(必需):**
* `VITE_API_URL` - 后端 API 地址(完整 URL,如:`https://api.example.com`)
* `VITE_AUTH_PORTAL_URL` - 认证门户地址(完整 URL,如:`https://auth.example.com`,web 应用需要)
**获取 API Token:**
1. 访问 [Cloudflare Dashboard](https://dash.cloudflare.com/profile/api-tokens)
2. 创建 Token,权限选择:
* `Account:Cloudflare Workers:Edit`
* `Account:Cloudflare Pages:Edit`
* `Zone:Zone:Read`(如果使用自定义域名)
### 2. 创建 Cloudflare Pages 项目(首次部署前)
首次部署前需要先创建 Cloudflare Pages 项目(在 Dashboard 或使用 `wrangler pages project create`)。
### 3. 配置 Cloudflare Workers Secrets
使用 `wrangler secret put` 配置后端运行时环境变量:
```bash
cd apps/server
# 必需
wrangler secret put JWT_SECRET # JWT 密钥(至少 32 字符)
wrangler secret put ACCELERATE_URL # Prisma Accelerate URL
wrangler secret put ALLOWED_DOMAIN # 允许的域名(如:exuils.com)
# 可选
wrangler secret put CORS_ORIGIN # CORS 允许的源
wrangler secret put JWT_EXPIRES_IN # JWT 过期时间(默认:7d)
```
**环境变量说明:**
* `ALLOWED_DOMAIN`:允许的域名,会允许该域名及其所有子域名(如:`exuils.com` 允许 `*.exuils.com`)
* `CORS_ORIGIN`:精确匹配的 CORS 源(可选,如果设置了 `ALLOWED_DOMAIN` 可省略)
### 4. Push 代码触发部署
```bash
git push origin main
```
## 工作流说明
### 智能路径触发 ⭐
CI/CD 配置了**路径触发**功能,只有相关应用变更时才会部署:
* **只修改 `apps/server/**`** → 只部署后端
* **只修改 `apps/web/**`** → 只部署前端
* **只修改 `apps/auth-portal/**`** → 只部署认证门户
* **只修改 `apps/docs/**`** → 只部署文档站点
* **修改 `packages/**`** → 部署所有依赖的应用(server、web、auth-portal)
这样可以:
* ✅ 节省 CI/CD 时间
* ✅ 减少不必要的部署
* ✅ 独立部署各个应用
### 部署流程
1. **检测变更** → 分析哪些应用需要部署
2. **构建依赖** → 构建共享的 packages
3. **构建应用** → 只构建变更的应用
4. **部署** → 只部署变更的应用
### 手动触发
如果需要强制部署所有应用,可以在 GitHub Actions 页面:
1. 进入 `Actions` 标签页
2. 选择 `Deploy to Cloudflare` workflow
3. 点击 `Run workflow`
## 查看部署状态
在 GitHub Actions 标签页中查看部署状态和日志。
---
---
url: /deployment/cloudflare.md
---
# Cloudflare 部署
## 概述
Cloudflare 部署使用 Cloudflare Workers(后端)和 Cloudflare Pages(前端),提供全球边缘计算能力。
## 前置要求
* Cloudflare 账户
* GitHub 仓库(用于 CI/CD)
* Prisma Accelerate 账户(用于数据库连接)
## 手动部署
### 1. 后端部署(Cloudflare Workers)
#### 1.1 设置环境变量
```bash
cd apps/server
wrangler secret put JWT_SECRET
wrangler secret put ACCELERATE_URL # 或 DATABASE_URL
```
#### 1.2 部署
```bash
pnpm deploy:server
# 或
cd apps/server
pnpm build
wrangler deploy
```
### 2. 前端部署(Cloudflare Pages)
#### 2.1 构建
```bash
cd apps/web
pnpm build
```
#### 2.2 部署
```bash
pnpm deploy:web
# 或使用 wrangler
wrangler pages deploy dist
```
#### 2.3 配置环境变量(可选)
在 Cloudflare Pages Dashboard 中配置环境变量,详见各应用的 README。
### 3. 认证门户部署
```bash
cd apps/auth-portal
pnpm build
wrangler pages deploy dist --project-name=fullstackpack-auth-portal
```
### 4. 文档站点部署
```bash
cd apps/docs
pnpm build
wrangler pages deploy .vitepress/dist --project-name=fullstackpack-docs
```
**注意**:首次部署前需要先创建 Cloudflare Pages 项目。
## 自动部署(CI/CD)⭐ 推荐
项目已配置 GitHub Actions,push 到 `main` 分支后会自动部署。
### 1. 配置 GitHub Secrets
在 GitHub 仓库设置中添加以下 Secrets:
* `CLOUDFLARE_API_TOKEN` - Cloudflare API Token(需要 `Account:Cloudflare Workers:Edit` 权限)
* `CLOUDFLARE_ACCOUNT_ID` - Cloudflare Account ID(可在 Dashboard 右侧找到)
**获取 API Token:**
1. 访问 [Cloudflare Dashboard](https://dash.cloudflare.com/profile/api-tokens)
2. 创建 Token,权限选择:
* `Account:Cloudflare Workers:Edit`
* `Account:Cloudflare Pages:Edit`
* `Zone:Zone:Read`(如果使用自定义域名)
### 2. 配置 Cloudflare Workers 环境变量
```bash
cd apps/server
wrangler secret put JWT_SECRET
wrangler secret put ACCELERATE_URL
```
### 3. Push 代码触发部署
```bash
git push origin main
```
GitHub Actions 会自动:
* 构建后端并部署到 Cloudflare Workers
* 构建前端并部署到 Cloudflare Pages
* 构建认证门户并部署到 Cloudflare Pages
* 构建文档站点并部署到 Cloudflare Pages
**注意**:首次部署前,需要先创建 Cloudflare Pages 项目(见上方手动部署步骤)。
## 数据库配置
### Prisma Accelerate(推荐)
1. 访问 https://accelerate.prisma.io/
2. 注册并创建项目
3. 获取 Accelerate URL
4. 设置为环境变量:`ACCELERATE_URL`
### 数据库迁移
```bash
cd apps/server
npx prisma migrate deploy
```
## 自定义域名
### Workers(后端)
在 `wrangler.toml` 中配置:
```toml
routes = [
{ pattern = "api.yourdomain.com/*", zone_name = "yourdomain.com" }
]
```
### Pages(前端)
在 Cloudflare Pages Dashboard 中配置自定义域名。
## 注意事项
1. **环境变量**:前端环境变量在 Cloudflare Pages Dashboard 中配置
2. **CORS**:确保后端 CORS 设置允许前端域名
3. **HTTPS**:Cloudflare 自动提供 HTTPS
4. **路由**:前端 SPA 路由需要在 Pages 中配置重写规则
---
---
url: /apps/front-template.md
---
# Front Template
基于 React + Vite 的前端应用模板,已集成 SSO 单点登录功能。
## 特性
* ✅ **SSO 单点登录** - 统一使用认证门户进行登录
* ✅ **自动跳转** - 未登录时自动跳转到认证门户
* ✅ **Token 管理** - 自动从 URL hash 提取 token
* ✅ **统一注销** - 退出登录统一跳转到认证门户
## 技术栈
* **React 19** + **TypeScript**
* **Vite** - 构建工具
* **shadcn/ui** - UI 组件库
* **TanStack Query** - 数据获取
* **Zustand** - 状态管理
* **React Router DOM v7** - 路由
* **Tailwind CSS** - 样式
## 如何使用此模板
1. **复制模板**:
```bash
cp -r apps/front-template apps/your-app-name
```
2. **修改配置**:
* 修改 `package.json` 中的 `name` 字段
* 修改 `vite.config.ts` 中的端口(建议使用 8000+)
* 修改 `vite.config.ts` 中的 `VITE_AUTH_PORTAL_URL`(如果需要)
3. **自定义应用**:
* 修改 `src/pages/dashboard/Home.tsx` - 你的 Dashboard 页面
* 修改 `src/components/layouts/DashboardLayout.tsx` - 你的布局
* 添加你的业务页面和路由
## 环境变量
**可选:**
* `VITE_API_URL` - 后端 API 地址(开发环境自动使用代理)
* `VITE_AUTH_PORTAL_URL` - 认证门户 URL(开发环境默认 `http://localhost:7777`)
## 开发
```bash
pnpm dev
```
## 构建
```bash
pnpm build
```
## 部署
```bash
pnpm deploy
```
## SSO 集成说明
### 1. 路由守卫
使用 `ProtectedRoute` 组件保护需要登录的路由:
```tsx
import { ProtectedRoute } from '@/components/auth/ProtectedRoute'
```
### 2. 退出登录
退出登录会自动跳转到认证门户:
```tsx
import { useLogout } from '@/hooks/queries/auth'
import { redirectToAuthPortalForLogout } from '@fullstackpack/shared'
import { AUTH_PORTAL_URL } from '@/constants'
const logoutMutation = useLogout()
const handleLogout = async () => {
await logoutMutation.mutateAsync()
redirectToAuthPortalForLogout(AUTH_PORTAL_URL)
}
```
### 3. 获取用户信息
```tsx
import { useAuth } from '@/hooks/queries/auth'
const { user, isAuthenticated } = useAuth()
```
---
---
url: /apps/server.md
---
# Server
基于 Hono 框架的后端服务,运行在 Cloudflare Workers 上。
## 技术栈
* **Hono** - Web 框架(专为边缘环境优化)
* **Cloudflare Workers** - 边缘计算平台
* **Prisma 7** - ORM(使用 Accelerate 或 Adapter)
* **Zod** - Schema 验证
* **Vitest** - 测试框架
## 开发
```bash
pnpm dev
```
## 构建
```bash
pnpm build
```
## 部署
```bash
pnpm deploy
```
## 数据库
### 连接方案
Cloudflare Workers 运行在 V8 isolate 环境中,**不支持直接的 TCP 连接**。项目支持两种数据库连接方案:
1. **Prisma Accelerate**(推荐)- 通过 HTTP API 连接数据库
2. **Prisma Adapter** - 使用 PostgreSQL adapter(仅 Node.js 环境)
### 配置
```bash
# 推送 schema
pnpm db:push
# 生成 Prisma Client
pnpm db:generate
```
详细数据库配置请查看 [数据库文档](/apps/server#数据库连接方案)。
## API 路由
* `POST /api/v1/auth/login` - 用户登录
* `POST /api/v1/auth/register` - 用户注册
* `POST /api/v1/auth/verify` - 验证 token
* `GET /api/v1/auth/me` - 获取当前用户信息
## 环境变量
详细环境变量配置请查看 [Server README](/apps/server#环境变量)。
**必需:**
* `JWT_SECRET` - JWT 密钥(至少 32 字符)
* `ACCELERATE_URL` 或 `DATABASE_URL` - 数据库连接
**注意**:Cloudflare Workers 环境使用 `ACCELERATE_URL`,自托管 Node.js 环境使用 `DATABASE_URL`。
## 数据库连接方案
### Prisma Accelerate(推荐)✅
**当前项目使用的方案**
Prisma Accelerate 是一个连接池和缓存服务,通过 HTTP API 连接数据库:
**优点:**
* ✅ 专为边缘环境设计
* ✅ 连接池管理(避免连接数限制)
* ✅ 查询缓存(提升性能)
* ✅ 支持所有 Prisma 功能
* ✅ 有免费开发计划
**获取方式:**
1. 访问 https://accelerate.prisma.io/
2. 注册并创建项目
3. 获取 Accelerate URL
### Prisma Adapter(已实现)✅
Prisma 7 支持通过 adapter 连接数据库:
**注意:**
* ⚠️ **在 Cloudflare Workers 中可能不工作**:PostgreSQL adapter 需要 TCP 连接,而 Workers 只支持 fetch API
* ⚠️ 如果 adapter 失败,会自动提示使用 Prisma Accelerate
* ✅ 在 Node.js 环境中可以正常工作
**使用方式:**
* 如果设置了 `ACCELERATE_URL`,优先使用 Accelerate
* 如果没有 `ACCELERATE_URL` 但有 `DATABASE_URL`,会尝试使用 adapter
* 如果 adapter 失败,会提示使用 Accelerate
## 总结
| 方案 | 支持 PostgreSQL | 成熟度 | 推荐度 |
|------|----------------|--------|--------|
| Prisma Accelerate | ✅ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| Prisma Adapter | ✅ | ⭐⭐ | ⭐ |
**结论:** 对于 PostgreSQL + Cloudflare Workers,**Prisma Accelerate 是最佳选择**。
---
---
url: /guide/sso-dev.md
---
# SSO 本地开发指南
## 本地开发注意事项
### 1. 清除旧的认证信息
如果之前测试过登录功能,浏览器 localStorage 中可能保存了旧的 token,导致应用认为已登录。
**解决方法**:
1. 打开浏览器开发者工具(F12)
2. 进入 Application/存储 → Local Storage
3. 找到对应的域名(如 `http://localhost:8000`)
4. 删除 `auth-storage` 键
5. 刷新页面
或者直接在浏览器控制台执行:
```javascript
localStorage.removeItem('auth-storage')
```
### 2. 端口配置
本地开发时,各应用的端口:
* **认证门户** (`apps/auth-portal`): `http://localhost:7777`
* **Web 应用** (`apps/web`): `http://localhost:8000`
* **应用模板** (`apps/front-template`): `http://localhost:8001`
* **后端服务** (`apps/server`): `http://localhost:8787`
### 3. 环境变量配置
开发环境已自动配置:
* `VITE_AUTH_PORTAL_URL` = `http://localhost:7777`(开发环境)
* `VITE_API_URL` = `/api`(开发环境,通过代理到 `http://localhost:8787`)
生产环境需要设置环境变量:
* `VITE_AUTH_PORTAL_URL` = 生产环境的认证门户 URL(如 `https://auth.example.com`)
* `VITE_API_URL` = 生产环境的 API URL
### 4. 测试流程
1. **启动所有服务**:
```bash
pnpm dev:all
```
2. **测试 SSO 流程**:
* 访问 `http://localhost:8000/dashboard`(web 应用)
* 应该自动跳转到 `http://localhost:7777?redirect=http://localhost:8000/dashboard`
* 在认证门户登录
* 登录成功后自动跳转回 `http://localhost:8000/dashboard#token=xxx`
* web 应用从 hash 中提取 token 并存储
3. **测试跨应用 SSO**:
* 在 web 应用登录后
* 访问 `http://localhost:8001/dashboard`(front-template)
* 如果 localStorage 中有 token,应该直接显示 Dashboard
* 如果没有 token,会跳转到认证门户
### 5. 常见问题
**Q: 为什么访问 web 应用没有跳转到认证门户?**
A: 可能的原因:
* localStorage 中有旧的 token(解决方法见第 1 点)
* 访问的不是受保护的路由(如 `/dashboard`)
* 检查浏览器控制台是否有错误
**Q: 登录后没有跳转回目标应用?**
A: 检查:
* 认证门户的 redirect 参数是否正确
* 浏览器控制台是否有错误
* 网络请求是否成功
**Q: Token 验证失败?**
A: 检查:
* 后端服务是否正常运行(`http://localhost:8787`)
* Token 是否过期
* 浏览器控制台的网络请求错误
### 6. 调试技巧
1. **查看 localStorage**:
```javascript
// 浏览器控制台
JSON.parse(localStorage.getItem('auth-storage'))
```
2. **清除所有认证信息**:
```javascript
// 浏览器控制台
localStorage.removeItem('auth-storage')
```
3. **手动设置 token(测试用)**:
```javascript
// 浏览器控制台
localStorage.setItem('auth-storage', JSON.stringify({
state: {
token: 'your-token-here',
user: null,
isLoading: false
},
version: 0
}))
```
4. **查看当前 URL hash**:
```javascript
// 浏览器控制台
window.location.hash
```
---
---
url: /apps/web.md
---
# Web
基于 React + Vite 的前端应用。
## 技术栈
* **React 19** + **TypeScript**
* **Vite** - 构建工具
* **shadcn/ui** - UI 组件库
* **TanStack Query** - 数据获取
* **Zustand** - 状态管理
* **React Router DOM v7** - 路由
* **Tailwind CSS** - 样式
## 开发
```bash
pnpm dev
```
## 构建
```bash
pnpm build
```
## 部署
```bash
pnpm deploy
```
## SSO 集成
Web 应用已集成 SSO 单点登录功能:
* ✅ **自动跳转** - 未登录时自动跳转到认证门户
* ✅ **Token 管理** - 自动从 URL hash 提取 token
* ✅ **统一注销** - 退出登录统一跳转到认证门户
## 环境变量
详细环境变量配置请查看 [Web README](/apps/web#环境变量)。
**可选:**
* `VITE_API_URL` - 后端 API 地址(开发环境自动使用代理)
* `VITE_AUTH_PORTAL_URL` - 认证门户 URL(开发环境默认 `http://localhost:7777`)
---
---
url: /apps.md
---
# 应用文档
## 应用列表
* [Server](/apps/server) - 后端服务(Hono + Cloudflare Workers)
* [Web](/apps/web) - Web 应用(React + Vite)
* [Auth Portal](/apps/auth-portal) - 认证门户(统一登录入口)
* [Front Template](/apps/front-template) - 前端应用模板
## 应用架构
```
apps/
├── server/ # 后端 API 服务
├── web/ # Web 应用实例
├── auth-portal/ # SSO 认证门户
├── front-template/ # 前端应用模板
└── docs/ # 文档站点
```
---
---
url: /guide/development.md
---
# 开发指南
## 开发流程
### TDD 开发模式 ⭐ 优先采用
1. **Red**: 先写测试,运行看到失败
2. **Green**: 写最少代码让测试通过
3. **Refactor**: 重构代码,保持测试通过
### 开发流程
1. **后端**: 先写测试 → 实现业务逻辑 → 添加路由测试 → 实现路由
2. **前端**: 先写组件测试 → 实现组件 → 添加 hooks 测试 → 实现 hooks
3. **共享**: 先写 schema 测试 → 定义 schemas
## 测试
### 运行测试
```bash
# 运行所有测试
pnpm test
# 运行特定包的测试
pnpm --filter server test
pnpm --filter web test
# 监听模式
pnpm --filter server test:watch
```
### 测试规范
* 测试文件:`__tests__` 目录,与源码结构对应
* 命名:`*.test.ts` 或 `*.spec.ts`
* 工具:Vitest(后端)+ Vitest + React Testing Library(前端)
* Mock:使用 Vitest 的 `vi.mock()` 和 `vi.fn()`
## 代码规范
### TypeScript
* **禁止使用 `any` 类型**:必须使用明确的类型定义
* 优先使用类型推断,减少显式类型注解
* 使用 `interface` 定义对象类型
* 使用 `type` 定义联合类型、工具类型等
### Git 提交规范
格式:`类型(模块): 描述`
**类型**: `feat` | `fix` | `docs` | `refactor` | `test` | `chore` | `perf` | `ci`
**模块**: `auth` | `user` | `api` | `ui` | `config` | `deploy` | `deps` | `init`
**示例**:
```bash
feat(auth): 添加用户登录功能
fix(api): 修复 CORS 错误
docs(readme): 更新部署文档
```
## 调试技巧
### 后端调试
```bash
# 使用 wrangler dev 进行调试
cd apps/server
pnpm dev
# 查看日志
wrangler tail
```
### 前端调试
* 使用浏览器开发者工具
* React DevTools
* TanStack Query DevTools
## 常见问题
### 端口冲突
如果端口被占用,可以修改:
* `apps/web/vite.config.ts` - Web 应用端口
* `apps/auth-portal/vite.config.ts` - 认证门户端口
* `apps/server/wrangler.toml` - 后端端口
### 数据库连接失败
* 检查 `DATABASE_URL` 或 `ACCELERATE_URL` 是否正确
* 确认数据库服务是否运行
* 查看 [数据库文档](/apps/server#数据库)
---
---
url: /guide/conventions.md
---
# 开发规范
## 核心原则
* ⭐ **TDD 优先**:先写测试,再写代码
* 🎨 **UI 组件**:必须使用 shadcn/ui
* 📦 **包管理**:使用 pnpm workspace
* 🔒 **类型安全**:TypeScript 严格模式
## 后端开发规范
### 技术栈
* **Web 框架**: Hono(专为边缘环境优化)
* **运行时**: Cloudflare Workers
* **ORM**: Prisma 7(使用 Prisma Accelerate 或 Adapter)
* **验证**: Zod(schema 验证)
* **认证**: JWT + bcryptjs
### 目录结构
```
apps/server/src/
├── config/ # 配置模块
├── db/ # Prisma client
├── lib/ # 工具函数
├── middlewares/ # Hono 中间件
├── routes/v1/ # API 路由
├── services/ # 业务逻辑层
└── __tests__/ # 测试文件(与源码结构对应)
```
### 代码组织
* **分层**: Routes → Services → Database
* **路由层**: 只处理请求/响应,调用 Service
* **服务层**: 业务逻辑,不直接处理 HTTP
### API 设计
* RESTful,版本前缀 `/api/v1/`
* 统一响应格式:`success()` 包装器
* 错误处理:`AppError` + 统一错误中间件
* 类型安全:Hono RPC 客户端自动类型推断
## 前端开发规范
### 技术栈
* **UI 框架**: React 19 + Vite
* **路由**: React Router DOM v7
* **状态管理**: Zustand(全局)+ TanStack Query(服务端)
* **UI 组件**: shadcn/ui(必须使用,禁止其他 UI 库)
* **样式**: Tailwind CSS(布局优先,少用颜色类)
* **表单**: react-hook-form + zod
### 目录结构
```
apps/web/src/
├── components/ # React 组件(auth/, layouts/, ui/)
├── hooks/queries/ # React Query hooks
├── lib/ # 工具函数(api, api-error)
├── pages/ # 页面组件
├── routes/ # 路由配置
└── stores/ # Zustand stores
```
### UI 组件
* **必须使用 shadcn/ui**:`pnpm dlx shadcn@latest add [component-name]`
* 组件位置:`components/ui/`
* 禁止:Material-UI、Ant Design 等
### 路由守卫
* `ProtectedRoute`:保护需要登录的路由
* `PublicRoute`:已登录用户访问登录页时重定向
### API 调用
* 使用 Hono RPC 客户端(`hc`),自动类型推断
* 位置:`lib/api.ts`
* 自动添加 Authorization header
* API hooks:封装在 `hooks/queries/` 中
## 类型安全规范 ⚠️ 严格遵循
### TypeScript 严格模式
* **禁止使用 `any` 类型**:必须使用明确的类型定义
* 如果类型推断失败,应该:
1. 检查类型定义是否正确
2. 使用 `unknown` 进行类型守卫
3. 定义明确的接口或类型别名
4. 使用泛型提高类型复用性
### 类型定义原则
* 优先使用类型推断,减少显式类型注解
* 使用 `interface` 定义对象类型
* 使用 `type` 定义联合类型、工具类型等
* 避免使用类型断言(`as`),除非确实必要且类型安全
### 示例
```typescript
// ❌ 错误:使用 any
function process(data: any) { ... }
// ✅ 正确:使用明确的类型
function process(data: T) { ... }
// 或
function process(data: unknown) {
if (isValidData(data)) { ... }
}
```
## Git 提交规范
### 格式
`类型(模块): 描述`
**类型**: `feat` | `fix` | `docs` | `refactor` | `test` | `chore` | `perf` | `ci`
**模块**: `auth` | `user` | `api` | `ui` | `config` | `deploy` | `deps` | `init`
**示例**:
```bash
feat(auth): 添加用户登录功能
fix(api): 修复 CORS 错误
docs(readme): 更新部署文档
chore(deps): 更新依赖版本
test(auth): 添加登录测试用例
```
## 包管理规范
### 包管理器
* 使用 pnpm(workspace 模式)
* 安装:`pnpm add [package]` 或 `pnpm add -D [package]`
* 工作区:使用 `--filter` 指定工作区
### 禁止使用的包
* **UI 库**: Material-UI、Ant Design 等(使用 shadcn/ui)
* **CSS 框架**: Bootstrap、Bulma 等(使用 Tailwind)
* **状态管理**: Redux(使用 Zustand + TanStack Query)
## 注意事项
1. 不要提交敏感信息(环境变量、密钥)
2. 不要提交构建产物(`dist/`, `.wrangler/`)
3. 遵循 TDD 流程:先写测试,再写代码
4. 使用 shadcn/ui,不要使用其他 UI 库
5. 保持代码简洁,遵循单一职责原则
6. **严格类型安全**:禁止使用 `any`,必须使用明确的类型定义
---
---
url: /guide/getting-started.md
---
# 快速开始
本指南将帮助你快速启动 Fullstack Pack 项目。
## 前置要求
* Node.js >= 18.0.0
* pnpm >= 8.0.0
* PostgreSQL 数据库(或使用 Prisma Accelerate)
## 安装步骤
### 1. 克隆项目
```bash
git clone
cd fullstackpack
```
### 2. 安装依赖
```bash
pnpm install
```
### 3. 配置环境变量
复制 `.env.example` 到 `.env` 并填写配置:
```bash
cp .env.example .env
```
**必需配置:**
* `DATABASE_URL` - PostgreSQL 数据库连接字符串
* `JWT_SECRET` - JWT 密钥(至少 32 字符)
**可选配置:**
* `ACCELERATE_URL` - Prisma Accelerate URL(Cloudflare Workers 推荐)
* `CORS_ORIGIN` - CORS 允许的源
* `JWT_EXPIRES_IN` - JWT 过期时间(默认:7d)
### 4. 初始化数据库
```bash
# 推送 schema 到数据库
pnpm db:push
# 或使用 migrations(生产环境推荐)
cd apps/server
npx prisma migrate dev
```
### 5. 启动开发服务器
```bash
# 同时启动所有应用(推荐)
pnpm dev:all
# 单独启动
pnpm dev:server # 后端:http://localhost:8787
pnpm dev:web # Web 应用:http://localhost:8000
pnpm dev:auth-portal # 认证门户:http://localhost:7777
pnpm docs:dev # 文档站点:http://localhost:9000
```
## 验证安装
1. 访问 `http://localhost:8000` - 应该看到 Web 应用
2. 访问 `http://localhost:7777` - 应该看到认证门户
3. 访问 `http://localhost:9000` - 应该看到文档站点
4. 访问 `http://localhost:8787/api/v1/health` - 应该看到 API 响应
## 下一步
* [开发指南](/guide/development) - 了解开发流程
* [项目结构](/guide/structure) - 了解项目组织
* [开发规范](/guide/conventions) - 遵循开发规范
---
---
url: /README.md
---
# 文档站点
Fullstack Pack 项目文档站点,使用 VitePress 构建。
## 开发
```bash
pnpm dev
```
访问:http://localhost:9000
## 构建
```bash
pnpm build
```
构建产物在 `.vitepress/dist/` 目录。
## LLMs 文档
插件会自动生成 LLM 友好的文档文件:
* **llms.txt** - 文档索引(简洁版)
* **llms-full.txt** - 完整文档内容
### 访问地址
**开发环境:**
* `/llms.txt`
* `/llms-full.txt`
**生产环境:**
* `https://your-domain.com/llms.txt`
* `https://your-domain.com/llms-full.txt`
### 文件位置
构建后的文件位于:
* `.vitepress/dist/llms.txt`
* `.vitepress/dist/llms-full.txt`
## 环境变量
文档站点是静态站点,**无需配置环境变量**。
## 功能
* ✅ 本地搜索(VitePress 内置)
* ✅ LLMs 支持(vitepress-plugin-llms)
* ✅ 响应式设计
* ✅ 中文界面
---
---
url: /deployment/self-hosted.md
---
# 自托管部署
## 概述
自托管部署允许你在自有服务器上运行 Fullstack Pack,提供更多控制和灵活性。
## 架构说明
### 自托管部署
* **后端**: Node.js 服务器(使用 `@hono/node-server`)
* **前端**: 任何静态文件服务器(Nginx、Apache、Node.js 等)
* **数据库**: PostgreSQL(直接 TCP 连接)
## 部署步骤
### 1. 后端部署
#### 1.1 环境要求
* Node.js >= 18.0.0
* PostgreSQL 数据库
* pnpm >= 8.0.0
#### 1.2 安装依赖
```bash
cd apps/server
pnpm install
```
#### 1.3 配置环境变量
创建 `.env` 文件:
```bash
# 必需
DATABASE_URL=postgresql://user:password@localhost:5432/dbname
JWT_SECRET=your-secret-key-at-least-32-characters-long
# 可选
NODE_ENV=production
SERVER_PORT=3000
SERVER_HOST=0.0.0.0
JWT_EXPIRES_IN=7d
CORS_ORIGIN=https://your-frontend-domain.com
```
#### 1.4 数据库迁移
```bash
# 生成 Prisma Client
pnpm db:generate
# 推送数据库 schema(开发环境)
pnpm db:push
# 或使用 migrations(生产环境推荐)
npx prisma migrate deploy
```
#### 1.5 构建和启动
```bash
# 构建
pnpm build
# 启动(使用 Node.js)
pnpm start
# 或使用 PM2(推荐生产环境)
pm2 start dist/server.js --name fullstackpack-api
```
#### 1.6 使用 Docker(可选)
创建 `Dockerfile`:
```dockerfile
FROM node:20-alpine
WORKDIR /app
# 安装 pnpm
RUN npm install -g pnpm
# 复制依赖文件
COPY package.json pnpm-lock.yaml pnpm-workspace.yaml ./
COPY apps/server/package.json ./apps/server/
COPY packages/*/package.json ./packages/*/
# 安装依赖
RUN pnpm install --frozen-lockfile
# 复制源代码
COPY . .
# 构建
RUN pnpm --filter server build
WORKDIR /app/apps/server
# 暴露端口
EXPOSE 3000
# 启动
CMD ["node", "dist/server.js"]
```
构建和运行:
```bash
docker build -t fullstackpack-api .
docker run -p 3000:3000 --env-file .env fullstackpack-api
```
### 2. 前端部署
#### 2.1 构建前端应用
**Web 应用**:
```bash
cd apps/web
pnpm install
pnpm build
# 构建产物在 dist/ 目录
```
**认证门户**:
```bash
cd apps/auth-portal
pnpm install
pnpm build
# 构建产物在 dist/ 目录
```
#### 2.2 配置环境变量
在构建前设置环境变量:
```bash
# Web 应用
export VITE_API_URL=https://api.yourdomain.com
export VITE_AUTH_PORTAL_URL=https://auth.yourdomain.com
# 认证门户
export VITE_API_URL=https://api.yourdomain.com
pnpm build
```
或创建 `.env.production` 文件:
```bash
# apps/web/.env.production
VITE_API_URL=https://api.yourdomain.com
VITE_AUTH_PORTAL_URL=https://auth.yourdomain.com
# apps/auth-portal/.env.production
VITE_API_URL=https://api.yourdomain.com
```
#### 2.3 使用 Nginx 部署
**Nginx 配置示例**:
```nginx
# Web 应用
server {
listen 80;
server_name app.yourdomain.com;
root /var/www/fullstackpack/web/dist;
index index.html;
# SPA 路由支持
location / {
try_files $uri $uri/ /index.html;
}
# 静态资源缓存
location /assets {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
# 认证门户
server {
listen 80;
server_name auth.yourdomain.com;
root /var/www/fullstackpack/auth-portal/dist;
index index.html;
location / {
try_files $uri $uri/ /index.html;
}
location /assets {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
# API 代理(可选,如果前端和后端在同一服务器)
server {
listen 80;
server_name api.yourdomain.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
```
#### 2.4 使用 Node.js 静态服务器(开发/测试)
```bash
# 安装 serve
npm install -g serve
# 启动 Web 应用
serve -s apps/web/dist -l 8000
# 启动认证门户
serve -s apps/auth-portal/dist -l 7777
```
### 3. 完整部署示例
#### 3.1 使用 Docker Compose
创建 `docker-compose.yml`:
```yaml
version: '3.8'
services:
postgres:
image: postgres:16-alpine
environment:
POSTGRES_USER: fullstackpack
POSTGRES_PASSWORD: your-password
POSTGRES_DB: fullstackpack
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
api:
build:
context: .
dockerfile: apps/server/Dockerfile
environment:
DATABASE_URL: postgresql://fullstackpack:your-password@postgres:5432/fullstackpack
JWT_SECRET: your-secret-key-at-least-32-characters-long
NODE_ENV: production
SERVER_PORT: 3000
SERVER_HOST: 0.0.0.0
ports:
- "3000:3000"
depends_on:
- postgres
nginx:
image: nginx:alpine
volumes:
- ./apps/web/dist:/usr/share/nginx/html/web:ro
- ./apps/auth-portal/dist:/usr/share/nginx/html/auth:ro
- ./nginx.conf:/etc/nginx/nginx.conf:ro
ports:
- "80:80"
- "443:443"
depends_on:
- api
volumes:
postgres_data:
```
#### 3.2 使用 PM2 部署
**ecosystem.config.js**:
```javascript
module.exports = {
apps: [
{
name: 'fullstackpack-api',
script: './apps/server/dist/server.js',
cwd: '/path/to/fullstackpack',
env: {
NODE_ENV: 'production',
DATABASE_URL: 'postgresql://...',
JWT_SECRET: '...',
SERVER_PORT: 3000,
SERVER_HOST: '0.0.0.0',
},
instances: 'max',
exec_mode: 'cluster',
},
],
}
```
启动:
```bash
pm2 start ecosystem.config.js
pm2 save
pm2 startup
```
## 环境变量对比
### Cloudflare Workers(后端)
```bash
# 必需
ACCELERATE_URL=prisma://accelerate.prisma.io/?api_key=...
JWT_SECRET=...
# 可选
NODE_ENV=production
CORS_ORIGIN=https://your-frontend.com
JWT_EXPIRES_IN=7d
```
### 自托管 Node.js(后端)
```bash
# 必需
DATABASE_URL=postgresql://user:password@host:5432/dbname
JWT_SECRET=...
# 可选
NODE_ENV=production
SERVER_PORT=3000
SERVER_HOST=0.0.0.0
CORS_ORIGIN=https://your-frontend.com
JWT_EXPIRES_IN=7d
```
### 前端(两种方式相同)
```bash
VITE_API_URL=https://api.yourdomain.com
VITE_AUTH_PORTAL_URL=https://auth.yourdomain.com
```
## 数据库连接差异
### Cloudflare Workers
* **必须使用**: Prisma Accelerate(通过 HTTP API)
* **原因**: Workers 不支持 TCP 连接
### 自托管 Node.js
* **推荐使用**: DATABASE\_URL + Prisma Adapter(直接 TCP 连接)
* **也可以使用**: Prisma Accelerate(如果需要)
## 性能对比
| 特性 | Cloudflare Workers | 自托管 Node.js |
|------|-------------------|----------------|
| **延迟** | 边缘计算,全球低延迟 | 取决于服务器位置 |
| **扩展性** | 自动扩展 | 需要手动配置 |
| **成本** | 按请求计费 | 固定服务器成本 |
| **数据库连接** | 必须使用 Accelerate | 直接 TCP 连接 |
| **维护** | 无需维护 | 需要服务器维护 |
## 推荐方案
* **小型项目/原型**: Cloudflare 部署(简单、快速)
* **大型项目/企业**: 自托管(更多控制、成本可控)
* **混合方案**: 前端 Cloudflare Pages + 后端自托管
## 注意事项
1. **CORS 配置**: 确保后端 CORS 设置允许前端域名
2. **HTTPS**: 生产环境必须使用 HTTPS
3. **环境变量**: 不要在代码中硬编码敏感信息
4. **数据库迁移**: 生产环境使用 `prisma migrate deploy` 而不是 `db:push`
5. **日志**: 配置适当的日志收集和监控
---
---
url: /deployment.md
---
# 部署概述
Fullstack Pack 支持两种部署方式:
1. **Cloudflare 部署**(推荐)- 使用 Cloudflare Workers + Pages
2. **自托管部署** - 在自有服务器上运行
## 部署方式对比
| 特性 | Cloudflare | 自托管 |
|------|-----------|--------|
| **后端运行时** | Cloudflare Workers | Node.js |
| **数据库连接** | Prisma Accelerate(HTTP) | DATABASE\_URL(TCP) |
| **前端托管** | Cloudflare Pages | Nginx/Apache/Node.js |
| **扩展性** | 自动扩展 | 手动配置 |
| **成本** | 按请求计费 | 固定服务器成本 |
| **延迟** | 边缘计算,全球低延迟 | 取决于服务器位置 |
## 推荐方案
* **小型项目/原型**: Cloudflare 部署(简单、快速)
* **大型项目/企业**: 自托管(更多控制、成本可控)
* **混合方案**: 前端 Cloudflare Pages + 后端自托管
## 文档导航
* [Cloudflare 部署](/deployment/cloudflare) - Cloudflare Workers + Pages 部署指南
* [自托管部署](/deployment/self-hosted) - 自有服务器部署指南
* [CI/CD](/deployment/cicd) - 自动化部署配置
---
---
url: /guide/structure.md
---
# 项目结构
## Monorepo 结构
```
fullstackpack/
├── apps/
│ ├── web/ # Web 应用(React + Vite)
│ ├── auth-portal/ # 认证门户(统一登录入口)
│ ├── front-template/ # 前端应用模板
│ └── server/ # 后端服务(Hono + Cloudflare Workers)
├── packages/
│ ├── logger/ # 通用日志包
│ └── shared/ # 共享类型和 schemas
├── apps/docs/ # 文档站点(VitePress)
├── pnpm-workspace.yaml # pnpm workspace 配置
└── package.json # 根 package.json
```
## 应用结构
### Server (`apps/server`)
```
apps/server/
├── src/
│ ├── config/ # 配置模块
│ ├── db/ # Prisma client
│ ├── lib/ # 工具函数
│ ├── middlewares/ # Hono 中间件
│ ├── routes/v1/ # API 路由
│ ├── services/ # 业务逻辑层
│ └── __tests__/ # 测试文件
├── prisma/
│ └── schema.prisma # 数据库 schema
└── wrangler.toml # Cloudflare Workers 配置
```
### Web (`apps/web`)
```
apps/web/
├── src/
│ ├── components/ # React 组件
│ │ ├── auth/ # 认证相关组件
│ │ ├── layouts/ # 布局组件
│ │ └── ui/ # shadcn/ui 组件
│ ├── hooks/queries/ # React Query hooks
│ ├── lib/ # 工具函数
│ ├── pages/ # 页面组件
│ ├── routes/ # 路由配置
│ └── stores/ # Zustand stores
└── vite.config.ts # Vite 配置
```
### Auth Portal (`apps/auth-portal`)
```
apps/auth-portal/
├── src/
│ ├── components/ # React 组件
│ ├── pages/ # 页面(主要是 Auth.tsx)
│ ├── routes/ # 路由配置
│ └── stores/ # 认证状态管理
└── vite.config.ts
```
## 包结构
### Shared (`packages/shared`)
```
packages/shared/
├── src/
│ ├── schemas/ # Zod schemas
│ ├── types/ # TypeScript 类型
│ ├── lib/ # 工具函数(如 auth 工具)
│ └── errors/ # 错误码定义
└── package.json
```
### Logger (`packages/logger`)
```
packages/logger/
├── src/
│ └── index.ts # Logger 实现
└── package.json
```
## 代码组织原则
### 分层架构
* **Routes** → **Services** → **Database**
* 路由层:只处理请求/响应,调用 Service
* 服务层:业务逻辑,不直接处理 HTTP
### 共享代码
* 类型定义:`packages/shared`
* 工具函数:`packages/shared/lib`
* 日志工具:`packages/logger`
### 测试
* 测试文件与源码结构对应
* 使用 `__tests__` 目录
* 命名:`*.test.ts` 或 `*.spec.ts`