【項目】負載均衡式在線OJ

負載均衡式在線OJ

目錄

負載均衡式在線OJ

1.項目介紹:

2.comm

2.1 log.hpp

日志等級

開放式日志

?時間戳工具

2.2 util.hpp

TimeUtil類

PathUtil類

FileUtil類

StringUtil類

3.Compile_server

3.1compile_run.hpp

RemoveTempFile

?CodeToDesc

?Start

?3.2compile.hpp

Compiler類

?3.3runner.hpp

Runner類

?4.oj_server

4.1 oj_control.hpp

Machine類

IncLoad

DecLoad

ResetLoad

Load

LoadBlance類

LoadConf

SmartChoice

OfflineMachine

OnlineMachine

Control類

RecoveryMachine

AllQuestions

Question

Judge

?4.2 oj_model

Question結構體

Model類

QueryMysql

GetAllQuestions

GetOneQuestion

依賴的外部模塊

?4.3 oj_view

AllExpandHtml

?OneExpandHtml


1.項目介紹:

??????? 該項目完成了類似力扣,牛客網等網站的在線OJ功能, 通過平衡負載函數,將所有用戶發出的請求平均分配給每一臺主機,做到負載均衡實現高并發、高可用性和高性能。

三個板塊

comm : 時間戳生成、文件路徑處理、文件讀寫操作以及字符串分割功能。
compile_server : 編譯與運?模塊
oj_server : 獲取題目列表,查看題目編寫題目界面,負載均衡等功能

開發環境 :?C++、Ubuntu、vim、g++、gdb、git、Makefile

所用技術棧 :?HTML、Json、STL標準庫、Boost準標準庫、cpp-httplib、ctemplate、MySQL

項目源碼 :

2.comm

2.1 log.hpp

log.hpp定義了一個日志系統,可以進行日志等級,日志格式化,日志輸出等功能,命名空間為ns_log。

日志等級

enum
{INFO,    // 信息級別日志DEBUG,   // 調試級別日志WARNING, // 警告級別日志ERROR,   // 錯誤級別日志FATAL    // 致命錯誤級別日志
};

開放式日志

使用方法 :?? LOG(INFO) << "This is an info message" << "\n";

inline std::ostream &Log(const std::string &level, const std::string &file_name, int line)#define LOG(level) Log(#level, __FILE__, __LINE__)

?時間戳工具

TimeUtil::GetTimeStamp()

2.2 util.hpp

TimeUtil類

此類中共有兩個接口,分別為GetTimeStamp(),用于獲取當前時間的秒級時間戳,目的是為了給文件形成唯一的文件名,另外一個是GetTimeMs()獲取當前時間的毫秒級時間戳。

static std::string GetTimeStamp()static std::string GetTimeMs()

PathUtil類

該類共有7個接口

AddSuffix:將文件名與后綴拼接,生成完整的文件路徑 ;

Src: 構建源文件的完整路徑,返回.cpp后綴的文件;

Exe:構建可執行文件的完整路徑,添加.exe后綴

CompileError:構建編譯錯誤文件的完整路徑,添加.compile_error后綴

Stdin:構建標準輸入文件的完整路徑,添加.stdin后綴
Stdout:構建標準輸出文件的完整路徑,添加.stdout后綴

Stderr:構建標準錯誤文件的完整路徑,添加.stderr后綴

static std::string AddSuffix(const std::string &file_name, const std::string &suffix)
static std::string Src(const std::string &file_name)
static std::string Exe(const std::string &file_name)
static std::string CompilerError(const std::string &file_name)
static std::string Stdin(const std::string &file_name)
static std::string Stdout(const std::string &file_name)
static std::string Stderr(const std::string &file_name)

FileUtil類

IsFileExists:檢查文件是否存在,存在返回true,不存在返回false

static bool IsFileExists(const std::string &path_name)

UniqFileName:使用上述GetTimeMs函數獲得唯一文件名

static std::string UniqFileName()

?WriteFile:將內容寫入指定文件,target為目標文件路徑,content為要寫入的內容,寫入成功為true

static bool WriteFile(const std::string &target, const std::string &content)

ReadFile: 讀取文件的內容,target:目標文件路徑,content:用于存儲讀取內容的字符串指針

static bool ReadFile(const std::string &target, std::string *content, bool keep = false)

StringUtil類

SplitString:將字符串按指定分隔符切分,并存儲到target中,str:要切分的字符串,target:存儲切結果的字符串向量,sep:切割符,該方法是基于Boost庫實現的
?

