Skip to content

shenhua24/liuyan-Vue_FastAPI

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

留言墙项目技术文档

📋 项目概述

这是一个基于 Vue3 和 FastAPI 开发的现代化留言墙应用,支持用户注册登录、留言发布、点赞评论、图片上传以及完整的管理员后台功能。

🎯 核心功能

  • 用户系统:注册、登录、个人信息管理
  • 留言功能:发布、查看、点赞、评论
  • 图片上传:支持头像和图片上传
  • 管理后台:用户管理、内容管理、统计分析
  • 权限控制:角色权限、账户状态管理

🏗️ 技术架构

前端技术栈

  • Vue 3 - 渐进式 JavaScript 框架
  • Vite - 现代化构建工具
  • Vue Router 4 - 官方路由管理器
  • Pinia - 新一代状态管理库
  • Element Plus - Vue 3 UI 组件库
  • Axios - HTTP 客户端库

后端技术栈

  • FastAPI - 现代化 Python Web 框架
  • SQLAlchemy - Python ORM 框架
  • SQLite - 轻量级数据库
  • JWT - JSON Web Token 认证
  • Uvicorn - ASGI 服务器
  • Pydantic - 数据验证库

📁 项目结构

demo-liuyan/
├── frontend/                 # Vue3前端项目
│   ├── src/
│   │   ├── components/       # 可复用组件
│   │   │   └── ImageUpload.vue
│   │   ├── views/           # 页面组件
│   │   │   ├── Login.vue    # 登录页面
│   │   │   ├── Register.vue # 注册页面
│   │   │   ├── Home.vue     # 主页布局
│   │   │   ├── Messages.vue # 留言墙页面
│   │   │   ├── Profile.vue  # 个人信息页面
│   │   │   └── Admin.vue    # 管理员后台
│   │   ├── stores/          # 状态管理
│   │   │   └── user.js      # 用户状态管理
│   │   ├── router/          # 路由配置
│   │   │   └── index.js     # 路由定义
│   │   └── utils/           # 工具函数
│   │       └── api.js       # API请求封装
│   ├── package.json         # 依赖配置
│   ├── vite.config.js       # Vite配置
│   └── index.html           # HTML模板
├── backend/                 # FastAPI后端项目
│   ├── main.py             # 主应用文件
│   ├── models.py           # 数据模型
│   ├── schemas.py          # 数据验证模式
│   ├── database.py         # 数据库配置
│   ├── auth.py             # 身份验证
│   ├── requirements.txt    # Python依赖
│   ├── uploads/            # 文件上传目录
│   └── liuyan.db          # SQLite数据库文件
├── README.md               # 项目说明
└── 技术文档.md             # 技术文档

🗄️ 数据库设计

用户表 (users)

字段 类型 说明
id Integer 主键,自增
username String(50) 用户名,唯一
hashed_password String(255) 加密密码
nickname String(50) 昵称
avatar String(255) 头像路径
role Enum 用户角色(user/admin)
is_active Boolean 账户状态
created_at DateTime 创建时间

留言表 (messages)

字段 类型 说明
id Integer 主键,自增
content Text 留言内容
author_id Integer 作者 ID,外键
created_at DateTime 创建时间

点赞表 (likes)

字段 类型 说明
id Integer 主键,自增
user_id Integer 用户 ID,外键
message_id Integer 留言 ID,外键
created_at DateTime 点赞时间

评论表 (comments)

字段 类型 说明
id Integer 主键,自增
content Text 评论内容
author_id Integer 评论者 ID,外键
message_id Integer 留言 ID,外键
created_at DateTime 评论时间

🔐 身份验证系统

JWT Token 认证

  • 算法:HS256
  • 过期时间:30 天
  • 存储位置:localStorage + HTTP Header
  • 自动刷新:支持 token 自动续期

权限控制

  • 用户角色:普通用户(user) / 管理员(admin)
  • 路由守卫:基于角色的页面访问控制
  • API 权限:接口级别的权限验证
  • 状态检查:实时账户状态监控

账户状态管理

  • 多层拦截:登录、路由、API、定期检查
  • 即时生效:账户禁用立即拦截访问
  • 友好提示:明确的错误信息提示
  • 自动清理:禁用后自动清除登录状态

📡 API 接口文档

用户认证接口

POST /api/register     # 用户注册
POST /api/login        # 用户登录
GET  /api/user/profile # 获取用户信息
PUT  /api/user/profile # 更新用户信息

留言相关接口

GET  /api/messages              # 获取留言列表
POST /api/messages              # 发布留言
POST /api/messages/{id}/like    # 点赞/取消点赞
GET  /api/messages/{id}/comments # 获取评论列表
POST /api/comments              # 发表评论

