diff --git a/uft_dev_server/CMakeLists.txt b/uft_dev_server/CMakeLists.txt index bebd8a0..5e43d7f 100644 --- a/uft_dev_server/CMakeLists.txt +++ b/uft_dev_server/CMakeLists.txt @@ -1,20 +1,28 @@ cmake_minimum_required(VERSION 3.12) project(UftDevServer) -# 设置vcpkg工具链路径 -set(CMAKE_TOOLCHAIN_FILE "D:/aigc/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file") +# 设置 vcpkg 工具链 +set(CMAKE_TOOLCHAIN_FILE "D:/aigc/vcpkg/scripts/buildsystems/vcpkg.cmake") -# 设置C++标准 +# 设置 C++ 标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 设置源文件目录 set(SOURCE_DIR src) -# 查找依赖包 +# 设置RCC++编译选项 +set(RCCPP_SOURCE_DIR ${SOURCE_DIR}) +set(RCCPP_INCLUDE_DIRS ${SOURCE_DIR} ${SOURCE_DIR}/controllers ${SOURCE_DIR}/filters) + + +# 查找其他依赖(Drogon, RapidJSON) find_package(Drogon CONFIG REQUIRED) find_package(RapidJSON CONFIG REQUIRED) -find_package(RCCPP REQUIRED) + +# 查找其他依赖(Drogon, RapidJSON) +set(RCCPP_DIR "D:/aigc/manta/uft_dev_server/third_party/RuntimeCompiledCPlusPlus/Aurora") +find_package(RuntimeCompiledCPlusPlus REQUIRED) # 添加可执行文件 add_executable(${PROJECT_NAME} @@ -24,23 +32,21 @@ add_executable(${PROJECT_NAME} ${SOURCE_DIR}/filters/ApiFilter.cpp ) -# 链接库 +# 链接库(手动指定 RCCPP 的库名) target_link_libraries(${PROJECT_NAME} PRIVATE Drogon::Drogon - ${CMAKE_DL_LIBS} # 用于动态加载 - RCCPP::RCCPP + ${CMAKE_DL_LIBS} + RuntimeCompiledCPlusPlus::RuntimeCompiledCPlusPlus ) -# 包含目录 +# 其他配置(包含目录、文件拷贝等保持不变) target_include_directories(${PROJECT_NAME} PRIVATE + ${RCCPP_INCLUDE_DIRS} ${SOURCE_DIR} ${SOURCE_DIR}/controllers ${SOURCE_DIR}/filters ) -# 设置RCC++编译选项 -set(RCCPP_SOURCE_DIR ${SOURCE_DIR}) -set(RCCPP_INCLUDE_DIRS ${SOURCE_DIR} ${SOURCE_DIR}/controllers ${SOURCE_DIR}/filters) # 配置文件拷贝 set(CONFIG_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/config/config.json") diff --git a/uft_dev_server/cmd.txt b/uft_dev_server/cmd.txt index f4903c9..3a76b33 100644 --- a/uft_dev_server/cmd.txt +++ b/uft_dev_server/cmd.txt @@ -1,3 +1,13 @@ +#增加RCC++依赖包(专为自行编译RCCPP提供,直接使用已有RCCPP目录则无需执行--注意命令执行位置) +git clone https://github.com/RuntimeCompiledCPlusPlus/RuntimeCompiledCPlusPlus.git +cd RuntimeCompiledCPlusPlus/Aurora +mkdir build +cd build +cmake .. -DCMAKE_INSTALL_PREFIX="D:/aigc/Libs/RCCPP" -DINSTALL_CMAKE_CONFIG=ON -DBUILD_SHARED_LIBS=ON -G "Visual Studio 17 2022" -A x64 -DCMAKE_POLICY_VERSION_MINIMUM="4.0.2" +cmake --build . --config Release --target install + + +#工程编译 cd D:/aigc/manta/uft_dev_server rm -Path build -Recurse -Force cmake -B build -DCMAKE_TOOLCHAIN_FILE="D:/aigc/vcpkg/scripts/buildsystems/vcpkg.cmake" diff --git a/uft_dev_server/src/controllers/HelloWorldController.cpp b/uft_dev_server/src/controllers/HelloWorldController.cpp index 74ab22c..df25a2b 100644 --- a/uft_dev_server/src/controllers/HelloWorldController.cpp +++ b/uft_dev_server/src/controllers/HelloWorldController.cpp @@ -1,12 +1,54 @@ -#include "HelloWorldController.h" +#include +#include +#include "HelloWorldController.h" +#include "RuntimeObjectSystem/IObject.h" +#include "RuntimeObjectSystem/ObjectInterfacePerModule.h" -using namespace drogon; +// 定义可热更新的接口 +class IHelloHandler : public IObject +{ +public: + virtual std::string GetResponse() = 0; +}; + +// 默认实现(可被热更新) +class HelloHandler_v1 : public TInterface +{ +public: + std::string GetResponse() override + { + return "Hello from Version 1!"; + } +}; +REGISTERCLASS(HelloHandler_v1); void HelloWorldController::asyncHandleHttpRequest( const HttpRequestPtr &req, std::function &&callback) { + // 初始化 RCCPP 系统(仅首次) + if (!m_pRuntimeSystem) + { + m_pRuntimeSystem = new RuntimeObjectSystem; + m_pRuntimeSystem->Initialise(new StdioLogSystem(), nullptr); + + // 创建初始对象 + auto pCtor = m_pRuntimeSystem->GetObjectFactorySystem()->GetConstructor("HelloHandler_v1"); + if (pCtor) + { + m_ObjectId = pCtor->Construct()->GetObjectId(); + } + } + + // 获取当前实现(可能是热更新后的版本) + IHelloHandler *pHandler = nullptr; + if (auto pObj = m_pRuntimeSystem->GetObjectFactorySystem()->GetObject(m_ObjectId)) + { + pObj->GetInterface(&pHandler); + } + + // 生成响应 auto resp = HttpResponse::newHttpResponse(); - resp->setBody("Hello, World! 欢迎访问 UFT C++ Server 开发 Project!"); + resp->setBody(pHandler ? pHandler->GetResponse() : "Error: Handler not loaded"); callback(resp); } \ No newline at end of file diff --git a/uft_dev_server/src/controllers/HelloWorldController.h b/uft_dev_server/src/controllers/HelloWorldController.h index 7d83cf5..6b59f13 100644 --- a/uft_dev_server/src/controllers/HelloWorldController.h +++ b/uft_dev_server/src/controllers/HelloWorldController.h @@ -1,13 +1,8 @@ -// HelloWorldController.h -#pragma once +#pragma once #include -#include +#include "RuntimeObjectSystem/RuntimeObjectSystem.h" // 全局作用域 -using namespace drogon; - -class HelloWorldController : - public HttpSimpleController, - public RCCPP::RuntimeObject +class HelloWorldController : public HttpSimpleController { public: PATH_LIST_BEGIN @@ -16,8 +11,9 @@ public: void asyncHandleHttpRequest(const HttpRequestPtr &req, std::function &&callback) override; - - // RCC++需要的接口 - virtual void Construct() {} - virtual void Serialize(ISimpleSerializer* pSerializer) {} + +private: + // RCCPP 相关成员(非继承) + IRuntimeObjectSystem *m_pRuntimeSystem; + ObjectId m_ObjectId; }; \ No newline at end of file diff --git a/uft_dev_server/third_party/RCCPP/Assets/GUI/Anonymous.ttf b/uft_dev_server/third_party/RCCPP/Assets/GUI/Anonymous.ttf deleted file mode 100644 index 3192af8..0000000 Binary files a/uft_dev_server/third_party/RCCPP/Assets/GUI/Anonymous.ttf and /dev/null differ diff --git a/uft_dev_server/third_party/RCCPP/Assets/GUI/Delicious-Bold.otf b/uft_dev_server/third_party/RCCPP/Assets/GUI/Delicious-Bold.otf deleted file mode 100644 index e5b1e25..0000000 Binary files a/uft_dev_server/third_party/RCCPP/Assets/GUI/Delicious-Bold.otf and /dev/null differ diff --git a/uft_dev_server/third_party/RCCPP/Assets/GUI/Delicious-BoldItalic.otf b/uft_dev_server/third_party/RCCPP/Assets/GUI/Delicious-BoldItalic.otf deleted file mode 100644 index 81bf13b..0000000 Binary files a/uft_dev_server/third_party/RCCPP/Assets/GUI/Delicious-BoldItalic.otf and /dev/null differ diff --git a/uft_dev_server/third_party/RCCPP/Assets/GUI/Delicious-Italic.otf b/uft_dev_server/third_party/RCCPP/Assets/GUI/Delicious-Italic.otf deleted file mode 100644 index d57df3b..0000000 Binary files a/uft_dev_server/third_party/RCCPP/Assets/GUI/Delicious-Italic.otf and /dev/null differ diff --git a/uft_dev_server/third_party/RCCPP/Assets/GUI/Delicious-Roman.otf b/uft_dev_server/third_party/RCCPP/Assets/GUI/Delicious-Roman.otf deleted file mode 100644 index 31ec11a..0000000 Binary files a/uft_dev_server/third_party/RCCPP/Assets/GUI/Delicious-Roman.otf and /dev/null differ diff --git a/uft_dev_server/third_party/RCCPP/Assets/GUI/compiling-notification.rcss b/uft_dev_server/third_party/RCCPP/Assets/GUI/compiling-notification.rcss deleted file mode 100644 index fbbd923..0000000 --- a/uft_dev_server/third_party/RCCPP/Assets/GUI/compiling-notification.rcss +++ /dev/null @@ -1,32 +0,0 @@ -body -{ - font-family: Delicious; - font-weight: normal; - font-style: normal; - font-size: 20; - color: white; - z-index: -3; -} - -body -{ - height: 100%; - width: 100%; -} - -div#compiling -{ - font-size: 16; - font-weight: bold; - - background-color: #303030; - - text-align: left; - - position:absolute; - bottom: 9px; - right: 40px; - width: 200px; -} - - diff --git a/uft_dev_server/third_party/RCCPP/Assets/GUI/compiling-notification.rml b/uft_dev_server/third_party/RCCPP/Assets/GUI/compiling-notification.rml deleted file mode 100644 index 1ec4bb1..0000000 --- a/uft_dev_server/third_party/RCCPP/Assets/GUI/compiling-notification.rml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - CompilingNotification - - -
- -
diff --git a/uft_dev_server/third_party/RCCPP/Assets/GUI/console.rcss b/uft_dev_server/third_party/RCCPP/Assets/GUI/console.rcss deleted file mode 100644 index e3426ea..0000000 --- a/uft_dev_server/third_party/RCCPP/Assets/GUI/console.rcss +++ /dev/null @@ -1,515 +0,0 @@ -body -{ - font-family: Delicious; - font-weight: normal; - font-style: normal; - font-size: 15pt; - color: white; - - top: 100px; - left: 30px; -} - -div#title_bar -{ - z-index: 2; - - position: absolute; - top: -33px; - - text-align: left; -} - -div#title_bar span -{ - padding-left: 30px; - padding-right: 20px; - padding-top: 12px; - padding-bottom: 35px; - - font-size: 18pt; - font-weight: bold; - - outline-font-effect: outline; - outline-width: 1px; - outline-color: black; - - background-decorator: tiled-horizontal; - background-left-image: console.tga 147px 0px 229px 85px; - background-center-image: console.tga stretch 229px 0px 230px 85px; - background-right-image: console.tga 231px 0px 246px 85px; -} - -div#window -{ - z-index: 2; - width: 600px; - height: auto; - - background-decorator: tiled-box; - background-top-left-image: console.tga 0px 0px 133px 15px; - background-top-right-image: console.tga 136px 0px 146px 15px; - background-top-image: console.tga stretch 134px 0px 135px 15px; - background-bottom-left-image: console.tga 0px 16px 11px 31px; - background-bottom-right-image: console.tga 136px 16px 146px 31px; - background-bottom-image: console.tga stretch 11px 16px 12px 31px; - background-left-image: console.tga stretch 0px 15px 10px 16px; - background-center-image: console.tga stretch 11px 15px 12px 16px; -} - -div#content -{ - z-index: 2; - - overflow: hidden auto; - - text-align: left; - - padding-left: 7px; - padding-right: 7px; - padding-bottom: 3px; -} - -div#controls -{ - z-index: 2; - - margin-top: 8px; - margin-right: 10px; - text-align: right; -} - -select, -dataselect -{ - margin-left: 20px; -} - -input.text, -textarea -{ - font-family: Anonymous; - font-size: 16pt; -} - -input.submit -{ - margin-left: 7px; - margin-bottom: 4px; -} - -button, -input.submit -{ - display: inline-block; - - width: 80px; - height: 28px; - - padding-top: 5px; - vertical-align: -18px; - - font-size: 14pt; - font-weight: bold; - text-align: center; - tab-index: auto; - - background-decorator: image; - background-image: console.tga 247px 0px 406px 45px; -} - -button:focus, -input.submit:focus -{ - font-weight: bold; - - shadow-font-effect: shadow; - shadow-offset: 1px 1px; - shadow-color: black; -} - -button:hover, -input.submit:hover -{ - background-image-t: 45px 90px; -} - -button:active, -input.submit:active -{ - background-image-t: 90px 135px; -} - -button:disabled, -input.submit:disabled -{ - background-image-t: 90px 135px; - color: grey; - font-weight: normal; -} - -input.text, -textarea -{ - padding: 5px; - padding-left: 10px; - padding-top: 10px; - margin: 5px; - margin-bottom: 0px; - - background-decorator: tiled-box; - background-top-left-image: console.tga 281px 272px 292px 284px; - background-top-right-image: console.tga 294px 272px 305px 284px; - background-top-image: console.tga stretch 292px 272px 293px 284px; - background-bottom-left-image: console.tga 281px 285px 292px 296px; - background-bottom-right-image: console.tga 294px 285px 305px 296px; - background-bottom-image: console.tga stretch 292px 285px 293px 296px; - background-left-image: console.tga stretch 281px 283px 292px 284px; - background-center-image: console.tga stretch 292px 283px 293px 284px; -} - -input.text -{ - height: 35px; - width: 677px; -} - -textarea -{ - height: 155px; - width: 677px; -} - -input.text, -select, -dataselect, -textarea -{ - color: black; - font-size: 13pt; -} - -datagrid input.text -{ - width: 100%; - height: auto; - margin: 0px; - padding: 0px 2px 0px; - - border-width: 1px; - border-color: black; - background-color: white; - - font-size: 15pt; - - background-decorator: none; -} - - - -select, -dataselect -{ - width: 175px; - height: 37px; -} - -select selectvalue, -dataselect selectvalue -{ - width: auto; - margin-right: 30px; - - height: 28px; - padding: 9px 10px 0px 10px; - - background-decorator: image; - background-image: console.tga 162px 192px 307px 229px; -} - -select selectvalue:hover, -dataselect selectvalue:hover -{ - background-image-t: 230px 267px; -} - -select selectarrow, -dataselect selectarrow -{ - width: 30px; - height: 37px; - - icon-decorator: image; - icon-image: console.tga 307px 192px 337px 229px; -} - -select selectarrow:hover, -dataselect selectarrow:hover -{ - icon-image-t: 230px 267px; -} - -select selectarrow:active, -select selectarrow:checked, -dataselect selectarrow:active, -dataselect selectarrow:checked -{ - icon-image-t: 268px 305px; -} - -select selectbox, -dataselect selectbox -{ - margin-left: 1px; - margin-top: -7px; - width: 162px; - padding: 1px 4px 4px 4px; -} - -select selectbox, -dataselect selectbox, -datagrid datagridbody -{ - background-decorator: tiled-box; - background-top-left-image: console.tga 281px 275px 292px 284px; - background-top-right-image: console.tga 294px 275px 305px 284px; - background-top-image: console.tga stretch 292px 275px 293px 284px; - background-bottom-left-image: console.tga 281px 285px 292px 296px; - background-bottom-right-image: console.tga 294px 285px 305px 296px; - background-bottom-image: console.tga stretch 292px 285px 293px 296px; - background-left-image: console.tga stretch 281px 283px 292px 284px; - background-center-image: console.tga stretch 292px 283px 293px 284px; -} - -select selectbox option, -dataselect selectbox option -{ - width: auto; - padding-left: 3px; -} - -select selectbox option:nth-child(even), -dataselect selectbox option:nth-child(even), -datagrid datagridrow:nth-child(even) -{ - background: #FFFFFFA0; -} - -select selectbox option:hover, -dataselect selectbox option:hover -{ - background: #FF5D5D; -} - - - -input.radio, -input.checkbox -{ - width: 30px; - height: 30px; - - vertical-align: -11px; -} - -input.radio -{ - icon-decorator: image; - icon-image: console.tga 407px 0px 437px 30px; -} - -input.radio:hover -{ - icon-image-s: 437px 467px; -} - -input.radio:active -{ - icon-image-s: 467px 497px; -} - -input.radio:checked -{ - icon-image-t: 30px 60px; -} - -input.radio:checked:hover -{ - icon-image-s: 437px 467px; - icon-image-t: 30px 60px; -} - -input.radio:checked:active -{ - icon-image-s: 467px 497px; - icon-image-t: 30px 60px; -} - -input.checkbox -{ - icon-decorator: image; - icon-image: console.tga 407px 60px 437px 90px; -} - -input.checkbox:hover -{ - icon-image-s: 437px 467px; -} - -input.checkbox:active -{ - icon-image-s: 467px 497px; -} - -input.checkbox:checked -{ - icon-image-t: 90px 120px; -} - -input.checkbox:checked:hover -{ - icon-image-s: 437px 467px; - icon-image-t: 90px 120px; -} - -input.checkbox:checked:active -{ - icon-image-s: 467px 497px; - icon-image-t: 90px 120px; -} - - - -datagrid datagridheader -{ - width: auto; - height: 25px; - padding: 5px 10px 0px 10px; - - background-decorator: tiled-horizontal; - background-left-image: console.tga 127px 192px 143px 223px; - background-center-image: console.tga stretch 143px 192px 145px 223px; - background-right-image: console.tga 145px 192px 160px 223px; -} - -datagrid datagridbody -{ - color: black; - - margin-left: 4px; - margin-right: 3px; - padding: 0px 4px 4px 4px; -} - - - -datagridexpand -{ - display: block; - - margin: 1px 0px 1px 5px; - height: 17px; - width: 17px; - - icon-decorator: image; - icon-image: console.tga 3px 232px 20px 249px; -} - -datagridexpand:hover -{ - icon-image-s: 21px 38px; -} - -datagridexpand:active -{ - icon-image-s: 39px 56px; -} - -datagridexpand.collapsed -{ - icon-image-t: 250px 267px; -} - - - -scrollbarvertical -{ - margin-top: 1px; - margin-bottom: 3px; - margin-right: 3px; - width: 27px; -} - -scrollbarvertical slidertrack -{ - background-decorator: tiled-vertical; - background-top-image: console.tga 70px 199px 97px 201px; - background-center-image: console.tga stretch 70px 201px 97px 202px; - background-bottom-image: console.tga 70px 203px 97px 204px; -} - -scrollbarvertical sliderbar -{ - margin-left: 4px; - width: 23px; - min-height: 46px; - - background-decorator: tiled-vertical; - background-top-image: console.tga 56px 152px 79px 175px; - background-center-image: console.tga stretch 56px 175px 79px 175px; - background-bottom-image: console.tga 56px 176px 79px 198px; -} - -scrollbarvertical sliderbar:hover -{ - background-top-image-s: 80px 103px; - background-center-image-s: 80px 103px; - background-bottom-image-s: 80px 103px; -} - -scrollbarvertical sliderbar:active -{ - background-top-image-s: 104px 127px; - background-center-image-s: 104px 127px; - background-bottom-image-s: 104px 127px; -} - -scrollbarvertical sliderarrowdec -{ - width: 27px; - height: 24px; - - icon-decorator: image; - icon-image: console.tga 0px 152px 27px 176px; -} - -scrollbarvertical sliderarrowdec:hover, -scrollbarvertical sliderarrowinc:hover -{ - icon-image-t: 177px 201px; -} - -scrollbarvertical sliderarrowdec:active, -scrollbarvertical sliderarrowinc:active -{ - icon-image-t: 202px 226px; -} - -scrollbarvertical sliderarrowinc -{ - width: 27px; - height: 24px; - - icon-decorator: image; - icon-image: console.tga 28px 152px 55px 176px; -} - - - -scrollbarhorizontal -{ - width: 0px; - height: 0px; -} - - diff --git a/uft_dev_server/third_party/RCCPP/Assets/GUI/console.rml b/uft_dev_server/third_party/RCCPP/Assets/GUI/console.rml deleted file mode 100644 index ff2c146..0000000 --- a/uft_dev_server/third_party/RCCPP/Assets/GUI/console.rml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - Title - - -
- - Console - -
-
-
- - - - - -
-
- -