Przeglądaj źródła

V1.4
1、修改了spdlog和webapi库的链接方式,可以使用spdlog::spdlog的方式添加库了

Apple 2 tygodni temu
rodzic
commit
44b1b143fe

+ 43 - 19
Libraries/LHHTTPAPI/FindLHHTTPAPI.cmake

@@ -10,29 +10,17 @@ find_path(INCLUDE_DIR
     PATHS ${CMAKE_CURRENT_LIST_DIR}/src
     NO_DEFAULT_PATH
 )
-
+unset(LHHTTPAPI_INCLUDE_DIRS CACHE)
 list(APPEND LHHTTPAPI_INCLUDE_DIRS ${INCLUDE_DIR})
-list(APPEND LHHTTPAPI_SOURCE_DIRS ${INCLUDE_DIR})
-
-
-#查找源文件
-# unset(SOURCE_DIR CACHE)
-# find_path(SOURCE_DIR 
-#     NAMES lhhttpapi.cpp
-#     PATHS ${CMAKE_CURRENT_LIST_DIR}/src
-#     NO_DEFAULT_PATH
-# )
 
-# list(APPEND LHHTTPAPI_SOURCE_DIRS ${SOURCE_DIR})
 
-# unset(SOURCE_DIR CACHE)
-# find_path(SOURCE_DIR 
-#     NAMES threadcontroller.cpp
-#     PATHS ${CMAKE_CURRENT_LIST_DIR}/../../common/Thread
-#     NO_DEFAULT_PATH
-# )
+#添加源文件
+unset(LHHTTPAPI_SOURCE_DIRS CACHE)
+list(APPEND LHHTTPAPI_SOURCE_DIRS 
+    ${INCLUDE_DIR}/lhhttpapi.cpp
+    ${INCLUDE_DIR}/WebAPIBase.cpp
+)
 
-# list(APPEND LHHTTPAPI_SOURCE_DIRS ${SOURCE_DIR})
 
 # 查找库文件,在这里区分平台,Debug和Release,32位和64位
 # 这里没有使用这个文件夹内的curl库,而是使用了外部的curl库
@@ -88,3 +76,39 @@ message(STATUS "LHHTTPAPI Found : ${LHHTTPAPI_FOUND}")
 message(STATUS "LHHTTPAPI Version : ${LHHTTPAPI_VERSION}")
 message(STATUS "--------------------------------------------------")
 
+
+#导入目标
+if(LHHTTPAPI_FOUND)
+    if(NOT TARGET lhhttpapi::lhhttpapi)
+        add_library(lhhttpapi::lhhttpapi UNKNOWN IMPORTED)
+        #添加头文件
+        set_target_properties(lhhttpapi::lhhttpapi PROPERTIES
+            INTERFACE_INCLUDE_DIRECTORIES "${LHHTTPAPI_INCLUDE_DIRS}")
+
+        #添加库文件
+        # if(ENABLE_SPDLOG_STATIC_LIB)
+        #     set_target_properties(${_lib_name} PROPERTIES
+        #         IMPORTED_LOCATION "${spdlog_STATIC_LIBRARY}")
+        #     #添加spdlog需要的依赖库
+        #     set_target_properties(${_lib_name} PROPERTIES
+        #         INTERFACE_LINK_LIBRARIES "pthread")
+        # else()
+        #     set_target_properties(${_lib_name} PROPERTIES
+        #         IMPORTED_LOCATION "${spdlog_LIBRARY}")
+        #     set_target_properties(${_lib_name} PROPERTIES
+        #         INTERFACE_LINK_LIBRARIES "pthread")
+        # endif()
+
+        #添加源文件
+        set_target_properties(lhhttpapi::lhhttpapi PROPERTIES
+           INTERFACE_SOURCES "${LHHTTPAPI_SOURCE_DIRS}")
+    endif()
+endif()
+
+# 标记这些变量为高级变量
+mark_as_advanced(
+    LHHTTPAPI_INCLUDE_DIRS 
+    LHHTTPAPI_SOURCE_DIRS 
+)
+
+

+ 144 - 0
Libraries/LHHTTPAPI/src/WebAPIBase.cpp