文件上传接口

POST /api/upload       # 上传文件

管理员接口

GET    /api/admin/users        # 获取用户列表
PUT    /api/admin/users/{id}   # 更新用户信息
DELETE /api/admin/messages/{id} # 删除留言
GET    /api/admin/stats        # 获取统计信息

🎨 前端架构设计

组件化设计

  • 页面组件:负责页面级别的业务逻辑
  • 通用组件:可复用的功能组件
  • 布局组件:页面布局和导航

状态管理

  • 用户状态:登录信息、个人资料
  • 响应式数据:自动更新 UI
  • 持久化存储:localStorage 同步

路由设计

  • 嵌套路由:主页下的子页面
  • 路由守卫:权限控制和状态检查
  • 动态导入:按需加载页面组件

🔧 开发环境配置

环境要求

  • Node.js: >= 16.0.0
  • Python: >= 3.8
  • npm: >= 8.0.0

安装步骤

1. 克隆项目

git clone <repository-url>
cd demo-liuyan

2. 安装后端依赖

cd backend
pip install -r requirements.txt

3. 安装前端依赖

cd frontend
npm install

启动项目

启动后端服务

cd backend
python main.py
# 服务运行在 http://localhost:8001

启动前端服务

cd frontend
npm run dev
# 服务运行在 http://localhost:5173

🚀 部署指南

生产环境配置

后端部署

  1. 环境变量配置
export SECRET_KEY="your-production-secret-key"
export DATABASE_URL="your-production-database-url"
  1. 使用 Gunicorn 部署
pip install gunicorn
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker

前端部署

  1. 构建生产版本
npm run build
  1. 使用 Nginx 部署
