实验室作为高校教学科研的重要场所,其管理效率直接影响教学质量和科研进度。传统的人工预约方式存在诸多痛点:电话或现场预约耗时耗力、手工记录易出错、信息更新不及时导致资源冲突等。这些问题在高校扩招背景下愈发凸显,亟需信息化解决方案。
本系统旨在构建一个基于B/S架构的实验室预约平台,主要解决以下核心问题:
前端技术组合:
后端技术组合:
数据库选型:
yaml复制spring:
datasource:
hikari:
maximum-pool-size: 20
connection-timeout: 30000
采用分层架构,明确各层职责:
code复制表现层:Vue前端
↑↓ HTTP/JSON
应用层:Spring Boot(Controller)
↑↓ Service接口
业务层:Service实现
↑↓ Mapper接口
持久层:MyBatis + MySQL
核心设计模式:
采用时间片轮询算法防止资源冲突:
java复制public boolean checkTimeConflict(LabAppointment newAppoint) {
List<LabAppointment> exists = appointmentMapper.selectByLabId(
newAppoint.getLabId());
return exists.stream().anyMatch(e ->
!(newAppoint.getEndTime().isBefore(e.getStartTime()) ||
newAppoint.getStartTime().isAfter(e.getEndTime())));
}
实验室表(lab_info):
sql复制CREATE TABLE `lab_info` (
`id` int NOT NULL AUTO_INCREMENT,
`lab_no` varchar(20) NOT NULL COMMENT '实验室编号',
`name` varchar(50) NOT NULL,
`capacity` int DEFAULT '30',
`equipment` json DEFAULT NULL COMMENT '设备配置',
`status` tinyint DEFAULT '0' COMMENT '0-空闲 1-已预约',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_lab_no` (`lab_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
预约记录表(appointment):
sql复制CREATE TABLE `appointment` (
`id` bigint NOT NULL AUTO_INCREMENT,
`lab_id` int NOT NULL,
`user_id` int NOT NULL,
`start_time` datetime NOT NULL,
`end_time` datetime NOT NULL,
`purpose` varchar(200) DEFAULT NULL,
`status` tinyint DEFAULT '0' COMMENT '0-待审核 1-已通过',
`create_time` datetime 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;
mermaid复制sequenceDiagram
学生->>前端: 提交预约表单
前端->>后端: POST /api/appointments
后端->>数据库: 检查时间冲突
数据库-->>后端: 返回检查结果
后端->>Redis: 缓存新预约
alt 无冲突
后端-->>前端: 返回成功
前端->>学生: 显示预约成功
else 有冲突
后端-->>前端: 返回错误提示
前端->>学生: 显示冲突提示
end
java复制public enum ApproveState {
PENDING(0) {
@Override
public ApproveState nextState() {
return APPROVED;
}
},
APPROVED(1) {
@Override
public ApproveState nextState() {
return this;
}
};
// 状态转换逻辑
public abstract ApproveState nextState();
}
基于协同过滤算法,根据历史预约记录推荐适合的实验室:
python复制# 伪代码示例
def recommend_labs(user_id):
user_history = get_user_history(user_id)
similar_users = find_similar_users(user_history)
return aggregate_recommendations(similar_users)
使用WebSocket实现实验室状态实时更新:
javascript复制// 前端代码
const socket = new WebSocket('wss://lab.example.com/status');
socket.onmessage = (event) => {
const data = JSON.parse(event.data);
updateLabStatus(data);
};
sql复制EXPLAIN SELECT * FROM appointment
WHERE lab_id=101 AND start_time>'2023-01-01';
dockerfile复制FROM openjdk:11-jre
COPY target/lab-system.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
压力测试数据(JMeter):
| 并发用户数 | 平均响应时间 | 错误率 |
|---|---|---|
| 100 | 235ms | 0% |
| 500 | 812ms | 0.2% |
| 1000 | 1.5s | 1.8% |
时间处理坑点:
必须统一使用UTC时间存储,前端展示时转换时区
java复制@JsonFormat(timezone = "GMT+8")
private LocalDateTime startTime;
并发控制方案:
sql复制SELECT * FROM lab_info WHERE id=101 FOR UPDATE;
缓存更新策略:
采用Cache Aside Pattern,先更新数据库再删除缓存
code复制src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── lab/
│ │ ├── config/ # 配置类
│ │ ├── controller/ # 控制器
│ │ ├── service/ # 服务层
│ │ ├── mapper/ # MyBatis接口
│ │ └── entity/ # 实体类
│ └── resources/
│ ├── static/ # 静态资源
│ └── application.yml # 配置文件
└── test/ # 测试代码
提示:系统开发中要特别注意预约状态的原子性操作,建议使用数据库事务+乐观锁机制确保数据一致性。在实际部署时,Nginx配置需要增加WebSocket支持。