static void SplitString(const std::string &str, std::vector<std::string> *target, const std::string &sep)

3.Compile_server

3.1compile_run.hpp

  • 編譯用戶代碼: 將用戶提交的代碼編譯為可執行文件。

  • 運行用戶程序: 在限制的 CPU 時間和內存內運行用戶程序。

  • 處理運行結果: 根據運行結果生成狀態碼和描述信息。

  • 清理臨時文件: 在運行結束后清理生成的臨時文件

RemoveTempFile

static void RemoveTempFile(const std::string &file_name)

該方法用于清理有指定文件名相關的臨時文件。可用于清理以下文件:

源文件 (file_name.cpp)
編譯錯誤文件 (file_name.compile_error)
可執行文件 (file_name.exe)
標準輸入文件 (file_name.stdin)
標準輸出文件 (file_name.stdout)
標準錯誤文件 (file_name.stderr)

?CodeToDesc

static std::string CodeToDesc(int code, const std::string &file_name)

該方法的作用是將狀態碼轉換為描述信息

code:狀態碼,file_name:文件名? 以下為狀態碼處理:

0: 編譯運行成功。
-1: 提交的代碼為空。
-2: 未知錯誤。
-3: 編譯錯誤(從 file_name.compile_error 文件中讀取錯誤信息)。
SIGABRT (6): 內存超過范圍。
SIGXCPU (24): CPU 使用超時。
SIGFPE (8): 浮點數溢出。

?Start

static void Start(const std::string &in_json, std::string *out_json)

該方法:編譯并運行用戶提交的代碼,返回運行結果
參數:in_json:輸入的 JSON 字符串,包含用戶代碼、輸入、CPU 時間限制和內存限制
out_json:輸出的 JSON 字符串,包含狀態碼、描述信息、標準輸出和標準錯誤

輸入JSON格式:
{"code": "用戶提交的代碼","input": "用戶輸入","cpu_limit": "CPU 時間限制","mem_limit": "內存限制"
}輸出JSON格式:
{"status": "狀態碼","reason": "描述信息","stdout": "標準輸出","stderr": "標準錯誤"
}

解析輸入 JSON,獲取代碼、輸入、CPU 限制和內存限制。
檢查代碼是否為空,如果為空,設置狀態碼為 -1。
生成唯一的文件名,并將代碼寫入臨時源文件。
調用 Compiler::Compile 編譯代碼:
如果編譯失敗,設置狀態碼為 -3。
調用 Runner::Run 運行編譯后的程序:
如果運行失敗,設置狀態碼為運行結果。
根據狀態碼生成描述信息。
如果運行成功,讀取標準輸出和標準錯誤文件的內容。
將結果寫入輸出 JSON。
(可選)清理臨時文件?

所依賴的外部模塊:

  • Compiler: 編譯模塊,負責將用戶代碼編譯為可執行文件。

  • Runner: 運行模塊,負責運行編譯后的程序,并限制其 CPU 和內存使用。

  • ns_log: 日志模塊,用于記錄日志信息。

  • ns_util: 工具模塊,提供文件、路徑、時間等工具函數。

  • JsonCpp: 用于解析和生成 JSON 數據。

?3.2compile.hpp

Compiler類

Compile

static bool Compile(const std::string &file_name)

?使用 fork 創建子進程。
在子進程中:
打開編譯錯誤文件(file_name.compile_error),用于存儲編譯錯誤信息。
使用 dup2 將標準錯誤輸出重定向到編譯錯誤文件。
使用 execlp 調用 g++ 編譯器,將源文件(file_name.cpp)編譯為可執行文件(file_name.exe)。
如果 execlp 失敗,記錄錯誤日志并退出。
在父進程中:
使用 waitpid 等待子進程結束。
檢查是否生成了可執行文件(file_name.exe)。
如果生成成功,記錄日志并返回 true;否則返回 false。

所依賴的外部模塊:

  • ns_util: 工具模塊,提供路徑拼接和文件操作功能。

    • PathUtil::Src(file_name): 獲取源文件路徑(./temp/file_name.cpp)。

    • PathUtil::Exe(file_name): 獲取可執行文件路徑(./temp/file_name.exe)。

    • PathUtil::CompilerError(file_name): 獲取編譯錯誤文件路徑(./temp/file_name.compile_error)。

    • FileUtil::IsFileExists(path): 檢查文件是否存在。

  • ns_log: 日志模塊,用于記錄日志信息。

    • LOG(INFO): 記錄信息日志。

    • LOG(WARNING): 記錄警告日志。

    • LOG(ERROR): 記錄錯誤日志

