HCY Blog

项目开发及学习经历

项目

本文介绍了三个技术项目:在线C语言编译器提供零配置的编译环境,支持代码持久化与分享,适合编程练习;代码高尔夫平台实现异步评测与AI助教功能,助力编程竞赛;AI医学辅助系统通过多智能体协作生成诊断建议,整合医学证据。这些项目展示了前端工程、容器化部署与智能决策等技术的应用,帮助读者了解如何构建实用工具与平台,提升开发与学习效率。

项目开发及学习经历

在线c语言编译器

项目地址: https://chenyuheee.github.io/c

项目描述: 零配置、开箱即用的在线 C 语言编译/运行环境,完全托管于 GitHub Pages。前端单页整合 Monaco Editor、代码运行、测试用例管理、度量分析、命令面板等功能,结合 Service Worker 提供基础离线体验。运行全部委托给 Wandbox API,失败时在界面内返回真实错误信息。支持在浏览器本地持久化代码、主题与测试用例,并可生成包含输入/用例的分享链接。

技术栈:

  • 前端:纯原生 HTML/CSS/JavaScript + Monaco Editor(通过 CDN loader 按需加载)
  • 状态持久化:localStorage 保存代码、主题、测试用例
  • 运行服务:Wandbox 编译 API(HTTPS POST,超时 8~10s)
  • 分享机制:Base64 编码 JSON 写入 URL hash(包含代码 / stdin / 测试用例)
  • PWA:手写 Service Worker 缓存核心静态文件
  • 版本管理与部署:Git、GitHub Pages(主干直发,无构建流程)

实现方式:

  1. 通过 Monaco 官方 AMD loader 在浏览器端加载编辑器,动态切换暗/明主题、撤销/重做、命令面板
  2. 纯前端实现 C 语法智能缩进与格式化(栈 + 状态机),并在“自动缩进”按钮中调用
  3. 利用 localStorage 同步代码、主题、测试面板用例,保持跨刷新持久化;关闭标签页前自动保存
  4. 运行按钮向 Wandbox 发送编译请求,展示 stdout/stderr/exit code,并在失败时反馈真实错误
  5. 分享窗口将代码、stdin、测试用例序列化为 JSON 后 Base64 编码写入 URL hash,实现零后端分享
  6. 测试用例面板基于 Wandbox 编译结果批量校验输入输出,提供通过/失败汇总
  7. Service Worker 预缓存首页、Manifest、图标等静态文件,实现离线打开与资源回源策略

学习技能:

  • 前端工程:Monaco Editor 二次封装、命令面板、响应式布局
  • 算法实现:针对 C 语法块的缩进/格式化状态机设计
  • API 集成:远程编译接口的超时控制、错误提示、多语言提示文案
  • 用户体验:快捷键绑定(Ctrl+Enter 运行、Ctrl+S 另存为)、移动端侧栏切换、I18n 切换
  • PWA 与缓存:手动编写 Service Worker、版本号控制和缓存失效策略
  • 数据处理:JSON 序列化分享、Base64 编码/解码、localStorage 容错

收获和推广:

  • 通过 GitHub Pages 零成本上线,解决社团同学随时练习 C 语言的需求
  • 掌握了 Monaco Editor 深度定制经验,可快速移植到其他语言沙箱
  • 建立版本化脚本(scripts/version.js)统一展示版本号,形成稳定的迭代节奏
  • 引入测试用例面板、代码度量、命令面板等增强功能,提升教学场景体验
  • 当前线上版本 v1.3.20,浏览器访问量稳定,持续收集反馈迭代

不足:

  • 运行完全依赖 Wandbox,出现超时或限流时只能提示错误,缺少备用编译服务
  • Share 链接采用 Base64,超长代码在微信等平台仍可能被截断
  • 当前仅支持单文件 C 程序,尚未提供多文件/头文件管理
  • 没有多人协作或实时同步功能,暂时定位于个人练习

代码高尔夫

项目地址: http://47.99.243.62 项目地址2: https://zjucodegolf.xyz (因为该域名的ICP备案还未完成,所以目前暂时无法访问)

项目描述: 面向编程社团的代码高尔夫竞赛平台,覆盖题库、提交评测、积分天梯、投稿、站内信、文章与论坛等模块。用户在浏览器内使用 Monaco 编辑器完成 C 语言题目,系统按 UTF-8 字节数计分,通过异步判题集群返回结果并刷新榜单。可选接入 DeepSeek 助教为 AC/非 AC 提交提供分析,整个平台支持邮箱验证与基础运营工具。

