零基础构建企业级健康数字档案馆全流程实操指南

系统架构与技术选型

本指南将带你从零构建一个具备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

启动服务与验证

至此,所有代码已就绪。请确保以下服务均在运行状态:

  1. Docker服务: PostgreSQL和MinIO(通过sudo docker-compose ps查看)。
  2. 后端服务: Django运行在 http://127.0.0.1:8000
  3. 前端服务: 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,并确认后端已允许跨域访问。

AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

扫码咨询
安答联动微信公众号二维码

微信扫码关注安答联动

申请试用
热线电话
申请试用

安答联动档案管理系统