前端 + Python + Docker 全栈项目模板

模板说明:本模板基于 Vue3(Vite)+ Python(FastAPI)+ Docker + docker-compose 构建,适配全栈开发场景,包含用户认证、基础接口、文件上传、容器化部署等核心功能,可直接复制初始化项目,快速启动开发。贴合10年全栈前端技术栈(Vue3/Node.js/Python/FastAPI/Docker),兼顾工程化规范与可扩展性,支持后续对接AI流式接口、地图模块。

一、项目总目录结构(完整可直接复制)

fullstack-template/  # 项目根目录
├── frontend/          # Vue3 前端项目(Vite)
├── backend/           # Python 后端项目(FastAPI)
├── docker-compose.yml # 多服务编排配置(前端+后端+MySQL)
├── .gitignore         # 全局忽略文件(git提交过滤)
└── README.md          # 项目启动、部署说明文档

二、前端项目模板(frontend/)

1. 前端目录结构

frontend/
├── public/             # 静态资源(不参与打包,直接访问)
│   └── favicon.ico
├── src/
│   ├── api/            # 接口请求(与后端FastAPI接口一一对应)
│   │   ├── index.js    # Axios 全局配置(拦截器、基础地址)
│   │   ├── auth.js     # 登录/鉴权相关接口
│   │   ├── user.js     # 用户管理相关接口
│   │   └── upload.js   # 文件上传相关接口
│   ├── assets/         # 静态资源(参与打包)
│   │   ├── img/        # 图片资源
│   │   └── css/        # 全局样式
│   ├── components/     # 通用组件
│   │   ├── common/     # 公共组件(按钮、输入框、弹窗等)
│   │   ├── auth/       # 认证相关组件(登录表单等)
│   │   └── layout/     # 布局组件(头部、侧边栏、底部)
│   ├── pages/          # 页面组件
│   │   ├── Login.vue   # 登录页
│   │   ├── Home.vue    # 首页
│   │   ├── User/       # 用户管理模块
│   │   │   ├── UserList.vue
│   │   │   └── UserEdit.vue
│   │   └── Upload.vue  # 文件上传页
│   ├── pinia/          # 状态管理(替代Vuex)
│   │   ├── index.js    # Pinia 初始化
│   │   └── userStore.js # 用户状态(Token、用户信息)
│   ├── router/         # 路由配置
│   │   └── index.js    # 路由定义、导航守卫(鉴权)
│   ├── utils/          # 工具函数
│   │   ├── request.js  # Axios 封装(请求/响应拦截)
│   │   └── common.js   # 通用工具(格式转换、本地存储等)
│   ├── App.vue         # 根组件
│   └── main.js         # 入口文件(初始化Vue、Pinia、Router)
├── .dockerignore       # Docker 忽略文件(不打包无关内容)
├── .env.development    # 开发环境变量
├── .env.production     # 生产环境变量
├── Dockerfile          # 前端Docker打包配置
├── index.html          # 入口HTML
├── package.json        # 前端依赖配置
└── vite.config.js      # Vite 配置(代理、别名、端口)

2. 前端核心配置文件(可直接复制使用)

(1)package.json

{
  "name": "frontend-template",
  "private": true,
  "version": "0.1.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "axios": "^1.6.8",
    "element-plus": "^2.7.2",
    "pinia": "^2.1.7",
    "vue": "^3.4.21",
    "vue-router": "^4.3.0"
  },
  "devDependencies": {
    "@vitejs/plugin-vue": "^5.0.4",
    "vite": "^5.2.8"
  }
}

(2)vite.config.js(配置代理,解决开发跨域)

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  resolve: {
    // 别名配置,@ 指向 src 目录
    alias: {
      '@': path.resolve(__dirname, 'src')
    }
  },
  server: {
    port: 8080, // 前端开发端口
    open: true, // 启动自动打开浏览器
    proxy: {
      // 代理后端接口,避免开发跨域
      '/api': {
        target: 'http://localhost:8000', // 后端服务地址
        changeOrigin: true, // 允许跨域
        rewrite: (path) => path.replace(/^\/api/, '') // 重写路径(可选)
      }
    }
  },
  build: {
    // 打包配置,优化打包体积
    minify: 'terser',
    rollupOptions: {
      output: {
        chunkFileNames: 'js/[name]-[hash].js',
        entryFileNames: 'js/[name]-[hash].js',
        assetFileNames: '[ext]/[name]-[hash].[ext]'
      }
    }
  }
})

