# 小红书 AI 文案生成系统

基于 AI 的智能文案创作平台，专注于小红书风格内容的自动生成。

## 项目简介

本项目是一个全栈 Web 应用，帮助用户快速生成符合小红书平台风格的营销文案。通过 AI 技术，用户只需输入主题关键词，即可自动生成带有 emoji 表情、话题标签和配图建议的高质量文案。

### 核心功能

- **AI 智能生成**: 输入主题关键词，自动生成小红书风格文案
- **历史记录**: 保存所有生成历史，支持搜索和管理
- **配图建议**: 为每条文案提供配套的图片拍摄建议
- **用户认证**: 完整的注册登录和权限管理系统
- **管理后台**: 管理员可管理所有用户和文案记录

## 技术栈

### 后端技术

| 技术 | 版本 | 用途 |
|------|------|------|
| NestJS | 11.1.0 | 后端框架 |
| TypeScript | 5.9.3 | 类型安全开发 |
| Prisma | 6.0.0 | ORM 框架 |
| MySQL | - | 关系型数据库 |
| @nestjs/swagger | 11.2.0 | API 文档 |
| @nestjs/jwt | - | JWT 认证 |
| Zod | 3.22.0 | 数据验证 |
| OpenAI SDK | 6.17.0 | AI 服务集成 |

### 前端技术

| 技术 | 版本 | 用途 |
|------|------|------|
| Vue 3 | 3.5.24 | 前端框架 |
| TypeScript | 5.9.0 | 类型安全开发 |
| Vite | - | 构建工具 |
| Naive UI | 2.43.2 | UI 组件库 |
| Pinia | 3.0.0 | 状态管理 |
| Vue Router | 4.2.0 | 路由管理 |
| Vue Query | 5.0.0 | 数据请求管理 |
| Tailwind CSS | 3.4.0 | 样式框架 |
| ECharts | 6.0.0 | 数据可视化 |

## 项目结构

```
workspace/
├── backend/                    # NestJS 后端服务
│   ├── src/
│   │   ├── common/            # 通用模块
│   │   │   ├── auth/          # JWT 鉴权模块
│   │   │   ├── prisma/        # Prisma 服务
│   │   │   └── decorators/    # 装饰器
│   │   └── modules/           # 业务模块
│   │       ├── ai/            # AI 文案生成服务
│   │       ├── copy/          # 文案管理
│   │       ├── upload/        # 文件上传
│   │       └── user/          # 用户管理
│   ├── prisma/
│   │   ├── schema.prisma      # 数据库模型定义
│   │   └── seed.ts            # 种子数据
│   ├── test/                  # 测试文件
│   ├── Dockerfile             # 后端容器配置
│   ├── package.json
│   └── .env.example           # 环境变量示例
│
├── frontend/                   # Vue 3 前端应用
│   ├── src/
│   │   ├── api/               # API 客户端
│   │   ├── composables/       # 组合式函数
│   │   ├── components/        # 通用组件
│   │   ├── config/            # 配置文件
│   │   ├── layouts/           # 布局组件
│   │   ├── router/            # 路由配置
│   │   ├── stores/            # Pinia 状态管理
│   │   ├── types/             # TypeScript 类型
│   │   ├── utils/             # 工具函数
│   │   └── views/             # 页面组件
│   │       ├── admin/         # 管理后台页面
│   │       ├── HomePage.vue   # 文案生成页
│   │       ├── HistoryPage.vue # 历史记录页
│   │       ├── ProfilePage.vue # 个人中心页
│   │       ├── LoginPage.vue
│   │       └── RegisterPage.vue
│   ├── public/
│   ├── Dockerfile             # 前端容器配置
│   ├── nginx.conf             # Nginx 配置
│   ├── package.json
│   └── .env                   # 环境变量
│
├── .spec/                      # 技术规范文档
│   ├── backend-nestjs/        # 后端开发规范
│   └── frontend-vue3/         # 前端开发规范
│
├── docs/                       # 项目文档
│   └── ai-generation-design.md # AI 生成设计文档
│
├── plan.md                     # 项目计划
├── data-model.md               # 数据模型定义
├── docker-compose.yml          # Docker 编排配置
└── README.md                   # 项目说明
```

## 快速开始

### 环境要求

- Node.js >= 18.x
- pnpm >= 8.x
- MySQL >= 8.0

### 安装依赖

```bash
# 安装后端依赖
cd backend
pnpm install

# 安装前端依赖
cd ../frontend
pnpm install
```

### 环境配置

#### 后端配置 (backend/.env)

```bash
# 数据库连接
DATABASE_URL="mysql://用户名:密码@localhost:3306/小红书文案生成"

# JWT 配置
JWT_SECRET="your-secret-key-change-in-production"
JWT_EXPIRES_IN="7d"

# AI 服务配置
AI_API_KEY="your-openai-api-key"
AI_API_BASE_URL="https://api.openai.com/v1"  # 可选，默认使用 OpenAI
AI_MODEL="gpt-3.5-turbo"

# 文件上传配置
UPLOAD_DIR="./uploads"
UPLOAD_MAX_SIZE=10485760

# 服务端口
PORT=3000
```

