19 changed files with 274 additions and 112 deletions
@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
|
||||
[submodule "cpp_server/RuntimeCompiledCPlusPlus"] |
||||
path = cpp_server/RuntimeCompiledCPlusPlus |
||||
url = https://github.com/RuntimeCompiledCPlusPlus/RuntimeCompiledCPlusPlus.git |
@ -0,0 +1,22 @@
@@ -0,0 +1,22 @@
|
||||
{ |
||||
"configurations": [ |
||||
{ |
||||
"name": "Win32", |
||||
"includePath": [ |
||||
"${workspaceFolder}/**", |
||||
"D:/aigc/vcpkg/installed/x64-windows/include/**" |
||||
], |
||||
"defines": [ |
||||
"_DEBUG", |
||||
"UNICODE", |
||||
"_UNICODE" |
||||
], |
||||
"windowsSdkVersion": "10.0.18362.0", |
||||
"compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/bin/Hostx64/x64/cl.exe", |
||||
"cStandard": "c11", |
||||
"cppStandard": "c++11", |
||||
"intelliSenseMode": "windows-msvc-x64" |
||||
} |
||||
], |
||||
"version": 4 |
||||
} |
@ -0,0 +1,9 @@
@@ -0,0 +1,9 @@
|
||||
{ |
||||
"cmake.configureOnOpen": true, |
||||
"cmake.buildDirectory": "${workspaceFolder}/build", |
||||
"cmake.generator": "Visual Studio 16 2019 Win64", |
||||
"C_Cpp.default.cppStandard": "c++11", |
||||
"cmake.configureSettings": { |
||||
"CMAKE_TOOLCHAIN_FILE": "D:/aigc/vcpkg/scripts/buildsystems/vcpkg.cmake" |
||||
} |
||||
} |
@ -0,0 +1,35 @@
@@ -0,0 +1,35 @@
|
||||
cmake_minimum_required(VERSION 3.15) |
||||
project(MyDrogonProject) |
||||
|
||||
# 设置C++11标准 |
||||
set(CMAKE_CXX_STANDARD 11) |
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON) |
||||
|
||||
# 查找依赖 |
||||
find_package(Drogon CONFIG REQUIRED) |
||||
|
||||
# 添加RCC++子模块 |
||||
add_subdirectory(RuntimeCompiledCPlusPlus) |
||||
|
||||
# 定义热重载源文件 |
||||
set(RUNTIME_COMPILED_SOURCES |
||||
src/controllers/UserController.cpp |
||||
) |
||||
|
||||
# 主可执行文件 |
||||
add_executable(${PROJECT_NAME} |
||||
src/main.cpp |
||||
${RUNTIME_COMPILED_SOURCES} |
||||
) |
||||
|
||||
# 配置RCC++ |
||||
runtime_compile_setup( |
||||
TARGET ${PROJECT_NAME} |
||||
SOURCES ${RUNTIME_COMPILED_SOURCES} |
||||
) |
||||
|
||||
# 链接库 |
||||
target_link_libraries(${PROJECT_NAME} PRIVATE Drogon::Drogon) |
||||
|
||||
# 复制Swagger UI |
||||
file(COPY swagger DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) |
@ -0,0 +1 @@
@@ -0,0 +1 @@
|
||||
Subproject commit a93b46d32052f16f2f0e647ef180ac92afa88764 |
@ -0,0 +1,7 @@
@@ -0,0 +1,7 @@
|
||||
# 用于查找RCC++的头文件路径 |
||||
find_path(RCCPP_INCLUDE_DIR RuntimeObjectSystem.h |
||||
PATHS ${CMAKE_SOURCE_DIR}/RuntimeCompiledCPlusPlus/RuntimeObjectSystem |
||||
) |
||||
|
||||
include(FindPackageHandleStandardArgs) |
||||
find_package_handle_standard_args(RCCPP DEFAULT_MSG RCCPP_INCLUDE_DIR) |
@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
|
||||
#include "UserController.h" |
||||
|
||||
RCCPP_RUNTIME_TYPE_REGISTRATION(UserController) |
||||
|
||||
/**
|
||||
* @brief 获取用户列表 |
||||
* @route GET /api/v1/users |
||||
* @response 200 用户列表JSON |
||||
*/ |
||||
void UserController::asyncHandleHttpRequest( |
||||
const drogon::HttpRequestPtr &req, |
||||
std::function<void(const drogon::HttpResponsePtr &)> &&callback) |
||||
{ |
||||
Json::Value ret; |
||||
ret["status"] = "ok"; |
||||
ret["message"] = "Hello from RCC++!"; |
||||
ret["data"] = Json::arrayValue; |
||||
|
||||
auto resp = drogon::HttpResponse::newHttpJsonResponse(ret); |
||||
callback(resp); |
||||
} |
@ -0,0 +1,22 @@
@@ -0,0 +1,22 @@
|
||||
#pragma once |
||||
|
||||
#include "RuntimeCompiledCPlusPlus/RuntimeObjectSystem/RuntimeObjectSystem.h" |
||||
#include <drogon/HttpSimpleController.h> |
||||
|
||||
class UserController : public RCCpp::IObject, |
||||
public drogon::HttpSimpleController<UserController> |
||||
{ |
||||
public: |
||||
UserController() { RCCpp::Construct(); } |
||||
virtual ~UserController() { RCCpp::Destruct(); } |
||||
|
||||
RCCPP_RUNTIME_TYPE_DECLARATION(UserController) |
||||
|
||||
void asyncHandleHttpRequest( |
||||
const drogon::HttpRequestPtr &req, |
||||
std::function<void(const drogon::HttpResponsePtr &)> &&callback) override; |
||||
|
||||
PATH_LIST_BEGIN |
||||
PATH_ADD("/api/v1/users", drogon::Get); |
||||
PATH_LIST_END |
||||
}; |
@ -0,0 +1,48 @@
@@ -0,0 +1,48 @@
|
||||
#include <drogon/drogon.h> |
||||
#include "RuntimeCompiledCPlusPlus/RuntimeObjectSystem/RuntimeObjectSystem.h" |
||||
#include "controllers/UserController.h" |
||||
|
||||
class SystemTable : public RCCpp::ISystemTable |
||||
{ |
||||
public: |
||||
virtual void Log(RCCpp::LogSystem::LogType type, const char *pText) override |
||||
{ |
||||
if (type == RCCpp::LogSystem::ERROR) |
||||
LOG_ERROR << pText; |
||||
else |
||||
LOG_INFO << pText; |
||||
} |
||||
}; |
||||
|
||||
int main() |
||||
{ |
||||
// 初始化RCC++
|
||||
SystemTable systemTable; |
||||
RCCpp::RuntimeObjectSystem runtimeObjectSystem; |
||||
runtimeObjectSystem.Initialise(&systemTable, nullptr); |
||||
|
||||
// 设置Swagger
|
||||
drogon::app().registerController(std::make_shared<drogon::SwaggerController>()); |
||||
|
||||
// 加载热重载控制器
|
||||
runtimeObjectSystem.GetObjectFactorySystem()->LoadObjectFactory( |
||||
"UserController", true); |
||||
|
||||
// 设置文档路径
|
||||
drogon::app().setDocumentRoot("./swagger"); |
||||
drogon::app().setDocumentRoot("/api/v1/docs"); |
||||
|
||||
// 启动日志
|
||||
LOG_INFO << "Server running on http://127.0.0.1:8848"; |
||||
LOG_INFO << "Swagger UI: http://127.0.0.1:8848/api/v1/docs"; |
||||
LOG_INFO << "Hot reload enabled - modify controller files to see changes"; |
||||
|
||||
// 主循环
|
||||
drogon::app() |
||||
.addListener("0.0.0.0", 8848) |
||||
.setThreadNum(4) |
||||
.run(); |
||||
|
||||
runtimeObjectSystem.CleanObjectFiles(); |
||||
return 0; |
||||
} |
Binary file not shown.
@ -0,0 +1,13 @@
@@ -0,0 +1,13 @@
|
||||
import 'package:win_text_editor/shared/base/base_content_controller.dart'; |
||||
|
||||
class UftFileController extends BaseContentController { |
||||
@override |
||||
void onOpenFile(String filePath) { |
||||
// TODO: implement onOpenFile |
||||
} |
||||
|
||||
@override |
||||
void onOpenFolder(String folderPath) { |
||||
// TODO: implement onOpenFolder |
||||
} |
||||
} |
@ -0,0 +1,47 @@
@@ -0,0 +1,47 @@
|
||||
import 'package:flutter/material.dart'; |
||||
import 'package:provider/provider.dart'; |
||||
import 'package:win_text_editor/framework/controllers/tab_items_controller.dart'; |
||||
import 'package:win_text_editor/modules/uft_file/controllers/uft_file_controller.dart'; |
||||
|
||||
class UftFileView extends StatefulWidget { |
||||
final String tabId; |
||||
const UftFileView({super.key, required this.tabId}); |
||||
|
||||
@override |
||||
State<UftFileView> createState() => _UftFileViewState(); |
||||
} |
||||
|
||||
class _UftFileViewState extends State<UftFileView> { |
||||
late final UftFileController _controller; |
||||
bool _isControllerFromTabManager = false; |
||||
|
||||
get tabManager => Provider.of<TabItemsController>(context, listen: false); |
||||
|
||||
@override |
||||
void initState() { |
||||
super.initState(); |
||||
|
||||
final controllerFromManager = tabManager.getController(widget.tabId); |
||||
if (controllerFromManager != null) { |
||||
_controller = controllerFromManager; |
||||
_isControllerFromTabManager = true; |
||||
} else { |
||||
_controller = UftFileController(); |
||||
_isControllerFromTabManager = false; |
||||
tabManager.registerController(widget.tabId, _controller); |
||||
} |
||||
} |
||||
|
||||
@override |
||||
void dispose() { |
||||
if (!_isControllerFromTabManager) { |
||||
_controller.dispose(); |
||||
} |
||||
super.dispose(); |
||||
} |
||||
|
||||
@override |
||||
Widget build(BuildContext context) { |
||||
return const Center(child: Text('demo')); |
||||
} |
||||
} |
Loading…
Reference in new issue