(3)src/utils/request.js(Axios封装,对接后端统一响应)

import axios from 'axios'
import { useUserStore } from '@/pinia/userStore'
import { ElMessage } from 'element-plus'

// 创建Axios实例
const service = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || '/api',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json;charset=utf-8'
  }
})

// 请求拦截器(添加Token,鉴权)
service.interceptors.request.use(
  (config) => {
    const userStore = useUserStore()
    // 若有Token,添加到请求头(Bearer 格式)
    if (userStore.token) {
      config.headers.Authorization = `Bearer ${userStore.token}`
    }
    return config
  },
  (error) => {
    ElMessage.error('请求发起失败,请检查网络')
    return Promise.reject(error)
  }
)

// 响应拦截器(统一处理响应,错误提示)
service.interceptors.response.use(
  (response) => {
    const res = response.data
    // 对接后端统一响应格式(code/msg/data)
    if (res.code !== 200) {
      // 401:Token失效,跳转登录页
      if (res.code === 401) {
        const userStore = useUserStore()
        userStore.logout() // 清除Token
        window.location.href = '/login'
      }
      // 其他错误,提示错误信息
      ElMessage.error(res.msg || '操作失败,请重试')
      return Promise.reject(res)
    }
    // 成功响应,返回数据
    return res.data
  },
  (error) => {
    ElMessage.error(error.message || '网络错误,请检查连接')
    return Promise.reject(error)
  }
)

export default service

(4)Dockerfile(前端Docker打包,适配Nginx)

# 第一阶段:构建前端项目(依赖安装 + 打包)
FROM node:18-alpine as build-stage

# 设置工作目录
WORKDIR /app

# 复制依赖配置文件
COPY package.json package-lock.json ./

# 安装依赖(国内源加速)
RUN npm install --registry=https://registry.npm.taobao.org

# 复制项目所有文件
COPY . .

# 打包前端项目(生成dist目录)
RUN npm run build

# 第二阶段:部署(基于Nginx,轻量运行)
FROM nginx:alpine as production-stage

# 复制打包后的dist目录到Nginx静态目录
COPY --from=build-stage /app/dist /usr/share/nginx/html

# 复制自定义Nginx配置(可选,解决前端路由刷新404)
COPY nginx.conf /etc/nginx/conf.d/default.conf

# 暴露80端口(Nginx默认端口)
EXPOSE 80

# 启动Nginx服务
CMD ["nginx", "-g", "daemon off;"]

(5).env.development(开发环境变量)

# 开发环境
NODE_ENV=development
# 后端接口基础地址(配合vite代理)
VITE_API_BASE_URL=/api

三、后端项目模板(backend/)

1. 后端目录结构(FastAPI)

backend/
├── app/                # 核心应用代码(类似前端src)
│   ├── __init__.py     # 包初始化文件(空文件即可)
│   ├── main.py         # FastAPI入口文件(启动、路由注册、跨域)
│   ├── api/            # 接口路由(模块化拆分)
│   │   ├── __init__.py
│   │   └── v1/         # 接口版本管理(v1版本,便于迭代)
│   │       ├── __init__.py
│   │       ├── auth.py # 登录/鉴权接口(JWT)
│   │       ├── user.py # 用户管理接口(CURD)
│   │       └── upload.py # 文件上传接口
│   ├── core/           # 核心配置
│   │   ├── __init__.py
│   │   ├── config.py   # 全局配置(数据库、JWT、跨域,从环境变量读取)
│   │   └── dependencies.py # 依赖注入(数据库会话、Token鉴权)
│   ├── models/         # 数据库模型(类似前端schema)
│   │   ├── __init__.py
│   │   └── user.py     # 用户表模型(MySQL)
│   ├── schemas/        # 数据校验模型(请求/响应参数校验)
│   │   ├── __init__.py
│   │   └── user.py     # 用户相关参数校验
│   ├── crud/           # 数据库操作(CURD,类似前端api请求)
│   │   ├── __init__.py
│   │   └── user.py     # 用户表CURD操作
│   ├── utils/          # 工具函数
│   │   ├── __init__.py
│   │   ├── jwt.py      # JWT工具(生成、解析Token)
│   │   └── password.py # 密码加密工具(bcrypt)
│   └── static/         # 静态文件(存储上传的文件)
│       └── uploads/
├── .dockerignore       # Docker忽略文件
├── .env                # 本地开发环境变量(不上传git)
├── .env.example        # 环境变量示例(上传git,标注必填项)
├── Dockerfile          # 后端Docker打包配置
├── requirements.txt    # 后端依赖清单
└── uvicorn_config.py   # uvicorn启动配置(可选)

