
项目预览

视频讲解及源码领取:C++云存储项目(可写简历)-支持注册-登录-分享文件-预览视频和图片
1 为什么是全网最全C++云存储项目
2 从这个项目你可以学到什么
这个项目包含的技术栈
2.1 C++ 11及以上语法的经典应用
当前项目使用到的主要C++11特性。
2.1.1 智能指针
std::shared_ptr<Connection> conn(new Connection());
std::weak_ptr<Connection> weakConn = conn;2.1.2 右值引用和移动语义
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
void* ptr = nullptr;2.1.6 范围for循环
for (const auto& item : container) {
// 处理item
}2.1.7 线程支持
std::mutex mtx;
std::lock_guard<std::mutex> lock(mtx);2.1.8 原子操作
std::atomic<int> counter{0};
counter++;2.1.9 时间工具
using namespace std::chrono;
auto now = system_clock::now();2.1.10 函数对象包装器
std::function<void(const TcpConnectionPtr&)> callback; 这些C++11特性在MyMuduo中的应用:
1. 智能指针用于管理TCP连接和定时器等资源
2. 移动语义用于优化Buffer的数据传输
3. Lambda表达式用于注册回调函数
4. 原子操作用于计数器和标志位
5. 线程支持用于实现EventLoop和ThreadPool
2.2 线程+线程池封装
2.3 高性缓存/日志/定时器的设计
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)
main Thread (Reactor)
|
EventLoop/Epoll
|
--------------------------------
| | |
Accept新连接 读写网络数据 处理业务逻辑2.4.2 单 Reactor + 线程池模型
Main Thread (Reactor) Thread Pool
| |
EventLoop/Epoll ----------------
| | | | |
IO Events Worker Worker Worker Worker
| | | | |
Accept/Read/Write Business Logic Processing2.4.3 多Reactors 模型
Main Reactor Thread
|
Accept新连接
|
-------------------------------
| | |
Sub Reactor 1 Sub Reactor 2 Sub Reactor 3
| | |
IO Events IO Events IO Events2.4.4 多Reactor + 线程池模型
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 Worker2.5 高性能HTTP组件设计
优化内容:
涉及的类文件:
2.5 数据库操作
数据库(用户注册/登录,文件管理,分享文件管理等表的设计)
-- 删除数据库
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_upload4 学习这个项目需要哪些技术栈基础
5 项目特色
6 附录
将MP4文件的 moov 原子(metadata box)移动到文件头部(这有助于视频流式传输和快速播放),可以使
用FFmpeg的 -movflags faststart 选项。
ffmpeg -i input.mp4 -movflags faststart -c copy output.mp4
-movflags faststartffmpeg -i C++Linux项目推荐-进阶版Webserver-Web聊天室+MySQL+Redis.mp4 -movflags faststart -c
copy C++Linux项目推荐-进阶版Webserver-Web聊天室+MySQL+Redis2.mp4
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。