增加原型验证
This commit is contained in:
+1506
File diff suppressed because it is too large
Load Diff
+898
@@ -0,0 +1,898 @@
|
||||
#!/bin/bash
|
||||
|
||||
# HotTrend Tees 原型快速启动脚本
|
||||
# 使用方法: bash quick_start.sh
|
||||
|
||||
set -e
|
||||
|
||||
echo "🚀 HotTrend Tees 原型快速启动"
|
||||
echo "================================"
|
||||
|
||||
# 检查必要的工具
|
||||
check_dependencies() {
|
||||
echo "📋 检查依赖项..."
|
||||
|
||||
if ! command -v docker &> /dev/null; then
|
||||
echo "❌ Docker 未安装,请先安装 Docker"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v node &> /dev/null; then
|
||||
echo "❌ Node.js 未安装,请先安装 Node.js"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! command -v python3 &> /dev/null; then
|
||||
echo "❌ Python3 未安装,请先安装 Python3"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "✅ 依赖项检查完成"
|
||||
}
|
||||
|
||||
# 创建项目目录结构
|
||||
setup_project_structure() {
|
||||
echo "📁 创建项目目录结构..."
|
||||
|
||||
mkdir -p hottrend-tees/{backend,frontend,docker,scripts,docs}
|
||||
mkdir -p hottrend-tees/backend/{app/{models,services,api,utils},tests}
|
||||
mkdir -p hottrend-tees/frontend/{src/{components,services},public}
|
||||
|
||||
cd hottrend-tees
|
||||
echo "✅ 项目结构创建完成"
|
||||
}
|
||||
|
||||
# 创建环境配置文件
|
||||
create_env_files() {
|
||||
echo "⚙️ 创建环境配置文件..."
|
||||
|
||||
# 后端环境配置
|
||||
cat > backend/.env.example << 'EOF'
|
||||
# Twitter API 配置
|
||||
TWITTER_BEARER_TOKEN=your_twitter_bearer_token
|
||||
TWITTER_API_KEY=your_twitter_api_key
|
||||
TWITTER_API_SECRET=your_twitter_api_secret
|
||||
TWITTER_ACCESS_TOKEN=your_twitter_access_token
|
||||
TWITTER_ACCESS_TOKEN_SECRET=your_twitter_access_token_secret
|
||||
|
||||
# OpenAI API 配置
|
||||
OPENAI_API_KEY=your_openai_api_key
|
||||
|
||||
# AWS 配置
|
||||
AWS_ACCESS_KEY_ID=your_aws_access_key
|
||||
AWS_SECRET_ACCESS_KEY=your_aws_secret_key
|
||||
AWS_REGION=us-east-1
|
||||
AWS_S3_BUCKET=hottrend-tees-designs
|
||||
|
||||
# 数据库配置
|
||||
DATABASE_URL=postgresql://user:password@localhost/hottrend_tees
|
||||
|
||||
# Redis 配置
|
||||
REDIS_URL=redis://localhost:6379
|
||||
EOF
|
||||
|
||||
# 前端环境配置
|
||||
cat > frontend/.env.example << 'EOF'
|
||||
REACT_APP_API_URL=http://localhost:8000
|
||||
REACT_APP_APP_NAME=HotTrend Tees
|
||||
EOF
|
||||
|
||||
echo "✅ 环境配置文件创建完成"
|
||||
echo "⚠️ 请复制 .env.example 为 .env 并填入真实的API密钥"
|
||||
}
|
||||
|
||||
# 创建Docker配置
|
||||
create_docker_configs() {
|
||||
echo "🐳 创建Docker配置..."
|
||||
|
||||
# 后端Dockerfile
|
||||
cat > backend/Dockerfile << 'EOF'
|
||||
FROM python:3.11-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
# 安装系统依赖
|
||||
RUN apt-get update && apt-get install -y \
|
||||
build-essential \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# 安装Python依赖
|
||||
COPY requirements.txt .
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
# 复制应用代码
|
||||
COPY . .
|
||||
|
||||
EXPOSE 8000
|
||||
|
||||
# 启动应用
|
||||
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
|
||||
EOF
|
||||
|
||||
# 前端Dockerfile
|
||||
cat > frontend/Dockerfile << 'EOF'
|
||||
FROM node:18-alpine AS build
|
||||
|
||||
WORKDIR /app
|
||||
COPY package*.json ./
|
||||
RUN npm ci --only=production
|
||||
|
||||
COPY . .
|
||||
RUN npm run build
|
||||
|
||||
FROM nginx:alpine
|
||||
COPY --from=build /app/build /usr/share/nginx/html
|
||||
COPY nginx.conf /etc/nginx/nginx.conf
|
||||
|
||||
EXPOSE 80
|
||||
CMD ["nginx", "-g", "daemon off;"]
|
||||
EOF
|
||||
|
||||
# Nginx配置
|
||||
cat > frontend/nginx.conf << 'EOF'
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name localhost;
|
||||
|
||||
location / {
|
||||
root /usr/share/nginx/html;
|
||||
index index.html index.htm;
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
location /api/ {
|
||||
proxy_pass http://backend:8000;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
}
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
# Docker Compose配置
|
||||
cat > docker-compose.yml << 'EOF'
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
backend:
|
||||
build: ./backend
|
||||
ports:
|
||||
- "8000:8000"
|
||||
environment:
|
||||
- DATABASE_URL=postgresql://postgres:password@db:5432/hottrend_tees
|
||||
- REDIS_URL=redis://redis:6379
|
||||
env_file:
|
||||
- ./backend/.env
|
||||
depends_on:
|
||||
- db
|
||||
- redis
|
||||
volumes:
|
||||
- ./backend:/app
|
||||
restart: unless-stopped
|
||||
|
||||
frontend:
|
||||
build: ./frontend
|
||||
ports:
|
||||
- "3000:80"
|
||||
depends_on:
|
||||
- backend
|
||||
restart: unless-stopped
|
||||
|
||||
db:
|
||||
image: postgres:15
|
||||
environment:
|
||||
POSTGRES_DB: hottrend_tees
|
||||
POSTGRES_USER: postgres
|
||||
POSTGRES_PASSWORD: password
|
||||
ports:
|
||||
- "5432:5432"
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
restart: unless-stopped
|
||||
|
||||
redis:
|
||||
image: redis:7-alpine
|
||||
ports:
|
||||
- "6379:6379"
|
||||
volumes:
|
||||
- redis_data:/data
|
||||
restart: unless-stopped
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
redis_data:
|
||||
EOF
|
||||
|
||||
echo "✅ Docker配置创建完成"
|
||||
}
|
||||
|
||||
# 创建package.json文件
|
||||
create_package_files() {
|
||||
echo "📦 创建package.json文件..."
|
||||
|
||||
# 后端requirements.txt
|
||||
cat > backend/requirements.txt << 'EOF'
|
||||
fastapi==0.104.1
|
||||
uvicorn[standard]==0.24.0
|
||||
tweepy==4.14.0
|
||||
openai==1.3.7
|
||||
boto3==1.29.7
|
||||
sqlalchemy==2.0.23
|
||||
psycopg2-binary==2.9.9
|
||||
redis==5.0.1
|
||||
celery==5.3.4
|
||||
python-multipart==0.0.6
|
||||
python-dotenv==1.0.0
|
||||
requests==2.31.0
|
||||
pillow==10.1.0
|
||||
pydantic-settings==2.1.0
|
||||
alembic==1.13.1
|
||||
asyncpg==0.29.0
|
||||
aiohttp==3.9.1
|
||||
pytest==7.4.3
|
||||
pytest-asyncio==0.21.1
|
||||
httpx==0.25.2
|
||||
EOF
|
||||
|
||||
# 前端package.json
|
||||
cat > frontend/package.json << 'EOF'
|
||||
{
|
||||
"name": "hottrend-tees-frontend",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"dependencies": {
|
||||
"@mui/icons-material": "^5.14.19",
|
||||
"@mui/material": "^5.14.20",
|
||||
"@emotion/react": "^11.11.1",
|
||||
"@emotion/styled": "^11.11.0",
|
||||
"@testing-library/jest-dom": "^5.17.0",
|
||||
"@testing-library/react": "^13.4.0",
|
||||
"@testing-library/user-event": "^13.5.0",
|
||||
"axios": "^1.6.2",
|
||||
"react": "^18.2.0",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-router-dom": "^6.8.0",
|
||||
"react-scripts": "5.0.1",
|
||||
"recharts": "^2.8.0",
|
||||
"styled-components": "^6.1.1",
|
||||
"web-vitals": "^2.1.4"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "react-scripts start",
|
||||
"build": "react-scripts build",
|
||||
"test": "react-scripts test",
|
||||
"eject": "react-scripts eject"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
"react-app",
|
||||
"react-app/jest"
|
||||
]
|
||||
},
|
||||
"browserslist": {
|
||||
"production": [
|
||||
">0.2%",
|
||||
"not dead",
|
||||
"not op_mini all"
|
||||
],
|
||||
"development": [
|
||||
"last 1 chrome version",
|
||||
"last 1 firefox version",
|
||||
"last 1 safari version"
|
||||
]
|
||||
},
|
||||
"proxy": "http://localhost:8000"
|
||||
}
|
||||
EOF
|
||||
|
||||
echo "✅ Package文件创建完成"
|
||||
}
|
||||
|
||||
# 创建基础代码文件
|
||||
create_basic_code() {
|
||||
echo "💻 创建基础代码文件..."
|
||||
|
||||
# 后端主文件
|
||||
cat > backend/app/__init__.py << 'EOF'
|
||||
# HotTrend Tees Backend
|
||||
EOF
|
||||
|
||||
cat > backend/app/main.py << 'EOF'
|
||||
from fastapi import FastAPI
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
|
||||
app = FastAPI(
|
||||
title="HotTrend Tees API",
|
||||
description="AI驱动的T-shirt定制平台原型API",
|
||||
version="1.0.0"
|
||||
)
|
||||
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=["*"],
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
||||
@app.get("/")
|
||||
async def root():
|
||||
return {"message": "HotTrend Tees API v1.0.0", "status": "running"}
|
||||
|
||||
@app.get("/api/health")
|
||||
async def health_check():
|
||||
return {
|
||||
"status": "healthy",
|
||||
"timestamp": "2025-07-03T00:00:00Z",
|
||||
"services": {
|
||||
"api": "running"
|
||||
}
|
||||
}
|
||||
EOF
|
||||
|
||||
# 前端基础文件
|
||||
cat > frontend/public/index.html << 'EOF'
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<meta name="theme-color" content="#000000" />
|
||||
<meta name="description" content="HotTrend Tees - AI驱动的T-shirt定制平台" />
|
||||
<title>HotTrend Tees</title>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>您需要启用JavaScript才能运行此应用程序。</noscript>
|
||||
<div id="root"></div>
|
||||
</body>
|
||||
</html>
|
||||
EOF
|
||||
|
||||
cat > frontend/src/index.js << 'EOF'
|
||||
import React from 'react';
|
||||
import ReactDOM from 'react-dom/client';
|
||||
import App from './App';
|
||||
|
||||
const root = ReactDOM.createRoot(document.getElementById('root'));
|
||||
root.render(
|
||||
<React.StrictMode>
|
||||
<App />
|
||||
</React.StrictMode>
|
||||
);
|
||||
EOF
|
||||
|
||||
cat > frontend/src/App.js << 'EOF'
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { ThemeProvider, createTheme } from '@mui/material/styles';
|
||||
import {
|
||||
CssBaseline,
|
||||
AppBar,
|
||||
Toolbar,
|
||||
Typography,
|
||||
Container,
|
||||
Box,
|
||||
Card,
|
||||
CardContent,
|
||||
Button,
|
||||
Alert
|
||||
} from '@mui/material';
|
||||
import { AutoAwesome } from '@mui/icons-material';
|
||||
|
||||
const theme = createTheme({
|
||||
palette: {
|
||||
primary: {
|
||||
main: '#6366f1',
|
||||
},
|
||||
secondary: {
|
||||
main: '#ec4899',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
function App() {
|
||||
const [apiStatus, setApiStatus] = useState('checking');
|
||||
|
||||
useEffect(() => {
|
||||
checkApiHealth();
|
||||
}, []);
|
||||
|
||||
const checkApiHealth = async () => {
|
||||
try {
|
||||
const response = await fetch('/api/health');
|
||||
const data = await response.json();
|
||||
setApiStatus(data.status === 'healthy' ? 'healthy' : 'error');
|
||||
} catch (error) {
|
||||
setApiStatus('error');
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<ThemeProvider theme={theme}>
|
||||
<CssBaseline />
|
||||
|
||||
<AppBar position="static" elevation={0}>
|
||||
<Toolbar>
|
||||
<AutoAwesome sx={{ mr: 2 }} />
|
||||
<Typography variant="h6" component="div" sx={{ flexGrow: 1 }}>
|
||||
HotTrend Tees - AI驱动的T-shirt定制平台
|
||||
</Typography>
|
||||
</Toolbar>
|
||||
</AppBar>
|
||||
|
||||
<Container maxWidth="md" sx={{ py: 4 }}>
|
||||
<Box textAlign="center" mb={4}>
|
||||
<Typography variant="h3" component="h1" gutterBottom>
|
||||
欢迎使用 HotTrend Tees 原型
|
||||
</Typography>
|
||||
<Typography variant="h6" color="textSecondary" paragraph>
|
||||
基于 Twitter API v2 + OpenAI + AWS 的AI驱动T-shirt定制平台
|
||||
</Typography>
|
||||
</Box>
|
||||
|
||||
<Card sx={{ mb: 4 }}>
|
||||
<CardContent>
|
||||
<Typography variant="h5" gutterBottom>
|
||||
系统状态
|
||||
</Typography>
|
||||
|
||||
{apiStatus === 'checking' && (
|
||||
<Alert severity="info">正在检查API连接...</Alert>
|
||||
)}
|
||||
|
||||
{apiStatus === 'healthy' && (
|
||||
<Alert severity="success">API服务运行正常</Alert>
|
||||
)}
|
||||
|
||||
{apiStatus === 'error' && (
|
||||
<Alert severity="error" action={
|
||||
<Button color="inherit" size="small" onClick={checkApiHealth}>
|
||||
重试
|
||||
</Button>
|
||||
}>
|
||||
API服务连接失败
|
||||
</Alert>
|
||||
)}
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
<Card>
|
||||
<CardContent>
|
||||
<Typography variant="h5" gutterBottom>
|
||||
下一步操作
|
||||
</Typography>
|
||||
<Typography paragraph>
|
||||
1. 配置API密钥(Twitter、OpenAI、AWS)
|
||||
</Typography>
|
||||
<Typography paragraph>
|
||||
2. 启动完整功能模块
|
||||
</Typography>
|
||||
<Typography paragraph>
|
||||
3. 测试趋势分析和设计生成功能
|
||||
</Typography>
|
||||
|
||||
<Button
|
||||
variant="contained"
|
||||
size="large"
|
||||
sx={{ mt: 2 }}
|
||||
onClick={() => window.open('/api/docs', '_blank')}
|
||||
>
|
||||
查看API文档
|
||||
</Button>
|
||||
</CardContent>
|
||||
</Card>
|
||||
</Container>
|
||||
</ThemeProvider>
|
||||
);
|
||||
}
|
||||
|
||||
export default App;
|
||||
EOF
|
||||
|
||||
echo "✅ 基础代码文件创建完成"
|
||||
}
|
||||
|
||||
# 创建启动脚本
|
||||
create_startup_scripts() {
|
||||
echo "🔧 创建启动脚本..."
|
||||
|
||||
# 开发环境启动脚本
|
||||
cat > scripts/start-dev.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
|
||||
echo "🚀 启动HotTrend Tees开发环境"
|
||||
|
||||
# 检查环境文件
|
||||
if [ ! -f "./backend/.env" ]; then
|
||||
echo "❌ 请先创建 backend/.env 文件"
|
||||
echo "💡 提示: 复制 backend/.env.example 为 backend/.env 并填入API密钥"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "./frontend/.env" ]; then
|
||||
echo "❌ 请先创建 frontend/.env 文件"
|
||||
echo "💡 提示: 复制 frontend/.env.example 为 frontend/.env"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 启动服务
|
||||
echo "🐳 启动Docker服务..."
|
||||
docker-compose up -d db redis
|
||||
|
||||
echo "⏳ 等待数据库启动..."
|
||||
sleep 10
|
||||
|
||||
echo "🐍 启动后端服务..."
|
||||
cd backend
|
||||
python -m venv venv
|
||||
source venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000 &
|
||||
cd ..
|
||||
|
||||
echo "⚛️ 启动前端服务..."
|
||||
cd frontend
|
||||
npm install
|
||||
npm start &
|
||||
cd ..
|
||||
|
||||
echo "✅ 开发环境启动完成!"
|
||||
echo "🌐 前端地址: http://localhost:3000"
|
||||
echo "📡 后端API: http://localhost:8000"
|
||||
echo "📚 API文档: http://localhost:8000/docs"
|
||||
EOF
|
||||
|
||||
# 生产环境启动脚本
|
||||
cat > scripts/start-prod.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
|
||||
echo "🚀 启动HotTrend Tees生产环境"
|
||||
|
||||
# 检查环境文件
|
||||
if [ ! -f "./backend/.env" ]; then
|
||||
echo "❌ 请先创建 backend/.env 文件"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -f "./frontend/.env" ]; then
|
||||
echo "❌ 请先创建 frontend/.env 文件"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 构建并启动所有服务
|
||||
echo "🐳 构建并启动所有服务..."
|
||||
docker-compose up -d --build
|
||||
|
||||
echo "⏳ 等待服务启动..."
|
||||
sleep 30
|
||||
|
||||
echo "✅ 生产环境启动完成!"
|
||||
echo "🌐 应用地址: http://localhost:3000"
|
||||
echo "📡 API地址: http://localhost:8000"
|
||||
|
||||
# 显示服务状态
|
||||
docker-compose ps
|
||||
EOF
|
||||
|
||||
# 停止脚本
|
||||
cat > scripts/stop.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
|
||||
echo "🛑 停止HotTrend Tees服务"
|
||||
|
||||
# 停止Docker服务
|
||||
docker-compose down
|
||||
|
||||
# 停止本地进程
|
||||
pkill -f "uvicorn app.main:app"
|
||||
pkill -f "npm start"
|
||||
|
||||
echo "✅ 所有服务已停止"
|
||||
EOF
|
||||
|
||||
# 设置脚本可执行权限
|
||||
chmod +x scripts/*.sh
|
||||
|
||||
echo "✅ 启动脚本创建完成"
|
||||
}
|
||||
|
||||
# 创建测试脚本
|
||||
create_test_script() {
|
||||
echo "🧪 创建测试脚本..."
|
||||
|
||||
cat > scripts/test-api.py << 'EOF'
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import asyncio
|
||||
import aiohttp
|
||||
import json
|
||||
import sys
|
||||
|
||||
async def test_api():
|
||||
base_url = "http://localhost:8000"
|
||||
|
||||
print("🧪 开始API测试")
|
||||
print("=" * 40)
|
||||
|
||||
async with aiohttp.ClientSession() as session:
|
||||
try:
|
||||
# 测试健康检查
|
||||
print("📋 测试健康检查...")
|
||||
async with session.get(f"{base_url}/api/health") as resp:
|
||||
if resp.status == 200:
|
||||
health_data = await resp.json()
|
||||
print(f"✅ 健康检查通过: {health_data['status']}")
|
||||
else:
|
||||
print(f"❌ 健康检查失败: HTTP {resp.status}")
|
||||
return False
|
||||
|
||||
# 测试根路径
|
||||
print("🏠 测试根路径...")
|
||||
async with session.get(f"{base_url}/") as resp:
|
||||
if resp.status == 200:
|
||||
root_data = await resp.json()
|
||||
print(f"✅ 根路径访问成功: {root_data['message']}")
|
||||
else:
|
||||
print(f"❌ 根路径访问失败: HTTP {resp.status}")
|
||||
return False
|
||||
|
||||
print("\n🎉 所有基础测试通过!")
|
||||
print("💡 提示: 配置API密钥后可以测试完整功能")
|
||||
return True
|
||||
|
||||
except aiohttp.ClientError as e:
|
||||
print(f"❌ 连接失败: {e}")
|
||||
print("💡 确保后端服务已启动 (python -m uvicorn app.main:app)")
|
||||
return False
|
||||
except Exception as e:
|
||||
print(f"❌ 测试失败: {e}")
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = asyncio.run(test_api())
|
||||
sys.exit(0 if success else 1)
|
||||
EOF
|
||||
|
||||
chmod +x scripts/test-api.py
|
||||
|
||||
echo "✅ 测试脚本创建完成"
|
||||
}
|
||||
|
||||
# 创建README文件
|
||||
create_readme() {
|
||||
echo "📖 创建README文件..."
|
||||
|
||||
cat > README.md << 'EOF'
|
||||
# HotTrend Tees 原型项目
|
||||
|
||||
🚀 基于 Twitter API v2 + OpenAI + AWS 的AI驱动T-shirt定制平台原型
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 1. 环境准备
|
||||
|
||||
```bash
|
||||
# 复制环境配置文件
|
||||
cp backend/.env.example backend/.env
|
||||
cp frontend/.env.example frontend/.env
|
||||
|
||||
# 编辑环境文件,填入真实的API密钥
|
||||
# backend/.env - 填入Twitter、OpenAI、AWS密钥
|
||||
# frontend/.env - 配置前端参数
|
||||
```
|
||||
|
||||
### 2. 开发环境启动
|
||||
|
||||
```bash
|
||||
# 启动开发环境
|
||||
bash scripts/start-dev.sh
|
||||
|
||||
# 或分别启动各个组件
|
||||
# 1. 启动数据库和Redis
|
||||
docker-compose up -d db redis
|
||||
|
||||
# 2. 启动后端
|
||||
cd backend
|
||||
python -m venv venv
|
||||
source venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
uvicorn app.main:app --reload
|
||||
|
||||
# 3. 启动前端
|
||||
cd frontend
|
||||
npm install
|
||||
npm start
|
||||
```
|
||||
|
||||
### 3. 生产环境部署
|
||||
|
||||
```bash
|
||||
# 启动生产环境
|
||||
bash scripts/start-prod.sh
|
||||
|
||||
# 或使用Docker Compose
|
||||
docker-compose up -d --build
|
||||
```
|
||||
|
||||
### 4. API测试
|
||||
|
||||
```bash
|
||||
# 运行API测试
|
||||
python scripts/test-api.py
|
||||
|
||||
# 或手动测试
|
||||
curl http://localhost:8000/api/health
|
||||
```
|
||||
|
||||
## 访问地址
|
||||
|
||||
- 🌐 前端应用: http://localhost:3000
|
||||
- 📡 后端API: http://localhost:8000
|
||||
- 📚 API文档: http://localhost:8000/docs
|
||||
- 🗄️ 数据库: localhost:5432
|
||||
- 🔴 Redis: localhost:6379
|
||||
|
||||
## 项目结构
|
||||
|
||||
```
|
||||
hottrend-tees/
|
||||
├── backend/ # FastAPI后端
|
||||
│ ├── app/ # 应用代码
|
||||
│ ├── requirements.txt # Python依赖
|
||||
│ └── Dockerfile # Docker配置
|
||||
├── frontend/ # React前端
|
||||
│ ├── src/ # 源代码
|
||||
│ ├── package.json # Node依赖
|
||||
│ └── Dockerfile # Docker配置
|
||||
├── scripts/ # 脚本文件
|
||||
│ ├── start-dev.sh # 开发环境启动
|
||||
│ ├── start-prod.sh # 生产环境启动
|
||||
│ ├── stop.sh # 停止服务
|
||||
│ └── test-api.py # API测试
|
||||
├── docker-compose.yml # Docker编排
|
||||
└── README.md # 项目说明
|
||||
```
|
||||
|
||||
## 功能特性
|
||||
|
||||
### ✅ 已实现
|
||||
- 基础API框架 (FastAPI)
|
||||
- 前端界面框架 (React + Material-UI)
|
||||
- Docker容器化部署
|
||||
- 健康检查和监控
|
||||
- 开发/生产环境配置
|
||||
|
||||
### 🚧 待实现 (需要API密钥)
|
||||
- Twitter趋势数据获取
|
||||
- OpenAI图像生成
|
||||
- AWS S3存储集成
|
||||
- 用户认证系统
|
||||
- 订单管理系统
|
||||
|
||||
## 开发指南
|
||||
|
||||
### 环境要求
|
||||
- Python 3.11+
|
||||
- Node.js 18+
|
||||
- Docker & Docker Compose
|
||||
- PostgreSQL 15+
|
||||
- Redis 7+
|
||||
|
||||
### API密钥配置
|
||||
|
||||
1. **Twitter API v2**
|
||||
- 访问: https://developer.twitter.com/
|
||||
- 申请开发者账号并创建应用
|
||||
- 获取Bearer Token和API密钥
|
||||
|
||||
2. **OpenAI API**
|
||||
- 访问: https://platform.openai.com/
|
||||
- 创建账号并生成API密钥
|
||||
- 确保账户有DALL-E 3访问权限
|
||||
|
||||
3. **AWS服务**
|
||||
- 访问: https://aws.amazon.com/
|
||||
- 创建IAM用户并配置S3权限
|
||||
- 获取Access Key和Secret Key
|
||||
|
||||
### 调试技巧
|
||||
|
||||
```bash
|
||||
# 查看容器日志
|
||||
docker-compose logs backend
|
||||
docker-compose logs frontend
|
||||
|
||||
# 进入容器调试
|
||||
docker-compose exec backend bash
|
||||
docker-compose exec db psql -U postgres -d hottrend_tees
|
||||
|
||||
# 重启特定服务
|
||||
docker-compose restart backend
|
||||
```
|
||||
|
||||
## 部署指南
|
||||
|
||||
### AWS ECS部署
|
||||
|
||||
1. 构建Docker镜像
|
||||
2. 推送到ECR
|
||||
3. 创建ECS任务定义
|
||||
4. 部署到ECS集群
|
||||
|
||||
详细部署步骤请参考: `docs/deployment.md`
|
||||
|
||||
## 贡献指南
|
||||
|
||||
1. Fork项目
|
||||
2. 创建功能分支
|
||||
3. 提交代码
|
||||
4. 创建Pull Request
|
||||
|
||||
## 许可证
|
||||
|
||||
MIT License
|
||||
|
||||
## 支持
|
||||
|
||||
如有问题,请创建Issue或联系开发团队。
|
||||
EOF
|
||||
|
||||
echo "✅ README文件创建完成"
|
||||
}
|
||||
|
||||
# 显示完成信息
|
||||
show_completion_info() {
|
||||
echo ""
|
||||
echo "🎉 HotTrend Tees 原型项目创建完成!"
|
||||
echo "================================"
|
||||
echo ""
|
||||
echo "📁 项目位置: $(pwd)"
|
||||
echo ""
|
||||
echo "📋 下一步操作:"
|
||||
echo "1️⃣ 配置API密钥:"
|
||||
echo " cp backend/.env.example backend/.env"
|
||||
echo " cp frontend/.env.example frontend/.env"
|
||||
echo " # 编辑 .env 文件,填入真实的API密钥"
|
||||
echo ""
|
||||
echo "2️⃣ 启动开发环境:"
|
||||
echo " bash scripts/start-dev.sh"
|
||||
echo ""
|
||||
echo "3️⃣ 访问应用:"
|
||||
echo " 🌐 前端: http://localhost:3000"
|
||||
echo " 📡 API: http://localhost:8000"
|
||||
echo " 📚 文档: http://localhost:8000/docs"
|
||||
echo ""
|
||||
echo "4️⃣ 运行测试:"
|
||||
echo " python scripts/test-api.py"
|
||||
echo ""
|
||||
echo "📖 更多信息请查看 README.md 文件"
|
||||
echo ""
|
||||
}
|
||||
|
||||
# 主执行流程
|
||||
main() {
|
||||
echo "开始创建 HotTrend Tees 原型项目..."
|
||||
|
||||
check_dependencies
|
||||
setup_project_structure
|
||||
create_env_files
|
||||
create_docker_configs
|
||||
create_package_files
|
||||
create_basic_code
|
||||
create_startup_scripts
|
||||
create_test_script
|
||||
create_readme
|
||||
|
||||
show_completion_info
|
||||
}
|
||||
|
||||
# 运行主函数
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user