# IISC-Test **Repository Path**: MyDearest35/iisc-test ## Basic Information - **Project Name**: IISC-Test - **Description**: 山西工学院的学生奖项管理系统c++后端 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-11-26 - **Last Updated**: 2026-06-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # IISC-Test ## 构建说明 1. CMake 默认构建工具选择 ninja 2. 启动配置的工作目录可以填 `$ProjectFileDir$` 这样项目里的文件它可以正常映射读取 3. 编译器 Windows 选择 `LLVM-MinGW UCRT` 可以 `winget` 安装 ```shell winget install MartinStorsjo.LLVM-MinGW.UCRT ``` CMake 构建额外选项 示例 ```shell -G Ninja -DVCPKG_TARGET_TRIPLET=x64-mingw-dynamic -DCMAKE_TOOLCHAIN_FILE=C:\LaoZu\Code\vcpkg\scripts\buildsystems\vcpkg.cmake ``` 4. 编译器 Windows 选择 `MSVC` 创建命令 ```shell mkdir visualstudio cd visualstudio cmake.exe -G "Visual Studio 18 2026" -DVCPKG_TARGET_TRIPLET=x64-windows -DCMAKE_TOOLCHAIN_FILE=I:\vcpkg-clion\scripts\buildsystems\vcpkg.cmake .. ``` 5. 编译器 Ubuntu 选择 LLVM 可以 brew 安装 ## Swagger UI 文档 ### Clion 插件 1. 搜索 `OpenAPI Specifications` 安装 2. 启动程序,会在`工作目录`下生成 `swagger.json` 文件 3. `工作目录`信息可以在程序启动日志查看 ### 官方方式下载 1. 原文链接:https://developer.aliyun.com/article/1662388 2. 下载启动 Swagger UI ```bash git clone https://github.com/swagger-api/swagger-ui.git cd swagger-ui npm install npm run dev ``` ## 关于 LLVM-MinGW 环境下编译问题 ```cmake ### 解决 Boost.Thread windows版本宏定义太低问题 #错误非常明确: #boost::winapi 里找不到 #WaitOnAddress #WakeByAddressSingle #WakeByAddressAll #这三个函数是 Windows 8 / Server 2012 及以上版本才提供的 同步原语。 #llvm-mingw 默认把 _WIN32_WINNT 设成 0x0600(Vista),于是 里不会声明这几个 API,导致 Boost 1.89 在编译时直接报错。 #解决办法(任选其一) #把整个 vcpkg 的 MinGW 动态三元组 的宏定义抬到 Windows 8 #不需要手写 #ifdef _WIN32 之类的判断。 #Triplet 文件本身就是只在 Windows 下、且只在 MinGW 工具链里生效的配置, #vcpkg 在其它平台或其它工具链根本不会去读取 x64-mingw-dynamic.cmake,所以直接写死宏即可: #这里 _WIN32_WINNT 升到 0x0A00(Windows 10) #打开 triplet 文件,在尾后添加 两个set #{VCPKG_ROOT}\triplets\community\x64-mingw-dynamic.cmake #set(VCPKG_CXX_FLAGS "-D_WIN32_WINNT=0x0A00 -DWINVER=0x0A00") #set(VCPKG_C_FLAGS "-D_WIN32_WINNT=0x0A00 -DWINVER=0x0A00") set(VCPKG_CXX_FLAGS "-DBOOST_USE_WINAPI_VERSION=0x0A00") set(VCPKG_C_FLAGS "-DBOOST_USE_WINAPI_VERSION=0x0A00") ### 解决 Boost.Cobalt 链接问题 # 给所有 port 统一加缺的那两个系统库 set(VCPKG_LINKER_FLAGS "-lbcrypt -lmswsock") ``` ## 关于 MacOS brew clang 环境下编译问题 brew clang 不知道 MacOS 的 Dev 头文件在哪,需要在 cmake 命令补充 ```shell -DCMAKE_CXX_FLAGS="-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk" -DCMAKE_C_FLAGS="-isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk" ``` #### MacOS 依赖问题 ```shell # boost::stacktrace 的依赖 brew install autoconf brew install automake brew install libtool ``` #### MacOS 链接问题 若出现严重的链接问题,可以看一下 vcpkg 使用什么编译器执行编译。 \ 例如执行安装示例,请看最下面一行的 Compiler ```text /Users/laozu/vcpkg-clion/vcpkg-llvm-rc2/vcpkg install boost-log Computing installation plan... The following packages will be built and installed: * boost-atomic:arm64-osx@1.90.0#1 * boost-chrono:arm64-osx@1.90.0#1 boost-log:arm64-osx@1.90.0#1 Additional packages (*) will be modified to complete this operation. Detecting compiler hash for triplet arm64-osx... Compiler found: /Users/laozu/Downloads/LLVM-22.1.0-rc2-macOS-ARM64/bin/clang++ ``` 解决办法:删除构建缓存重新构建 ```shell # mac 自带旧 clang 导致 vcpkg 使用系统编译导致新旧 clang 链接错误 # 可以使用下面执行清除缓存,然后用新 clang 重新编译 # vcpkg 文件夹下删除 ./buildtrees ./packages ./installed rm -rf /Users/laozu/.cache/vcpkg/archives ``` # 项目未来需要解决的事项 1. `Push.Json.TryCatch模块` 的 `json::object -> json::value` 泛用性转换。 (注:需要深度思考一下,因为目前 `json::object` 很符合 `Json.TryCatch模块` 的定义,保证 `code msg` 是一定存在的。 而 `json::value` 太泛化,会破坏接口限制范围,`json::value` 的内容让前端配合 `Json::MsgData` 实现就好。 然后设置是否继承 `Json::Msg` 为是否需要 `Json::MsgData` 包装的分界线,若用户希望让结构体在第一层而不是 `MsgXXX` 其下,可以通过继承 `Json::Msg` 实现。) 2. `throw 异常` 使用 `std::expected` 的错误变体,用于避免异常的开销。 3. `Push::Json::XXX` 的接口改成模板形式,其模板参数将是个 `Tool::TemplateWrapper>::tem_str` 用于配合在编译期针对 `Params Path Query匹配` 的静态断言。 4. `Meta.Describe模块` 添加一个可以接受模板回调函数参数的便携`get_struct_field_info`函数,其回调函数形式大概是 `template std::function`。 5. `std::invoke()` 这是高性能调用模板,因此在可以编译期确定的调用函数参数,应代替运行期的 `std::function()`。 6. 拆分此项目成熟的模块,应研究 `cmamkList.txt` 的模块添加工程。 7. `get_table_meta.html` 添加一键复制按钮。 8. `Tool.Json.ParSer模块` 的时间文字转换研究 `std::get_time()`。 9. `Push.Router模块` 替换 `std::vector` 查找优化。方向建议: `std::map` 研究结构体 `operator<()` 使其能够针对 `/api/:xxxx` 这种匹配问题。 10. `Swagger.schema模块` 使用 模板类偏特化 代替 模板重载函数 实现。 11. 简化模板函数的代码,使其更加清晰,研究 `template ` 的函数模板参数,实现更快的调用。比如 `Push.Json模块` 的 `Params Body模板类`,区别仅在于个别的 `Impl` 函数。 12. `std::ispanstream(std::string())` 代替 `std::istringstream(std::string))` 的高优质实现。 13. `json::value_to json::try_value_to` 面对描述结构体类,默认会使用 `json:try_value_to_tag`。所以需要学习 `boost/system库`。 14. `DeepSeek模块` 封装更变易用的 API 类。`std::map` 当作分用户的长久对话。注:`SSL流` 是否需要长链接待定。 15. `Experiment模块` 的宏定义 `Params(Type, name)` 和 `Params(Type name)`。类对象的静态函数反射使得注册 `Push模块`。 16. `PIMPL 编译防火墙` 优化 `.cppm` 和 `.cpp` 加速编译。 17. `Boost.Log` 研究进阶操作。 18. 修改`IISC`和`Push`的耦合度,然后精良减少静态函数固定搭配,比如避免`get_thread_pool`,当用户在`main`函数写,提高`cobalt`分离设计,使的用户可以直接依赖`cobalt::co_main`。 19. `MainImpl`使用`asio::io_context`代替实现。 20. 编译期函数返回 `std::array` 编译期常量(查是否需要static修饰)写在模板函数里,然后通过 `std::span` 动态版本,传递 `impl接口`,实现模板最大程度的分文件解耦。 21. `Swagger模块` 添加个一个实体类的默认值选项,这样swagger会有默认值填入。而不是每次需要用户手动输入。 22. 字符串性能:https://clang.llvm.org/extra/clang-tidy/checks/performance/inefficient-string-concatenation.html