?3.3runner.hpp

Runner類

SetProcLimit接口

static void SetProcLimit(int _cpu_limit, int _mem_limit)

參數:_cpu_limit:CPU時間限制,_mem_limit:內存資源限制,設置進程的 CPU 和內存資源限制。

setrlimit 系統調用設置資源限制。RLIMIT_CPU: 限制 CPU 時間。RLIMIT_AS: 限制虛擬內存大小。

Run接口

運行編譯后的程序,并限制其 CPU 和內存資源使用

static int Run(const std::string &file_name, int cpu_limit, int mem_limit)
  • > 0: 程序異常退出,返回值為收到的信號編號。

  • == 0: 程序正常運行完畢。

  • < 0: 內部錯誤(如文件打開失敗或子進程創建失敗)

  1. 獲取可執行文件、標準輸入、標準輸出和標準錯誤的路徑。

  2. 打開標準輸入、標準輸出和標準錯誤文件。

  3. 使用 fork 創建子進程。

  4. 在子進程中:

    • 使用 dup2 重定向標準輸入、標準輸出和標準錯誤。

    • 調用 SetProcLimit 設置資源限制。

    • 使用 execl 運行可執行程序。

    • 如果 execl 失敗,記錄錯誤日志并退出。

  5. 在父進程中:

    • 關閉文件描述符。

    • 使用 waitpid 等待子進程結束。

    • 獲取子進程的退出狀態,并返回狀態碼的低 7 位(信號編號)。

?依賴的外部模塊

  • ns_util: 工具模塊,提供路徑拼接功能。

    • PathUtil::Exe(file_name): 獲取可執行文件路徑(./temp/file_name.exe)。

    • PathUtil::Stdin(file_name): 獲取標準輸入文件路徑(./temp/file_name.stdin)。

    • PathUtil::Stdout(file_name): 獲取標準輸出文件路徑(./temp/file_name.stdout)。

    • PathUtil::Stderr(file_name): 獲取標準錯誤文件路徑(./temp/file_name.stderr)。

  • ns_log: 日志模塊,用于記錄日志信息。

    • LOG(INFO): 記錄信息日志。

    • LOG(ERROR): 記錄錯誤日志。

?4.oj_server

4.1 oj_control.hpp

主要的功能:管理題目數據,渲染網面,負載均衡,調用編譯和運行服務。

核心類

Machine:表示提供編譯和運行服務的主機

LoadBlance:實現負載均衡

Control:核心業務邏輯處理器

?依賴模塊

ns_model: 題目數據管理。

ns_view: HTML 渲染。

ns_log: 日志記錄。

ns_util: 工具函數。

httplib: HTTP 客戶端。

Machine類

IncLoad

void IncLoad()//增加主機負載,使用互斥鎖保護負載變量,確保線程安全。

DecLoad

void DecLoad()//減少主機負載,使用互斥鎖保護負載變量,確保線程安全。

ResetLoad

void ResetLoad()//重置主機的負載為0,使用互斥鎖保護負載變量,確保線程安全

Load

uint64_t Load() //獲取主機的當前負載,使用互斥鎖保護負載變量,確保線程安全

LoadBlance類

LoadConf

bool LoadConf(const std::string &machine_conf)

?從配置文件中加載主機信息,參數:machine_conf:配置文件路徑

讀取配置文件,解析每臺主機的 IP 和端口。初始化主機對象,并將其加入在線主機列表。

SmartChoice

bool SmartChoice(int *id, Machine **m)

參數:id 輸出型參數返回選擇的主機ID, m:輸出參數,返回選擇的主機的對象指針。
遍歷在線主機列表,選擇負載最低的主機

OfflineMachine

void OfflineMachine(int which)//將指定主機離線

which為要離線的主機ID

OnlineMachine

void OnlineMachine()//將所有離線主機全部上線

ShowMachine

void ShowMachines()//打印當前在線和離線主機列表(用于調試)。

Control類

核心業務邏輯控制器,負責管理題目數據、渲染網頁、負載均衡以及調用編譯和運行服務。

RecoveryMachine

void RecoveryMachine()//恢復離線主機為在線狀態

AllQuestions

bool AllQuestions(string *html) //獲取所有題目數據并渲染為網頁。