@@ -0,0 +1,144 @@
+#include "WebAPIBase.h"
+
+#include "spdlog/spdlog.h"
+
+
+WebAPIBase::~WebAPIBase()
+{
+    if(m_httpApi != nullptr)
+    {
+        delete m_httpApi;
+        m_httpApi = nullptr;
+    }
+}
+
+
+/* 初始化WebApi */
+bool WebAPIBase::initWebApi(const QString& url,const QString& serID, const QString appType, const QString& serverIP)
+{
+    if(m_httpApi == nullptr)
+    {
+        m_httpApi = new lhhttpapi;
+    }
+    
+    if(!m_httpApi->Load())
+    {
+        SPDLOG_ERROR("Load WebAPI failed");
+        return false;
+    }
+    SPDLOG_DEBUG("URL: {}", url.toStdString());
+    SPDLOG_DEBUG("ServerID: {}", serID.toStdString());
+    SPDLOG_DEBUG("ServerKey: {}", appType.toStdString());
+
+    void* pHttp = nullptr;
+    int i = 0;
+    for(i = 0; i < 3; i++)
+    {
+        pHttp = m_httpApi->DBInit(url.toStdString().c_str(), true);
+        if(pHttp != nullptr)
+        {
+            break;
+        }
+        SPDLOG_ERROR("设置WebAPI地址失败: {}", m_httpApi->DoGetLastError(&i).toStdString());
+    }
+    if(i >= 3)
+    {
+        SPDLOG_ERROR("WebAPI设置地址错误!");
+        return false;
+    }
+    
+    int ret = 0;
+
+#ifdef QT_DEBUG
+    /* 获取服务器列表 */
+    // char serverList[8192]={0};
+    // ret = m_httpApi->DBGetServerList(serverList, 8192-1);
+    // if(ret != 0)
+    // {
+    //     SPDLOG_LOGGER_ERROR(m_logger, "Get server list failed: {}, error info: {}", ret, m_httpApi->DoGetLastError(&ret).toStdString());
+    //     return false;
+    // }
+    // SPDLOG_LOGGER_INFO(m_logger, QString("\nGet server list success:%1").arg(serverList));
+#endif
+
+    /* 登录,第二个参数是限制的服务 */
+    for(i = 0; i < 3; i++)
+    {
+        ret = m_httpApi->DBLogin("", serID, appType, m_userToken, true, pHttp);
+        if(ret == 0)
+        {
+            break;
+        }
+        SPDLOG_ERROR("Login failed: {}, error info: {}", ret, m_httpApi->DoGetLastError(&ret).toStdString());
+        /* 登录失败,等待一段时间 */
+        QThread::msleep(200);
+    }
+    if(i >= 3)
+    {
+        SPDLOG_ERROR("登陆WebAPI失败!");
+        return false;
+    }
+
+    SPDLOG_INFO("WebAPI Login success!");
+
+    return true;
+}
+
+
+/**
+ * @brief 将json的key转换成小写,这种转换不会转值中嵌套的json
+ * 
+ * @param json 
+ * @param result 
+ * @return true 
+ * @return false 
+ */
+bool WebAPIBase::convertJsonKeyToLower(const nJson& json, nJson& result)
+{
+    for(auto& it : json.items())
+    {
+        std::string key = it.key();
+        std::transform(key.begin(), key.end(), key.begin(), ::tolower); // 转换成小写
+        /* 是object */
+        if(it.value().is_object())
+        {
+            convertJsonKeyToLower(it.value(), result[key]); // 递归处理嵌套的对象
+        }
+        /* 是array */
+        else if(it.value().is_array())
+        {
+            nJson arrayResult = nJson::array();
+            for(auto& item : it.value())
+            {
+                if(item.is_object())
+                {
+                    /* 如果是对象,递归转换 */
+                    nJson itemJson = nJson::object();
+                    convertJsonKeyToLower(item, itemJson);
+                    /* 将转换后的对象添加到数组中 */
+                    arrayResult.push_back(itemJson);
+                }
+                else
+                {
+                    arrayResult.push_back(item);
+                }
+            }
+            result[key] = arrayResult;
+        }
+        else
+        {
+            /* 直接赋值非对象和非数组类型 */
+            result[key] = it.value(); 
+        }
+    }
+
+    return true;
+}
+
+/* 打印webapi返回的错误信息 */
+void WebAPIBase::printWebApiError(int ret, const QString& errorMsg)
+{
+    SPDLOG_ERROR("WebAPI Error: {}, Error Message: {}", ret, nJson::parse(errorMsg.toStdString()).dump(4));
+}
+
+

+ 29 - 0
Libraries/LHHTTPAPI/src/WebAPIBase.h

