全网最全C++云存储项目-支持注册-登录-分享文件-预览视频和图片

项目预览

视频讲解(源码领取看视频):https://www.bilibili.com/video/BV1XPfTY8EGD/

1 为什么是全网最全C++云存储项目

  • 支持注册登录
  • 支持文件管理
  • 支持视频预览
  • 支持图片预览
  • 支持文件分享
  • 优化了大文件上传
  • 支持断点下载

2 从这个项目你可以学到什么

这个项目包含的技术栈

2.1 C++ 11及以上语法的经典应用

当前项目使用到的主要C++11特性。

2.1.1 智能指针

  • std::shared_ptr :共享所有权的智能指针
  • std::weak_ptr :弱引用,配合shared_ptr使用
  • std::unique_ptr :独占所有权的智能指针
std::shared_ptr<Connection> conn(new Connection());
std::weak_ptr<Connection> weakConn = conn;

2.1.2 右值引用和移动语义

  • 使用 && 表示右值引用
  • std::move() 将左值转换为右值
  • 移动构造函数和移动赋值运算符
class Buffer {
Buffer(Buffer&& other) noexcept; // 移动构造函数
Buffer& operator=(Buffer&& other) noexcept; // 移动赋值运算符
};

2.1.3 Lambda表达式

  • 用于创建匿名函数对象
  • 常用于回调函数
auto callback = [](const TcpConnectionPtr& conn) {
// 处理连接
};

2.1.4 auto关键字

  • 自动类型推导
  • 简化代码,提高可读性
autoresult=calculateResult();
autoit=container.begin();

2.1.5 nullptr

  • 替代NULL的空指针常量
  • 类型安全
void* ptr = nullptr;

2.1.6 范围for循环

  • 简化容器遍历
for (const auto& item : container) {
// 处理item
}

2.1.7 线程支持

  • std::thread :线程类
  • std::mutex :互斥量
  • std::condition_variable :条件变量
  • std::lock_guard 和 std::unique_lock :RAII锁管理
std::mutex mtx;
std::lock_guard<std::mutex> lock(mtx);

2.1.8 原子操作

  • std::atomic :原子类型
  • 无锁编程支持
std::atomic<int> counter{0};
counter++;

2.1.9 时间工具

  • std::chrono :时间库
  • 高精度时间点和时间段
using namespace std::chrono; 
auto now = system_clock::now();

2.1.10 函数对象包装器

  • std::function :通用函数包装器
  • std::bind :函数适配器
std::function<void(const TcpConnectionPtr&)> callback; 

这些C++11特性在MyMuduo中的应用:

1. 智能指针用于管理TCP连接和定时器等资源

2. 移动语义用于优化Buffer的数据传输

3. Lambda表达式用于注册回调函数

4. 原子操作用于计数器和标志位

5. 线程支持用于实现EventLoop和ThreadPool

2.2 线程+线程池封装

  • Thread 基于pthread封装线类
  • ThreadPool 基于Thread 封装线程池

2.3 高性缓存/日志/定时器的设计

  • Buffer类 高性能缓存
  • AsyncLogging 高性能异步日志
  • Timer 高性能定时器

2.4 高性能C++网络框架设计

支持多种网络模型:

1. 单 epoll 模型

2. 单 epoll + 线程池模型

3. main reactor + sub reactor 模型

4. main reactor + sub reactor + 线程池模型

2.4.1 单 Reactor 模型 (test_reactor_single.cc)

  • 单个 Reactor(EventLoop)线程负责所有的事件监听和处理
  • 所有的 IO 操作和业务处理都在同一个线程中完成
           main Thread (Reactor)
                   |
             EventLoop/Epoll
                   |
     --------------------------------
    |              |                |
Accept新连接 读写网络数据 处理业务逻辑

2.4.2 单 Reactor + 线程池模型

  • 单个 Reactor 线程处理所有的 IO 事件
  • 线程池处理耗时的业务逻辑
  • IO 和业务处理解耦
Main Thread (Reactor)      Thread Pool
     |                         |
EventLoop/Epoll          ----------------
     |                   |    |    |    |
IO Events            Worker Worker Worker Worker
     |                   |    |    |    |
Accept/Read/Write   Business Logic Processing

2.4.3 多Reactors 模型

  • 主 Reactor 只负责接收新连接
  • 多个 Sub Reactor 负责处理 IO 事件
  • 通过多线程提高 IO 处理性能
             Main Reactor Thread
                     |
               Accept新连接
                     |
     -------------------------------
     |               |             |
Sub Reactor 1  Sub Reactor 2  Sub Reactor 3
     |               |             |
 IO Events     IO Events       IO Events

2.4.4 多Reactor + 线程池模型

  • 主 Reactor 负责接收新连接
  • 多个 Sub Reactor 处理 IO 事件
  • 线程池处理业务逻辑
  • 最大程度的并发处理
