From ea34c15cd221716610748346552c039c862ab604 Mon Sep 17 00:00:00 2001 From: hejl Date: Mon, 26 May 2025 08:43:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=88=9B=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- uft_dev_server/.vscode/c_cpp_properties.json | 22 ++++++ uft_dev_server/.vscode/launch.json | 26 +++++++ uft_dev_server/.vscode/settings.json | 76 +++++++++++++++++++ uft_dev_server/.vscode/tasks.json | 33 ++++++++ uft_dev_server/CMakeLists.txt | 68 +++++++++++++++++ uft_dev_server/cmd.txt | 3 + uft_dev_server/src/config/config.json | 25 ++++++ .../src/controllers/ApiController.cpp | 48 ++++++++++++ .../src/controllers/HelloWorldController.cpp | 12 +++ .../src/controllers/HelloWorldController.h | 15 ++++ uft_dev_server/src/filters/ApiFilter.cpp | 24 ++++++ uft_dev_server/src/filters/ApiFilter.h | 14 ++++ uft_dev_server/src/main.cpp | 27 +++++++ uft_dev_server/src/swagger/swagger.json | 65 ++++++++++++++++ 14 files changed, 458 insertions(+) create mode 100644 uft_dev_server/.vscode/c_cpp_properties.json create mode 100644 uft_dev_server/.vscode/launch.json create mode 100644 uft_dev_server/.vscode/settings.json create mode 100644 uft_dev_server/.vscode/tasks.json create mode 100644 uft_dev_server/CMakeLists.txt create mode 100644 uft_dev_server/cmd.txt create mode 100644 uft_dev_server/src/config/config.json create mode 100644 uft_dev_server/src/controllers/ApiController.cpp create mode 100644 uft_dev_server/src/controllers/HelloWorldController.cpp create mode 100644 uft_dev_server/src/controllers/HelloWorldController.h create mode 100644 uft_dev_server/src/filters/ApiFilter.cpp create mode 100644 uft_dev_server/src/filters/ApiFilter.h create mode 100644 uft_dev_server/src/main.cpp create mode 100644 uft_dev_server/src/swagger/swagger.json diff --git a/uft_dev_server/.vscode/c_cpp_properties.json b/uft_dev_server/.vscode/c_cpp_properties.json new file mode 100644 index 0000000..1d687c0 --- /dev/null +++ b/uft_dev_server/.vscode/c_cpp_properties.json @@ -0,0 +1,22 @@ +{ + "configurations": [ + { + "name": "Win32", + "includePath": [ + "${workspaceFolder}/**", + "${vcpkgRoot}/x64-mingw-static/include/**" + ], + "defines": [ + "_DEBUG", + "UNICODE", + "_UNICODE" + ], + "compilerPath": "C:/ProgramData/chocolatey/lib/mingw/tools/install/mingw64/bin/g++.exe", + "cStandard": "c17", + "cppStandard": "c++17", + "intelliSenseMode": "windows-gcc-x64", + "configurationProvider": "ms-vscode.cmake-tools" + } + ], + "version": 4 +} \ No newline at end of file diff --git a/uft_dev_server/.vscode/launch.json b/uft_dev_server/.vscode/launch.json new file mode 100644 index 0000000..2d9e0a6 --- /dev/null +++ b/uft_dev_server/.vscode/launch.json @@ -0,0 +1,26 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "g++.exe - Build and debug active file", + "type": "cppdbg", + "request": "launch", + "program": "${workspaceFolder}/build/CppServerProject.exe", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [], + "externalConsole": false, + "MIMode": "gdb", + "miDebuggerPath": "C:/ProgramData/chocolatey/lib/mingw/tools/install/mingw64/bin/gdb.exe", + "setupCommands": [ + { + "description": "Enable pretty-printing for gdb", + "text": "-enable-pretty-printing", + "ignoreFailures": true + } + ], + "preLaunchTask": "C/C++: g++.exe build active file" + } + ] +} \ No newline at end of file diff --git a/uft_dev_server/.vscode/settings.json b/uft_dev_server/.vscode/settings.json new file mode 100644 index 0000000..1d877c9 --- /dev/null +++ b/uft_dev_server/.vscode/settings.json @@ -0,0 +1,76 @@ +{ + "files.associations": { + "*.dbclient-js": "javascript", + "any": "cpp", + "array": "cpp", + "atomic": "cpp", + "strstream": "cpp", + "bit": "cpp", + "bitset": "cpp", + "cctype": "cpp", + "chrono": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "codecvt": "cpp", + "compare": "cpp", + "concepts": "cpp", + "condition_variable": "cpp", + "coroutine": "cpp", + "csignal": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdint": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "deque": "cpp", + "list": "cpp", + "map": "cpp", + "set": "cpp", + "string": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "regex": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "numbers": "cpp", + "ostream": "cpp", + "semaphore": "cpp", + "shared_mutex": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "cinttypes": "cpp", + "typeinfo": "cpp", + "variant": "cpp" + } +} \ No newline at end of file diff --git a/uft_dev_server/.vscode/tasks.json b/uft_dev_server/.vscode/tasks.json new file mode 100644 index 0000000..a547fea --- /dev/null +++ b/uft_dev_server/.vscode/tasks.json @@ -0,0 +1,33 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "cppbuild", + "label": "C/C++: g++.exe build active file", + "command": "C:/ProgramData/chocolatey/lib/mingw/tools/install/mingw64/bin/g++.exe", + "args": [ + "-fdiagnostics-color=always", + "-g", + "${workspaceFolder}/*.cpp", + "-o", + "${workspaceFolder}/build/${fileBasenameNoExtension}.exe", + "-I${vcpkgRoot}/x64-mingw-static/include", + "-L${vcpkgRoot}/x64-mingw-static/lib", + "-ldrogon", + "-ljsoncpp", + "-lrcpp" + ], + "options": { + "cwd": "${workspaceFolder}" + }, + "problemMatcher": [ + "$gcc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + "detail": "Task generated by Debugger." + } + ] +} \ No newline at end of file diff --git a/uft_dev_server/CMakeLists.txt b/uft_dev_server/CMakeLists.txt new file mode 100644 index 0000000..89ac891 --- /dev/null +++ b/uft_dev_server/CMakeLists.txt @@ -0,0 +1,68 @@ +cmake_minimum_required(VERSION 3.12) +project(CppServerProject) + +# 设置vcpkg工具链路径 +set(CMAKE_TOOLCHAIN_FILE "D:/aigc/vcpkg/scripts/buildsystems/vcpkg.cmake" CACHE STRING "Vcpkg toolchain file") + +# 设置C++标准 +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +# 设置源文件目录 +set(SOURCE_DIR src) + +# 查找依赖包 +find_package(Drogon CONFIG REQUIRED) +find_package(RapidJSON CONFIG REQUIRED) + +# 添加可执行文件 +add_executable(${PROJECT_NAME} + ${SOURCE_DIR}/main.cpp + ${SOURCE_DIR}/controllers/HelloWorldController.cpp + ${SOURCE_DIR}/controllers/ApiController.cpp + ${SOURCE_DIR}/filters/ApiFilter.cpp +) + +# 链接库 +target_link_libraries(${PROJECT_NAME} PRIVATE + Drogon::Drogon + ${CMAKE_DL_LIBS} # 用于动态加载 +) + +# 包含目录 +target_include_directories(${PROJECT_NAME} PRIVATE + ${SOURCE_DIR} + ${SOURCE_DIR}/controllers + ${SOURCE_DIR}/filters +) + +# 配置文件拷贝 +set(CONFIG_SRC "${CMAKE_CURRENT_SOURCE_DIR}/src/config/config.json") +set(CONFIG_DEST "${CMAKE_CURRENT_BINARY_DIR}/Debug/config.json") + +add_custom_command( + TARGET ${PROJECT_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/Debug" + COMMAND ${CMAKE_COMMAND} -E copy + "${CONFIG_SRC}" + "${CONFIG_DEST}" + COMMENT "Copying config.json to output directory" + VERBATIM +) + +# 处理多配置情况 +if(CMAKE_CONFIGURATION_TYPES) + foreach(CFG_TYPE ${CMAKE_CONFIGURATION_TYPES}) + set(CFG_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CFG_TYPE}") + add_custom_command( + TARGET ${PROJECT_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E make_directory "${CFG_DIR}" + COMMAND ${CMAKE_COMMAND} -E copy + "${CONFIG_SRC}" + "${CFG_DIR}/config.json" + COMMENT "Copying config.json to ${CFG_TYPE} directory" + VERBATIM + ) + endforeach() +endif() + diff --git a/uft_dev_server/cmd.txt b/uft_dev_server/cmd.txt new file mode 100644 index 0000000..0629965 --- /dev/null +++ b/uft_dev_server/cmd.txt @@ -0,0 +1,3 @@ +rm -Path build -Recurse -Force +cmake -B build -DCMAKE_TOOLCHAIN_FILE="D:/aigc/vcpkg/scripts/buildsystems/vcpkg.cmake" +cmake --build build \ No newline at end of file diff --git a/uft_dev_server/src/config/config.json b/uft_dev_server/src/config/config.json new file mode 100644 index 0000000..24fd489 --- /dev/null +++ b/uft_dev_server/src/config/config.json @@ -0,0 +1,25 @@ +{ + "controllers": [ + { + "name": "HelloWorldController", + "path": "/" + }, + { + "name": "ApiController", + "path": "/" + } + ], + "filters": [ + { + "name": "ApiFilter", + "path": "/api/*" + } + ], + "listeners": [ + { + "address": "0.0.0.0", + "port": 8080, + "ssl": false + } + ] +} \ No newline at end of file diff --git a/uft_dev_server/src/controllers/ApiController.cpp b/uft_dev_server/src/controllers/ApiController.cpp new file mode 100644 index 0000000..6f85c97 --- /dev/null +++ b/uft_dev_server/src/controllers/ApiController.cpp @@ -0,0 +1,48 @@ +#pragma once +#include +#include +#include + +using namespace drogon; + +class ApiController : public HttpController +{ +public: + METHOD_LIST_BEGIN + ADD_METHOD_TO(ApiController::getInfo, "/api/info", Get); + ADD_METHOD_TO(ApiController::postData, "/api/data", Post); + METHOD_LIST_END + + void getInfo(const HttpRequestPtr &req, + std::function &&callback) + { + Json::Value ret; + ret["status"] = "ok"; + ret["version"] = "1.0.0"; + ret["message"] = "Welcome to CppServerProject"; + + auto resp = HttpResponse::newHttpJsonResponse(ret); + callback(resp); + } + + void postData(const HttpRequestPtr &req, + std::function &&callback) + { + auto json = req->getJsonObject(); + if (!json) + { + auto resp = HttpResponse::newHttpResponse(); + resp->setStatusCode(k400BadRequest); + resp->setBody("Invalid JSON data"); + callback(resp); + return; + } + + Json::Value ret; + ret["status"] = "received"; + ret["data"] = *json; + + auto resp = HttpResponse::newHttpJsonResponse(ret); + callback(resp); + } +}; \ No newline at end of file diff --git a/uft_dev_server/src/controllers/HelloWorldController.cpp b/uft_dev_server/src/controllers/HelloWorldController.cpp new file mode 100644 index 0000000..5c5a322 --- /dev/null +++ b/uft_dev_server/src/controllers/HelloWorldController.cpp @@ -0,0 +1,12 @@ +#include "HelloWorldController.h" + +using namespace drogon; + +void HelloWorldController::asyncHandleHttpRequest( + const HttpRequestPtr &req, + std::function &&callback) +{ + auto resp = HttpResponse::newHttpResponse(); + resp->setBody("Hello, World!"); + 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 new file mode 100644 index 0000000..7a88b3d --- /dev/null +++ b/uft_dev_server/src/controllers/HelloWorldController.h @@ -0,0 +1,15 @@ +#pragma once +#include + +using namespace drogon; + +class HelloWorldController : public HttpSimpleController +{ +public: + PATH_LIST_BEGIN + PATH_ADD("/hello", Get); + PATH_LIST_END + + void asyncHandleHttpRequest(const HttpRequestPtr &req, + std::function &&callback) override; +}; \ No newline at end of file diff --git a/uft_dev_server/src/filters/ApiFilter.cpp b/uft_dev_server/src/filters/ApiFilter.cpp new file mode 100644 index 0000000..e97bf09 --- /dev/null +++ b/uft_dev_server/src/filters/ApiFilter.cpp @@ -0,0 +1,24 @@ +#include "ApiFilter.h" + +using namespace drogon; + +ApiFilter::ApiFilter() {} + +void ApiFilter::doFilter(const HttpRequestPtr &req, + FilterCallback &&fcb, + FilterChainCallback &&fccb) +{ + // 简单的API密钥验证 + auto apiKey = req->getHeader("X-API-KEY"); + if (apiKey.empty() || apiKey != "secret-key") + { + auto resp = HttpResponse::newHttpResponse(); + resp->setStatusCode(k401Unauthorized); + resp->setBody("Unauthorized: Invalid API Key"); + fcb(resp); + return; + } + + // 通过验证,继续处理 + fccb(); +}; \ No newline at end of file diff --git a/uft_dev_server/src/filters/ApiFilter.h b/uft_dev_server/src/filters/ApiFilter.h new file mode 100644 index 0000000..eb70e4b --- /dev/null +++ b/uft_dev_server/src/filters/ApiFilter.h @@ -0,0 +1,14 @@ + +#include + +using namespace drogon; + +class ApiFilter : public HttpFilter +{ +public: + ApiFilter(); + + virtual void doFilter(const HttpRequestPtr &req, + FilterCallback &&fcb, + FilterChainCallback &&fccb) override; +}; \ No newline at end of file diff --git a/uft_dev_server/src/main.cpp b/uft_dev_server/src/main.cpp new file mode 100644 index 0000000..457e0ce --- /dev/null +++ b/uft_dev_server/src/main.cpp @@ -0,0 +1,27 @@ +#include +#include + +using namespace drogon; + +int main() +{ + try + { + // 设置日志级别 + drogon::app().setLogLevel(trantor::Logger::kTrace); + drogon::app().registerBeginningAdvice([]() + { LOG_INFO << "Drogon application starting..."; }); + + // 加载配置 + drogon::app().loadConfigFile("./config.json"); + + // 启动服务 + drogon::app().run(); + } + catch (const std::exception &e) + { + std::cerr << "Error: " << e.what() << std::endl; + return 1; + } + return 0; +} \ No newline at end of file diff --git a/uft_dev_server/src/swagger/swagger.json b/uft_dev_server/src/swagger/swagger.json new file mode 100644 index 0000000..9e41a03 --- /dev/null +++ b/uft_dev_server/src/swagger/swagger.json @@ -0,0 +1,65 @@ +{ + "openapi": "3.0.0", + "info": { + "title": "CppServerProject API", + "version": "1.0.0", + "description": "A sample C++ backend server with Swagger documentation" + }, + "paths": { + "/hello": { + "get": { + "summary": "Hello World", + "description": "Returns a simple greeting", + "responses": { + "200": { + "description": "Successful response", + "content": { + "text/plain": { + "schema": { + "type": "string", + "example": "Hello, World!" + } + } + } + } + } + } + }, + "/api/info": { + "get": { + "summary": "Get API info", + "description": "Returns basic API information", + "responses": { + "200": { + "description": "Successful response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiInfo" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "ApiInfo": { + "type": "object", + "properties": { + "status": { + "type": "string" + }, + "version": { + "type": "string" + }, + "message": { + "type": "string" + } + } + } + } + } +} \ No newline at end of file