实验室信息管理系统(LIMS)是现代化实验室管理的重要工具,它通过数字化手段解决传统实验室管理中的效率低下、数据易丢失等问题。作为一名长期从事实验室管理工作的技术人员,我深刻体会到一套高效的信息管理系统对科研工作的重要性。
这个基于Django框架开发的实验室信息管理系统,是我在实际工作中经过多次迭代优化的成果。系统采用B/S架构,前端使用Vue.js,后端采用Python+Django,数据库选用MySQL,实现了实验室预约、设备管理、实验数据共享等核心功能。相比市面上一些商业系统,这套开源方案更灵活、成本更低,特别适合高校实验室和小型科研团队使用。
选择Django作为后端框架主要基于以下几个考虑:
前端选择Vue.js是因为:
数据库选用MySQL而非PostgreSQL的原因是:
系统采用典型的三层架构:
表现层:Vue.js构建的SPA应用,通过Axios与后端API交互
业务逻辑层:Django处理核心业务逻辑,包括:
数据访问层:Django ORM + MySQL,实现数据的持久化存储
这种分层架构的优势在于:
预约功能是系统的核心,实现时需要考虑以下几个关键点:
python复制def check_availability(lab_id, start_time, end_time):
"""
检查实验室在指定时间段是否可用
:param lab_id: 实验室ID
:param start_time: 预约开始时间
:param end_time: 预约结束时间
:return: Boolean
"""
overlapping = Appointment.objects.filter(
lab_id=lab_id,
start_time__lt=end_time,
end_time__gt=start_time,
status='approved'
).exists()
return not overlapping
设备管理采用RFID标签+扫码双重识别方式:
python复制class Equipment(models.Model):
STATUS_CHOICES = [
('available', '可用'),
('in_use', '使用中'),
('maintenance', '维护中'),
('retired', '已报废')
]
name = models.CharField(max_length=100)
lab = models.ForeignKey(Lab, on_delete=models.CASCADE)
status = models.CharField(max_length=20, choices=STATUS_CHOICES)
last_calibration = models.DateField()
next_calibration = models.DateField()
实验数据共享功能实现要点:
python复制@permission_required('lab.share_experiment', raise_exception=True)
def share_experiment(request):
# 实验分享视图逻辑
pass
sql复制CREATE TABLE `laboratory` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(100) NOT NULL,
`location` varchar(100) NOT NULL,
`capacity` int NOT NULL,
`description` text,
`status` enum('active','inactive') DEFAULT 'active',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
sql复制CREATE TABLE `appointment` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int NOT NULL,
`lab_id` int NOT NULL,
`start_time` datetime NOT NULL,
`end_time` datetime NOT NULL,
`purpose` text NOT NULL,
`status` enum('pending','approved','rejected','completed','canceled') DEFAULT 'pending',
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `idx_lab_time` (`lab_id`,`start_time`,`end_time`),
KEY `idx_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
python复制# 不好的写法
labs = Lab.objects.all()
for lab in labs:
appointments = Appointment.objects.filter(lab=lab)
# 优化后的写法
labs = Lab.objects.prefetch_related(
Prefetch('appointment_set',
queryset=Appointment.objects.filter(status='approved'))
).all()
python复制class CustomPermissionBackend(ModelBackend):
def has_perm(self, user_obj, perm, obj=None):
if user_obj.is_superuser:
return True
# 自定义权限检查逻辑
return super().has_perm(user_obj, perm, obj)
python复制class AuditLog(models.Model):
user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
action = models.CharField(max_length=100)
ip_address = models.GenericIPAddressField()
timestamp = models.DateTimeField(auto_now_add=True)
details = models.JSONField()
推荐部署方案:
Docker部署示例:
dockerfile复制FROM python:3.9
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
必备监控指标:
常见优化手段:
python复制# settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
'charset': 'utf8mb4',
'connect_timeout': 5,
}
}
}
python复制class LabAdmin(admin.ModelAdmin):
list_display = ('name', 'location', 'status')
list_filter = ('status',)
search_fields = ('name', 'location')
readonly_fields = ('created_at',)
json复制{
"code": 200,
"message": "success",
"data": {...}
}
python复制from django.db import connection
connection.queries # 查看所有执行的SQL
这套实验室信息管理系统经过多个版本的迭代,目前已经稳定运行在多个高校实验室中。系统源代码已开源,包含完整的部署文档和开发指南。
项目资源:
关键依赖版本:
在实际部署和使用过程中,建议先在小规模环境中测试,再逐步推广。对于大型实验室,可以考虑增加Redis缓存和负载均衡来提高系统性能。