@@ -0,0 +1,29 @@
+#ifndef _WEBAPIBASE_H_
+#define _WEBAPIBASE_H_
+
+#include "lhhttpapi.h"
+#include "commonDefine.h"
+
+class WebAPIBase
+{
+public:
+    WebAPIBase() = default;
+    virtual ~WebAPIBase();
+
+    /* 初始化WebAPI */
+    virtual bool initWebApi(const QString& url, const QString& serID, const QString appType, const QString& serverIP = "");
+
+protected:
+    /* 将json的key转换成小写 */
+    bool convertJsonKeyToLower(const nJson& json, nJson& result);
+    /* 打印webapi返回的错误信息 */
+    void printWebApiError(int ret, const QString& errorMsg);
+
+protected:
+    lhhttpapi* m_httpApi = nullptr;
+    QString m_userToken;
+
+};
+
+
+#endif /* _WEBAPIBASE_H_ */

+ 46 - 10
Libraries/spdlog/Findspdlog.cmake

@@ -45,7 +45,11 @@ list(APPEND spdlog_INCLUDE_DIR ${SPDLOG_INC_DIR})
 list(APPEND spdlog_INCLUDE_DIR ${SPDLOG_INC_DIR}/spdlog)
 #包含fmt头文件,使用fmt的时候包含fmt/bundled/format.h这样的完整目录
 list(APPEND spdlog_INCLUDE_DIR ${SPDLOG_INC_DIR}/spdlog/fmt)
+list(APPEND spdlog_INCLUDE_DIR ${CMAKE_CURRENT_LIST_DIR}/Logs)
 
+#添加源文件
+unset(spdlog_SOURCES CACHE)
+set(spdlog_SOURCES ${CMAKE_CURRENT_LIST_DIR}/Logs/loginit.cpp)
 
 
 unset(spdlog_LIBRARY CACHE)
@@ -116,7 +120,7 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
     else()
         list(APPEND spdlog_LIBRARY ${SPDLOG_LIB_DIR}/libspdlog.so)
     endif()
-    list(APPEND spdlog_LIBRARY pthread)
+    # list(APPEND spdlog_LIBRARY pthread)
     if(ENABLE_SPDLOG_STATIC_LIB)
         if(CMAKE_BUILD_TYPE MATCHES "Debug")
             list(APPEND spdlog_STATIC_LIBRARY ${SPDLOG_LIB_DIR}/libspdlogd.a)
@@ -124,7 +128,7 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Linux")
             list(APPEND spdlog_STATIC_LIBRARY ${SPDLOG_LIB_DIR}/libspdlog.a)
         endif()
         #这里需要显式的链接依赖库,或者使用target_link_options(appname PRIVATE "-Wl,--copy-dt-needed-entries")来让gcc递归搜索依赖库
-        list(APPEND spdlog_STATIC_LIBRARY pthread)
+        # list(APPEND spdlog_STATIC_LIBRARY pthread)
     endif()
 #MacOS版本
 elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
@@ -137,15 +141,8 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
 
 endif()
 
-#设置查找到后的变量
-# if(ENABLE_SPDLOG_STATIC_LIB)
-#     set(spdlog_LIBRARY ${spdlog_STATIC_LIBRARY})
-# endif()
-
-# message(STATUS "spdlog_INCLUDE_DIR: ${spdlog_INCLUDE_DIR}")
-# message(STATUS "spdlog_LIBRARY: ${spdlog_LIBRARY}")
-# message(STATUS "spdlog_STATIC_LIBRARY: ${spdlog_STATIC_LIBRARY}")
 
+#检查是否找到库
 if(spdlog_INCLUDE_DIR AND (spdlog_LIBRARY OR spdlog_STATIC_LIBRARY))
     set(spdlog_FOUND TRUE)
     set(spdlog_VERSION ${SPDLOG_V})
@@ -158,6 +155,9 @@ if(spdlog_INCLUDE_DIR AND (spdlog_LIBRARY OR spdlog_STATIC_LIBRARY))
     if(ENABLE_SPDLOG_STATIC_LIB)
         message(STATUS "Static Library : spdlog_STATIC_LIBRARY")
     endif()
+
+    
+
 else()
     set(spdlog_FOUND FALSE)
 endif()
@@ -165,3 +165,39 @@ endif()
 message(STATUS "spdlog FOUND: ${spdlog_FOUND}")
 message(STATUS "spdlog Version: ${spdlog_VERSION}")
 message(STATUS "--------------------------------------------------")