Main Reactor Thread
|
Accept新连接
|
---------------------------------
| | |
Sub Reactor 1 Sub Reactor 2 Sub Reactor 3
| | |
IO Events IO Events IO Events
| | |
----------Thread Pool------------
| | | | |
Worker Worker Worker Worker Worker

2.5 高性能HTTP组件设计

优化内容:

  • 在muduo http框架上优化大文件上传。
  • 优化文件断点下载(支持range 下载指定范围的数据)
  • session权限校验

涉及的类文件:

  • HttpContext
  • HttpRequest
  • HttpResponse
  • HttpServer
  • FileUploadContext 处理文件上传上下文
  • FileDownloadContext 处理文件下载上下文

2.6 数据库操作

数据库(用户注册/登录,文件管理,分享文件管理等表的设计)

  • users用户表
  • sessions 保存用户会话用于HTTP API校验
  • files 保存个人文件
  • file_shares 保存文件分享记录
-- 删除数据库
DROP DATABASE file_manager;
-- 创建数据库
CREATE DATABASE IF NOT EXISTS file_manager DEFAULT CHARACTER SET utf8mb4 COLLATE
utf8mb4_unicode_ci;

USE file_manager;

-- 创建用户表
CREATE TABLE IF NOT EXISTS users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(64) NOT NULL,
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_username (username)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 创建会话表
CREATE TABLE IF NOT EXISTS sessions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    session_id VARCHAR(32) NOT NULL UNIQUE,
    user_id INT NOT NULL,
    username VARCHAR(50) NOT NULL,
    expire_time TIMESTAMP NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_session_id (session_id),
    INDEX idx_user_id (user_id),
    INDEX idx_expire_time (expire_time),
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 创建文件表
CREATE TABLE IF NOT EXISTS files (
    id INT PRIMARY KEY AUTO_INCREMENT,
    filename VARCHAR(255) NOT NULL,
    original_filename VARCHAR(255) NOT NULL,
    file_size BIGINT UNSIGNED NOT NULL,
    file_type VARCHAR(50),
    user_id INT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_filename (filename),
    INDEX idx_user_id (user_id),
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 创建文件分享表
CREATE TABLE IF NOT EXISTS file_shares (
    id INT PRIMARY KEY AUTO_INCREMENT,
    file_id INT NOT NULL,
    owner_id INT NOT NULL,
    shared_with_id INT,
    share_type ENUM('private', 'public', 'protected', 'user') NOT NULL,
    share_code VARCHAR(32) NOT NULL,
    expire_time TIMESTAMP NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    extract_code VARCHAR(6),
    INDEX idx_file_id (file_id),
    INDEX idx_owner_id (owner_id),
    INDEX idx_shared_with_id (shared_with_id),
    INDEX idx_share_code (share_code),
    INDEX idx_expire_time (expire_time),
    FOREIGN KEY (file_id) REFERENCES files(id) ON DELETE CASCADE,
    FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (shared_with_id) REFERENCES users(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

3 把项目跑起来

3.1 导入数据库

// 进入项目目录
cd lesson29_file_manager
// 使用用户名 密码导入数据库
mysql -u username -ppassword < file_manager.sql

比如我username是root,password是123456,即是

mysql -u root -p123456 < file_manager.sql

然后登录数据库查看是否导入正常。

选择数据库

mysql> use file_manager;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

显示当前数据库的表单

mysql> show tables;
+------------------------+
| Tables_in_file_manager |
+------------------------+
| file_shares |
| files |
| sessions |
| users |
+------------------------+
4 rows in set (0.00 sec)

3.2 编译项目和运行项目

cd lesson29_file_manager
mkdir build
cd build
cmake ..
make
运行:
./bin/http_upload

4 学习这个项目需要哪些技术栈基础

  • C++11及以上常用语言特性
  • C++ STL
  • Linux多线程编程
  • Linux网络编程
  • Linux C++网络框架实现
  • Linux Http协议
  • MySQL数据库知识

5 项目特色

  • 大文件上传处理
  • 支持文件断点下载

6 附录

将MP4文件的 moov 原子(metadata box)移动到文件头部(这有助于视频流式传输和快速播放),可以使

用FFmpeg的 -movflags faststart 选项。

ffmpeg -i input.mp4 -movflags faststart -c copy output.mp4

-movflags faststart

ffmpeg -i C++Linux项目推荐-进阶版Webserver-Web聊天室+MySQL+Redis.mp4 -movflags faststart -c

copy C++Linux项目推荐-进阶版Webserver-Web聊天室+MySQL+Redis2.mp4

#校招过来人的经验分享##简历中的项目经历要怎么写##校招##后端开发##C++#
全部评论
mark
点赞 回复 分享
发布于 04-30 19:24 安徽
mark
点赞 回复 分享
发布于 04-30 09:52 广东

相关推荐

评论
点赞
11
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务