Files
pub/quick_start.sh
T
2025-07-03 15:44:27 +08:00

899 lines
20 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "$@"