实现方式:

  1. 使用 infra/docker-compose.yml 编排 PostgreSQL 15、Redis 7、RabbitMQ 3.12、API、Runner、Web 与 Nginx,deploy.sh 一键推送到阿里云 ECS(47.99.243.62)。
  2. API 基于 Express + TypeScript,模块化路由覆盖认证、题库、题目投稿、提交、榜单、文章、论坛、站内信与管理员接口,通过 pg 操作数据库,zod 做参数校验,jsonwebtoken/bcryptjs 实现权限控制。
  3. 提交链路将源码与测试需求写入 submissions 表并发布到 RabbitMQ 队列,Runner 组合 gcc -O2 -s 编译、按用例限时运行,统计时间/内存并回调内部 API 写回判题详情及 submission_tests 明细。
  4. API 内置 C 语言字节计数器(去换行后基于 Token 拼接)保障评测与前端展示一致,同时维护 best_recordsleaderboards 生成积分榜。
  5. Runner、API、Web 均打包为独立镜像;Runner 容器预装 GCC/Clang,限制 CPU/内存防止挤占资源,内部只接受带签名 Token 的回调。
  6. Web 端使用 React 18 + Vite + Tailwind + React Router,提供暗色主题、Monaco 编辑器、一键投稿、榜单与后台管理面板,所有请求都通过统一封装的 apiFetch 访问 API。
  7. 配置 SMTP(nodemailer)完成邮箱验证,DeepSeek API 封装在提交详情页的 AI 助教按钮中,可选为失败提交生成诊断或对 AC 代码做精简建议。

技术栈:

  • 基础设施:Docker Compose(PostgreSQL、Redis、RabbitMQ、API、Runner、Web、Nginx),阿里云 ECS 部署。
  • 后端:Node.js 20 + Express + TypeScript,pgzodjsonwebtokenbcryptjsmultergray-matternodemailer
  • Runner:Node.js + amqplib,容器内 GCC/Clang 执行沙箱,HTTP 回调写回判题结果。
  • 前端:React 18、Vite、TailwindCSS、React Router、@monaco-editor/react、Marked + DOMPurify。
  • 消息与缓存:RabbitMQ 负责异步调度;Redis 预留用于会话与排行榜缓存(配置完待接入)。
  • DevOps:Git + GitHub,环境变量管理 .env/.env.exampledeploy.sh 触发重启;Nginx 反代 Web/API。

学习技能:

  • 体系化 TypeScript 后端开发:Express 中间件抽象、zod 校验链、JWT 鉴权与 RBAC。
  • SQL 设计与调优:PostgreSQL schema、榜单积分计算、事务化写入投稿/论坛等复合业务流程。
  • 消息队列与异步判题:RabbitMQ 发布/消费、Runner 幂等处理、限流与失败重试策略。
  • 容器化运行:多服务 Docker 镜像构建、资源限制、Nginx 反向代理与静态文件托管。
  • 富交互前端:Monaco 编辑器、React 状态管理、暗色模式、题面 Markdown 渲染与后台管理界面。
  • LLM 辅助能力:DeepSeek API 封装、错误上下文拼接、判题日志与代码联合提示工程。

收获和推广:

  • 完成题库 → 提交流程 → Runner 回写 → 榜单刷新的闭环,在内测期间稳定支撑 30+ 位同学使用。
  • 建立题目投稿、文章、论坛、站内信、Admin 面板等配套模块,形成自运转社区闭环。
  • 通过 Docker Compose + 一键脚本让部署/回滚标准化,阿里云主机故障时可 10 分钟内恢复。
  • 深度打磨 C 语言字节计数与编辑器体验,为后续扩展多语言、榜单算法奠定基础。
  • AI 助教为失败提交提供可重现实例,提高新人理解判题反馈的效率。

不足:

  • 目前仅支持 C 语言,Runner 尚未做 seccomp/CGroups 级别的硬隔离,多语言与更强沙箱待实现。
  • Redis 方案尚未真正接入线上路径,排行榜与会话仍落在数据库,存在性能瓶颈风险。
  • 单机部署缺乏自动监控与告警,RabbitMQ/Runner 异常需要人工介入。
  • 邮件与 AI 能力依赖外部服务配置,缺少兜底与健康检查。
  • Admin 工具未覆盖批量数据修复、判题重跑等高级运维场景。