+
+
+#导入目标
+if(spdlog_FOUND)
+    if(NOT TARGET spdlog::spdlog)
+        add_library(spdlog::spdlog UNKNOWN IMPORTED)
+        #添加头文件
+        set_target_properties(spdlog::spdlog PROPERTIES
+            INTERFACE_INCLUDE_DIRECTORIES "${spdlog_INCLUDE_DIR}")
+
+        #添加库文件
+        if(ENABLE_SPDLOG_STATIC_LIB)
+            set_target_properties(spdlog::spdlog PROPERTIES
+                IMPORTED_LOCATION "${spdlog_STATIC_LIBRARY}")
+            #添加spdlog需要的依赖库
+            set_target_properties(spdlog::spdlog PROPERTIES
+                INTERFACE_LINK_LIBRARIES "pthread")
+        else()
+            set_target_properties(spdlog::spdlog PROPERTIES
+                IMPORTED_LOCATION "${spdlog_LIBRARY}")
+            set_target_properties(spdlog::spdlog PROPERTIES
+                INTERFACE_LINK_LIBRARIES "pthread")
+        endif()
+
+        #添加源文件
+        set_target_properties(spdlog::spdlog PROPERTIES
+           INTERFACE_SOURCES "${spdlog_SOURCES}")
+    endif()
+endif()
+
+# 标记这些变量为高级变量
+mark_as_advanced(
+    spdlog_INCLUDE_DIR 
+    spdlog_LIBRARY 
+    spdlog_STATIC_LIBRARY
+)

+ 69 - 0
Libraries/spdlog/Logs/loginit.cpp

@@ -0,0 +1,69 @@
+#include "loginit.h"
+
+#include "spdlog/spdlog.h"
+#include "spdlog/sinks/stdout_color_sinks.h"
+#include "spdlog/sinks/daily_file_sink.h"
+
+// #include "fmt/base.h"
+
+/* 初始化spdlog */
+void init_log()
+{
+    try 
+    {
+        /* 给默认记录器用的sink */
+        auto sink_default = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
+        /* 创建一个控制台sink */
+        auto sink_consolse = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
+        /* 创建一个文件sink,每天一个,00:00创建新的 */
+        auto sink_file = std::make_shared<spdlog::sinks::daily_file_sink_mt>("log/log.txt", 0, 0);
+        /* 修改输出格式 */
+        #if C_DEBUG
+            sink_default->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%s %#] %v %$");
+            sink_consolse->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n] [%s %#] %v%$");
+            sink_file->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n] [%s %#] %v %$");
+        #elif C_RELEASE
+            sink_default->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] %v %$");
+            sink_consolse->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n] %v %$");
+            sink_file->set_pattern("%^[%Y-%m-%d %H:%M:%S:%e] [%l] [%n] %v %$");
+        #endif
+
+        /* 设置默认日志记录器,设置成自定义的sink */
+        spdlog::default_logger()->sinks().clear();
+        spdlog::default_logger()->sinks().push_back(sink_default);
+        spdlog::default_logger()->sinks().push_back(sink_file);
+        /* 创建sink数组 */
+        std::vector<spdlog::sink_ptr> sinks;
+        sinks.push_back(sink_consolse);
+        sinks.push_back(sink_file);
+
+        /* 创建一个标准输出 */
+        auto logger_main = std::make_shared<spdlog::logger>("main",begin(sinks),end(sinks));
+        /* 创建一个MQTT输出Logger */
+        auto logger_MQTT = std::make_shared<spdlog::logger>("MQTT",begin(sinks),end(sinks));
+        /* 创建一个线程池输出Logger */
+        auto logger_threadPool = std::make_shared<spdlog::logger>("ThreadPool",begin(sinks),end(sinks));
+
+        /* 注册到注册表 */
+        spdlog::register_logger(logger_main);
+        spdlog::register_logger(logger_MQTT);
+        spdlog::register_logger(logger_threadPool);
+
+
+        /* 设置spdlog输出级别,默认的估计不输出debug这个级别 */
+#ifdef C_DEBUG
+        spdlog::set_level(spdlog::level::trace);
+        spdlog::flush_on(spdlog::level::trace);
+#elif C_RELEASE
+        spdlog::set_level(spdlog::level::info);
+        spdlog::flush_on(spdlog::level::info);
+#endif
+
+
+
+    //    SPDLOG_LOGGER_DEBUG(logger_main,"******* 有行号且debug也能输出 *******");
+    }  catch (const spdlog::spdlog_ex& ex) {
+        fmt::print("Log initialization failed: %s\n", ex.what());
+    }
+}
+

+ 8 - 0
Libraries/spdlog/Logs/loginit.h

@@ -0,0 +1,8 @@
+
+
+#ifndef LOGINIT_H
+#define LOGINIT_H
+
+void init_log();
+
+#endif /* LOGINIT_H */