server {
    listen 80;
    server_name your-domain.com;

    location / {
        root /path/to/dist;
        try_files $uri $uri/ /index.html;
    }

    location /api {
        proxy_pass http://localhost:8001;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

🔍 功能特性详解

图片上传系统

  • 支持格式:JPG、PNG、GIF
  • 大小限制:2MB
  • 存储方式:本地文件系统
  • URL 生成:自动生成访问链接
  • 拖拽上传:支持拖拽和点击上传

实时交互功能

  • 点赞系统:实时点赞状态更新
  • 评论系统:嵌套评论显示
  • 状态同步:前后端数据实时同步
  • 用户体验:流畅的交互动画

管理员后台

  • 用户管理:查看、编辑、禁用用户
  • 内容管理:删除不当留言
  • 统计分析:用户数、留言数等统计
  • 权限控制:管理员专属功能

🛡️ 安全机制

数据验证

  • 前端验证:表单输入验证
  • 后端验证:Pydantic 数据模型验证
  • SQL 注入防护:ORM 自动防护
  • XSS 防护:输入内容转义

权限安全

  • JWT 安全:密钥加密和过期控制
  • 角色权限:基于角色的访问控制
  • API 权限:接口级别权限验证
  • 状态监控:实时账户状态检查

📊 性能优化

前端优化

  • 代码分割:路由级别的懒加载
  • 组件缓存:合理使用 keep-alive
  • 图片优化:图片压缩和格式优化
  • 请求优化:防抖和节流处理

后端优化

  • 数据库优化:索引和查询优化
  • 缓存策略:合理使用缓存
  • 异步处理:FastAPI 异步特性
  • 文件处理:高效的文件上传处理

🐛 常见问题解决

开发环境问题

  1. 端口冲突:修改配置文件中的端口号
  2. 依赖安装失败:检查 Node.js 和 Python 版本
  3. 数据库连接失败:检查数据库文件权限

功能问题

  1. 图片上传失败:检查文件大小和格式
  2. 登录失败:检查用户名密码和账户状态
  3. 权限不足:检查用户角色和权限配置

📈 扩展建议

功能扩展

  • 消息通知:实时消息推送
  • 社交功能:关注、私信等
  • 内容审核:自动内容审核
  • 数据分析:更详细的统计分析

技术升级

  • 数据库升级:迁移到 PostgreSQL 或 MySQL
  • 缓存系统:引入 Redis 缓存
  • 消息队列:使用 Celery 处理异步任务
  • 容器化部署:Docker 容器化部署

📞 技术支持

如有技术问题,请参考:

  1. 项目 README:基础使用说明
  2. API 文档http://localhost:8001/docs
  3. 源码注释:详细的中文注释
  4. 测试用例:参考测试脚本

🧪 测试指南

功能测试流程

1. 用户注册登录测试

# 测试步骤
1. 访问 http://localhost:5173
2. 点击"立即注册"创建新账户
3. 使用新账户登录系统
4. 验证登录状态和用户信息显示

2. 留言功能测试

# 测试步骤
1. 登录后进入留言墙页面
2. 发布新留言,验证内容显示
3. 点赞留言,验证点赞数变化
4. 发表评论,验证评论显示
5. 测试加载更多功能

3. 管理员功能测试

# 默认管理员账户
用户名: admin
密码: admin123

# 测试步骤
1. 使用管理员账户登录
2. 进入管理后台页面
3. 测试用户管理功能
4. 测试留言删除功能
5. 查看统计信息

4. 图片上传测试

# 测试步骤
1. 进入个人信息页面
2. 上传头像图片(支持拖拽)
3. 验证图片预览和保存
4. 检查头像在各页面的显示

自动化测试

后端 API 测试

# 运行测试脚本
cd backend
python test_login.py      # 测试登录功能
python test_user_ban.py   # 测试用户禁用功能

前端单元测试

# 安装测试依赖
npm install --save-dev @vue/test-utils vitest

# 运行测试
npm run test

📝 开发规范

代码规范

前端代码规范

// 1. 组件命名使用PascalCase
export default {
  name: "UserProfile",
};

// 2. 变量命名使用camelCase
const userName = ref("");
const isLoading = ref(false);

// 3. 常量使用UPPER_SNAKE_CASE
const API_BASE_URL = "http://localhost:8001";

// 4. 函数命名使用动词开头
const handleSubmit = () => {};
const getUserInfo = () => {};

后端代码规范

# 1. 类名使用PascalCase
class UserModel(Base):
    pass

# 2. 函数名使用snake_case
def get_user_by_id(user_id: int):
    pass

# 3. 常量使用UPPER_SNAKE_CASE
SECRET_KEY = "your-secret-key"

# 4. 类型注解
def create_user(user_data: UserCreate) -> UserResponse:
    pass

Git 提交规范

# 提交信息格式
<type>(<scope>): <description>

# 类型说明
feat:     新功能
fix:      修复bug
docs:     文档更新
style:    代码格式调整
refactor: 代码重构
test:     测试相关
chore:    构建过程或辅助工具的变动

# 示例
feat(auth): 添加用户登录功能
fix(upload): 修复图片上传失败问题
docs(api): 更新API文档

🔧 配置文件说明

前端配置文件

vite.config.js

export default defineConfig({
  plugins: [vue()],
  resolve: {
    alias: {
      "@": fileURLToPath(new URL("./src", import.meta.url)),
    },
  },
  css: {
    postcss: {},
  },
  server: {
    port: 5173,
    host: true,
    proxy: {
      "/api": {
        target: "http://localhost:8001",
        changeOrigin: true,
        secure: false,
      },
    },
  },
});

package.json 关键配置

{
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },
  "dependencies": {
    "vue": "^3.4.0",
    "vue-router": "^4.2.5",
    "pinia": "^2.1.7",
    "element-plus": "^2.4.4"
  }
}

后端配置文件

main.py 关键配置

# CORS配置
app.add_middleware(
    CORSMiddleware,
    allow_origins=["http://localhost:5173"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# 静态文件服务
app.mount("/uploads", StaticFiles(directory="uploads"), name="uploads")

auth.py 配置

# JWT配置
SECRET_KEY = "your-secret-key-here"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30 * 24 * 60  # 30天

📊 监控和日志

应用监控

# 添加请求日志中间件
@app.middleware("http")
async def log_requests(request: Request, call_next):
    start_time = time.time()
    response = await call_next(request)
    process_time = time.time() - start_time
    logger.info(f"{request.method} {request.url} - {response.status_code} - {process_time:.2f}s")
    return response

错误日志

import logging

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler('app.log'),
        logging.StreamHandler()
    ]
)

性能监控

// 前端性能监控
const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    console.log(`${entry.name}: ${entry.duration}ms`);
  }
});
observer.observe({ entryTypes: ["navigation", "resource"] });

🔒 安全最佳实践

密码安全

# 使用bcrypt加密密码
from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

def get_password_hash(password: str) -> str:
    return pwd_context.hash(password)

输入验证

# 使用Pydantic进行数据验证
class UserCreate(BaseModel):
    username: str = Field(..., min_length=3, max_length=50)
    password: str = Field(..., min_length=6, max_length=50)
    nickname: Optional[str] = Field(None, max_length=50)

项目版本: 1.0.0 最后更新: 2025 年 7 月 维护状态: 积极维护 技术支持: 详见项目 README 和源码注释

About

一个完整的前后端留言墙项目,灵感来自于todoList,前端Vue3后端FastAPI

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages