综合医院档案培训平台搭建全流程实操指南

一、技术方案选型与环境准备

针对综合医院档案培训场景,我们需要构建一个轻量级、易维护且支持多终端访问的系统。本方案采用 Docker 部署,利用 MySQL 存储档案数据与培训记录,Python Flask 提供后端API服务,Nginx 处理静态资源与反向代理。该架构零依赖宿主机环境,可实现一键部署。

在服务器终端执行以下命令安装 Docker 及 Docker Compose。以 CentOS 7 为例:

```bash 1. 卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest-containerd docker-latest-logrotate docker-logrotate docker-engine 2. 安装必要工具包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 3. 添加 Docker 阿里云镜像源(国内加速) sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 4. 安装 Docker Engine sudo yum install -y docker-ce docker-ce-cli containerd.io 5. 启动 Docker 并设置开机自启 sudo systemctl start docker sudo systemctl enable docker 6. 安装 Docker Compose sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose ```

执行 docker --versiondocker-compose --version 确认安装成功。

二、项目目录结构规划

在服务器 /home 目录下创建项目文件夹 hospital_archive_training,并严格按照以下结构创建子目录和文件:

```text /home/hospital_archive_training/ ├── mysql/ │ └── init.sql 数据库初始化脚本 ├── backend/ │ ├── Dockerfile 后端服务镜像构建文件 │ ├── requirements.txt Python依赖包列表 │ └── app.py Flask 后端核心代码 ├── frontend/ │ ├── nginx.conf Nginx 配置文件 │ └── index.html 前端培训页面 └── docker-compose.yml 容器编排文件 ```

使用命令 mkdir -p /home/hospital_archive_training/{mysql,backend,frontend} 快速创建目录。

三、数据库设计与初始化

创建 mysql/init.sql 文件。该脚本将建立数据库、表结构并插入初始测试数据。设计包含用户表、档案培训内容表和培训记录表。

```sql -- 创建数据库 CREATE DATABASE IF NOT EXISTS hospital_db DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci; USE hospital_db; -- 1. 员工用户表 CREATE TABLE IF NOT EXISTS users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL, real_name VARCHAR(50) NOT NULL, department VARCHAR(50) NOT NULL, role ENUM('admin', 'staff') DEFAULT 'staff' ); -- 2. 档案培训内容表 CREATE TABLE IF NOT EXISTS training_materials ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(100) NOT NULL, category VARCHAR(50) NOT NULL COMMENT '如:病历书写、档案保密、影像归档', content_type ENUM('video', 'document') NOT NULL, url VARCHAR(255) NOT NULL COMMENT '资源链接或相对路径', duration_minutes INT DEFAULT 0 ); -- 3. 培训记录表 CREATE TABLE IF NOT EXISTS training_records ( id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, material_id INT NOT NULL, progress INT DEFAULT 0 COMMENT '观看进度百分比', is_completed BOOLEAN DEFAULT FALSE, score INT DEFAULT NULL COMMENT '考核分数', updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (material_id) REFERENCES training_materials(id) ); -- 插入初始管理员账号 (密码: admin123) INSERT INTO users (username, password, real_name, department, role) VALUES ('admin', 'admin123', '系统管理员', '信息科', 'admin'); -- 插入示例培训数据 INSERT INTO training_materials (title, category, content_type, url, duration_minutes) VALUES ('电子病历规范基础培训', '病历管理', 'video', 'https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_1mb.mp4', 10), ('医院档案保密制度详解', '法律法规', 'document', '/docs/privacy_policy.pdf', 5); ```

四、后端服务开发

创建 backend/requirements.txt,定义依赖环境:

```text flask==2.3.3 flask-cors==4.0.0 pymysql==1.1.0 ```

创建 backend/Dockerfile,定义运行环境:

```dockerfile FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple COPY app.py . CMD ["python", "-u", "app.py"] ```

创建 backend/app.py,编写核心业务逻辑。包含登录验证、获取培训列表、提交学习进度等接口。

```python from flask import Flask, request, jsonify from flask_cors import CORS import pymysql import os app = Flask(__name__) CORS(app) 允许跨域请求 数据库配置(环境变量注入) db_config = { 'host': os.getenv('DB_HOST', 'mysql'), 'user': os.getenv('DB_USER', 'root'), 'password': os.getenv('DB_PASSWORD', 'root'), 'database': os.getenv('DB_NAME', 'hospital_db'), 'cursorclass': pymysql.cursors.DictCursor } def get_db_connection(): return pymysql.connect(db_config) @app.route('/api/login', methods=['POST']) def login(): data = request.json username = data.get('username') password = data.get('password') conn = get_db_connection() try: with conn.cursor() as cursor: sql = "SELECT FROM users WHERE username=%s AND password=%s" cursor.execute(sql, (username, password)) user = cursor.fetchone() if user: 移除密码字段不返回前端 user.pop('password', None) return jsonify({'code': 200, 'data': user, 'msg': '登录成功'}) else: return jsonify({'code': 401, 'msg': '用户名或密码错误'}) finally: conn.close() @app.route('/api/materials', methods=['GET']) def get_materials(): conn = get_db_connection() try: with conn.cursor() as cursor: cursor.execute("SELECT FROM training_materials") materials = cursor.fetchall() return jsonify({'code': 200, 'data': materials}) finally: conn.close() @app.route('/api/progress', methods=['POST']) def update_progress(): data = request.json user_id = data.get('user_id') material_id = data.get('material_id') progress = data.get('progress') is_completed = data.get('is_completed', False) conn = get_db_connection() try: with conn.cursor() as cursor: 检查记录是否存在 check_sql = "SELECT id FROM training_records WHERE user_id=%s AND material_id=%s" cursor.execute(check_sql, (user_id, material_id)) record = cursor.fetchone() if record: update_sql = "UPDATE training_records SET progress=%s, is_completed=%s WHERE user_id=%s AND material_id=%s" cursor.execute(update_sql, (progress, is_completed, user_id, material_id)) else: insert_sql = "INSERT INTO training_records (user_id, material_id, progress, is_completed) VALUES (%s, %s, %s, %s)" cursor.execute(insert_sql, (user_id, material_id, progress, is_completed)) conn.commit() return jsonify({'code': 200, 'msg': '进度已更新'}) finally: conn.close() if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) ```

五、前端页面实现

创建 frontend/nginx.conf,配置 Nginx 反向代理:

```nginx server { listen 80; server_name localhost; 前端静态文件 location / { root /usr/share/nginx/html; index index.html; } API 反向代理到后端容器 location /api/ { proxy_pass http://backend:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } } ```

综合医院档案培训平台搭建全流程实操指南

创建 frontend/index.html,提供一个包含登录、视频播放和进度提交功能的单页应用:

```html 医院档案培训平台

综合医院档案培训系统

欢迎, ()

培训课程列表

```

六、容器编排与一键部署

在项目根目录创建 docker-compose.yml,将所有服务串联起来。这是实现“零门槛落地”的关键配置文件。

```yaml version: '3.8' services: MySQL 数据库服务 mysql: image: mysql:5.7 container_name: hospital_mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: hospital_db volumes: - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql - mysql_data:/var/lib/mysql ports: - "3306:3306" networks: - hospital_net healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost"] interval: 10s timeout: 5s retries: 3 Flask 后端服务 backend: build: ./backend container_name: hospital_backend environment: DB_HOST: mysql DB_USER: root DB_PASSWORD: root DB_NAME: hospital_db depends_on: mysql: condition: service_healthy networks: - hospital_net restart: always Nginx 前端服务 frontend: image: nginx:alpine container_name: hospital_frontend volumes: - ./frontend/index.html:/usr/share/nginx/html/index.html - ./frontend/nginx.conf:/etc/nginx/conf.d/default.conf ports: - "80:80" depends_on: - backend networks: - hospital_net restart: always volumes: mysql_data: networks: hospital_net: driver: bridge ```

确保所有文件路径无误后,在项目根目录执行以下命令启动系统:

```bash 构建并启动所有容器 docker-compose up -d --build 查看运行状态 docker-compose ps ```

七、功能验证与操作说明

部署完成后,打开浏览器访问服务器 IP 地址(如 http://192.168.1.100)。

1. 管理员登录验证

  • 用户名:admin
  • 密码:admin123

登录成功后,页面应显示“系统管理员”及“信息科”,并加载出两条默认培训数据。

2. 视频培训与进度追踪

  • 点击“电子病历规范基础培训”下方的播放按钮。
  • 拖动进度条或播放视频,观察下方状态文本变化。
  • 打开浏览器开发者工具 (F12) -> Network,可以看到向 /api/progress 发送的 POST 请求,Payload 中包含当前的进度百分比。

3. 数据持久化验证

  • 执行 docker-compose restart 重启所有容器。
  • 刷新浏览器页面,重新登录。
  • 进入
AI咨询
热线电话

028-85154420

15388110056

全国售前咨询电话

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

微信扫码关注安答联动

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

安答联动档案管理系统