2. 后端核心配置文件(可直接复制使用)

(1)requirements.txt(后端依赖,包含FastAPI核心依赖)

fastapi>=0.104.1          # 核心框架
uvicorn>=0.24.0           # 运行服务器
pydantic-settings>=2.0.0  # 环境变量配置
pymysql>=1.1.0            # MySQL连接
sqlalchemy>=2.0.23        # ORM工具(数据库操作)
python-jose[cryptography]>=3.3.0 # JWT鉴权
passlib[bcrypt]>=1.7.4    # 密码加密
python-multipart>=0.0.6   # 文件上传
aiohttp>=3.9.0            # 异步请求(后续对接AI API可用)
python-dotenv>=1.0.0      # 读取.env文件

(2)app/core/config.py(全局配置,从环境变量读取)

from pydantic_settings import BaseSettings, SettingsConfigDict

class Settings(BaseSettings):
    """全局配置类,从.env文件读取环境变量,默认值作为 fallback"""
    # 项目基础配置
    PROJECT_NAME: str = "FastAPI 全栈模板"
    API_V1_STR: str = "/api/v1"  # 接口版本前缀

    # 数据库配置(MySQL)
    DATABASE_URL: str = "mysql+pymysql://root:123456@mysql:3306/fullstack_db"
    # 格式:mysql+pymysql://用户名:密码@数据库地址:端口/数据库名

    # JWT鉴权配置
    SECRET_KEY: str = "your-secret-key-123456"  # 生产环境用随机字符串
    ALGORITHM: str = "HS256"                    # 加密算法
    ACCESS_TOKEN_EXPIRE_MINUTES: int = 30        # Token过期时间(分钟)

    # 跨域配置
    CORS_ORIGINS: list = ["*"]  # 开发环境允许所有域名,生产环境替换为前端域名

    # 静态文件配置(文件上传)
    STATIC_DIR: str = "app/static"
    UPLOAD_DIR: str = "app/static/uploads"

    # 加载.env文件(优先级:环境变量 > .env文件 > 默认值)
    model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8")

# 全局配置实例(整个项目统一使用)
settings = Settings()

(3)app/main.py(FastAPI入口文件,注册路由、跨域)

from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from app.api.v1 import auth, user, upload
from app.core.config import settings

# 初始化FastAPI应用
app = FastAPI(
    title=settings.PROJECT_NAME,
    description="前端 + Python + Docker 全栈项目模板接口文档",
    version="1.0.0",
    openapi_url=f"{settings.API_V1_STR}/openapi.json",  # 接口文档地址
    docs_url="/docs",  # Swagger文档地址(前端联调必备)
    redoc_url="/redoc"
)

# 1. 配置跨域(解决前端联调跨域问题)
app.add_middleware(
    CORSMiddleware,
    allow_origins=settings.CORS_ORIGINS,
    allow_credentials=True,  # 允许携带Cookie
    allow_methods=["*"],     # 允许所有请求方法
    allow_headers=["*"],     # 允许所有请求头
)

# 2. 注册接口路由(模块化拆分,便于维护)
app.include_router(auth.router, prefix=settings.API_V1_STR, tags=["认证"])
app.include_router(user.router, prefix=settings.API_V1_STR, tags=["用户管理"])
app.include_router(upload.router, prefix=settings.API_V1_STR, tags=["文件上传"])

# 3. 挂载静态文件(用于访问上传的文件,如图片)
app.mount("/static", StaticFiles(directory=settings.STATIC_DIR), name="static")

# 4. 根路由(测试服务是否启动)
@app.get("/")
def root():
    return {
        "message": "FastAPI 全栈服务已启动",
        "docs_url": "/docs",  # 接口文档地址(前端联调查看)
        "api_version": "v1"
    }

(4)Dockerfile(后端Docker打包,适配FastAPI)