html:輸出參數,返回渲染后的HTML內容

從Model獲取所有題目數據,使用View渲染題目列表為HTML

Question

bool Question(const string &number, string *html)//獲取指定題目數據并渲染為網頁

number: 題目編號。html: 輸出參數,返回渲染后的 HTML 內容。

Judge

void Judge(const std::string &number, const std::string in_json, std::string *out_json)

參數:number:題目編號,in_json:輸入的JSON數據,out_json:輸出的JSON數據,包含評測數據

從 Model 獲取指定題目的詳細信息。
解析輸入 JSON,拼接用戶代碼和測試用例代碼。
使用負載均衡選擇主機,發起 HTTP 請求調用編譯和運行服務。
將評測結果寫入輸出 JSON。

?所依賴的外部模塊

  • ns_model: 提供題目數據管理功能。

    • GetAllQuestions: 獲取所有題目數據。

    • GetOneQuestion: 獲取指定題目數據。

  • ns_view: 提供 HTML 渲染功能。

    • AllExpandHtml: 渲染題目列表為 HTML。

    • OneExpandHtml: 渲染題目詳情為 HTML。

  • ns_log: 提供日志記錄功能。

  • ns_util: 提供工具函數(如字符串分割)。

  • httplib: 提供 HTTP 客戶端功能,用于調用編譯和運行服務。

?4.2 oj_model

Question結構體

變量名類型描述
numberstd::string題目編號,唯一標識
titlestd::string題目標題
starstd::string題目難度(簡單、中等、困難)
descstd::string題目描述
headerstd::string題目預設代碼(用戶編輯器的初始代碼)
tailstd::string題目測試用例(與 header 拼接形成完整代碼)
cpu_limitint題目時間限制(單位:秒)
mem_limitint題目空間限制(單位:KB)

Model類

QueryMysql

bool QueryMySql(const std::string &sql, vector<Question> *out)//執行 SQL 查詢,并將結果存儲到 out 中。

sql:要執行的SQL查詢語句,out:輸出參數,存儲查詢結果的Question向量

GetAllQuestions

bool GetAllQuestions(vector<Question> *out)

構造 SQL 查詢語句:SELECT * FROM oj_questions

調用 QueryMySql 執行查詢

GetOneQuestion

bool GetOneQuestion(const std::string &number, Question *q)

構造 SQL 查詢語句:SELECT * FROM oj_questions WHERE number=<number>。
調用 QueryMySql 執行查詢。
如果查詢結果中有且僅有一條記錄,將其賦值給 q。

依賴的外部模塊

  • ns_log: 提供日志記錄功能。

    • LOG(INFO): 記錄信息日志。

    • LOG(WARNING): 記錄警告日志。

    • LOG(FATAL): 記錄致命錯誤日志。

  • ns_util: 提供工具函數。

  • mysql.h: MySQL C API 頭文件,用于連接和操作 MySQL 數據庫。

// 以下是硬編碼的常量const std::string oj_questions = "oj_questions"; // 數據庫表名const std::string host = "127.0.0.1";           // MySQL 服務器地址const std::string user = "oj_client";           // MySQL 用戶名const std::string passwd = "123456";            // MySQL 密碼const std::string db = "oj";                    // 數據庫名稱const int port = 3306;                          // MySQL 服務器端口號

?4.3 oj_view

AllExpandHtml

void AllExpandHtml(const vector<struct Question> &questions, std::string *html)

question:題目列表,包含所有題目的詳細信息,html:輸出參數,存儲渲染后的html內容。

  1. 構造模板文件路徑:./template_html/all_questions.html

  2. 創建 ctemplate::TemplateDictionary 對象 root,用于存儲模板數據。

  3. 遍歷題目列表,將每個題目的編號、標題和難度添加到模板數據中。

  4. 加載模板文件。

  5. 使用模板數據渲染 HTML 頁面,并將結果存儲到 html 中。

?OneExpandHtml

q:單個題目的詳細信息,html:輸出參數存儲渲染后的html內容

  1. 構造模板文件路徑:./template_html/one_question.html

  2. 創建 ctemplate::TemplateDictionary 對象 root,用于存儲模板數據。

  3. 將題目的編號、標題、難度、描述和預設代碼添加到模板數據中。

  4. 加載模板文件。

  5. 使用模板數據渲染 HTML 頁面,并將結果存儲到 html 中。

?所依賴的外部模塊

ctemplate: 用于 HTML 模板渲染。