#### 前端配置 (frontend/.env)

```bash
VITE_API_BASE_URL=/api
```

### 数据库初始化

```bash
cd backend

# 生成 Prisma Client
pnpm prisma generate

# 执行数据库迁移
pnpm prisma migrate dev

# 填充种子数据（可选）
pnpm prisma db seed
```

种子数据预置账户：
- 管理员: `admin@example.com` / `123456`
- 普通用户: `user@example.com` / `123456`

### 启动开发服务

```bash
# 启动后端服务 (端口 3000)
cd backend
pnpm run start:dev

# 启动前端服务 (端口 5173)
cd frontend
pnpm run dev
```

访问 `http://localhost:5173` 即可使用应用。

API 文档访问 `http://localhost:3000/api/docs`

## 开发指南

### 开发模式

后端使用 SWC 编译器，支持热重载：

```bash
cd backend
pnpm run start:dev    # 开发模式（监听文件变化）
pnpm run start:debug  # 调试模式
```

前端使用 Vite 开发服务器：

```bash
cd frontend
pnpm run dev          # 开发模式
pnpm run preview      # 预览生产构建
```

### 构建命令

```bash
# 后端构建
cd backend
pnpm run build        # 输出到 dist/ 目录

# 前端构建
cd frontend
pnpm run build        # 输出到 dist/ 目录
```

### 测试命令

```bash
# 后端测试
cd backend
pnpm run test         # 单元测试
pnpm run test:e2e     # E2E 测试
pnpm run test:cov     # 测试覆盖率

# 前端测试
cd frontend
pnpm run test         # 单元测试
```

### Prisma 常用命令

```bash
cd backend

# 打开 Prisma Studio（数据库可视化工具）
pnpm prisma studio

# 创建新迁移
pnpm prisma migrate dev --name 描述

# 重置数据库
pnpm prisma migrate reset

# 推送 schema 变更（开发环境）
pnpm prisma db push
```

## Naive UI 组件库使用

本项目使用 Naive UI 作为主要 UI 组件库。Naive UI 是一个 Vue 3 组件库，提供丰富的组件和优秀的 TypeScript 支持。

### 基础使用

```vue
<script setup lang="ts">
import { NButton, NInput, NCard } from 'naive-ui'
</script>

<template>
  <NCard title="卡片标题">
    <NInput placeholder="请输入内容" />
    <NButton type="primary">确定</NButton>
  </NCard>
</template>
```

### 主题配置

主题配置位于 `frontend/src/config/theme.ts`，支持自定义颜色、字体等。

### 常用组件

| 组件 | 用途 |
|------|------|
| NButton | 按钮 |
| NInput | 输入框 |
| NCard | 卡片 |
| NDataTable | 数据表格 |
| NForm | 表单 |
| NMessage | 消息提示 |
| NModal | 模态框 |
| NMenu | 菜单 |
| NLayout | 布局 |

详细文档请参考 [Naive UI 官方文档](https://www.naiveui.com/)。

## API 接口

### 认证接口

| 方法 | 路径 | 描述 |
|------|------|------|
| POST | `/api/auth/register` | 用户注册 |
| POST | `/api/auth/login` | 用户登录 |
| GET | `/api/auth/profile` | 获取当前用户信息 |

### 用户接口

| 方法 | 路径 | 描述 |
|------|------|------|
| PATCH | `/api/users/me` | 更新个人资料 |
| PATCH | `/api/users/password` | 修改密码 |
| GET | `/api/users` | 获取用户列表（管理员） |

### 文案接口

| 方法 | 路径 | 描述 |
|------|------|------|
| POST | `/api/copies/generate` | AI 生成文案 |
| GET | `/api/copies` | 获取我的历史记录 |
| DELETE | `/api/copies/:id` | 删除我的文案 |
| GET | `/api/copies/admin` | 获取所有文案（管理员） |
| DELETE | `/api/copies/admin/:id` | 删除任意文案（管理员） |

完整 API 文档请访问 `/api/docs`（Swagger UI）。

## 页面路由

| 路径 | 页面 | 权限 |
|------|------|------|
| `/` | 文案生成页 | 登录用户 |
| `/history` | 历史记录页 | 登录用户 |
| `/profile` | 个人中心页 | 登录用户 |
| `/admin/copies` | 文案管理 | 管理员 |
| `/admin/users` | 用户管理 | 管理员 |
| `/auth/login` | 登录页 | 公开 |
| `/auth/register` | 注册页 | 公开 |

## 常见问题

### Q: AI 生成失败怎么办？

A: 请检查 `AI_API_KEY` 是否正确配置。如果使用第三方 API，确保 `AI_API_BASE_URL` 设置正确。

### Q: 如何更换数据库？

A: 修改 `DATABASE_URL` 环境变量，然后运行 `pnpm prisma migrate dev` 重新生成迁移。

### Q: 前端如何代理 API 请求？

A: 开发环境已配置 Vite 代理，生产环境需要通过 Nginx 反向代理。

## 许可证

MIT License