AI医学辅助诊断系统(MedAgt)

项目地址: http://121.43.107.58

项目描述: MedAgt 是一个面向远程问诊场景的智能医学站点,目标是“采集症状,生成可追溯的初步建议”。前端提供病例标签页、多症状录入、追问锁定与历史回放,后端 orchestrates 多个 DeepSeek Agent:先生成检索策略,再调用 PubMed/NICE 抓取证据,最后汇总出 triage、诊疗建议、追问列表和临时诊断。界面实时展示分析进度、证据数量、置信度以及文献统计,支持直接下载 PubMed 摘要或全文。

核心能力:

  1. 多病例管理:左侧标签页可一键新建/切换病例,完成分析后自动折叠表单并持久化到 localStorage
  2. 追问闭环:若 LLM 觉得信息不足,会生成 3~6 条追问并锁定结果,用户补充后才能继续生成最终方案。
  3. 进度可视化:前端通过 /api/v1/progress 轮询展示“解析症状 → 检索 → 排序 → 规划 → 翻译”五步进度条。
  4. 证据展示:后端整合 PubMed/NICE,过滤动物试验、人口不符等噪声,同时汇总“发表年份柱状图 + 来源占比圆图”。
  5. 证据下载:自建 /api/v1/evidence/:pmid/abstract|fulltext,支持直接拉取官方摘要和 PDF 链接。

实现方式:

  1. 前端使用 Next.js 16(App Router + TypeScript),主页面 page.tsx 负责表单、追问、结果展示与可视化;CSS Modules 控制整体玻璃拟态风格并针对移动端适配。
  2. 表单状态通过 React hooks 管理,并将病例、分析结果、追问历史等写入浏览器缓存,刷新不丢数据。
  3. 后端 FastAPI 提供 /api/v1/analyze,内部实例化 SymptomAnalyzer 并串联多个 DeepSeek Agent(搜索计划、证据排序、临床规划、追问、翻译)。
  4. 知识检索模块 knowledge.py 直接调用 NCBI E-utilities(httpx 请求)和 NICE 非结构化页面,过滤兽医/动物研究,按年份和来源统计文献分布。
  5. Agent 决策流程会记录原始提示词与输出(agent_traces),便于事后审计和复现答案;若证据不足则回退到内置安全方案。

技术栈:

  • 前端:Next.js 16、React、TypeScript、CSS Modules、Turbopack
  • 后端:FastAPI、httpx、Pydantic、DeepSeek API、asyncio
  • 数据来源:PubMed E-utilities、NICE Guidelines(HTML 抓取)
  • 部署:阿里云 ECS(Ubuntu 24.04)+ systemd + Nginx 反向代理
  • 辅助:deploy.sh 一键增量部署、localStorage 持久化、浏览器端数据可视化

学习技能:

  • 多 Agent 提示工程:拆分检索、排序、规划、追问、翻译五个 Agent,调优提示词与 JSON Schema 校验
  • 临床语境的数据清洗:针对年龄段/性别/动物研究等添加过滤器,保证返回证据更贴近真实临床
  • 前端状态编排:处理病例折叠、追问锁、历史追问回放、并行进度条等互动细节
  • 可观测性设计:记录 agent trace、进度轮询与错误提示,便于上线后的调试和迭代
  • 云端部署与运维:systemd 管理前后端服务,Nginx 统一反代,deploy.sh 根据 git diff 判断最小部署单元

收获和推广:

  • 完成“问诊 → 检索 → 决策 → 追问 → 复盘”闭环,真实部署到外网供演示
  • 对 PubMed/NICE 的抓取和过滤有了实践经验,可复用到其他医学知识项目
  • 为校内远程医疗课程提供 demo,展示 LLM + 传统检索的协同工作流
  • 构建了可追溯的 agent trace 与证据链,为后续引入人工审核打下基础

不足:

  • 目前还未引入电子病历数据,全部基于用户手动输入
  • triage 规则仍依赖 LLM 输出,缺少医学顾问的正式背书
  • NCBI API 调用未做本地缓存,高并发场景仍需加速与限流策略