ctemplate::TemplateDictionary: 存儲模板數據。
ctemplate::Template: 加載和渲染模板文件。
ns_model: 提供題目數據管理功能。
Question: 題目數據結構,包含編號、標題、難度、描述、預設代碼等信息。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897893.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897893.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897893.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實現“XXX一張圖“進行環境設施設備可視化管理

實現“電網一張圖”、“鐵路一張圖”、“水庫一張圖”、“森林一張圖”等概念,本質上是將某一領域的空間數據、設施設備、運行狀態等信息整合到一個統一的數字化平臺上,實現全域可視化、智能化管理和協同運營。這種“一張圖”模式依賴于地理信息系統(GIS)、物聯網(IoT)、…

《基於Python的網絡爬蟲抓包技術研究與應用》

## 摘要 本文探討了基于Python的網絡爬蟲抓包技術及其應用。隨著互聯網數據的快速增長&#xff0c;網絡爬蟲技術在數據采集和分析中扮演著越來越重要的角色。本研究首先介紹了網絡爬蟲的基本概念和Python在爬蟲開發中的優勢&#xff0c;然后深入分析了抓包技術的原理和常用工具…

【藍橋杯速成】| 1.暴力解題

1高頻考點與暴力解題_嗶哩嗶哩_bilibili 感謝up主分享&#xff0c;以下內容是學習筆記&#xff0c;以c為主&#xff0c;部分python 題目一&#xff1a;維納的年齡 題目內容 美國數學家維納(N.Wiener)智力早熟&#xff0c; 11歲就上了大學。他曾在1935~1936年應邀來中國清華大…

[C++Qt] 槽函數收不到信號問題(信號的注冊)

&#x1f4e2;博客主頁&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;歡迎點贊 &#x1f44d; 收藏 ?留言 &#x1f4dd; 如有錯誤敬請指正&#xff01;&#x1f4e2;本文由 丶布布原創&#xff0c;首發于 CSDN&#xff0c;轉載注明出處&#x1f649;&#x1f4e2;現…

從零開始用AI開發游戲(一)

1. 核心玩法設計 核心目標&#xff1a;玩家需在隨機生成的3D迷宮中尋找出口&#xff0c;躲避陷阱、收集道具、解開謎題。核心機制&#xff1a; 隨機生成迷宮&#xff1a;每次游戲生成不同結構的迷宮&#xff08;遞歸分割算法或深度優先搜索&#xff09;。第一人稱視角&#xf…

基于ssm的寵物醫院信息管理系統(全套)

一、系統架構 前端&#xff1a;html | layui | vue | element-ui 后端&#xff1a;spring | springmvc | mybatis 環境&#xff1a;jdk1.8 | mysql | maven | tomcat | idea | nodejs 二、代碼及數據庫 三、功能介紹 01. web端-首頁1 02. web端-首頁…

【CXX】6.7 SharedPtr<T> — std::shared_ptr<T>

std::shared_ptr 的 Rust 綁定稱為 SharedPtr。 限制&#xff1a; SharedPtr 不支持 T 為不透明的 Rust 類型。對于在語言邊界上傳遞不透明 Rust 類型的所有權&#xff0c;應改用 Box&#xff08;C 中的 rust::Box&#xff09;。 示例 // src/main.rsuse std::ops::Deref; …

利用python生成excel中模板范圍對應的shape文件

利用python生成excel中模板范圍對應的shape文件 # -*- coding: utf-8 -*- import os.pathimport pandas as pd from shapely.geometry import Polygon from shapely.wkt import dumps import argparse# 創建解析器 parser argparse.ArgumentParser(description"這是一個…

cursor使用

