From b887f7dda2716aa86980167a1b4b72d187ffb9ef Mon Sep 17 00:00:00 2001 From: lzx <2246256235@qq.com> Date: 星期二, 29 十月 2024 15:12:21 +0800 Subject: [PATCH] Merge branch 'master' of ssh://115.28.86.8:29418/~admin/昆仑_1025 --- Client/郑凯文/document/About version updates.docx | 0 Server/王琨元/document/数据库连接.txt | 16 + Server/马丽萍/code/log/.vscode/launch.json | 24 + Server/马渝杭/document/版本更新功能需求_server.docx | 0 Server/王琨元/document/数据库.docx | 0 Server/李转转/document/需求分析报告.docx | 0 Client/申烜/document/注册登录需求分析.docx | 0 Server/王琨元/document/数据库模块需求分析.docx | 0 Server/王琨元/document/数据库连接池类.txt | 91 ++++++ Server/马丽萍/code/log/.vscode/c_cpp_properties.json | 18 + Client/龚启祥/document/昆仑_大屏显示.docx | 0 Client/朱航/document/需求分析.docx | 0 Server/王琨元/document/单例模式封装.txt | 51 +++ Server/王琨元/document/备份导出.txt | 29 ++ Client/刘子航/document/昆仑_警报管理.docx | 0 Server/马丽萍/code/log/block_queue.h | 212 +++++++++++++++ Server/马丽萍/document/日志需求分析文档.docx | 0 /dev/null | 0 Client/姜可庚/document/权限管理需求分析.docx | 0 Server/马丽萍/code/log/log.cpp | 164 +++++++++++ Server/马丽萍/code/log/log.h | 69 ++++ Client/郑凯文/document/About version updates(第二版).docx | 0 Server/马丽萍/code/log/.vscode/settings.json | 59 ++++ Server/马丽萍/code/log/README.md | 9 Client/冀浩昶/document/生产计划管理_需求分析.docx | 0 Client/黎弘霖/document/设备管理需求分析.docx | 0 Server/王琨元/document/防注入.txt | 67 ++++ 27 files changed, 809 insertions(+), 0 deletions(-) diff --git "a/Client/\345\206\200\346\265\251\346\230\266/document/\347\224\237\344\272\247\350\256\241\345\210\222\347\256\241\347\220\206_\351\234\200\346\261\202\345\210\206\346\236\220.docx" "b/Client/\345\206\200\346\265\251\346\230\266/document/\347\224\237\344\272\247\350\256\241\345\210\222\347\256\241\347\220\206_\351\234\200\346\261\202\345\210\206\346\236\220.docx" index 108a31d..2402a23 100644 --- "a/Client/\345\206\200\346\265\251\346\230\266/document/\347\224\237\344\272\247\350\256\241\345\210\222\347\256\241\347\220\206_\351\234\200\346\261\202\345\210\206\346\236\220.docx" +++ "b/Client/\345\206\200\346\265\251\346\230\266/document/\347\224\237\344\272\247\350\256\241\345\210\222\347\256\241\347\220\206_\351\234\200\346\261\202\345\210\206\346\236\220.docx" Binary files differ diff --git "a/Client/\345\210\230\345\255\220\350\210\252/document/\346\230\206\344\273\221_\350\255\246\346\212\245\347\256\241\347\220\206.docx" "b/Client/\345\210\230\345\255\220\350\210\252/document/\346\230\206\344\273\221_\350\255\246\346\212\245\347\256\241\347\220\206.docx" index 6e3fc7b..708c01a 100644 --- "a/Client/\345\210\230\345\255\220\350\210\252/document/\346\230\206\344\273\221_\350\255\246\346\212\245\347\256\241\347\220\206.docx" +++ "b/Client/\345\210\230\345\255\220\350\210\252/document/\346\230\206\344\273\221_\350\255\246\346\212\245\347\256\241\347\220\206.docx" Binary files differ diff --git "a/Client/\345\247\234\345\217\257\345\272\232/document/\346\235\203\351\231\220\347\256\241\347\220\206\351\234\200\346\261\202\345\210\206\346\236\220.docx" "b/Client/\345\247\234\345\217\257\345\272\232/document/\346\235\203\351\231\220\347\256\241\347\220\206\351\234\200\346\261\202\345\210\206\346\236\220.docx" index 4b72f8f..3d2db4d 100644 --- "a/Client/\345\247\234\345\217\257\345\272\232/document/\346\235\203\351\231\220\347\256\241\347\220\206\351\234\200\346\261\202\345\210\206\346\236\220.docx" +++ "b/Client/\345\247\234\345\217\257\345\272\232/document/\346\235\203\351\231\220\347\256\241\347\220\206\351\234\200\346\261\202\345\210\206\346\236\220.docx" Binary files differ diff --git "a/Client/\346\234\261\350\210\252/document/\346\234\261\350\210\252.docx" "b/Client/\346\234\261\350\210\252/document/\346\234\261\350\210\252.docx" deleted file mode 100644 index b405d28..0000000 --- "a/Client/\346\234\261\350\210\252/document/\346\234\261\350\210\252.docx" +++ /dev/null Binary files differ diff --git "a/Client/\346\234\261\350\210\252/document/\351\234\200\346\261\202\345\210\206\346\236\220.docx" "b/Client/\346\234\261\350\210\252/document/\351\234\200\346\261\202\345\210\206\346\236\220.docx" new file mode 100644 index 0000000..7f3c79f --- /dev/null +++ "b/Client/\346\234\261\350\210\252/document/\351\234\200\346\261\202\345\210\206\346\236\220.docx" Binary files differ diff --git "a/Client/\347\224\263\347\203\234/document/\346\263\250\345\206\214\347\231\273\345\275\225\351\234\200\346\261\202\345\210\206\346\236\220.docx" "b/Client/\347\224\263\347\203\234/document/\346\263\250\345\206\214\347\231\273\345\275\225\351\234\200\346\261\202\345\210\206\346\236\220.docx" index 809614f..651bb8e 100644 --- "a/Client/\347\224\263\347\203\234/document/\346\263\250\345\206\214\347\231\273\345\275\225\351\234\200\346\261\202\345\210\206\346\236\220.docx" +++ "b/Client/\347\224\263\347\203\234/document/\346\263\250\345\206\214\347\231\273\345\275\225\351\234\200\346\261\202\345\210\206\346\236\220.docx" Binary files differ diff --git "a/Client/\351\203\221\345\207\257\346\226\207/About version updates.docx" "b/Client/\351\203\221\345\207\257\346\226\207/document/About version updates.docx" similarity index 100% rename from "Client/\351\203\221\345\207\257\346\226\207/About version updates.docx" rename to "Client/\351\203\221\345\207\257\346\226\207/document/About version updates.docx" Binary files differ diff --git "a/Client/\351\203\221\345\207\257\346\226\207/document/About version updates\357\274\210\347\254\254\344\272\214\347\211\210\357\274\211.docx" "b/Client/\351\203\221\345\207\257\346\226\207/document/About version updates\357\274\210\347\254\254\344\272\214\347\211\210\357\274\211.docx" new file mode 100644 index 0000000..541bae5 --- /dev/null +++ "b/Client/\351\203\221\345\207\257\346\226\207/document/About version updates\357\274\210\347\254\254\344\272\214\347\211\210\357\274\211.docx" Binary files differ diff --git "a/Client/\351\273\216\345\274\230\351\234\226/document/\350\256\276\345\244\207\347\256\241\347\220\206\351\234\200\346\261\202\345\210\206\346\236\220.docx" "b/Client/\351\273\216\345\274\230\351\234\226/document/\350\256\276\345\244\207\347\256\241\347\220\206\351\234\200\346\261\202\345\210\206\346\236\220.docx" index e248c95..382d262 100644 --- "a/Client/\351\273\216\345\274\230\351\234\226/document/\350\256\276\345\244\207\347\256\241\347\220\206\351\234\200\346\261\202\345\210\206\346\236\220.docx" +++ "b/Client/\351\273\216\345\274\230\351\234\226/document/\350\256\276\345\244\207\347\256\241\347\220\206\351\234\200\346\261\202\345\210\206\346\236\220.docx" Binary files differ diff --git "a/Client/\351\276\232\345\220\257\347\245\245/document/\346\230\206\344\273\221_\345\244\247\345\261\217\346\230\276\347\244\272.docx" "b/Client/\351\276\232\345\220\257\347\245\245/document/\346\230\206\344\273\221_\345\244\247\345\261\217\346\230\276\347\244\272.docx" index 9750358..970f45b 100644 --- "a/Client/\351\276\232\345\220\257\347\245\245/document/\346\230\206\344\273\221_\345\244\247\345\261\217\346\230\276\347\244\272.docx" +++ "b/Client/\351\276\232\345\220\257\347\245\245/document/\346\230\206\344\273\221_\345\244\247\345\261\217\346\230\276\347\244\272.docx" Binary files differ diff --git "a/Server/\346\235\216\350\275\254\350\275\254/document/\351\234\200\346\261\202\345\210\206\346\236\220\346\212\245\345\221\212.docx" "b/Server/\346\235\216\350\275\254\350\275\254/document/\351\234\200\346\261\202\345\210\206\346\236\220\346\212\245\345\221\212.docx" index d35f9c5..9a68128 100644 --- "a/Server/\346\235\216\350\275\254\350\275\254/document/\351\234\200\346\261\202\345\210\206\346\236\220\346\212\245\345\221\212.docx" +++ "b/Server/\346\235\216\350\275\254\350\275\254/document/\351\234\200\346\261\202\345\210\206\346\236\220\346\212\245\345\221\212.docx" Binary files differ diff --git "a/Server/\347\216\213\347\220\250\345\205\203/document/\345\215\225\344\276\213\346\250\241\345\274\217\345\260\201\350\243\205.txt" "b/Server/\347\216\213\347\220\250\345\205\203/document/\345\215\225\344\276\213\346\250\241\345\274\217\345\260\201\350\243\205.txt" new file mode 100644 index 0000000..c07f1df --- /dev/null +++ "b/Server/\347\216\213\347\220\250\345\205\203/document/\345\215\225\344\276\213\346\250\241\345\274\217\345\260\201\350\243\205.txt" @@ -0,0 +1,51 @@ +#include <iostream> +#include <memory> +#include <mutex> +#include <string> +#include <mysql_driver.h> +#include <mysql_connection.h> +#include <cppconn/statement.h> +#include <cppconn/resultset.h> + +class DatabaseOperator { +private: + // 绉佹湁鏋勯�犲嚱鏁� + DatabaseOperator() { + try { + driver = sql::mysql::get_mysql_driver_instance(); + connection = driver->connect("tcp://127.0.0.1:3306", "username", "password"); + connection->setSchema("your_database"); + } catch (sql::SQLException &e) { + std::cerr << "鏁版嵁搴撹繛鎺ラ敊璇�: " << e.what() << std::endl; + } + } + + static DatabaseOperator* instance; + static std::mutex mutex; + sql::Driver* driver; + std::unique_ptr<sql::Connection> connection; + +public: + // 鑾峰彇鍗曚緥瀹炰緥 + static DatabaseOperator* getInstance() { + std::lock_guard<std::mutex> lock(mutex); + if (instance == nullptr) { + instance = new DatabaseOperator(); + } + return instance; + } + + // 鎵ц鏌ヨ鎿嶄綔锛堢ず渚嬶級 + sql::ResultSet* query(const std::string& sql) { + try { + std::unique_ptr<sql::Statement> stmt(connection->createStatement()); + return stmt->executeQuery(sql); + } catch (sql::SQLException &e) { + std::cerr << "鏌ヨ閿欒: " << e.what() << std::endl; + } + return nullptr; + } +}; + +std::mutex DatabaseOperator::mutex; +DatabaseOperator* DatabaseOperator::instance = nullptr; \ No newline at end of file diff --git "a/Server/\347\216\213\347\220\250\345\205\203/document/\345\244\207\344\273\275\345\257\274\345\207\272.txt" "b/Server/\347\216\213\347\220\250\345\205\203/document/\345\244\207\344\273\275\345\257\274\345\207\272.txt" new file mode 100644 index 0000000..79c8216 --- /dev/null +++ "b/Server/\347\216\213\347\220\250\345\205\203/document/\345\244\207\344\273\275\345\257\274\345\207\272.txt" @@ -0,0 +1,29 @@ +#!/bin/bash + +# 鏁版嵁搴撹繛鎺ュ弬鏁� +DB_USER="your_username" +DB_PASS="your_password" +DB_NAME="your_database_name" +BACKUP_DIR="/path/to/backup/directory" + +# 鑾峰彇褰撳墠鏃ユ湡锛岀敤浜庢枃浠跺悕 +DATE=$(date +%Y%m%d%H%M%S) + +# 澶囦唤鏂囦欢鍚� +BACKUP_FILE="${BACKUP_DIR}/backup_${DATE}.sql" + +# 鍒涘缓澶囦唤鐩綍锛堝鏋滀笉瀛樺湪锛� +mkdir -p $BACKUP_DIR + +# 浣跨敤mysqldump杩涜鏁版嵁搴撳浠� +mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_FILE + +if [ $? -eq 0 ]; then + echo "鏁版嵁搴撳浠芥垚鍔燂細$BACKUP_FILE" +else + echo "鏁版嵁搴撳浠藉け璐�" +fi + +# 娣诲姞瀹氭椂浠诲姟锛堜娇鐢╟rontab -e鏉ョ紪杈戝畾鏃朵换鍔★級 +# 渚嬪锛屾瘡澶╁噷鏅�2鐐规墽琛屽浠� +# 0 2 * * * /path/to/this/script.sh \ No newline at end of file diff --git "a/Server/\347\216\213\347\220\250\345\205\203/document/\346\225\260\346\215\256\345\272\223.docx" "b/Server/\347\216\213\347\220\250\345\205\203/document/\346\225\260\346\215\256\345\272\223.docx" index 866495c..c7dd41d 100644 --- "a/Server/\347\216\213\347\220\250\345\205\203/document/\346\225\260\346\215\256\345\272\223.docx" +++ "b/Server/\347\216\213\347\220\250\345\205\203/document/\346\225\260\346\215\256\345\272\223.docx" Binary files differ diff --git "a/Server/\347\216\213\347\220\250\345\205\203/document/\346\225\260\346\215\256\345\272\223\346\250\241\345\235\227\351\234\200\346\261\202\345\210\206\346\236\220.docx" "b/Server/\347\216\213\347\220\250\345\205\203/document/\346\225\260\346\215\256\345\272\223\346\250\241\345\235\227\351\234\200\346\261\202\345\210\206\346\236\220.docx" new file mode 100644 index 0000000..0a608f6 --- /dev/null +++ "b/Server/\347\216\213\347\220\250\345\205\203/document/\346\225\260\346\215\256\345\272\223\346\250\241\345\235\227\351\234\200\346\261\202\345\210\206\346\236\220.docx" Binary files differ diff --git "a/Server/\347\216\213\347\220\250\345\205\203/document/\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245.txt" "b/Server/\347\216\213\347\220\250\345\205\203/document/\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245.txt" new file mode 100644 index 0000000..dad6734 --- /dev/null +++ "b/Server/\347\216\213\347\220\250\345\205\203/document/\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245.txt" @@ -0,0 +1,16 @@ +#include "MySQL.h" +#include <WinSock2.h> +#include <mysql.h> +#include <iostream> +#include <string> +using namespace std; +int main() { + MYSQL mysql; + mysql_init(&mysql);//鍒濆鍖� + //杩炴帴鏁版嵁搴撴湇鍔″櫒鏈嶅姟鍣� IP 鐢ㄦ埛鍚� 瀵嗙爜 鏁版嵁搴撶鍙e彿 + mysql_real_connect(&mysql, "192.168.136.128", "root", "123456", "wang", 3306, NULL, 0); + + string sql="set names gbk"; + mysql_real_query(&mysql, sql.c_str(), sql.size()); + mysql_close(&mysql); + return 0; \ No newline at end of file diff --git "a/Server/\347\216\213\347\220\250\345\205\203/document/\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\261\240\347\261\273.txt" "b/Server/\347\216\213\347\220\250\345\205\203/document/\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\261\240\347\261\273.txt" new file mode 100644 index 0000000..8c82c1a --- /dev/null +++ "b/Server/\347\216\213\347\220\250\345\205\203/document/\346\225\260\346\215\256\345\272\223\350\277\236\346\216\245\346\261\240\347\261\273.txt" @@ -0,0 +1,91 @@ +#include <iostream> +#include <list> +#include <mutex> +#include <condition_variable> +#include <mysql_driver.h> +#include <mysql_connection.h> +#include <cppconn/statement.h> +#include <cppconn/resultset.h> + +class SQLConnectionPool { +private: + SQLConnectionPool(int minConns, int maxConns) : + minConnections(minConns), maxConnections(maxConns), currentConnections(0) {} + + static SQLConnectionPool* instance; + static std::mutex mutex; + std::condition_variable cv; + int minConnections; + int maxConnections; + int currentConnections; + std::list<std::unique_ptr<sql::Connection>> connections; + + // 鍒涘缓涓�涓柊鐨勬暟鎹簱杩炴帴 + std::unique_ptr<sql::Connection> createConnection() { + try { + sql::Driver* driver = sql::mysql::get_mysql_driver_instance(); + std::unique_ptr<sql::Connection> conn(driver->connect("tcp://127.0.0.1:3306", "username", "password")); + conn->setSchema("your_database"); + return conn; + } catch (sql::SQLException &e) { + std::cerr << "鍒涘缓杩炴帴閿欒: " << e.what() << std::endl; + return nullptr; + } + } + +public: + // 鑾峰彇鍗曚緥瀹炰緥 + static SQLConnectionPool* getInstance(int minConns, int maxConns) { + std::lock_guard<std::mutex> lock(mutex); + if (instance == nullptr) { + instance = new SQLConnectionPool(minConns, maxConns); + instance->initializePool(); + } + return instance; + } + + // 鍒濆鍖栬繛鎺ユ睜 + void initializePool() { + for (int i = 0; i < minConnections; ++i) { + std::unique_ptr<sql::Connection> conn = createConnection(); + if (conn) { + connections.push_back(std::move(conn)); + currentConnections++; + } + } + } + + // 鑾峰彇鏁版嵁搴撹繛鎺� + std::unique_ptr<sql::Connection> getConnection() { + std::unique_lock<std::mutex> lock(mutex); + while (connections.empty() && currentConnections >= maxConnections) { + cv.wait(lock); + } + + std::unique_ptr<sql::Connection> conn; + if (!connections.empty()) { + conn = std::move(connections.front()); + connections.pop_front(); + } else if (currentConnections < maxConnections) { + conn = createConnection(); + if (conn) { + currentConnections++; + } + } + return conn; + } + + // 褰掕繕鏁版嵁搴撹繛鎺� + void releaseConnection(std::unique_ptr<sql::Connection>& conn) { + std::lock_guard<std::mutex> lock(mutex); + if (currentConnections > minConnections) { + currentConnections--; + } else { + connections.push_back(std::move(conn)); + } + cv.notify_one(); + } +}; + +std::mutex SQLConnectionPool::mutex; +SQLConnectionPool* SQLConnectionPool::instance = nullptr; \ No newline at end of file diff --git "a/Server/\347\216\213\347\220\250\345\205\203/document/\351\230\262\346\263\250\345\205\245.txt" "b/Server/\347\216\213\347\220\250\345\205\203/document/\351\230\262\346\263\250\345\205\245.txt" new file mode 100644 index 0000000..19a2f6c --- /dev/null +++ "b/Server/\347\216\213\347\220\250\345\205\203/document/\351\230\262\346\263\250\345\205\245.txt" @@ -0,0 +1,67 @@ +#include <iostream> +#include <mysql_driver.h> +#include <mysql_connection.h> +#include <cppconn/statement.h> +#include <cppconn/prepared_statement.h> +#include <cppconn/resultset.h> +#include <string> +#include <regex> + +class DatabaseUtils { +public: + // 杩炴帴鏁版嵁搴� + static sql::Connection* connect() { + try { + sql::mysql::MySQL_Driver* driver = sql::mysql::get_mysql_driver_instance(); + sql::Connection* con = driver->connect("tcp://127.0.0.1:3306", "mayi", "123456"); + con->setSchema("your_database"); + return con; + } catch (sql::SQLException& e) { + std::cerr << "鏁版嵁搴撹繛鎺ラ敊璇�: " << e.what() << std::endl; + return nullptr; + } + } + + // 妫�鏌QL璇彞鏄惁瀛樺湪娼滃湪娉ㄥ叆椋庨櫓锛堢畝鍗曟鍒欐牎楠岋級 + static bool isSafeSQL(const std::string& sql) { + // 绠�鍗曠殑姝e垯琛ㄨ揪寮忥紝闃叉甯歌鐨勬敞鍏ュ叧閿瘝 + std::regex injectionRegex("(drop|delete|update|insert|select\\s+\\*\\s+from)", std::regex_constants::icase); + return!std::regex_search(sql, injectionRegex); + } + + // 浣跨敤鍙傛暟鍖栨煡璇㈡墽琛孲QL璇彞 + static sql::ResultSet* executeSafeQuery(sql::Connection* con, const std::string& sql, const std::vector<std::string>& params) { + try { + sql::PreparedStatement* pstmt = con->prepareStatement(sql); + for (size_t i = 0; i < params.size(); ++i) { + pstmt->setString(i + 1, params[i]); + } + return pstmt->executeQuery(); + } catch (sql::SQLException& e) { + std::cerr << "鏌ヨ鎵ц閿欒: " << e.what() << std::endl; + return nullptr; + } + } +}; + +int main() { + sql::Connection* con = DatabaseUtils::connect(); + if (con) { + std::string sql = "SELECT * FROM your_table WHERE column_name =?"; + std::vector<std::string> params = {"test_value"}; + if (DatabaseUtils::isSafeSQL(sql)) { + sql::ResultSet* res = DatabaseUtils::executeSafeQuery(con, sql, params); + if (res) { + while (res->next()) { + // 澶勭悊缁撴灉 + std::cout << res->getString(1) << std::endl; + } + delete res; + } + } else { + std::cerr << "娼滃湪鐨凷QL娉ㄥ叆椋庨櫓" << std::endl; + } + delete con; + } + return 0; +} \ No newline at end of file diff --git "a/Server/\351\251\254\344\270\275\350\220\215/code/log/.vscode/c_cpp_properties.json" "b/Server/\351\251\254\344\270\275\350\220\215/code/log/.vscode/c_cpp_properties.json" new file mode 100644 index 0000000..cea4d3f --- /dev/null +++ "b/Server/\351\251\254\344\270\275\350\220\215/code/log/.vscode/c_cpp_properties.json" @@ -0,0 +1,18 @@ +{ + "configurations": [ + { + "name": "windows-gcc-x64", + "includePath": [ + "${workspaceFolder}/**" + ], + "compilerPath": "gcc", + "cStandard": "${default}", + "cppStandard": "${default}", + "intelliSenseMode": "windows-gcc-x64", + "compilerArgs": [ + "" + ] + } + ], + "version": 4 +} \ No newline at end of file diff --git "a/Server/\351\251\254\344\270\275\350\220\215/code/log/.vscode/launch.json" "b/Server/\351\251\254\344\270\275\350\220\215/code/log/.vscode/launch.json" new file mode 100644 index 0000000..6d3cc50 --- /dev/null +++ "b/Server/\351\251\254\344\270\275\350\220\215/code/log/.vscode/launch.json" @@ -0,0 +1,24 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "C/C++ Runner: Debug Session", + "type": "cppdbg", + "request": "launch", + "args": [], + "stopAtEntry": false, + "externalConsole": true, + "cwd": "d:/git_1026/鏄嗕粦_1025/Server/椹附钀�/code/log", + "program": "d:/git_1026/鏄嗕粦_1025/Server/椹附钀�/code/log/build/Debug/outDebug", + "MIMode": "gdb", + "miDebuggerPath": "gdb", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ] + } + ] +} \ No newline at end of file diff --git "a/Server/\351\251\254\344\270\275\350\220\215/code/log/.vscode/settings.json" "b/Server/\351\251\254\344\270\275\350\220\215/code/log/.vscode/settings.json" new file mode 100644 index 0000000..bb879da --- /dev/null +++ "b/Server/\351\251\254\344\270\275\350\220\215/code/log/.vscode/settings.json" @@ -0,0 +1,59 @@ +{ + "C_Cpp_Runner.cCompilerPath": "gcc", + "C_Cpp_Runner.cppCompilerPath": "g++", + "C_Cpp_Runner.debuggerPath": "gdb", + "C_Cpp_Runner.cStandard": "", + "C_Cpp_Runner.cppStandard": "", + "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/VR_NR/Community/VC/Auxiliary/Build/vcvarsall.bat", + "C_Cpp_Runner.useMsvc": false, + "C_Cpp_Runner.warnings": [ + "-Wall", + "-Wextra", + "-Wpedantic", + "-Wshadow", + "-Wformat=2", + "-Wcast-align", + "-Wconversion", + "-Wsign-conversion", + "-Wnull-dereference" + ], + "C_Cpp_Runner.msvcWarnings": [ + "/W4", + "/permissive-", + "/w14242", + "/w14287", + "/w14296", + "/w14311", + "/w14826", + "/w44062", + "/w44242", + "/w14905", + "/w14906", + "/w14263", + "/w44265", + "/w14928" + ], + "C_Cpp_Runner.enableWarnings": true, + "C_Cpp_Runner.warningsAsError": false, + "C_Cpp_Runner.compilerArgs": [], + "C_Cpp_Runner.linkerArgs": [], + "C_Cpp_Runner.includePaths": [], + "C_Cpp_Runner.includeSearch": [ + "*", + "**/*" + ], + "C_Cpp_Runner.excludeSearch": [ + "**/build", + "**/build/**", + "**/.*", + "**/.*/**", + "**/.vscode", + "**/.vscode/**" + ], + "C_Cpp_Runner.useAddressSanitizer": false, + "C_Cpp_Runner.useUndefinedSanitizer": false, + "C_Cpp_Runner.useLeakSanitizer": false, + "C_Cpp_Runner.showCompilationTime": false, + "C_Cpp_Runner.useLinkTimeOptimization": false, + "C_Cpp_Runner.msvcSecureNoWarnings": false +} \ No newline at end of file diff --git "a/Server/\351\251\254\344\270\275\350\220\215/code/log/README.md" "b/Server/\351\251\254\344\270\275\350\220\215/code/log/README.md" new file mode 100644 index 0000000..d6dec71 --- /dev/null +++ "b/Server/\351\251\254\344\270\275\350\220\215/code/log/README.md" @@ -0,0 +1,9 @@ + +鍚屾/寮傛鏃ュ織绯荤粺 +=============== +鍚屾/寮傛鏃ュ織绯荤粺涓昏娑夊強浜嗕袱涓ā鍧楋紝涓�涓槸鏃ュ織妯″潡锛屼竴涓槸闃诲闃熷垪妯″潡,鍏朵腑鍔犲叆闃诲闃熷垪妯″潡涓昏鏄В鍐冲紓姝ュ啓鍏ユ棩蹇楀仛鍑嗗. +> * 鑷畾涔夐樆濉為槦鍒� +> * 鍗曚緥妯″紡鍒涘缓鏃ュ織 +> * 鍚屾鏃ュ織 +> * 寮傛鏃ュ織 +> * 瀹炵幇鎸夊ぉ銆佽秴琛屽垎绫� diff --git "a/Server/\351\251\254\344\270\275\350\220\215/code/log/block_queue.h" "b/Server/\351\251\254\344\270\275\350\220\215/code/log/block_queue.h" new file mode 100644 index 0000000..34c77bd --- /dev/null +++ "b/Server/\351\251\254\344\270\275\350\220\215/code/log/block_queue.h" @@ -0,0 +1,212 @@ +/************************************************************* +*寰幆鏁扮粍瀹炵幇鐨勯樆濉為槦鍒楋紝m_back = (m_back + 1) % m_max_size; +*绾跨▼瀹夊叏锛屾瘡涓搷浣滃墠閮借鍏堝姞浜掓枼閿侊紝鎿嶄綔瀹屽悗锛屽啀瑙i攣 +**************************************************************/ + +#ifndef BLOCK_QUEUE_H +#define BLOCK_QUEUE_H + +#include <iostream> +#include <stdlib.h> +#include <pthread.h> +#include <sys/time.h> +#include "../lock/locker.h" +using namespace std; + +template <class T> +class block_queue +{ +public: + block_queue(int max_size = 1000) + { + if (max_size <= 0) + { + exit(-1); + } + + m_max_size = max_size; + m_array = new T[max_size]; + m_size = 0; + m_front = -1; + m_back = -1; + } + + void clear() + { + m_mutex.lock(); + m_size = 0; + m_front = -1; + m_back = -1; + m_mutex.unlock(); + } + + ~block_queue() + { + m_mutex.lock(); + if (m_array != NULL) + delete [] m_array; + + m_mutex.unlock(); + } + //鍒ゆ柇闃熷垪鏄惁婊′簡 + bool full() + { + m_mutex.lock(); + if (m_size >= m_max_size) + { + + m_mutex.unlock(); + return true; + } + m_mutex.unlock(); + return false; + } + //鍒ゆ柇闃熷垪鏄惁涓虹┖ + bool empty() + { + m_mutex.lock(); + if (0 == m_size) + { + m_mutex.unlock(); + return true; + } + m_mutex.unlock(); + return false; + } + //杩斿洖闃熼鍏冪礌 + bool front(T &value) + { + m_mutex.lock(); + if (0 == m_size) + { + m_mutex.unlock(); + return false; + } + value = m_array[m_front]; + m_mutex.unlock(); + return true; + } + //杩斿洖闃熷熬鍏冪礌 + bool back(T &value) + { + m_mutex.lock(); + if (0 == m_size) + { + m_mutex.unlock(); + return false; + } + value = m_array[m_back]; + m_mutex.unlock(); + return true; + } + + int size() + { + int tmp = 0; + + m_mutex.lock(); + tmp = m_size; + + m_mutex.unlock(); + return tmp; + } + + int max_size() + { + int tmp = 0; + + m_mutex.lock(); + tmp = m_max_size; + + m_mutex.unlock(); + return tmp; + } + //寰�闃熷垪娣诲姞鍏冪礌锛岄渶瑕佸皢鎵�鏈変娇鐢ㄩ槦鍒楃殑绾跨▼鍏堝敜閱� + //褰撴湁鍏冪礌push杩涢槦鍒�,鐩稿綋浜庣敓浜ц�呯敓浜т簡涓�涓厓绱� + //鑻ュ綋鍓嶆病鏈夌嚎绋嬬瓑寰呮潯浠跺彉閲�,鍒欏敜閱掓棤鎰忎箟 + bool push(const T &item) + { + + m_mutex.lock(); + if (m_size >= m_max_size) + { + + m_cond.broadcast(); + m_mutex.unlock(); + return false; + } + + m_back = (m_back + 1) % m_max_size; + m_array[m_back] = item; + + m_size++; + + m_cond.broadcast(); + m_mutex.unlock(); + return true; + } + //pop鏃�,濡傛灉褰撳墠闃熷垪娌℃湁鍏冪礌,灏嗕細绛夊緟鏉′欢鍙橀噺 + bool pop(T &item) + { + + m_mutex.lock(); + while (m_size <= 0) + { + + if (!m_cond.wait(m_mutex.get())) + { + m_mutex.unlock(); + return false; + } + } + + m_front = (m_front + 1) % m_max_size; + item = m_array[m_front]; + m_size--; + m_mutex.unlock(); + return true; + } + + //澧炲姞浜嗚秴鏃跺鐞� + bool pop(T &item, int ms_timeout) + { + struct timespec t = {0, 0}; + struct timeval now = {0, 0}; + gettimeofday(&now, NULL); + m_mutex.lock(); + if (m_size <= 0) + { + t.tv_sec = now.tv_sec + ms_timeout / 1000; + t.tv_nsec = (ms_timeout % 1000) * 1000; + if (!m_cond.timewait(m_mutex.get(), t)) + { + m_mutex.unlock(); + return false; + } + } + + if (m_size <= 0) + { + m_mutex.unlock(); + return false; + } + + m_front = (m_front + 1) % m_max_size; + item = m_array[m_front]; + m_size--; + m_mutex.unlock(); + return true; + } + +private: + locker m_mutex; + cond m_cond; + + T *m_array; + int m_size; + int m_max_size; + int m_front; + int m_back; +}; + +#endif diff --git "a/Server/\351\251\254\344\270\275\350\220\215/code/log/log.cpp" "b/Server/\351\251\254\344\270\275\350\220\215/code/log/log.cpp" new file mode 100644 index 0000000..411f8eb --- /dev/null +++ "b/Server/\351\251\254\344\270\275\350\220\215/code/log/log.cpp" @@ -0,0 +1,164 @@ +#include <string.h> +#include <time.h> +#include <sys/time.h> +#include <stdarg.h> +#include "log.h" +#include <pthread.h> +using namespace std; + +Log::Log() +{ + m_count = 0; + m_is_async = false; +} + +Log::~Log() +{ + if (m_fp != NULL) + { + fclose(m_fp); + } +} +//寮傛闇�瑕佽缃樆濉為槦鍒楃殑闀垮害锛屽悓姝ヤ笉闇�瑕佽缃� +bool Log::init(const char *file_name, int close_log, int log_buf_size, int split_lines, int max_queue_size) +{ + //濡傛灉璁剧疆浜唌ax_queue_size,鍒欒缃负寮傛 + if (max_queue_size >= 1) + { + m_is_async = true; + m_log_queue = new block_queue<string>(max_queue_size); + pthread_t tid; + //flush_log_thread涓哄洖璋冨嚱鏁�,杩欓噷琛ㄧず鍒涘缓绾跨▼寮傛鍐欐棩蹇� + pthread_create(&tid, NULL, flush_log_thread, NULL); + } + + m_close_log = close_log; + m_log_buf_size = log_buf_size; + m_buf = new char[m_log_buf_size]; + memset(m_buf, '\0', m_log_buf_size); + m_split_lines = split_lines; + + time_t t = time(NULL); + struct tm *sys_tm = localtime(&t); + struct tm my_tm = *sys_tm; + + + const char *p = strrchr(file_name, '/'); + char log_full_name[256] = {0}; + + if (p == NULL) + { + snprintf(log_full_name, 255, "%d_%02d_%02d_%s", my_tm.tm_year + 1900, my_tm.tm_mon + 1, my_tm.tm_mday, file_name); + } + else + { + strcpy(log_name, p + 1); + strncpy(dir_name, file_name, p - file_name + 1); + snprintf(log_full_name, 255, "%s%d_%02d_%02d_%s", dir_name, my_tm.tm_year + 1900, my_tm.tm_mon + 1, my_tm.tm_mday, log_name); + } + + m_today = my_tm.tm_mday; + + m_fp = fopen(log_full_name, "a"); + if (m_fp == NULL) + { + return false; + } + + return true; +} + +void Log::write_log(int level, const char *format, ...) +{ + struct timeval now = {0, 0}; + gettimeofday(&now, NULL); + time_t t = now.tv_sec; + struct tm *sys_tm = localtime(&t); + struct tm my_tm = *sys_tm; + char s[16] = {0}; + switch (level) + { + case 0: + strcpy(s, "[debug]:"); + break; + case 1: + strcpy(s, "[info]:"); + break; + case 2: + strcpy(s, "[warn]:"); + break; + case 3: + strcpy(s, "[erro]:"); + break; + default: + strcpy(s, "[info]:"); + break; + } + //鍐欏叆涓�涓猯og锛屽m_count++, m_split_lines鏈�澶ц鏁� + m_mutex.lock(); + m_count++; + + if (m_today != my_tm.tm_mday || m_count % m_split_lines == 0) //everyday log + { + + char new_log[256] = {0}; + fflush(m_fp); + fclose(m_fp); + char tail[16] = {0}; + + snprintf(tail, 16, "%d_%02d_%02d_", my_tm.tm_year + 1900, my_tm.tm_mon + 1, my_tm.tm_mday); + + if (m_today != my_tm.tm_mday) + { + snprintf(new_log, 255, "%s%s%s", dir_name, tail, log_name); + m_today = my_tm.tm_mday; + m_count = 0; + } + else + { + snprintf(new_log, 255, "%s%s%s.%lld", dir_name, tail, log_name, m_count / m_split_lines); + } + m_fp = fopen(new_log, "a"); + } + + m_mutex.unlock(); + + va_list valst; + va_start(valst, format); + + string log_str; + m_mutex.lock(); + + //鍐欏叆鐨勫叿浣撴椂闂村唴瀹规牸寮� + int n = snprintf(m_buf, 48, "%d-%02d-%02d %02d:%02d:%02d.%06ld %s ", + my_tm.tm_year + 1900, my_tm.tm_mon + 1, my_tm.tm_mday, + my_tm.tm_hour, my_tm.tm_min, my_tm.tm_sec, now.tv_usec, s); + + int m = vsnprintf(m_buf + n, m_log_buf_size - n - 1, format, valst); + m_buf[n + m] = '\n'; + m_buf[n + m + 1] = '\0'; + log_str = m_buf; + + m_mutex.unlock(); + + if (m_is_async && !m_log_queue->full()) + { + m_log_queue->push(log_str); + } + else + { + m_mutex.lock(); + fputs(log_str.c_str(), m_fp); + m_mutex.unlock(); + } + + va_end(valst); +} + +void Log::flush(void) +{ + m_mutex.lock(); + //寮哄埗鍒锋柊鍐欏叆娴佺紦鍐插尯 + fflush(m_fp); + m_mutex.unlock(); +} diff --git "a/Server/\351\251\254\344\270\275\350\220\215/code/log/log.h" "b/Server/\351\251\254\344\270\275\350\220\215/code/log/log.h" new file mode 100644 index 0000000..64972af --- /dev/null +++ "b/Server/\351\251\254\344\270\275\350\220\215/code/log/log.h" @@ -0,0 +1,69 @@ +#ifndef LOG_H +#define LOG_H + +#include <stdio.h> +#include <iostream> +#include <string> +#include <stdarg.h> +#include <pthread.h> +#include "block_queue.h" + +using namespace std; + +class Log +{ +public: + //C++11浠ュ悗,浣跨敤灞�閮ㄥ彉閲忔噿姹変笉鐢ㄥ姞閿� + static Log *get_instance() + { + static Log instance; + return &instance; + } + + static void *flush_log_thread(void *args) + { + Log::get_instance()->async_write_log(); + } + //鍙�夋嫨鐨勫弬鏁版湁鏃ュ織鏂囦欢銆佹棩蹇楃紦鍐插尯澶у皬銆佹渶澶ц鏁颁互鍙婃渶闀挎棩蹇楁潯闃熷垪 + bool init(const char *file_name, int close_log, int log_buf_size = 8192, int split_lines = 5000000, int max_queue_size = 0); + + void write_log(int level, const char *format, ...); + + void flush(void); + +private: + Log(); + virtual ~Log(); + void *async_write_log() + { + string single_log; + //浠庨樆濉為槦鍒椾腑鍙栧嚭涓�涓棩蹇梥tring锛屽啓鍏ユ枃浠� + while (m_log_queue->pop(single_log)) + { + m_mutex.lock(); + fputs(single_log.c_str(), m_fp); + m_mutex.unlock(); + } + } + +private: + char dir_name[128]; //璺緞鍚� + char log_name[128]; //log鏂囦欢鍚� + int m_split_lines; //鏃ュ織鏈�澶ц鏁� + int m_log_buf_size; //鏃ュ織缂撳啿鍖哄ぇ灏� + long long m_count; //鏃ュ織琛屾暟璁板綍 + int m_today; //鍥犱负鎸夊ぉ鍒嗙被,璁板綍褰撳墠鏃堕棿鏄偅涓�澶� + FILE *m_fp; //鎵撳紑log鐨勬枃浠舵寚閽� + char *m_buf; + block_queue<string> *m_log_queue; //闃诲闃熷垪 + bool m_is_async; //鏄惁鍚屾鏍囧織浣� + locker m_mutex; + int m_close_log; //鍏抽棴鏃ュ織 +}; + +#define LOG_DEBUG(format, ...) if(0 == m_close_log) {Log::get_instance()->write_log(0, format, ##__VA_ARGS__); Log::get_instance()->flush();} +#define LOG_INFO(format, ...) if(0 == m_close_log) {Log::get_instance()->write_log(1, format, ##__VA_ARGS__); Log::get_instance()->flush();} +#define LOG_WARN(format, ...) if(0 == m_close_log) {Log::get_instance()->write_log(2, format, ##__VA_ARGS__); Log::get_instance()->flush();} +#define LOG_ERROR(format, ...) if(0 == m_close_log) {Log::get_instance()->write_log(3, format, ##__VA_ARGS__); Log::get_instance()->flush();} + +#endif diff --git "a/Server/\351\251\254\344\270\275\350\220\215/document/\346\227\245\345\277\227\351\234\200\346\261\202\345\210\206\346\236\220\346\226\207\346\241\243.docx" "b/Server/\351\251\254\344\270\275\350\220\215/document/\346\227\245\345\277\227\351\234\200\346\261\202\345\210\206\346\236\220\346\226\207\346\241\243.docx" index e465412..13a9cda 100644 --- "a/Server/\351\251\254\344\270\275\350\220\215/document/\346\227\245\345\277\227\351\234\200\346\261\202\345\210\206\346\236\220\346\226\207\346\241\243.docx" +++ "b/Server/\351\251\254\344\270\275\350\220\215/document/\346\227\245\345\277\227\351\234\200\346\261\202\345\210\206\346\236\220\346\226\207\346\241\243.docx" Binary files differ diff --git "a/Server/\351\251\254\346\270\235\346\235\255/document/\347\211\210\346\234\254\346\233\264\346\226\260\345\212\237\350\203\275\351\234\200\346\261\202_server.docx" "b/Server/\351\251\254\346\270\235\346\235\255/document/\347\211\210\346\234\254\346\233\264\346\226\260\345\212\237\350\203\275\351\234\200\346\261\202_server.docx" index 3a6b58b..a9b7748 100644 --- "a/Server/\351\251\254\346\270\235\346\235\255/document/\347\211\210\346\234\254\346\233\264\346\226\260\345\212\237\350\203\275\351\234\200\346\261\202_server.docx" +++ "b/Server/\351\251\254\346\270\235\346\235\255/document/\347\211\210\346\234\254\346\233\264\346\226\260\345\212\237\350\203\275\351\234\200\346\261\202_server.docx" Binary files differ diff --git "a/\345\217\202\350\200\203\346\226\207\346\241\243/\351\234\200\346\261\202\345\210\206\346\236\220\346\250\241\346\235\277/~$\346\261\202\345\212\237\350\203\275\350\247\204\346\240\274\350\257\264\346\230\216\344\271\246_2.docx" "b/\345\217\202\350\200\203\346\226\207\346\241\243/\351\234\200\346\261\202\345\210\206\346\236\220\346\250\241\346\235\277/~$\346\261\202\345\212\237\350\203\275\350\247\204\346\240\274\350\257\264\346\230\216\344\271\246_2.docx" deleted file mode 100644 index 91ee577..0000000 --- "a/\345\217\202\350\200\203\346\226\207\346\241\243/\351\234\200\346\261\202\345\210\206\346\236\220\346\250\241\346\235\277/~$\346\261\202\345\212\237\350\203\275\350\247\204\346\240\274\350\257\264\346\230\216\344\271\246_2.docx" +++ /dev/null Binary files differ diff --git "a/\346\227\245\345\277\227\351\234\200\346\261\202\345\210\206\346\236\220\346\226\207\346\241\243.docx" "b/\346\227\245\345\277\227\351\234\200\346\261\202\345\210\206\346\236\220\346\226\207\346\241\243.docx" deleted file mode 100644 index e465412..0000000 --- "a/\346\227\245\345\277\227\351\234\200\346\261\202\345\210\206\346\236\220\346\226\207\346\241\243.docx" +++ /dev/null Binary files differ -- Gitblit v1.8.0