Medcord 项目集
Medcord·易录 —— 自托管、隐私优先的家庭病历管理系统。本仓库是 Medcord 项目的总索引;服务端代码位于
server/子目录,微信小程序端位于miniapp/子目录,安卓/iOS 客户端规划中。
项目结构
| 子目录 | 用途 | 状态 |
|---|---|---|
server/ |
服务端(Next.js 16 + PostgreSQL + pgvector) | v0.4.4 已交付 |
miniapp/ |
微信小程序(Taro + React + TypeScript) | v1.0.1 已交付 |
AndroidApp/ |
安卓 APP | 规划中 |
iOS-APP/ |
iOS APP | 规划中 |
Server
服务端详情请查看
server/README.md(开发、部署、API、版本演进等详细信息)。
概述
Medcord·易录是一套面向家庭场景的私有病历管理 Web 应用:以手机验证码登录,以家庭成员为档案主体,录入每次就诊记录(含报告图片等附件),由 AI 自动识别化验指标、生成结构化摘要,并支持跨成员的混合语义检索。
核心特性:手机验证码登录 · 成员权限矩阵 · AI 多模态录入 · 摘要三要素 · 混合语义检索(关键词 + pgvector 向量,RRF 融合)· 附件 AES-256-GCM 加密 · 管理后台 · 优雅降级。
版本演进
| 版本 | 要点 |
|---|---|
| v0.3.4 | 数据库底座升级到 PG 18.6 + pgvector 0.8.6;首个 1Panel 应用商店包 |
| v0.4.0 | 运行时升级 Node 24(trixie-slim);@types/node ^24;HEALTHCHECK 改用 node -e |
| v0.4.1 | 1Panel 打包重构:PostgreSQL/Redis 改 service 依赖,阿里云/短信/AI 凭证非必填 |
| v0.4.2 | 1Panel 打包修复数据库破坏性删除:DB 连接改 5 个纯文本字段,绕开 deleteAppLink 自动建库 |
| v0.4.3 | 成员详情页白屏修复:/api/members/{id} 与 /api/members/{id}/trend 重写为真实 handler(修复此前错位成 member-requests 的 Bug);fail() 支持 404 |
| v0.4.4 | 里程碑 5「微信小程序登录」上线 + Web 端对齐 miniapp(D1–D5)+ 权限矩阵 race 修复:新增 POST /api/auth/wechat/login(code→openid,已绑定签发 7 天 JWT,未绑定下发 5 分钟一次性 openid_session 令牌)与 POST /api/auth/wechat/bind-phone(短信验证码绑定手机号);users.openid VARCHAR(64) + 部分唯一索引;1Panel 包新增 WX_APPID / WX_SECRET 非必填配置。同时修复 /api/auth/* 在 Next.js 16.3.1 Edge runtime 下 body 解析失败、附件物理文件丢失返回 410 Gone(attachments.is_orphan)、用户管理 PATCH 改 PUT(对齐服务端单一契约,含编辑弹窗 / 重置密码输入弹窗 / 启停)、附件在线预览(?disposition=inline)、搜索历史(localStorage 最近 10 条)、趋势图异常点着色、权限矩阵一键全开 useRef 化(消除 stale closure) |
部署
- 镜像源(本地 Registry 短标签):
medcord-server+medcord-ocr(NAS 自托管 Gitea 内建本地 Registry;CI workflow 同步推送长格式localhost:5000/arutera-docker/medcord-server与短标签medcord-server,NAS 本机直 pull 用短标签即可)。含独立 OCR Sidecar 容器。 - 版本号命名:
main分支 release tag:vX.Y.Z(如v0.4.4),同时打latest;develop分支 Web 页面侧边栏显示的版本号:vX.Y.Z_dev(如v0.4.4_dev),与 main 同源的最近 tag 加_dev后缀。该命名仅用于 Web 页面显示(见server/src/app/(dashboard)/layout.tsx兜底值),与 docker build 参数、镜像标签版本号无关。
- 1Panel 一键安装:通过
server/1panel-app/medcord/(当前唯一0.4.4/目录,镜像medcord-server:v0.4.4+medcord-ocr:v0.4.4;表单含微信小程序WX_APPID/WX_SECRET非必填项)上传至 1Panel 「本地应用」(实际路径/1p/1panel/resource/apps/local/medcord/),详见server/产品说明书.md§18.3/§25 - CI/CD:push 到
develop构建develop镜像、push tag(v*)构建{tag}+latest→ Gitea Actions(.gitea/workflows/build-and-push-medcord.yml)自动构建并推送至本地 Registry(GitHub 端仅作双远端同步,GitHub Actions 已弃用)
技术栈
| 层级 | 技术 |
|---|---|
| 服务端 | Next.js 16 (App Router) + TypeScript 5 + React 19 |
| 数据库 | PostgreSQL 18.6 + pgvector 0.8.6(2560 维 halfvec HNSW) |
| 缓存 | Redis (ioredis) |
| OCR | 独立 Sidecar 容器(@arcships/light-ocr) |
| 大模型 | MiniMax M3 / DashScope Embedding(可降级 mock) |
| 短信认证 | 阿里云 Dypnsapi |
| 部署 | Docker Compose + 1Panel |
详细文档
server/README.md— 完整说明(开发、部署、API、版本演进)server/产品说明书.md— 最新产品说明书(架构 / 设计 / 接口 / 部署,含 v0.4.x 演进)server/产品说明书-CodeReview报告.md— 最新 CodeReview 报告(v0.4.4)server/1panel-app/medcord/— 1Panel 应用包(用于一键安装)
MiniApp(微信小程序)
与 服务端 配套的首个已交付客户端,里程碑 0–8 全部完成并通过逐里程碑验收。完整说明请查看
miniapp/README.md(快速开始、目录结构、里程碑交付、FAQ)。
概述
Medcord·易录微信小程序是服务端 Web 端的功能子集 + 移动场景增强:以验证码/密码登录,覆盖家庭成员列表与详情、AI 录入就诊(多附件上传 + 智能识别回填)、化验指标趋势图、就诊详情(AI Markdown 摘要 + 化验表格 + 附件预览)、跨成员混合语义检索、我的(改昵称/改密码/退出)、回收站,以及管理员的审批/权限矩阵/系统设置/用户管理/归档成员管理。
形态:Taro 3.6.35 + React 18 + TypeScript 5 微信小程序 · AppID wxc4ad1c9566d83af2 · API 基址 https://medcord.arutera.top · 主包 624KB/2MB 限额。
核心特性:验证码 + 密码双通道登录 · AI 录入就诊(multipart 多附件 + 识别回填)· ECharts 指标趋势图(异常着色 + 参考范围标线)· AI 摘要 Markdown 渲染 · 混合语义检索(防抖 + 历史记录)· 管理后台(审批/权限矩阵/系统设置/用户管理/归档)。
版本演进
| 版本 | 要点 |
|---|---|
| v1.0.0 | 里程碑 0–8 全量交付:工程骨架(分包 + tabBar)→ 基础架构(请求/状态/路由守卫)→ 登录 → 成员与就诊时间轴 → 指标趋势图 → AI 录入与就诊详情 → 混合语义检索 → 管理后台 → CI 自动上传(miniprogram-ci) |
| v1.0.1 | 修复「我的」「管理」页相关问题:TextEncoder 惰性 polyfill(消除管理页白屏)、Switch _num 崩溃规避、用户详情缺失 id 拦截、settings 去除无脑 fetchMe 与全站 requireAuth() 守卫;配套 产品说明书.md 与 产品说明书-CodeReview报告.md |
技术栈
| 维度 | 技术 |
|---|---|
| 框架 | Taro 3.6.35(Webpack5)+ React 18 + TypeScript 5(strict) |
| 状态 | Zustand 4.x(persist + Taro storage 适配) |
| 样式 | Tailwind CSS 3.4 + weapp-tailwindcss 2.11.3(类名转义)+ postcss-rem-to-responsive-pixel(1rem=32rpx,750 设计稿) |
| 组件 | taro-ui 3.1.1(精确锁定) |
| 图表 | echarts 5.x(core 按需引入,LineChart + markLine) |
| 网络 | wx.request / wx.downloadFile(Bearer 鉴权 + 统一响应剥壳);自定义 multipart 上传 |
构建与部署
- 本地开发:
cd miniapp && npm install && npm run dev:weapp;生产构建npm run build:weapp,产物输出至miniapp/dist/(miniprogramRoot已指向)。 - 环境变量:
.env.production的TARO_APP_API_BASE=https://medcord.arutera.top(变更域名仅改此文件)。 - 合法域名(真机/上线必需):微信公众平台将
https://medcord.arutera.top加入 request / uploadFile / downloadFile 三类合法域名。 - CI/CD:push 到 main 触发
.gitea/workflows/deploy-miniapp.yml(miniprogram-ci 自动上传),此处 Gitea 与 Server 共用同一实例。
详细文档
miniapp/README.md— 快速开始 / 目录结构 / 里程碑交付 / FAQminiapp/产品说明书.md— 小程序端产品说明书(v1.0.1:架构 / 模块 / 契约 / 质量)miniapp/产品说明书-CodeReview报告.md— 小程序端 CodeReview 报告(v1.0.1:里程碑 0–8 全量 + 「我的」「管理」修复)miniapp/docs/小程序开发规划.md— 里程碑开发规划与 ADR 记录miniapp/docs/部署与域名配置.md— 上线部署与合法域名配置
AndroidApp
规划中。
iOS-APP
规划中。
许可证
私有项目,未指定开源许可证。