这个基于Python+Flask的医院设备报修系统,是我在医疗信息化领域的一次重要实践。系统采用前后端分离架构,后端使用Flask框架构建RESTful API,前端采用Vue.js实现动态交互界面,数据库选用MySQL进行数据存储。整个开发过程使用PyCharm作为主要IDE,配合Navicat进行数据库管理。
这个系统主要解决了医院设备管理中的几个痛点问题:
系统特别适合200-500张床位的中小型医院使用,因为这类医疗机构通常信息化程度不高,但又迫切需要提升运营效率。我们采用了轻量级的Flask框架而非更重的Django,就是考虑到中小医院IT资源有限,需要更灵活、更节省资源的解决方案。
报修流程是系统的核心功能,我们设计了多级分类的报修表单:
技术实现上,后端使用Flask-SQLAlchemy定义数据模型:
python复制class RepairOrder(db.Model):
__tablename__ = 'repair_orders'
id = db.Column(db.Integer, primary_key=True)
device_id = db.Column(db.Integer, db.ForeignKey('devices.id'))
reporter_id = db.Column(db.Integer, db.ForeignKey('users.id'))
description = db.Column(db.Text)
urgency = db.Column(db.Integer) # 1-普通, 2-紧急, 3-危急
status = db.Column(db.Integer) # 0-待受理, 1-处理中, 2-已完成
created_at = db.Column(db.DateTime, default=datetime.utcnow)
关键设计点:紧急程度不仅影响界面显示颜色,还会触发不同的通知机制。危急级别的工单会同时短信通知科室主任和设备科长。
工单状态机设计是另一个技术难点。我们实现了以下状态流转:
前端使用Vuex管理状态,关键代码如下:
javascript复制// store/modules/repair.js
const mutations = {
UPDATE_STATUS(state, { orderId, newStatus }) {
const order = state.orders.find(o => o.id === orderId)
if (order) {
// 验证状态流转是否合法
if (validStatusTransition(order.status, newStatus)) {
order.status = newStatus
}
}
}
}
虽然主要使用Flask,但我们引入了Django的ORM来处理复杂报表,因为它的聚合查询功能更强大。例如计算各科室设备故障率:
python复制from django.db.models import Count, F
def department_failure_rate():
return (RepairOrder.objects
.values('device__department__name')
.annotate(
total_devices=Count('device', distinct=True),
failure_count=Count('id'),
rate=F('failure_count')/F('total_devices')
)
.order_by('-rate'))
我们采用Blueprint组织API路由,保持代码模块化:
python复制# api/repair.py
repair_bp = Blueprint('repair', __name__)
@repair_bp.route('/orders', methods=['POST'])
@jwt_required()
def create_order():
current_user = get_jwt_identity()
data = request.get_json()
# 数据验证逻辑...
order = RepairOrder(reporter_id=current_user, **data)
db.session.add(order)
db.session.commit()
return jsonify(order.to_dict()), 201
安全措施包括:
前端采用Vue CLI创建项目,主要优化点:
javascript复制const RepairList = () => import('./views/RepairList.vue')
javascript复制// utils/api.js
const api = axios.create({
baseURL: process.env.VUE_APP_API_URL
})
api.interceptors.response.use(
response => response.data,
error => {
if (error.response.status === 401) {
store.dispatch('logout')
}
return Promise.reject(error)
}
)
MySQL表设计遵循以下原则:
sql复制CREATE TABLE `devices` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`model` varchar(50) DEFAULT NULL,
`department_id` int(11) NOT NULL,
`purchase_date` date DEFAULT NULL,
`status` tinyint(4) DEFAULT '1',
PRIMARY KEY (`id`),
KEY `idx_department` (`department_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
推荐使用PyCharm Professional版,配置步骤:
pip install -r requirements.txtcd frontend && npm run serveflask run --reload我们提供两种部署方案:
方案一:传统服务器部署
nginx复制server {
listen 80;
server_name yourdomain.com;
location / {
root /var/www/frontend/dist;
try_files $uri $uri/ /index.html;
}
location /api {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
}
}
方案二:Docker容器化部署
dockerfile复制# backend/Dockerfile
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "-w 4", "-b :5000", "wsgi:app"]
问题: 工单列表加载缓慢
解决方案:
EXPLAIN SELECT * FROM repair_orders WHERE status=1开发环境下常见跨域问题,后端需要配置CORS:
python复制from flask_cors import CORS
def create_app():
app = Flask(__name__)
CORS(app, resources={
r"/api/*": {
"origins": ["http://localhost:8080"],
"methods": ["GET", "POST", "PUT", "DELETE"],
"allow_headers": ["Authorization", "Content-Type"]
}
})
return app
建议的备份策略:
mysqldump -u root -p hospital_db > backup.sqlpython复制import subprocess
from datetime import datetime
def backup_database():
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
filename = f'backup_{timestamp}.sql'
cmd = f'mysqldump -u root -pYOUR_PASSWORD hospital_db > {filename}'
subprocess.run(cmd, shell=True, check=True)
系统设计时已考虑扩展性,以下是几个可行的扩展方向:
技术实现上,建议:
这个项目从技术选型到架构设计都充分考虑了医疗行业的特殊需求,在实际部署中已经帮助多家医院提升了设备管理效率。开发过程中最大的体会是:医疗信息化系统必须在功能完备性和操作简便性之间找到平衡点,因为最终用户(医护人员)往往没有太多时间学习复杂系统。