# 基础镜像(轻量Python,减少镜像体积)
FROM python:3.11-slim

# 设置工作目录
WORKDIR /app

# 安装系统依赖(可选,解决某些依赖安装失败问题)
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc \
    && rm -rf /var/lib/apt/lists/*

# 复制依赖配置文件
COPY requirements.txt .

# 安装后端依赖(国内源加速,--no-cache-dir 不缓存,减少体积)
RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 复制项目所有文件
COPY . .

# 暴露后端服务端口(与uvicorn启动端口一致)
EXPOSE 8000

# 启动命令(生产环境,不使用--reload热更新)
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

(5).env.example(环境变量示例,上传git)

# 数据库配置(必填)
DATABASE_URL=mysql+pymysql://root:123456@mysql:3306/fullstack_db

# JWT配置(必填,生产环境请修改为随机字符串)
SECRET_KEY=your-secret-key-123456
ACCESS_TOKEN_EXPIRE_MINUTES=30

# 跨域配置(生产环境替换为前端域名)
CORS_ORIGINS=["*"]

# 项目名称(可选)
PROJECT_NAME=FastAPI 全栈模板

四、全局配置文件(项目根目录)

1. docker-compose.yml(多服务编排,一键启动前端+后端+MySQL)

version: '3.8'  # docker-compose版本

# 定义所有服务
services:
  # 1. 前端服务
  frontend:
    build:
      context: ./frontend  # 前端项目目录
      dockerfile: Dockerfile  # 前端Dockerfile路径
    container_name: frontend-template  # 容器名称(自定义,便于管理)
    ports:
      - "8080:80"  # 端口映射:宿主机8080端口 → 容器80端口(Nginx)
    depends_on:
      - backend  # 依赖后端服务,后端启动后再启动前端
    restart: always  # 容器挂掉自动重启
    networks:
      - fullstack-network  # 加入自定义网络,便于服务间通信

  # 2. 后端服务
  backend:
    build:
      context: ./backend   # 后端项目目录
      dockerfile: Dockerfile  # 后端Dockerfile路径
    container_name: backend-template
    ports:
      - "8000:8000"  # 端口映射:宿主机8000端口 → 后端8000端口
    depends_on:
      - mysql  # 依赖MySQL服务,数据库启动后再启动后端
    environment:
      # 环境变量(覆盖.env文件,适配Docker环境)
      - DATABASE_URL=mysql+pymysql://root:123456@mysql:3306/fullstack_db
      - SECRET_KEY=your-secret-key-123456
      - CORS_ORIGINS=["*"]
    restart: always
    networks:
      - fullstack-network

  # 3. MySQL数据库服务(直接使用官方镜像,无需自己构建)
  mysql:
    image: mysql:8.0  # 官方MySQL镜像(8.0版本,稳定)
    container_name: mysql-template
    ports:
      - "3306:3306"  # 端口映射:宿主机3306端口 → 数据库3306端口
    environment:
      - MYSQL_ROOT_PASSWORD=123456  # 根密码(自定义)
      - MYSQL_DATABASE=fullstack_db  # 自动创建数据库(与后端配置一致)
      - MYSQL_CHARSET=utf8mb4  # 字符集(支持中文、表情)
      - MYSQL_COLLATION=utf8mb4_unicode_ci
    volumes:
      - mysql-data:/var/lib/mysql  # 数据卷:持久化数据库数据(容器删除数据不丢失)
    restart: always
    networks:
      - fullstack-network

# 自定义网络(所有服务在同一网络,可通过服务名访问)
networks:
  fullstack-network:
    driver: bridge  # 桥接模式,默认即可

# 数据卷(持久化数据,避免容器删除后数据丢失)
volumes:
  mysql-data:  # 自动创建数据卷,存储MySQL数据

2. .gitignore(全局忽略文件,git提交过滤)

# 后端忽略文件
backend/__pycache__/      # Python编译缓存
backend/.env              # 本地环境变量(不上传)
backend/venv/             # Python虚拟环境
backend/app/static/uploads/ # 上传的文件(不上传)
backend/*.log             # 日志文件
backend/.pytest_cache/    # 测试缓存

# 前端忽略文件
frontend/node_modules/    # 前端依赖
frontend/dist/            # 打包后的文件
frontend/.env             # 前端环境变量
frontend/.vscode/         # VSCode配置
frontend/package-lock.json # 依赖锁文件(可选,建议上传)
frontend/.npmrc           # npm配置
frontend/.gitignore

# Docker忽略文件
*.dockerignore
.docker-compose.override.yml
.docker-compose.yml.bak

# 通用忽略文件
.DS_Store                 # Mac系统文件
*.log                     # 所有日志文件
.vscode/                  # VSCode配置
.idea/                    # PyCharm配置
.gitignore                # git忽略文件
*.zip                     # 压缩包
*.tar.gz

3. README.md(项目说明,便于团队协作与部署)

# 前端 + Python + Docker 全栈项目模板
基于 Vue3(Vite)+ Python(FastAPI)+ Docker + MySQL 构建的全栈项目模板,包含用户认证、文件上传、容器化部署等核心功能,可直接初始化项目,快速启动开发。

## 技术栈
- 前端:Vue3、Vite、Pinia、VueRouter、Element Plus
- 后端:Python、FastAPI、SQLAlchemy(ORM)、JWT鉴权
- 数据库:MySQL 8.0
- 工程化&部署:Docker、docker-compose
- 其他:Axios、bcrypt(密码加密)

## 快速启动(Docker一键启动)
1. 克隆项目到本地
git clone [项目地址]
cd fullstack-template

2. 启动所有服务(后端+前端+MySQL)
docker-compose up -d --build

3. 访问地址
- 前端:http://localhost:8080
- 后端接口文档:http://localhost:8000/docs
- MySQL:localhost:3306(用户名root,密码123456)

## 本地开发(不使用Docker)
### 后端开发
1. 进入后端目录
cd backend

2. 创建虚拟环境(可选)
python -m venv venv
source venv/bin/activate  # Mac/Linux
venv\Scripts\activate     # Windows

3. 安装依赖
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

4. 复制.env.example为.env,修改配置(数据库地址等)
cp .env.example .env

5. 启动后端服务
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000

### 前端开发
1. 进入前端目录
cd frontend

2. 安装依赖
npm install

3. 启动前端服务
npm run dev

## 项目结构说明
- frontend/:Vue3前端项目
- backend/:FastAPI后端项目
- docker-compose.yml:多服务编排配置
- .gitignore:全局忽略文件

## 核心功能
1. 用户认证:登录、JWT鉴权
2. 用户管理:用户列表、新增、编辑、删除
3. 文件上传:文件上传、静态文件访问
4. 容器化部署:一键启动、自动重启、数据持久化

## 注意事项
1. 生产环境需修改SECRET_KEY为随机字符串,避免泄露
2. 生产环境需修改CORS_ORIGINS,只允许指定前端域名
3. MySQL数据通过数据卷持久化,删除容器不丢失数据
4. 前端打包后通过Nginx部署,后端通过uvicorn运行

五、模板使用说明(关键步骤)

  1. 复制上述所有目录结构和文件,创建本地项目文件夹,粘贴对应文件;

  2. 修改基础配置:

- 后端:修改backend/.env文件,配置数据库密码、SECRET_KEY等;

- 前端:修改frontend/.env.development,配置后端接口地址(如需);

- docker-compose.yml:修改MySQL密码、容器名称等自定义配置。
  1. 启动项目:在项目根目录执行 docker-compose up -d --build,一键启动前端、后端、MySQL;

  2. 开发扩展:

- 新增接口:在backend/app/api/v1/目录下新增路由文件,注册到main.py;

- 新增页面:在frontend/src/pages/目录下新增页面,配置路由;

- 对接AI流式接口:在backend/app/api/v1/新增ai.py,添加流式接口(复用之前的AI流式代码);

- 添加地图模块:在前端引入Mapbox GL/OpenLayers,后端新增地图相关接口。

六、适配性说明

本模板完全贴合你的10年全栈技术栈(Vue3/Node.js/Python/FastAPI/Docker),可直接扩展:

  • 对接AI流式接口:在backend/app/api/v1/新增ai.py,复制之前的AI流式代码,修改路由即可;

  • 添加地图模块:前端引入Mapbox GL/Cesium,后端新增地图相关接口(如坐标转换、轨迹查询);

  • 扩展Node.js服务:如需保留Node.js后端,可在docker-compose.yml中新增Node.js服务,与Python服务协同。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容