# poetize_server_cpp **Repository Path**: zhoudawei666/poetize_server_cpp ## Basic Information - **Project Name**: poetize_server_cpp - **Description**: 时光星球C++版后端 - **Primary Language**: C++ - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-04 - **Last Updated**: 2026-05-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: Cpp ## README ### 项目简介 - 基于 C++17 的 HTTP 服务,框架:Drogon,数据库:MySQL(poetize),缓存:Redis,搜索:Elasticsearch,目前只兼容Linux系统。 - Drogon 构建配置参考: - 主要模块:文章服务 `ArticleController`(全文检索、分页、排序、审核过滤等)、用户相关控制器、工具组件(JWT、Redis、Elasticsearch 客户端等)。 - 搜索/列表默认使用 Elasticsearch,过滤 `deleted=0`、`audit_status=1`,默认按 `view_count` 降序,可指定排序字段。 - 提供 Python 脚本 `examples/1.py` 用于将数据库文章全量/增量同步到 ES(重建索引映射,包含所有文章字段)。 ### 目录结构(节选) - `controller/` 控制器 - `include/` 控制器声明与路由(如 `ArticleController.h`) - `src/` 控制器实现(如 `ArticleController.cc` 文章搜索/分页/排序/详情等) - `models/` 数据库模型(Drogon ORM 生成的表结构映射,如 `Article.*`) - `utils/` 工具组件 - `elasticsearch/` ES HTTP 客户端封装(`ElasticsearchClient.*`) - `redis/` Redis 客户端封装(`mredis.*`) - `jwt/` JWT 管理(`jwt_manager.*`) - `response/` 响应包装工具(`response_utils.*`) - `word_detection/` 词汇检测服务(`word_detection.*`,使用 ONNX Runtime 和 BERT tokenizer) - 其他:邮件、短信、文件工具等 - `examples/` 示例与脚本 - `1.py` MySQL → Elasticsearch 同步脚本(ES 8.x,重建索引并全量/增量导入) - `elastic/` Elasticsearch 分发包及 IK 分词插件示例 - `main.cc` 程序入口(初始化配置、启动 HTTP 服务器) - `config.json` 示例配置(数据库、Redis、JWT 等,可被环境变量覆盖) ### 环境依赖 - C++17、CMake、Drogon、MySQL 客户端库、Redis、libcurl、JsonCpp、Elasticsearch 8.7.1。 - 运行时需可访问的 MySQL、Redis、Elasticsearch 服务。 - 如需文档转换功能,需要安装 LibreOffice 和 PDF 处理工具(pdftk 或 qpdf)。 - 如需词汇检测功能,需要安装 ONNX Runtime(见下方安装指南)。 - 如需使用 RabbitMQ 消息队列功能,需要安装 librabbitmq-dev(见下方安装指南)。 ### 词汇检测服务依赖安装 #### 1. 安装 ONNX Runtime **使用预编译版本(推荐):** ```bash # 创建安装目录 sudo mkdir -p /usr/local/onnxruntime-1.24.1 # 解压预编译包(假设文件在 /mnt/f/ 目录) sudo tar zxvf /mnt/f/onnxruntime-linux-x64-1.24.1.tgz -C /usr/local/onnxruntime-1.24.1 --strip-components=1 # 验证解压结果(能看到include和lib目录即成功) ls /usr/local/onnxruntime-1.24.1/ ``` #### 2. 模型准备 **步骤1: 转换模型为 ONNX 格式** ```bash # 转换模型为 ONNX 格式 python convert_to_onnx.py ``` **步骤2: 准备 Tokenizer 文件** 确保模型目录包含以下文件: - `tokenizer.json` - BERT tokenizer 词汇表(必需,优先使用) - `tokenizer_config.json` - Tokenizer 配置文件,包含特殊 token IDs(必需) - `vocab.txt` - 词汇表文件(可选,如果 tokenizer.json 不存在时使用) 这些文件通常可以从 Hugging Face 模型仓库获取,或从训练好的模型目录中复制。 **步骤3: 配置模型路径** 在 `config.json` 中配置模型路径: ```json { "wordDetection": { "onnxModelPath": "/path" } } ``` 模型目录应包含: - `model.onnx` 或 `*.onnx` - ONNX 格式的模型文件(如果路径是目录,会自动查找) - `tokenizer.json` - BERT tokenizer 词汇表(必需,优先使用) - `tokenizer_config.json` - Tokenizer 配置文件(必需) - `vocab.txt` - 词汇表文件(可选,向后兼容,仅在 tokenizer.json 不存在时使用) **注意:** - 模型路径可以是 `.onnx` 文件路径,也可以是包含 `.onnx` 文件的目录 - 如果路径是目录,代码会自动查找目录中的 `.onnx` 文件(优先查找 `model.onnx`) - Tokenizer 文件必须与 ONNX 模型文件在同一目录下 - 代码会自动根据模型的输入形状设置序列长度,无需手动配置 #### 验证安装 ```bash # 检查 ONNX Runtime ls /usr/local/onnxruntime-1.24.1/include/onnxruntime_cxx_api.h ls /usr/local/onnxruntime-1.24.1/lib/libonnxruntime.so # 检查模型目录结构(假设模型路径为 /path/to/model) ls /path/to/model/model.onnx # 或 *.onnx ls /path/to/model/tokenizer.json # 必需 ls /path/to/model/tokenizer_config.json # 必需 ``` ### LibreOffice 安装指南 #### Ubuntu/Debian 系统 ```bash # 更新包列表 sudo apt-get update # 安装 LibreOffice(完整版,包含所有组件) sudo apt-get install -y libreoffice # 或者只安装无头模式(headless,适合服务器环境,更轻量) sudo apt-get install -y libreoffice-writer-nogui libreoffice-calc-nogui # 验证安装 libreoffice --version ``` #### CentOS/RHEL 系统 ```bash # 安装 LibreOffice sudo yum install -y libreoffice # 或者使用 dnf(CentOS 8+) sudo dnf install -y libreoffice ``` #### 安装 PDF 处理工具 同时需要安装 PDF 处理工具(pdftk 或 qpdf): **安装 pdftk:** ```bash # Ubuntu/Debian sudo apt-get install -y pdftk # CentOS/RHEL(需要 EPEL 仓库) sudo yum install -y epel-release sudo yum install -y pdftk ``` **安装 qpdf(推荐,更现代):** ```bash # Ubuntu/Debian sudo apt-get install -y qpdf # CentOS/RHEL sudo yum install -y qpdf ``` #### 验证安装 ```bash # 检查 LibreOffice which libreoffice libreoffice --version # 检查 pdftk which pdftk pdftk --version # 检查 qpdf which qpdf qpdf --version # 测试转换功能(无头模式) libreoffice --headless --convert-to pdf --outdir /tmp /tmp/test.docx ``` #### 注意事项 1. **无头模式**:服务器环境建议使用无头模式(headless),不需要图形界面 2. **内存占用**:LibreOffice 转换文档会占用一定内存,确保服务器有足够资源 3. **转换时间**:大文件转换可能需要较长时间,建议设置超时处理 4. **临时文件**:转换过程会生成临时文件,确保 `/tmp` 目录有足够空间 ### RabbitMQ 安装指南 #### Ubuntu/Debian 系统 ```bash # 安装 librabbitmq-dev(RabbitMQ C 客户端库) sudo apt-get update sudo apt-get install -y librabbitmq-dev ``` #### 从源码编译安装(如果包管理器没有提供) 1. 安装编译依赖: ```bash sudo apt-get update sudo apt-get install -y build-essential cmake git pkg-config sudo apt-get install -y libssl-dev libpopt-dev libxml2-dev ``` 2. 安装 rabbitmq-c: ```bash # 克隆仓库 git clone https://github.com/alanxz/rabbitmq-c.git cd rabbitmq-c # 创建构建目录 mkdir build && cd build # 配置和编译 cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local make -j$(nproc) # 安装 sudo make install # 更新库路径 sudo ldconfig cd ../.. ``` #### 验证安装 ```bash # 检查头文件 ls /usr/include/amqp.h # 或 ls /usr/local/include/amqp.h # 检查库文件 ls /usr/lib/x86_64-linux-gnu/librabbitmq* # 或 ls /usr/local/lib/librabbitmq* ``` #### 注意事项 1. **RabbitMQ 服务器**: 需要确保 RabbitMQ 服务器正在运行 2. **默认凭据**: 默认连接使用 guest/guest 凭据(仅限本地连接) 3. **生产环境**: 生产环境请使用强密码和适当的权限配置 4. **消息持久化**: 要保证消息不丢失,需要队列和消息都设置为持久化 ### 编译与运行 ```bash mkdir -p build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. make -j ./poetize_server_cpp # 默认监听 8848 ``` ### 关键配置 - 数据库/Redis/JWT 等配置见 `config.json` 或环境变量(若未设置,程序会使用内置默认并在日志中警告)。 - Elasticsearch 默认在 `ArticleController` 构造中指向 `http://localhost:9200`,如需修改可调整构造参数或配置。 ### 常见问题 - 排序 400/结果异常:确保 ES 索引字段与排序字段一致,文本字段需使用 `.keyword` 或使用数值/date 字段;默认已处理缺失字段的 `missing` 与 `unmapped_type`。 - 搜索为空:检查 ES 是否有索引数据,确认 `audit_status=1`、`deleted=0` 过滤条件是否满足。 - ES 连接异常:确认 `ElasticsearchClient` 地址、网络连通性,以及 ES 8.x 安全配置(需 basic_auth 时在客户端侧补充)。 - 词汇检测服务初始化失败: - 检查 ONNX Runtime 是否正确安装,确认库文件路径 - 确认模型路径配置正确,可以是 `.onnx` 文件路径或包含 `.onnx` 文件的目录 - 确认模型目录包含 `tokenizer.json` 和 `tokenizer_config.json` 文件 - 检查模型文件是否损坏,确认 ONNX 模型格式正确 - 查看日志中的详细错误信息,常见错误包括:模型文件不存在、tokenizer 文件缺失、输入维度不匹配等 ### 开源说明 - 定位:示例/学习/内部服务参考,可据此二次开发文章搜索、内容管理等应用。 - 贡献:欢迎提 Issue/PR(功能建议、bug 修复、性能优化、文档补充)。 - 安全:提交前请移除/替换数据库、Redis、ES 的真实账号密码和 JWT 密钥等敏感信息。 - 许可证:请按团队/仓库实际选择的 LICENSE 执行;若未设定,建议补充明确的开源许可。