# MyCppProject **Repository Path**: Ye_Quan/my-cpp-project ## Basic Information - **Project Name**: MyCppProject - **Description**: 我的C++项目 - **Primary Language**: C++ - **License**: AFL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 38 - **Forks**: 9 - **Created**: 2025-03-18 - **Last Updated**: 2026-03-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README MyCppProject #### 介绍 这是我的 C++ 多项目合集,包含桌面应用、服务端组件和通用库。 当前重点维护的是 **QuanMian 面经系统**,其余项目处于“功能稳定、偶尔维护”的状态。 --- #### 目录 - [项目总览](#项目总览) - [QuanMian 面经系统](#quanmian-面经系统) - [lylog 日志库](#lylog-日志库) - [Qt音乐播放器(仿网易云)](#qt音乐播放器仿网易云) - [CloudBackup 云备份系统](#cloudbackup-云备份系统) - [Qt-experiments](#qt-experiments) --- #### 项目总览 | 项目名 | 描述 | 技术栈 | |--|--|--| | [QuanMian 面经系统](https://gitee.com/Ye_Quan/my-cpp-project/tree/master/QuanMian) | 面经全文搜索 + 题目聚类 + 公司题库画像,包含 Qt 桌面端、Web 前端、brpc 微服务和 Redis/MySQL/etcd 后端 | C++17, Qt, brpc, Protobuf, Redis, MySQL, etcd, cpp-httplib, Python | | [lylog 日志库](https://gitee.com/Ye_Quan/my-cpp-project/tree/master/lylog) | 轻量级 C++ 日志库,支持同步/异步日志、可配置格式、多种输出 Sink(控制台、文件、滚动文件),提供全局 Logger 管理与简洁宏封装 | C++17, std::thread, chrono, iostream | | [Qt音乐播放器(仿网易云)](https://gitee.com/Ye_Quan/my-cpp-project/tree/master/MusicPlayer) | 支持本地歌单管理、播放控制面板、可视化进度条等常用功能的桌面音乐播放器 | Qt5, C++11, QMediaPlayer, QNetworkAccessManager, SQLite | | [CloudBackup 云备份系统](https://gitee.com/Ye_Quan/my-cpp-project/tree/master/CloudBackup) | 简易文件云备份/恢复服务,支持多文件打包、增量上传与 HTTP 接口访问 | C++17, httplib, 多线程, 文件操作 | | [Qt-experiments](https://gitee.com/Ye_Quan/my-cpp-project/tree/master/Qt-experiments) | Qt 图形和算法小实验集合,目前包含 DFS 可视化、路径规划等 Demo | Qt, C++ | > 代码仓库中还包含一些游戏 Demo、状态机/路径规划实验等小项目,这里不一一展开。 --- #### QuanMian 面经系统 QuanMian 是一个围绕“真实面经数据”构建的面试题知识库和分析系统,涵盖 **面经采集、AI 解析与聚类、公司题库画像、模拟面试生成** 等完整链路: - **客户端形态** - Qt 桌面客户端(`QuanMian/Client`):支持公司列表、面经列表、题目列表等多种卡片视图,内置搜索对话框和面经上传对话框,通过自定义 `NetClient` 与后端交互。 - Web 前端(`QuanMian/WebClient`):通过 HTTP + JSON 接口访问网关,对浏览器友好,支持 CORS。 - **网关层(HTTP + JSON / Protobuf)** - `GatewayServer`(`QuanMian/server/gateway`)基于 `cpp-httplib` 实现,统一暴露: - 面经搜索:`/service/interview/search_interview` + `/service/interview/search_interview_json` - 题目/题簇搜索:`/service/interview/search_question` + `/service/interview/search_question_json` - 公司搜索:`/service/interview/search_company` + `/service/interview/search_company_json` - 面经上传:`/service/interview/upload_interview` + `/service/interview/upload_interview_json` - 同一套逻辑,既支持 **Protobuf**(适合 C++/Qt 客户端),也支持 **JSON**(适合 Web 前端),并内置 CORS 与 OPTIONS 预检处理。 - **面经服务(brpc 微服务)** - `InterviewServiceImpl`(`QuanMian/server/interview`)基于 brpc 和 Protobuf 实现面经相关的核心 RPC: - `SearchInterview`:根据关键字、公司、分页参数在 MySQL 中搜索面经,返回结构化的面经列表。 - `SearchQuestion`: - 支持按题簇维度返回“代表题 + 标签 + 命中量”,用于列表聚合展示。 - 支持按题簇展开,返回该簇内所有具体问题。 - 特别支持 “公司 + 岗位” 触发 **LLM 生成模拟面试题**,并和热门题簇结果混合。 - `SearchCompany`: - 按关键字搜索公司; - 为每个公司统计面经数量、最近面经时间、Top 标签及其占比,生成用于前端卡片展示的“公司题库画像”。 - `UploadInterview`:接收用户上传的原始面经文本并写入 MySQL,后续交由分析流水线处理。 - **AI 与数据分析流水线** - 使用 Redis 队列和 ZSet 管理多种后台任务: - 面经解析任务:将原始面经推入 `interview:analysis:*` 队列,由 Python 服务解析出 Q&A、公司信息、标签等。 - 题目聚类任务:单题通过 `cluster:req`/`cluster:rsp` 与聚类服务交互,自动打上题簇 ID。 - 模拟面试任务:将 “公司 + 岗位 + 历史高频题/标签” 组合成上下文,通过 `mock_interview:req` 队列交给 LLM,落库/缓存后返回客户端。 - `InterviewServer::analysis` 线程会: - 持续消费 Redis 中的解析结果,更新面经表、题目表及关联标签。 - 定期扫描未解析/未聚类的数据,做 **补偿和重试**,保证系统在服务重启后仍能自动追上进度。 - **数据存储与服务治理** - MySQL:存储面经、题目、标签、公司画像等结构化数据,封装在 `MySQLClient` 内。 - Redis:既作为缓存(如公司的搜索结果、模拟面试结果),也作为任务队列和去重/锁控制中心。 - etcd:通过自封装的 `ServiceRegistry` / `ServiceDiscovery` + `ServiceManager` 实现服务注册与服务发现。 整体上,QuanMian 是一个 **C++ 为主、Python 为辅** 的多组件系统,重点练习了: - brpc + Protobuf 的 RPC 设计; - Redis 驱动的任务队列与缓存双重用法; - 基于 LLM 的“模拟面试题生成”和“面经结构化解析”场景; - Qt 客户端与 Web 前端共用一套后端服务的接口设计。 ##### 视频展示 [C++ 全栈项目 -泉面 -阶段记录](https://www.bilibili.com/video/BV1T4qhBdEbv/?share_source=copy_web&vd_source=93cae92b9c0576cf34b98ff025567ec0) [C++ 全栈项目 -泉面 -阶段记录2](https://www.bilibili.com/video/BV1hpcfziE4Q/?share_source=copy_web&vd_source=93cae92b9c0576cf34b98ff025567ec0) --- #### lylog 日志库 `lylog` 是一个独立可复用的 C++ 日志库,设计目标是 **“足够轻量,但比简单 printf 好用很多”**,目前具备以下能力: - **日志级别与格式化** - 支持多级别:`debug / info / warning / error / fatal`。 - 自定义格式字符串(见 `Formatter`): - 时间:`%Y-%m-%d %H:%M:%S` - 级别:`%l` - 线程:`%t` - 日志器名:`%n` - 源文件/行号:`%s` / `%#` - 消息内容:`%v` - 通过 `Formatter` 组合一系列 `FormatItem`,避免运行期字符串拼接散落在业务代码中。 - **同步 / 异步日志** - 提供 `SyncLogger` 与 `AsyncLogger` 两种实现: - 同步模式:直接按顺序写入 Sink,适合简单工具或启动期日志。 - 异步模式:通过 `AsyncLooper` 维护双 Buffer + 后台线程消费,降低主线程 I/O 开销。 - `AsyncLooper` 使用自旋 + 条件变量唤醒机制,既保证吞吐,又在空闲时不占用过多 CPU。 - **多种 Sink 与滚动策略** - `StdoutSink`:输出到标准输出。 - `FileSink`:写入固定文件,自动创建目录。 - `SizeRollSink`:按文件大小自动切分日志文件(为新文件名加入带微秒的时间戳)。 - `TimeRollSink`:按时间间隔切分日志文件。 - 提供 `SinkFactory`,可通过字符串 + 配置快速构建不同类型的 Sink。 - **全局 Logger 管理与宏封装** - 通过 `LogManager` 统一管理命名 Logger: - 支持自定义 Builder(`GlobalBuilder` / `LocalBuilder`)创建并注册 Logger。 - 默认自动注册一个名为 `default_logger` 的 Logger,输出到标准输出。 - 在 `lylog.h` 中提供简洁宏: - `debug / info / warning / error / fatal`:自动补全 `__FILE__` 与 `__LINE__`。 - `fdebug / finfo / ...`:直接从 `LogManager` 获取 `default_logger` 并输出。 整体来看,`lylog` 已经可以在实际项目中作为独立日志模块使用,特别适合作为 **小型服务 / Demo / 工具** 的通用基础库。 --- #### Qt音乐播放器(仿网易云) 主要是一个用于练手 Qt UI 和多媒体模块的桌面播放器,功能包括: - 本地歌曲扫描与列表展示; - 播放控制(播放/暂停、上一首/下一首、音量调节); - 自定义进度条控件和播放控制面板; - 歌曲卡片与列表自绘,练习 Qt 的事件和样式定制。 ##### 视频展示 [Qt -音乐播放器(仿网易云)V1.0](https://www.bilibili.com/video/BV1RBJpzWEfK?vd_source=f44e6c9d66d84da5c620d3f5529e9424) --- #### CloudBackup 云备份系统 一个基于 HTTP 的简单云备份服务,用于练习文件 IO、HTTP 协议与多线程: - 支持将本地文件/目录打包并上传到服务端; - 通过配置文件(`config.conf`)管理备份源路径等参数; - 使用 `httplib` 暴露备份/恢复接口; - 后端负责管理备份文件、支持一定程度的增量/断点能力(通过分片与元数据管理实现)。 --- #### Qt-experiments 主要是一些围绕 Qt 图形和算法可视化的小实验项目,目前包括但不限于: - DFS 算法可视化:以网格/图结构展示搜索过程; - 路径规划与场景管理 Demo; - 状态机、RVO 等相关的小型实验。 ##### 视频展示 [Qt -DFS算法可视化](https://www.bilibili.com/video/BV1wdL2zxEFE?vd_source=f44e6c9d66d84da5c620d3f5529e9424)