全網(wǎng)最全C++云存儲(chǔ)項(xiàng)目-支持注冊(cè)-登錄-分享文件-預(yù)覽視頻和圖片
項(xiàng)目預(yù)覽
視頻講解(源碼領(lǐng)取看視頻):https://www.bilibili.com/video/BV1XPfTY8EGD/
1 為什么是全網(wǎng)最全C++云存儲(chǔ)項(xiàng)目
- 支持注冊(cè)登錄
- 支持文件管理
- 支持視頻預(yù)覽
- 支持圖片預(yù)覽
- 支持文件分享
- 優(yōu)化了大文件上傳
- 支持?jǐn)帱c(diǎn)下載
2 從這個(gè)項(xiàng)目你可以學(xué)到什么
這個(gè)項(xiàng)目包含的技術(shù)棧
2.1 C++ 11及以上語法的經(jīng)典應(yīng)用
當(dāng)前項(xiàng)目使用到的主要C++11特性。
2.1.1 智能指針
- std::shared_ptr :共享所有權(quán)的智能指針
- std::weak_ptr :弱引用,配合shared_ptr使用
- std::unique_ptr :獨(dú)占所有權(quán)的智能指針
std::shared_ptr<Connection> conn(new Connection()); std::weak_ptr<Connection> weakConn = conn;
2.1.2 右值引用和移動(dòng)語義
- 使用 && 表示右值引用
- std::move() 將左值轉(zhuǎn)換為右值
- 移動(dòng)構(gòu)造函數(shù)和移動(dòng)賦值運(yùn)算符
class Buffer { Buffer(Buffer&& other) noexcept; // 移動(dòng)構(gòu)造函數(shù) Buffer& operator=(Buffer&& other) noexcept; // 移動(dòng)賦值運(yùn)算符 };
2.1.3 Lambda表達(dá)式
- 用于創(chuàng)建匿名函數(shù)對(duì)象
- 常用于回調(diào)函數(shù)
auto callback = [](const TcpConnectionPtr& conn) { // 處理連接 };
2.1.4 auto關(guān)鍵字
- 自動(dòng)類型推導(dǎo)
- 簡(jiǎn)化代碼,提高可讀性
autoresult=calculateResult(); autoit=container.begin();
2.1.5 nullptr
- 替代NULL的空指針常量
- 類型安全
void* ptr = nullptr;
2.1.6 范圍for循環(huán)
- 簡(jiǎn)化容器遍歷
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 時(shí)間工具
- std::chrono :時(shí)間庫
- 高精度時(shí)間點(diǎn)和時(shí)間段
using namespace std::chrono; auto now = system_clock::now();
2.1.10 函數(shù)對(duì)象包裝器
- std::function :通用函數(shù)包裝器
- std::bind :函數(shù)適配器
std::function<void(const TcpConnectionPtr&)> callback;
這些C++11特性在MyMuduo中的應(yīng)用:
1. 智能指針用于管理TCP連接和定時(shí)器等資源
2. 移動(dòng)語義用于優(yōu)化Buffer的數(shù)據(jù)傳輸
3. Lambda表達(dá)式用于注冊(cè)回調(diào)函數(shù)
4. 原子操作用于計(jì)數(shù)器和標(biāo)志位
5. 線程支持用于實(shí)現(xiàn)EventLoop和ThreadPool
2.2 線程+線程池封裝
- Thread 基于pthread封裝線類
- ThreadPool 基于Thread 封裝線程池
2.3 高性緩存/日志/定時(shí)器的設(shè)計(jì)
- Buffer類 高性能緩存
- AsyncLogging 高性能異步日志
- Timer 高性能定時(shí)器
2.4 高性能C++網(wǎng)絡(luò)框架設(shè)計(jì)
支持多種網(wǎng)絡(luò)模型:
1. 單 epoll 模型
2. 單 epoll + 線程池模型
3. main reactor + sub reactor 模型
4. main reactor + sub reactor + 線程池模型
2.4.1 單 Reactor 模型 (test_reactor_single.cc)
- 單個(gè) Reactor(EventLoop)線程負(fù)責(zé)所有的事件監(jiān)聽和處理
- 所有的 IO 操作和業(yè)務(wù)處理都在同一個(gè)線程中完成
main Thread (Reactor) | EventLoop/Epoll | -------------------------------- | | | Accept新連接 讀寫網(wǎng)絡(luò)數(shù)據(jù) 處理業(yè)務(wù)邏輯
2.4.2 單 Reactor + 線程池模型
- 單個(gè) Reactor 線程處理所有的 IO 事件
- 線程池處理耗時(shí)的業(yè)務(wù)邏輯
- IO 和業(yè)務(wù)處理解耦
Main Thread (Reactor) Thread Pool | | EventLoop/Epoll ---------------- | | | | | IO Events Worker Worker Worker Worker | | | | | Accept/Read/Write Business Logic Processing
2.4.3 多Reactors 模型
- 主 Reactor 只負(fù)責(zé)接收新連接
- 多個(gè) Sub Reactor 負(fù)責(zé)處理 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 負(fù)責(zé)接收新連接
- 多個(gè) Sub Reactor 處理 IO 事件
- 線程池處理業(yè)務(wù)邏輯
- 最大程度的并發(fā)處理
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組件設(shè)計(jì)
優(yōu)化內(nèi)容:
- 在muduo http框架上優(yōu)化大文件上傳。
- 優(yōu)化文件斷點(diǎn)下載(支持range 下載指定范圍的數(shù)據(jù))
- session權(quán)限校驗(yàn)
涉及的類文件:
- HttpContext
- HttpRequest
- HttpResponse
- HttpServer
- FileUploadContext 處理文件上傳上下文
- FileDownloadContext 處理文件下載上下文
2.6 數(shù)據(jù)庫操作
數(shù)據(jù)庫(用戶注冊(cè)/登錄,文件管理,分享文件管理等表的設(shè)計(jì))
- users用戶表
- sessions 保存用戶會(huì)話用于HTTP API校驗(yàn)
- files 保存?zhèn)€人文件
- file_shares 保存文件分享記錄
-- 刪除數(shù)據(jù)庫 DROP DATABASE file_manager; -- 創(chuàng)建數(shù)據(jù)庫 CREATE DATABASE IF NOT EXISTS file_manager DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE file_manager; -- 創(chuàng)建用戶表 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; -- 創(chuàng)建會(huì)話表 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; -- 創(chuàng)建文件表 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; -- 創(chuàng)建文件分享表 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 把項(xiàng)目跑起來
3.1 導(dǎo)入數(shù)據(jù)庫
// 進(jìn)入項(xiàng)目目錄 cd lesson29_file_manager // 使用用戶名 密碼導(dǎo)入數(shù)據(jù)庫 mysql -u username -ppassword < file_manager.sql
比如我username是root,password是123456,即是
mysql -u root -p123456 < file_manager.sql
然后登錄數(shù)據(jù)庫查看是否導(dǎo)入正常。
選擇數(shù)據(jù)庫
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
顯示當(dāng)前數(shù)據(jù)庫的表單
mysql> show tables; +------------------------+ | Tables_in_file_manager | +------------------------+ | file_shares | | files | | sessions | | users | +------------------------+ 4 rows in set (0.00 sec)
3.2 編譯項(xiàng)目和運(yùn)行項(xiàng)目
cd lesson29_file_manager mkdir build cd build cmake .. make 運(yùn)行: ./bin/http_upload
4 學(xué)習(xí)這個(gè)項(xiàng)目需要哪些技術(shù)?;A(chǔ)
- C++11及以上常用語言特性
- C++ STL
- Linux多線程編程
- Linux網(wǎng)絡(luò)編程
- Linux C++網(wǎng)絡(luò)框架實(shí)現(xiàn)
- Linux Http協(xié)議
- MySQL數(shù)據(jù)庫知識(shí)
5 項(xiàng)目特色
- 大文件上傳處理
- 支持文件斷點(diǎn)下載
6 附錄
將MP4文件的 moov 原子(metadata box)移動(dòng)到文件頭部(這有助于視頻流式傳輸和快速播放),可以使
用FFmpeg的 -movflags faststart 選項(xiàng)。
ffmpeg -i input.mp4 -movflags faststart -c copy output.mp4
-movflags faststart
ffmpeg -i C++Linux項(xiàng)目推薦-進(jìn)階版Webserver-Web聊天室+MySQL+Redis.mp4 -movflags faststart -c
copy C++Linux項(xiàng)目推薦-進(jìn)階版Webserver-Web聊天室+MySQL+Redis2.mp4
#校招過來人的經(jīng)驗(yàn)分享##簡(jiǎn)歷中的項(xiàng)目經(jīng)歷要怎么寫##校招##后端開發(fā)##C++#