init template

This commit is contained in:
2025-11-27 21:17:46 +08:00
parent 2848a75aa2
commit d9873219d6
6 changed files with 1585 additions and 12 deletions
+42 -2
View File
@@ -65,5 +65,45 @@ temp/
.DS_Store
Thumbs.db
# Git temporary files
.git/
# Coverage reports
htmlcov/
.coverage
.coverage.*
coverage.xml
*.cover
.pytest_cache/
# Docker
docker-compose.override.yml
.dockerignore
# Frontend specific
.cache/
.parcel-cache/
.next/
.nuxt/
.vuepress/dist
# Testing
.tox/
.nox/
# MyPy
.mypy_cache/
.dmypy.json
dmypy.json
# Jupyter Notebook
.ipynb_checkpoints
# pyenv
.python-version
# Certificates and keys
*.pem
*.key
*.crt
# Local configuration
config.local.js
config.local.json
+459
View File
@@ -0,0 +1,459 @@
# 项目模板使用指南
## 概述
这是一个生产级的 FastAPI + Vue 3 全栈应用模板,包含完整的用户认证、文件上传、数据库操作和现代化前端界面。
## 模板特性
### 后端 (FastAPI)
- ✅ RESTful API 设计
- ✅ JWT 身份认证
- ✅ SQLAlchemy ORM (支持 PostgreSQL/SQLite)
- ✅ 文件上传处理
- ✅ PDF 处理能力
- ✅ AI 模型集成 (Claude, Gemini)
- ✅ 自动 API 文档 (Swagger/OpenAPI)
- ✅ CORS 配置
- ✅ 环境变量管理
### 前端 (Vue 3)
- ✅ Composition API
- ✅ Element Plus UI 组件库
- ✅ Pinia 状态管理
- ✅ Vue Router 路由
- ✅ Vite 构建工具
- ✅ 响应式设计
- ✅ 统一配置管理
- ✅ API 服务封装
## 快速开始
### 方法一: 使用自动化脚本 (推荐)
```bash
# 1. 运行创建脚本
./create-from-template.sh
# 2. 根据提示输入项目信息
Project name: my-awesome-app
Display name: My Awesome App
Database name: myapp_db
API port: 8888
Frontend port: 3000
# 3. 脚本会自动:
# - 创建新项目目录
# - 复制所有文件
# - 替换配置项
# - 清理临时文件
# - 初始化 git 仓库
```
### 方法二: 手动创建
#### 1. 复制项目
```bash
# 复制整个项目到新目录
cp -r /path/to/pager /path/to/your-new-project
cd /path/to/your-new-project
# 清理不需要的文件
rm -rf .git backend/__pycache__ backend/wordmaster.db backend/uploads/* frontend/node_modules frontend/dist
```
#### 2. 配置后端
```bash
cd backend
# 复制环境变量配置
cp .env.example .env
# 编辑 .env 文件,修改以下配置:
# - DATABASE_URL: 数据库连接字符串
# - SECRET_KEY: JWT 密钥 (必须修改!)
# - OPENROUTER_API_KEY: AI API 密钥 (如需要)
# - AI_MODEL: AI 模型选择
# 安装依赖
pip install -r requirements.txt
# 初始化数据库
python main.py
```
#### 3. 配置前端
```bash
cd frontend
# 编辑 package.json
# 修改 "name": "your-project-frontend"
# 安装依赖
npm install
# 配置开发环境变量 (可选)
# 编辑 .env.development
# VITE_API_BASE_URL=http://localhost:8888/api
```
#### 4. 修改项目名称和品牌
需要修改的文件:
**后端:**
- `backend/main.py`: 数据库名称、应用描述
- `backend/.env`: 数据库连接字符串
**前端:**
- `frontend/package.json`: 项目名称
- `frontend/index.html`: 页面标题
- `frontend/src/config/index.js`: API 端口配置
#### 5. 启动项目
```bash
# 后端 (在 backend 目录)
python main.py
# 或
uvicorn main:app --host 0.0.0.0 --port 8888 --reload
# 前端 (在 frontend 目录)
npm run dev
```
## 项目结构详解
```
your-project/
├── backend/ # FastAPI 后端
│ ├── main.py # 主应用文件 (所有 API 端点)
│ ├── requirements.txt # Python 依赖
│ ├── .env.example # 环境变量示例
│ ├── migrate_db.py # 数据库迁移脚本
│ ├── pdf_splitter_*.py # PDF 处理模块
│ ├── claude_exam_parser.py # AI 解析器
│ ├── utils/ # 工具函数
│ └── uploads/ # 文件上传目录
│
├── frontend/ # Vue 3 前端
│ ├── src/
│ │ ├── main.js # 应用入口
│ │ ├── App.vue # 根组件
│ │ ├── router/ # 路由配置
│ │ ├── stores/ # Pinia 状态管理
│ │ ├── views/ # 页面组件
│ │ ├── components/ # 可复用组件
│ │ ├── config/ # 配置管理
│ │ └── services/ # API 服务
│ ├── package.json # 前端依赖
│ └── vite.config.js # Vite 配置
│
├── start.sh # 开发启动脚本
├── stop.sh # 停止脚本
├── status.sh # 状态检查脚本
├── template.config.json # 模板配置
└── TEMPLATE_GUIDE.md # 本文档
```
## 核心功能模块
### 1. 用户认证系统
**后端实现** (`backend/main.py`):
```python
# 注册
@app.post("/api/auth/register")
# 登录
@app.post("/api/auth/login")
# 获取当前用户
def get_current_user(credentials: HTTPAuthorizationCredentials)
```
**前端实现** (`frontend/src/stores/auth.js`):
```javascript
// 登录
async login(username, password)
// 注册
async register(username, password)
// 登出
logout()
// 自动加载用户信息
loadUser()
```
### 2. 数据库模型
**基础模型结构** (`backend/main.py`):
```python
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
username = Column(String, unique=True)
password_hash = Column(String)
created_at = Column(DateTime)
# 添加你自己的模型
class YourModel(Base):
__tablename__ = "your_table"
# 定义字段...
```
### 3. 文件上传
**后端示例**:
```python
@app.post("/api/upload")
async def upload_file(
file: UploadFile = File(...),
current_user: User = Depends(get_current_user)
):
# 保存到 uploads/{user_id}/
file_path = f"uploads/{current_user.id}/{file.filename}"
# 处理文件...
return {"file_path": file_path}
```
**前端示例** (使用 Element Plus):
```vue
<el-upload
:action="uploadUrl"
:headers="headers"
:on-success="handleSuccess"
>
<el-button>上传文件</el-button>
</el-upload>
```
### 4. 状态管理 (Pinia)
创建新的 store (`frontend/src/stores/yourStore.js`):
```javascript
import { defineStore } from 'pinia'
import { ref } from 'vue'
export const useYourStore = defineStore('your-store', () => {
const data = ref([])
async function fetchData() {
// API 调用...
}
return { data, fetchData }
})
```
### 5. 路由配置
添加新路由 (`frontend/src/router/index.js`):
```javascript
{
path: '/your-page',
name: 'YourPage',
component: () => import('../views/YourPage.vue'),
meta: { requiresAuth: true } // 需要登录
}
```
## 自定义和扩展
### 添加新的 API 端点
在 `backend/main.py` 中:
```python
@app.get("/api/your-endpoint")
async def your_endpoint(
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
# 你的逻辑
return {"data": "your data"}
```
### 添加新的前端页面
1. 创建组件: `frontend/src/views/YourPage.vue`
```vue
<template>
<div class="your-page">
<h1>{{ title }}</h1>
</div>
</template>
<script setup>
import { ref } from 'vue'
const title = ref('Your Page Title')
</script>
```
2. 在路由中注册 (见上面路由配置)
### 修改数据库模型
1. 编辑 `backend/main.py` 中的模型定义
2. 运行迁移:
```bash
cd backend
python migrate_db.py
```
## 部署指南
### 环境变量配置
**生产环境必须修改**:
```bash
# backend/.env
SECRET_KEY=your-very-long-random-secret-key-min-32-chars
DATABASE_URL=postgresql://user:password@host:port/dbname
```
### Docker 部署
创建 `Dockerfile` (后端):
```dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8888"]
```
创建 `Dockerfile` (前端):
```dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
CMD ["npm", "run", "preview"]
```
### Nginx 配置
```nginx
server {
listen 80;
server_name your-domain.com;
location / {
root /var/www/frontend/dist;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://localhost:8888;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
```
## 最佳实践
### 1. 安全性
- ✅ 修改默认 SECRET_KEY
- ✅ 使用 HTTPS (生产环境)
- ✅ 限制 CORS 源
- ✅ 定期更新依赖
- ✅ 不要提交 .env 文件
### 2. 性能优化
- ✅ 启用数据库索引
- ✅ 使用连接池
- ✅ 前端代码分割
- ✅ 静态资源 CDN
- ✅ API 响应缓存
### 3. 开发规范
- ✅ 遵循 RESTful API 设计
- ✅ 使用 TypeScript (可选)
- ✅ 编写单元测试
- ✅ 代码审查
- ✅ Git 提交规范
## 常见问题
### Q: 如何切换数据库?
**从 SQLite 到 PostgreSQL:**
```python
# 修改 DATABASE_URL
DATABASE_URL = "postgresql://user:password@localhost:5432/dbname"
# 重新创建表
python main.py
```
### Q: 如何添加新的 AI 模型?
编辑 `backend/.env`:
```bash
AI_MODEL=google/gemini-3-pro-preview
# 或
AI_MODEL=openai/gpt-4o
```
### Q: 前端如何跨域请求?
开发环境在 `vite.config.js` 配置代理:
```javascript
export default defineConfig({
server: {
proxy: {
'/api': {
target: 'http://localhost:8888',
changeOrigin: true
}
}
}
})
```
### Q: 如何部署到云服务器?
1. 购买云服务器 (阿里云/腾讯云/AWS)
2. 配置安全组开放端口
3. 使用 Docker 或 PM2 部署
4. 配置域名和 HTTPS
## 模板更新
如果模板有更新,你可以:
1. **选择性合并**:
```bash
git remote add template /path/to/template
git fetch template
git cherry-pick <commit-hash>
```
2. **手动更新**:
比较新旧文件,手动复制需要的功能
## 技术支持
- 查看 `CLAUDE.md` 了解详细项目文档
- 查看 `README.md` 了解部署指南
- FastAPI 文档: https://fastapi.tiangolo.com
- Vue 3 文档: https://vuejs.org
- Element Plus 文档: https://element-plus.org
## 许可证
MIT License - 自由使用和修改
---
**祝你的项目开发顺利!** 🚀
+288
View File
@@ -0,0 +1,288 @@
# 模板快速使用指南
## 三种使用方式
### 🚀 方式一: 自动化脚本 (最推荐)
```bash
# 1. 运行创建脚本
./create-from-template.sh
# 2. 按提示输入项目信息
# 3. 脚本会自动完成所有配置
# 4. 进入新项目目录开始开发
```
**优点**:
- ✅ 一键创建,无需手动配置
- ✅ 自动替换所有配置项
- ✅ 自动生成安全的 SECRET_KEY
- ✅ 自动初始化 Git 仓库
---
### 📋 方式二: 手动复制
```bash
# 1. 复制项目
cp -r /path/to/pager /path/to/your-new-project
cd /path/to/your-new-project
# 2. 清理不需要的文件
rm -rf .git backend/__pycache__ backend/*.db backend/uploads/* frontend/node_modules frontend/dist
# 3. 配置后端
cd backend
cp .env.example .env
# 编辑 .env 文件,修改必要配置
# 4. 配置前端
cd frontend
# 编辑 package.json,修改项目名称
# 5. 初始化 Git
git init
git add .
git commit -m "Initial commit"
```
---
### 🔗 方式三: Git 模板方式
```bash
# 1. 克隆为模板
git clone /path/to/pager your-new-project
cd your-new-project
# 2. 移除原有 Git 历史
rm -rf .git
# 3. 按方式二的步骤 3-5 操作
```
---
## 核心配置清单
### ✅ 必须修改的配置
**后端 `backend/.env`:**
```bash
# 1. 数据库连接 (必须)
DATABASE_URL=postgresql://user:pass@host:port/dbname
# 2. 密钥 (必须,生产环境)
SECRET_KEY=<生成一个长随机字符串>
# 3. AI API Key (如需 AI 功能)
OPENROUTER_API_KEY=<your-api-key>
```
**前端 `frontend/package.json`:**
```json
{
"name": "your-project-name-frontend"
}
```
**前端 `frontend/index.html`:**
```html
<title>Your Project Name</title>
```
---
### 🔧 可选修改的配置
**端口配置:**
- 后端: `backend/main.py` 或 `.env` 中的 `PORT`
- 前端: `vite.config.js` 中的 `server.port`
**API 地址:**
- `frontend/src/config/index.js`
---
## 快速命令参考
### 开发环境
```bash
# 后端
cd backend
pip install -r requirements.txt # 安装依赖
python main.py # 启动服务
# 前端
cd frontend
npm install # 安装依赖
npm run dev # 启动开发服务器
# 或使用启动脚本
./start.sh # 同时启动前后端
./status.sh # 查看运行状态
./stop.sh # 停止所有服务
```
### 数据库操作
```bash
cd backend
python main.py # 首次运行自动创建表
python migrate_db.py # 手动迁移数据库
```
### 生产构建
```bash
# 前端构建
cd frontend
npm run build # 构建到 dist/ 目录
npm run preview # 预览生产构建
# 后端生产运行
cd backend
uvicorn main:app --host 0.0.0.0 --port 8888
```
---
## 项目结构速览
```
your-project/
├── backend/ # FastAPI 后端
│ ├── main.py # 主应用 (所有 API 在这里)
│ ├── .env # 环境变量 (从 .env.example 复制)
│ └── requirements.txt # Python 依赖
│
├── frontend/ # Vue 3 前端
│ ├── src/
│ │ ├── views/ # 页面组件
│ │ ├── stores/ # Pinia 状态管理
│ │ ├── router/ # 路由配置
│ │ └── config/ # 配置管理
│ └── package.json # 前端依赖
│
├── create-from-template.sh # 模板创建脚本
├── TEMPLATE_GUIDE.md # 完整使用指南
└── start.sh # 开发启动脚本
```
---
## 开发工作流
### 添加新功能
**1. 后端 API:**
```python
# backend/main.py
@app.get("/api/your-endpoint")
async def your_endpoint(current_user: User = Depends(get_current_user)):
return {"message": "Hello"}
```
**2. 前端页面:**
```bash
# 创建组件
touch frontend/src/views/YourPage.vue
# 注册路由 (frontend/src/router/index.js)
{
path: '/your-page',
component: () => import('../views/YourPage.vue')
}
```
**3. 状态管理:**
```javascript
// frontend/src/stores/yourStore.js
import { defineStore } from 'pinia'
export const useYourStore = defineStore('your-store', () => {
// 定义状态和方法
})
```
---
## 常见问题速查
| 问题 | 解决方法 |
|------|---------|
| 端口被占用 | 修改 `.env` 中的 `PORT` 或 `vite.config.js` |
| CORS 错误 | 检查 `backend/main.py` 的 CORS 配置 |
| 数据库连接失败 | 检查 `DATABASE_URL` 格式和数据库服务状态 |
| 前端请求失败 | 检查 `frontend/src/config/index.js` 的 API_BASE_URL |
| JWT 认证失败 | 确保 `SECRET_KEY` 正确且前后端一致 |
---
## 安全检查清单
- [ ] 修改了 `SECRET_KEY` (生产环境必须)
- [ ] 不提交 `.env` 文件到 Git
- [ ] 生产环境设置 `DEBUG=false`
- [ ] 限制 CORS 允许的域名
- [ ] 使用 HTTPS (生产环境)
- [ ] 定期更新依赖包
- [ ] 保护 API keys 安全
---
## 生成安全密钥
```bash
# 方法 1: OpenSSL
openssl rand -base64 32
# 方法 2: Python
python -c "import secrets; print(secrets.token_urlsafe(32))"
# 方法 3: Node.js
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
```
---
## 部署选项
### Docker
```bash
docker-compose up -d
```
### PM2
```bash
pm2 start backend/main.py --name api
pm2 serve frontend/dist 3000 --name frontend
```
### 云服务器
- 阿里云 ECS
- 腾讯云 CVM
- AWS EC2
- DigitalOcean Droplet
---
## 获取帮助
- 📖 完整文档: `TEMPLATE_GUIDE.md`
- 🏗️ 项目架构: `CLAUDE.md`
- 📋 部署指南: `README.md`
- ⚙️ 配置说明: `backend/.env.example`
---
## 下一步
1. ✅ 使用 `create-from-template.sh` 创建新项目
2. ✅ 配置 `backend/.env`
3. ✅ 安装依赖 (后端+前端)
4. ✅ 启动开发服务器
5. ✅ 开始开发你的功能
**祝你的项目开发顺利!** 🎉
+169 -10
View File
@@ -1,23 +1,182 @@
# =============================================================================
# Database Configuration
# =============================================================================
#
# For SQLite (recommended for development):
# DATABASE_URL=sqlite:///./database_name.db
#
# For PostgreSQL (recommended for production):
# DATABASE_URL=postgresql://username:password@host:port/database_name
#
# For MySQL:
# DATABASE_URL=mysql://username:password@host:port/database_name
#
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/wordmaster
# JWT Configuration
SECRET_KEY=your-super-secret-and-secure-key-change-me
# =============================================================================
# Security Configuration
# =============================================================================
#
# IMPORTANT: Change SECRET_KEY in production!
# Generate a secure key with: openssl rand -base64 32
# Or: python -c "import secrets; print(secrets.token_urlsafe(32))"
#
SECRET_KEY=your-super-secret-and-secure-key-change-me-in-production
# JWT algorithm (HS256 is recommended)
ALGORITHM=HS256
# Token expiration time in minutes
ACCESS_TOKEN_EXPIRE_MINUTES=30
# OpenRouter AI Configuration (for Claude Sonnet 4.5 access)
# =============================================================================
# OpenRouter AI Configuration
# =============================================================================
#
# Get your API key from: https://openrouter.ai/keys
OPENROUTER_API_KEY=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
# Required if you want to use AI-powered features
#
OPENROUTER_API_KEY=your-openrouter-api-key-here
# =============================================================================
# AI Model Selection
# Available models:
# - anthropic/claude-sonnet-4.5 (默认,通用能力强)
# - google/gemini-3-pro-preview (数学能力强,推荐数学试卷使用)
# - openai/gpt-4o
# - openai/gpt-4-turbo
# =============================================================================
#
# Available models through OpenRouter:
#
# Claude Models (Anthropic):
# - anthropic/claude-sonnet-4.5 (Default, best general performance)
# - anthropic/claude-opus-4 (Most capable, slower)
# - anthropic/claude-haiku-3.5 (Fast, cost-effective)
#
# Gemini Models (Google):
# - google/gemini-3-pro-preview (Great for math, recommended for math exams)
# - google/gemini-pro-1.5 (Good general performance)
#
# GPT Models (OpenAI):
# - openai/gpt-4o (Latest GPT-4 with vision)
# - openai/gpt-4-turbo (Fast GPT-4)
# - openai/gpt-3.5-turbo (Fastest, most economical)
#
AI_MODEL=anthropic/claude-sonnet-4.5
# =============================================================================
# Parser Configuration
# Set to "true" to use Claude AI parser by default, "false" to use traditional parser
# =============================================================================
#
# Use AI-powered parser for better accuracy (requires OPENROUTER_API_KEY)
# Set to "false" to use traditional rule-based parser
#
USE_CLAUDE_PARSER=true
# =============================================================================
# Application Configuration
# =============================================================================
#
# Server host and port
HOST=0.0.0.0
PORT=8888
# Environment: development, staging, production
ENVIRONMENT=development
# Enable debug mode (set to false in production)
DEBUG=true
# =============================================================================
# CORS Configuration
# =============================================================================
#
# Allowed origins for CORS (comma-separated)
# Use "*" for development, specific domains for production
#
# Examples:
# CORS_ORIGINS=http://localhost:3000,http://localhost:3001
# CORS_ORIGINS=https://yourdomain.com,https://www.yourdomain.com
#
CORS_ORIGINS=*
# =============================================================================
# File Upload Configuration
# =============================================================================
#
# Maximum file size in MB
MAX_UPLOAD_SIZE=50
# Allowed file extensions (comma-separated)
ALLOWED_EXTENSIONS=.pdf,.jpg,.jpeg,.png,.doc,.docx
# Upload directory (relative to backend/)
UPLOAD_DIR=uploads
# =============================================================================
# Logging Configuration
# =============================================================================
#
# Log level: DEBUG, INFO, WARNING, ERROR, CRITICAL
LOG_LEVEL=INFO
# Log file path (leave empty to disable file logging)
LOG_FILE=logs/app.log
# =============================================================================
# Feature Flags
# =============================================================================
#
# Enable/disable specific features
#
ENABLE_AI_FEATURES=true
ENABLE_PDF_PROCESSING=true
ENABLE_FILE_UPLOAD=true
ENABLE_ANALYTICS=true
# =============================================================================
# Rate Limiting (Optional)
# =============================================================================
#
# Requests per minute per user
RATE_LIMIT_PER_MINUTE=60
# =============================================================================
# Email Configuration (Optional)
# =============================================================================
#
# SMTP settings for sending emails
# Leave empty if not using email features
#
# SMTP_HOST=smtp.gmail.com
# SMTP_PORT=587
# SMTP_USER=your-email@gmail.com
# SMTP_PASSWORD=your-app-password
# SMTP_FROM=noreply@yourdomain.com
# =============================================================================
# Redis Configuration (Optional)
# =============================================================================
#
# For caching and session management
# Leave empty if not using Redis
#
# REDIS_URL=redis://localhost:6379/0
# =============================================================================
# Sentry Configuration (Optional)
# =============================================================================
#
# For error tracking and monitoring
# Get your DSN from: https://sentry.io
#
# SENTRY_DSN=your-sentry-dsn-here
# =============================================================================
# Notes
# =============================================================================
#
# 1. Copy this file to .env and update the values
# 2. Never commit .env to version control
# 3. Use strong, unique values for SECRET_KEY in production
# 4. Set DEBUG=false in production
# 5. Use specific CORS_ORIGINS in production
# 6. Keep API keys secure and rotate them regularly
#
# =============================================================================
+513
View File
@@ -0,0 +1,513 @@
#!/bin/bash
# 项目模板创建脚本
# 用法: ./create-from-template.sh [目标目录]
set -e # 遇到错误立即退出
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 打印带颜色的消息
print_success() {
echo -e "${GREEN}✓ $1${NC}"
}
print_info() {
echo -e "${BLUE}ℹ $1${NC}"
}
print_warning() {
echo -e "${YELLOW}⚠ $1${NC}"
}
print_error() {
echo -e "${RED}✗ $1${NC}"
}
print_header() {
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BLUE} $1${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
}
# 获取当前模板目录
TEMPLATE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# 欢迎信息
clear
print_header "FastAPI + Vue 3 项目模板生成器"
echo ""
print_info "此脚本将基于当前模板创建一个新项目"
echo ""
# 获取目标目录
if [ -n "$1" ]; then
TARGET_DIR="$1"
else
read -p "$(echo -e ${BLUE}请输入新项目目录 [默认: ../my-new-project]: ${NC})" TARGET_DIR
TARGET_DIR=${TARGET_DIR:-../my-new-project}
fi
# 转换为绝对路径
TARGET_DIR=$(cd "$(dirname "$TARGET_DIR")" 2>/dev/null && pwd)/$(basename "$TARGET_DIR") || TARGET_DIR="$TARGET_DIR"
# 检查目标目录是否已存在
if [ -d "$TARGET_DIR" ]; then
print_warning "目录 $TARGET_DIR 已存在"
read -p "$(echo -e ${YELLOW}是否覆盖? [y/N]: ${NC})" OVERWRITE
if [[ ! $OVERWRITE =~ ^[Yy]$ ]]; then
print_info "已取消"
exit 0
fi
rm -rf "$TARGET_DIR"
fi
echo ""
print_header "项目配置"
echo ""
# 收集项目信息
read -p "$(echo -e ${BLUE}项目名称 (小写,用连字符) [my-app]: ${NC})" PROJECT_NAME
PROJECT_NAME=${PROJECT_NAME:-my-app}
read -p "$(echo -e ${BLUE}项目显示名称 [My Application]: ${NC})" PROJECT_DISPLAY_NAME
PROJECT_DISPLAY_NAME=${PROJECT_DISPLAY_NAME:-My Application}
read -p "$(echo -e ${BLUE}数据库名称 [${PROJECT_NAME//-/_}_db]: ${NC})" DATABASE_NAME
DATABASE_NAME=${DATABASE_NAME:-${PROJECT_NAME//-/_}_db}
read -p "$(echo -e ${BLUE}后端 API 端口 [8888]: ${NC})" API_PORT
API_PORT=${API_PORT:-8888}
read -p "$(echo -e ${BLUE}前端开发端口 [3000]: ${NC})" FRONTEND_PORT
FRONTEND_PORT=${FRONTEND_PORT:-3000}
read -p "$(echo -e ${BLUE}域名 (可选,按回车跳过): ${NC})" DOMAIN_NAME
# 数据库类型
echo ""
echo -e "${BLUE}选择数据库类型:${NC}"
echo " 1) SQLite (默认,适合开发)"
echo " 2) PostgreSQL (推荐生产环境)"
read -p "$(echo -e ${BLUE}请选择 [1]: ${NC})" DB_TYPE
DB_TYPE=${DB_TYPE:-1}
if [ "$DB_TYPE" = "2" ]; then
read -p "$(echo -e ${BLUE}PostgreSQL 主机 [localhost]: ${NC})" PG_HOST
PG_HOST=${PG_HOST:-localhost}
read -p "$(echo -e ${BLUE}PostgreSQL 端口 [5432]: ${NC})" PG_PORT
PG_PORT=${PG_PORT:-5432}
read -p "$(echo -e ${BLUE}PostgreSQL 用户名 [postgres]: ${NC})" PG_USER
PG_USER=${PG_USER:-postgres}
read -s -p "$(echo -e ${BLUE}PostgreSQL 密码: ${NC})" PG_PASSWORD
echo ""
DATABASE_URL="postgresql://${PG_USER}:${PG_PASSWORD}@${PG_HOST}:${PG_PORT}/${DATABASE_NAME}"
else
DATABASE_URL="sqlite:///./${DATABASE_NAME}.db"
fi
# 生成随机 SECRET_KEY
SECRET_KEY=$(openssl rand -base64 32 2>/dev/null || python3 -c "import secrets; print(secrets.token_urlsafe(32))")
# 确认信息
echo ""
print_header "配置确认"
echo ""
echo -e "${BLUE}项目名称:${NC} $PROJECT_NAME"
echo -e "${BLUE}显示名称:${NC} $PROJECT_DISPLAY_NAME"
echo -e "${BLUE}数据库名称:${NC} $DATABASE_NAME"
echo -e "${BLUE}数据库 URL:${NC} $DATABASE_URL"
echo -e "${BLUE}API 端口:${NC} $API_PORT"
echo -e "${BLUE}前端端口:${NC} $FRONTEND_PORT"
echo -e "${BLUE}域名:${NC} ${DOMAIN_NAME:-未设置}"
echo -e "${BLUE}目标目录:${NC} $TARGET_DIR"
echo ""
read -p "$(echo -e ${BLUE}确认创建项目? [Y/n]: ${NC})" CONFIRM
if [[ $CONFIRM =~ ^[Nn]$ ]]; then
print_info "已取消"
exit 0
fi
# 开始创建项目
echo ""
print_header "创建项目"
echo ""
# 1. 创建目标目录
print_info "创建目录: $TARGET_DIR"
mkdir -p "$TARGET_DIR"
# 2. 复制文件
print_info "复制项目文件..."
rsync -a --progress "$TEMPLATE_DIR/" "$TARGET_DIR/" \
--exclude='.git' \
--exclude='node_modules' \
--exclude='__pycache__' \
--exclude='*.pyc' \
--exclude='dist' \
--exclude='backend/wordmaster.db' \
--exclude='backend/uploads/*' \
--exclude='frontend/.env.local' \
--exclude='.DS_Store'
print_success "文件复制完成"
# 3. 替换配置
print_info "更新配置文件..."
cd "$TARGET_DIR"
# 替换后端配置
if [ -f "backend/main.py" ]; then
# macOS 和 Linux 兼容的 sed
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' "s/wordmaster/$DATABASE_NAME/g" backend/main.py
sed -i '' "s/学习助手 Pro/$PROJECT_DISPLAY_NAME/g" backend/main.py
else
sed -i "s/wordmaster/$DATABASE_NAME/g" backend/main.py
sed -i "s/学习助手 Pro/$PROJECT_DISPLAY_NAME/g" backend/main.py
fi
fi
# 创建 .env 文件
cat > backend/.env << EOF
# Database Configuration
DATABASE_URL=$DATABASE_URL
# JWT Configuration
SECRET_KEY=$SECRET_KEY
ALGORITHM=HS256
ACCESS_TOKEN_EXPIRE_MINUTES=30
# OpenRouter AI Configuration (for Claude Sonnet 4.5 access)
# Get your API key from: https://openrouter.ai/keys
OPENROUTER_API_KEY=your-openrouter-api-key-here
# AI Model Selection
# Available models:
# - anthropic/claude-sonnet-4.5 (默认,通用能力强)
# - google/gemini-3-pro-preview (数学能力强,推荐数学试卷使用)
# - openai/gpt-4o
# - openai/gpt-4-turbo
AI_MODEL=anthropic/claude-sonnet-4.5
# Parser Configuration
USE_CLAUDE_PARSER=true
EOF
print_success "后端配置已更新"
# 替换前端配置
if [ -f "frontend/package.json" ]; then
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' "s/\"name\": \"wordmaster-frontend\"/\"name\": \"$PROJECT_NAME-frontend\"/g" frontend/package.json
else
sed -i "s/\"name\": \"wordmaster-frontend\"/\"name\": \"$PROJECT_NAME-frontend\"/g" frontend/package.json
fi
fi
if [ -f "frontend/index.html" ]; then
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' "s/<title>.*<\/title>/<title>$PROJECT_DISPLAY_NAME<\/title>/g" frontend/index.html
else
sed -i "s/<title>.*<\/title>/<title>$PROJECT_DISPLAY_NAME<\/title>/g" frontend/index.html
fi
fi
# 更新前端配置文件
if [ -f "frontend/src/config/index.js" ]; then
if [[ "$OSTYPE" == "darwin"* ]]; then
sed -i '' "s/:8888/:$API_PORT/g" frontend/src/config/index.js
else
sed -i "s/:8888/:$API_PORT/g" frontend/src/config/index.js
fi
fi
print_success "前端配置已更新"
# 4. 创建 README
print_info "生成项目 README..."
cat > README.md << EOF
# $PROJECT_DISPLAY_NAME
基于 FastAPI + Vue 3 全栈模板创建的项目。
## 快速启动
### 后端
\`\`\`bash
cd backend
# 安装依赖
pip install -r requirements.txt
# 启动服务
python main.py
# 访问 http://localhost:$API_PORT
# API 文档: http://localhost:$API_PORT/docs
\`\`\`
### 前端
\`\`\`bash
cd frontend
# 安装依赖
npm install
# 启动开发服务器
npm run dev
# 访问 http://localhost:$FRONTEND_PORT
\`\`\`
### 使用启动脚本
\`\`\`bash
# 同时启动前后端
./start.sh
# 查看状态
./status.sh
# 停止所有服务
./stop.sh
\`\`\`
## 配置
### 环境变量
后端配置文件: \`backend/.env\`
主要配置项:
- \`DATABASE_URL\`: 数据库连接
- \`SECRET_KEY\`: JWT 密钥 (已自动生成)
- \`OPENROUTER_API_KEY\`: AI API 密钥 (可选)
### 端口配置
- 后端 API: $API_PORT
- 前端开发: $FRONTEND_PORT
## 数据库
- 类型: $([ "$DB_TYPE" = "2" ] && echo "PostgreSQL" || echo "SQLite")
- 数据库名: $DATABASE_NAME
$([ "$DB_TYPE" = "2" ] && echo "- 连接: $PG_HOST:$PG_PORT" || echo "- 文件: $DATABASE_NAME.db")
首次运行时会自动创建数据库表。
## 技术栈
**后端:**
- FastAPI - 高性能 Web 框架
- SQLAlchemy - ORM
- JWT - 身份认证
- Pydantic - 数据验证
**前端:**
- Vue 3 - 渐进式框架
- Element Plus - UI 组件库
- Pinia - 状态管理
- Vite - 构建工具
## 文档
- 查看 \`TEMPLATE_GUIDE.md\` 了解详细开发指南
- 查看 \`CLAUDE.md\` 了解项目架构
## 部署
请参考 \`TEMPLATE_GUIDE.md\` 中的部署章节。
---
创建时间: $(date +%Y-%m-%d)
EOF
print_success "README 已生成"
# 5. 初始化 git
print_info "初始化 Git 仓库..."
git init
git add .
git commit -m "Initial commit: Created from template
Project: $PROJECT_DISPLAY_NAME
Database: $DATABASE_NAME
API Port: $API_PORT
Frontend Port: $FRONTEND_PORT
"
print_success "Git 仓库已初始化"
# 6. 创建启动帮助文档
cat > GETTING_STARTED.md << EOF
# 快速开始指南
## 第一次运行
### 1. 配置环境
#### 后端配置
已自动生成 \`backend/.env\` 文件,主要配置:
- ✅ 数据库已配置: $DATABASE_NAME
- ✅ JWT 密钥已生成
- ⚠️ 如需 AI 功能,请在 \`backend/.env\` 中设置 \`OPENROUTER_API_KEY\`
#### 前端配置
默认配置已就绪,无需修改。
### 2. 安装依赖
#### 后端依赖
\`\`\`bash
cd backend
pip install -r requirements.txt
\`\`\`
推荐使用虚拟环境:
\`\`\`bash
python -m venv venv
source venv/bin/activate # Linux/Mac
# 或
venv\\Scripts\\activate # Windows
pip install -r requirements.txt
\`\`\`
#### 前端依赖
\`\`\`bash
cd frontend
npm install
# 或使用 yarn
yarn install
\`\`\`
### 3. 启动开发服务器
#### 方式一: 使用启动脚本 (推荐)
\`\`\`bash
./start.sh
\`\`\`
#### 方式二: 手动启动
**后端:**
\`\`\`bash
cd backend
python main.py
\`\`\`
**前端:**
\`\`\`bash
cd frontend
npm run dev
\`\`\`
### 4. 访问应用
- 前端界面: http://localhost:$FRONTEND_PORT
- 后端 API: http://localhost:$API_PORT
- API 文档: http://localhost:$API_PORT/docs
### 5. 默认账户
首次访问需要注册账户。系统会自动创建数据库表。
## 开发流程
### 添加新功能
1. **后端 API**
- 编辑 \`backend/main.py\`
- 添加新的端点和数据模型
- 自动重载会生效
2. **前端页面**
- 在 \`frontend/src/views/\` 创建新组件
- 在 \`frontend/src/router/index.js\` 注册路由
- Vite 会自动热更新
3. **状态管理**
- 在 \`frontend/src/stores/\` 创建新 store
- 使用 Pinia 管理全局状态
### 调试技巧
**后端调试:**
- 查看终端日志
- 访问 http://localhost:$API_PORT/docs 测试 API
- 使用 Python 调试器
**前端调试:**
- 使用浏览器开发者工具
- Vue DevTools 扩展
- 检查网络请求
## 常见问题
### 端口被占用
修改配置文件中的端口号:
- 后端: \`backend/.env\` 或 \`backend/main.py\`
- 前端: \`frontend/vite.config.js\`
### 数据库连接失败
- SQLite: 检查文件权限
- PostgreSQL: 检查连接字符串和服务状态
### 前端 API 请求失败
检查 \`frontend/src/config/index.js\` 中的 API_BASE_URL 配置
## 下一步
- 📖 阅读 \`TEMPLATE_GUIDE.md\` 了解完整功能
- 🔧 根据需求定制功能模块
- 🚀 参考部署指南发布应用
祝开发顺利! 🎉
EOF
print_success "快速开始指南已生成"
# 完成
echo ""
print_header "项目创建完成!"
echo ""
echo -e "${GREEN}✨ 项目已成功创建在: $TARGET_DIR${NC}"
echo ""
echo -e "${BLUE}下一步:${NC}"
echo ""
echo -e " 1. 进入项目目录:"
echo -e " ${YELLOW}cd $TARGET_DIR${NC}"
echo ""
echo -e " 2. 安装后端依赖:"
echo -e " ${YELLOW}cd backend && pip install -r requirements.txt${NC}"
echo ""
echo -e " 3. 安装前端依赖:"
echo -e " ${YELLOW}cd frontend && npm install${NC}"
echo ""
echo -e " 4. 启动项目:"
echo -e " ${YELLOW}./start.sh${NC}"
echo ""
echo -e " 5. 访问应用:"
echo -e " ${YELLOW}http://localhost:$FRONTEND_PORT${NC}"
echo ""
echo -e "${BLUE}📚 详细文档:${NC}"
echo -e " - GETTING_STARTED.md - 快速开始"
echo -e " - TEMPLATE_GUIDE.md - 完整指南"
echo -e " - README.md - 项目说明"
echo ""
print_success "祝您开发顺利! 🚀"
echo ""
+114
View File
@@ -0,0 +1,114 @@
{
"template": {
"name": "FastAPI-Vue3 Full-Stack Template",
"version": "1.0.0",
"description": "A production-ready full-stack template with FastAPI backend and Vue 3 frontend",
"author": "Your Name",
"license": "MIT"
},
"features": {
"backend": {
"framework": "FastAPI",
"database": "PostgreSQL/SQLite",
"authentication": "JWT",
"fileUpload": true,
"aiIntegration": true,
"pdfProcessing": true
},
"frontend": {
"framework": "Vue 3",
"uiLibrary": "Element Plus",
"stateManagement": "Pinia",
"buildTool": "Vite",
"router": true
}
},
"configurable": {
"projectName": {
"description": "Your new project name",
"default": "my-app",
"placeholder": "my-awesome-app"
},
"projectDisplayName": {
"description": "Display name for your application",
"default": "My Application",
"placeholder": "My Awesome App"
},
"databaseName": {
"description": "Database name",
"default": "myapp_db",
"placeholder": "your_database_name"
},
"apiPort": {
"description": "Backend API port",
"default": 8888,
"placeholder": 8888
},
"frontendPort": {
"description": "Frontend development server port",
"default": 3000,
"placeholder": 3000
},
"domainName": {
"description": "Production domain (optional)",
"default": "",
"placeholder": "your-domain.com"
}
},
"replacements": {
"backend": [
{
"file": "backend/main.py",
"patterns": [
{"find": "wordmaster", "replace": "{{databaseName}}"},
{"find": "学习助手 Pro", "replace": "{{projectDisplayName}}"}
]
},
{
"file": "backend/.env.example",
"patterns": [
{"find": "wordmaster", "replace": "{{databaseName}}"},
{"find": "8888", "replace": "{{apiPort}}"}
]
}
],
"frontend": [
{
"file": "frontend/package.json",
"patterns": [
{"find": "wordmaster-frontend", "replace": "{{projectName}}-frontend"}
]
},
{
"file": "frontend/src/config/index.js",
"patterns": [
{"find": "8888", "replace": "{{apiPort}}"}
]
},
{
"file": "frontend/index.html",
"patterns": [
{"find": "学习助手 Pro", "replace": "{{projectDisplayName}}"}
]
}
]
},
"cleanupFiles": [
"backend/wordmaster.db",
"backend/uploads/*",
"backend/__pycache__",
"frontend/node_modules",
"frontend/dist",
".git"
],
"keepExampleFiles": [
"backend/.env.example",
"TEMPLATE_GUIDE.md",
"template.config.json"
]
}