零基础构建企业级健康数字档案馆全流程实操指南
系统架构与技术选型
本指南将带你从零构建一个具备OCR文字识别、对象存储和全文检索能力的健康数字档案馆。为了确保系统的轻量化和高可维护性,我们采用以下技术栈:
- 后端框架: Django 4.2 + Django REST Framework(提供稳健的API接口)
- 前端框架: Vue 3 + Element Plus(现代化UI组件库)
- 对象存储: MinIO(私有云存储方案,兼容S3 API)
- OCR引擎: Tesseract-OCR(开源文字识别,支持中文)
- 数据库: PostgreSQL(存储档案元数据)
环境初始化与依赖安装
在开始编码前,必须先准备好操作系统环境。本指南以Ubuntu 20.04/22.04为例,其他系统请参考对应包管理器命令。
1. 安装系统基础依赖
我们需要安装Python环境、Node.js环境、Tesseract OCR引擎以及Docker。打开终端执行以下命令:
更新源并安装基础工具
sudo apt-get update && sudo apt-get install -y python3.9 python3-pip nodejs npm docker.io docker-compose
安装Tesseract OCR引擎及中文语言包
sudo apt-get install -y tesseract-ocr tesseract-ocr-chi-sim libtesseract-dev
验证安装
tesseract --version
docker --version
2. 启动基础存储服务(MinIO + PostgreSQL)
为了不手动配置复杂的数据库和存储服务,我们使用Docker Compose一键拉起。创建目录health_archive,并在其中创建docker-compose.yml文件,写入以下内容:
version: '3.8'
services:
db:
image: postgres:14
environment:
POSTGRES_DB: health_archive
POSTGRES_USER: admin
POSTGRES_PASSWORD: secret123
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
minio:
image: minio/minio
command: server /data --console-address ":9001"
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadmin
ports:
- "9000:9000"
- "9001:9001"
volumes:
- minio_data:/data
volumes:
postgres_data:
minio_data:
在终端执行sudo docker-compose up -d启动服务。此时,数据库运行在5432端口,MinIO控制台运行在9001端口。
后端核心代码实现
后端负责处理文件上传、调用OCR识别并将文件存入MinIO。
1. 创建Django项目并配置
创建虚拟环境并激活
python3.9 -m venv venv
source venv/bin/activate
安装Python依赖
pip install django djangorestframework django-cors-headers psycopg2-binary Pillow pytesseract minio
创建项目
django-admin startproject backend
cd backend
django-admin startapp archive
2. 配置settings.py
打开backend/settings.py,修改如下配置。注意将INSTALLED_APPS和中间件配置完整,不要省略:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'corsheaders',
'archive', 注册我们的app
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware', 跨域中间件
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
数据库配置(连接Docker中的Postgres)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'health_archive',
'USER': 'admin',
'PASSWORD': 'secret123',
'HOST': '127.0.0.1',
'PORT': '5432',
}
}
允许所有来源跨域(开发环境)
CORS_ALLOW_ALL_ORIGINS = True
媒体文件配置
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
3. 定义数据模型
在archive/models.py中定义健康档案的数据结构:

from django.db import models
class HealthRecord(models.Model):
file_name = models.CharField(max_length=255, verbose_name="文件名称")
upload_time = models.DateTimeField(auto_now_add=True, verbose_name="上传时间")
file_type = models.CharField(max_length=50, verbose_name="文件类型")
ocr_content = models.TextField(blank=True, null=True, verbose_name="OCR识别内容")
minio_path = models.CharField(max_length=500, verbose_name="MinIO存储路径")
class Meta:
db_table = 'health_records'
4. 编写视图逻辑(OCR + 上传)
在archive/views.py中实现核心业务逻辑。这里我们将OCR识别和MinIO上传封装在一起:
import os
import pytesseract
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.parsers import MultiPartParser, FormParser
from django.conf import settings
from minio import Minio
from .models import HealthRecord
初始化MinIO客户端
minio_client = Minio(
"127.0.0.1:9000",
access_key="minioadmin",
secret_key="minioadmin",
secure=False
)
确保存储桶存在
BUCKET_NAME = "health-docs"
if not minio_client.bucket_exists(BUCKET_NAME):
minio_client.make_bucket(BUCKET_NAME)
class FileUploadView(APIView):
parser_classes = (MultiPartParser, FormParser)
def post(self, request, args, kwargs):
file_obj = request.FILES['file']
file_name = file_obj.name
1. OCR识别处理
读取文件内容进行识别
image_content = file_obj.read()
将指针重置,以便后续上传
file_obj.seek(0)
try:
指定中文语言包
text = pytesseract.image_to_string(image_content, lang='chi_sim')
except Exception as e:
text = "OCR识别失败"
2. 上传到MinIO
object_name = f"uploads/{file_name}"
minio_client.put_object(
BUCKET_NAME,
object_name,
file_obj,
length=-1,
part_size=1010241024
)
3. 保存元数据到数据库
record = HealthRecord.objects.create(
file_name=file_name,
file_type=file_name.split('.')[-1],
ocr_content=text,
minio_path=object_name
)
return Response({
"message": "上传成功",
"id": record.id,
"ocr_preview": text[:100] 返回前100字预览
})
5. 配置URL路由
在backend/urls.py中注册路由:
from django.contrib import admin
from django.urls import path
from archive.views import FileUploadView
urlpatterns = [
path('admin/', admin.site.urls),
path('api/upload/', FileUploadView.as_view(), name='file_upload'),
]
执行数据库迁移并启动后端服务:
python manage.py makemigrations
python manage.py migrate
python manage.py runserver
前端交互界面开发
前端使用Vue 3构建,提供简洁的文件上传界面和档案列表展示。
1. 初始化Vue项目
cd ..
npm create vue@latest frontend
cd frontend
npm install element-plus axios
在frontend/src/main.js中完整引入Element Plus:
import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
const app = createApp(App)
app.use(ElementPlus)
app.mount('app')
2. 编写上传组件
直接修改frontend/src/App.vue,实现完整的拖拽上传和列表展示功能:
健康数字档案馆
拖拽医疗影像或报告到此处,或点击上传
已归档列表
3. 启动前端服务
npm run dev
启动服务与验证
至此,所有代码已就绪。请确保以下服务均在运行状态:
- Docker服务: PostgreSQL和MinIO(通过
sudo docker-compose ps查看)。 - 后端服务: Django运行在
http://127.0.0.1:8000。 - 前端服务: Vue运行在
http://localhost:5173(或终端显示的URL)。
实操验证步骤
1. 准备一张包含中文文字的体检报告图片(JPG或PNG格式)。
2. 打开浏览器访问前端地址。
3. 将图片拖拽到上传区域。
4. 观察前端弹出的“归档成功”提示,下方表格应立即显示该文件名,且“OCR识别预览”列应显示图片中的文字内容(如“白细胞计数”、“姓名”等)。
5. 访问 http://127.0.0.1:9001,使用账号minioadmin / minioadmin登录MinIO控制台,进入health-docs存储桶,确认文件已物理存储在对象存储中。
常见问题排查
1. OCR识别返回空内容:请检查系统是否安装了tesseract-ocr-chi-sim语言包,或在pytesseract.image_to_string中显式指定lang='chi_sim'。
2. 连接PostgreSQL失败:确认Docker容器已启动,且settings.py中的HOST端口映射正确。
3. 前端上传网络错误:检查Django的CORS_ALLOW_ALL_ORIGINS是否设置为True,并确认后端已允许跨域访问。