引入私有文檔 設置-> Features->下滑找到Docs url后邊多加一個 / 可以拉取url下所有的頁面(子頁面&#xff0c;子目錄)&#xff0c;不加只拉取url當前頁面 使用 選擇 Docs 回車 選擇 文檔 直接解析鏈接 鏈接 回車 搜索引擎 web 對比git版本差異 git 選擇其中一個 g…

達夢數據庫中插入導出圖片的方法與應用

達夢數據庫中插入導出圖片的方法與應用 在數據庫的實際應用場景中&#xff0c;圖片存儲是一項常見且重要的需求。以電商平臺為例&#xff0c;商品展示圖片是吸引消費者的關鍵元素&#xff1b;而在社交軟件里&#xff0c;用戶頭像更是個人形象的直觀體現。針對達夢數據庫&#…

【云原生】動態資源分配(DRA)深度洞察報告

1. DRA 的發展與設計靈感 Kubernetes 早期通過 Device Plugin&#xff08;設備插件&#xff09;機制支持 GPU、NIC 等特殊硬件&#xff0c;將節點上可用設備數量上報給 kubelet 和調度器。但設備插件模式存在局限&#xff1a;調度器只能根據節點標簽等屬性粗粒度篩選&#xff…

嵌入式八股ARM篇

前言 ARM篇主要介紹一下寄存器和中斷機制,至于匯編這一塊…還請大家感興趣自行學習 1.寄存器 R0 - R3 R4 - R11 寄存器 R0 - R3一般用作函數傳參 R4 - R11用來保存程序運算的中間結果或函數的局部變量 在函數調用過程中 注意在發生異常的時候 cortex-M0架構會自動將R0-R3壓入…

Python 實現的采集諸葛靈簽

Python 實現的采集諸葛靈簽 項目介紹 這是一個基于 Python 開發的諸葛靈簽數據采集和展示項目。通過爬蟲技術獲取諸葛神簽的簽文和解簽內容&#xff0c;并提供數據存儲和查詢功能。 項目結構 zhuge/├── zhuge_scraper.py # 爬蟲主程序├── zhuge_pages/ # 數據存儲目錄…

【C++項目實戰】校園公告搜索引擎:完整實現與優化指南

&#x1f3ac; 個人主頁&#xff1a;誰在夜里看海. &#x1f4d6; 個人專欄&#xff1a;《C系列》《Linux系列》《算法系列》 ?? 道阻且長&#xff0c;行則將至 目錄 &#x1f4da;一、項目概述 &#x1f4d6;1.項目背景 &#x1f4d6;2.主要功能 &#x1f4d6;3.界面展…

代理(Delegate)、閉包(Closure)、Notification(通知中心) 和 swift_event_bus適用場景和工作方式

在 Swift 開發中&#xff0c;在 Swift 開發中&#xff0c;代理&#xff08;Delegate&#xff09;、閉包&#xff08;Closure&#xff09;、Notification&#xff08;通知中心&#xff09; 和 swift_event_bus 主要用于 組件之間的通信&#xff0c;但它們的適用場景和工作方式有…

設計模式--單例模式(Singleton)【Go】

引言 在設計模式中&#xff0c;單例模式&#xff08;Singleton Pattern&#xff09;是一種非常常見且實用的模式。它的核心思想是確保一個類只有一個實例&#xff0c;并提供一個全局訪問點。這種模式在需要全局唯一對象的場景中非常有用&#xff0c;比如配置管理、日志記錄、數…

MySQL數據庫復制

文章目錄 MySQL數據庫復制一、復制的原理二、復制的搭建1.編輯配置文件2.在主庫上創建復制的用戶3.獲取主庫的備份4.基于從庫的恢復5.建立主從復制6.開啟主從復制7.查看主從復制狀態 MySQL數據庫復制 MySQL作為非常流行的數據庫&#xff0c;支撐它如此出彩的因素主要有兩個&am…

Sourcetree——使用.gitignore忽略文件或者文件夾

一、為何需要文件忽略機制&#xff1f; 1.1 為什么要會略&#xff1f; 對于開發者而言&#xff0c;明智地選擇忽略某些文件類型&#xff0c;能帶來三大核心優勢&#xff1a; 倉庫純凈性&#xff1a;避免二進制文件、編譯產物等污染代碼庫 安全防護&#xff1a;防止敏感信息&…

基于yolov8+streamlit實現目標檢測系統帶漂亮登錄界面

【項目介紹】 基于YOLOv8和Streamlit實現的目標檢測系統&#xff0c;結合了YOLOv8先進的目標檢測能力與Streamlit快速構建交互式Web應用的優勢&#xff0c;為用戶提供了一個功能強大且操作簡便的目標檢測平臺。該系統不僅具備高精度的目標檢測功能&#xff0c;還擁有一個漂亮且…

分享vue好用的pdf 工具實測

vue3-pdf-app&#xff1a; 帶大綱&#xff0c;帶分頁&#xff0c;帶縮放&#xff0c;帶全屏&#xff0c;帶打印&#xff0c;帶下載&#xff0c;帶旋轉 下載依賴&#xff1a; yarn add vue3-pdf-appornpm install vue3-pdf-app 配置類&#xff1a; 創建文件 pdfConfig.ts /…