为了满足教学楼、楼层和教室数量不固定的条件,同时实现教室使用状态的时间段管理,我采用了一种灵活且可扩展的数据库设计方案。
1. 数据库表结构设计
基于微信小程序云开发的特点,我这里使用 MongoDB 文档型数据库来存储数据。以下是针对教室预约功能的核心表结构设计。
(1)USERS 集合 - 用户信息
用于存储用户的基本信息和权限。
{
"_id": "user_001", // 唯一标识符
"openid": "oxxxxxxxxxxxxxxx", // 微信用户的唯一标识
"name": "张三", // 用户姓名
"role": "student" // 用户角色(学生、教师或其他)
}
(2)BUILDINGS 集合 - 教学楼信息
记录所有教学楼的相关信息。
{
"_id": "building_A", // 唯一标识符
"name": "A栋教学楼", // 教学楼名称
"floors_count": 5, // 楼层数量
"description": "位于校园东侧的教学楼" // 描述信息
}
(3)FLOORS 集合 - 楼层信息
记录每层楼的具体信息。
{
"_id": "floor_A1", // 唯一标识符
"number": 1, // 楼层数字编号
"building_id": "building_A", // 所属教学楼ID
"classrooms_count": 10 // 该楼层教室总数
}
(4)CLASSROOMS 集合 - 教室信息
详细记录每个教室的情况,包括容量、设备配置以及时间安排。
{
"_id": "room_A101", // 唯一标识符
"name": "多媒体教室101", // 教室名称
"capacity": 50, // 容纳人数
"equipment": ["投影仪", "音响"], // 设备清单
"floor_id": "floor_A1", // 所属楼层ID
"schedule": [ // 时间段安排
{
"date": "2023-11-01", // 使用日期
"time_slots": [ // 时间段列表
{"start_time": "08:00", "end_time": "09:00", "status": "available"}, // 可用
{"start_time": "09:00", "end_time": "10:00", "status": "booked"} // 已预订
]
},
{
"date": "2023-11-02",
"time_slots": [
{"start_time": "10:00", "end_time": "11:00", "status": "booked"},
{"start_time": "11:00", "end_time": "12:00", "status": "available"}
]
}
]
}
(5)RESERVATIONS 集合 - 预约记录
保存每次预约的历史记录。
{
"_id": "reservation_001", // 唯一标识符
"user_id": "user_001", // 预约用户ID
"classroom_id": "room_A101", // 教室ID
"date": "2023-11-01", // 预约日期
"time_slot": { // 预约时间段
"start_time": "09:00",
"end_time": "10:00"
},
"purpose": "课程考试", // 预约用途
"created_at": "2023-10-25T14:30:00Z" // 创建时间
}
2. 数据完善策略
为了使数据库更加实用和完善,可以从以下几个方面入手:
(1)初始化基础数据
在项目启动阶段,预先录入一些必要的基础数据,例如教学楼、楼层和教室的基础信息。这些数据可以通过批量导入脚本完成。
// 初始化教学楼数据
const buildingsData = [
{ _id: "building_A", name: "A栋教学楼", floors_count: 5, description: "..." },
{ _id: "building_B", name: "B栋教学楼", floors_count: 7, description: "..." }
];
db.collection('buildings').add(buildingsData);
(2)动态更新时间安排
每天定时运行任务,清理过期的时间段状态,并重新设置默认为空闲状态。
// 清理过期时间段
db.collection('classrooms').updateMany({}, {
$pull: {
schedule: { date: { $lt: new Date().toISOString().split('T')[0] } }
}
});
// 添加新日期,默认状态为可用
db.collection('classrooms').updateMany({}, {
$push: {
schedule: {
date: new Date().toISOString().split('T')[0],
time_slots: [
{ start_time: "08:00", end_time: "09:00", status: "available" },
{ start_time: "09:00", end_time: "10:00", status: "available" }
]
}
}
});
(3)用户反馈机制
允许用户提交关于教室设施或预约过程中的问题反馈,以便及时改进系统。
{
"_id": "feedback_001",
"user_id": "user_001",
"content": "多媒体教室101的投影仪无法正常使用。",
"created_at": "2023-10-26T10:00:00Z"
}
3. 功能实现的关键点
-
用户认证:通过
wx.login
接口获取用户的 OpenID,并将其与用户信息绑定。 -
教室查询:提供按条件筛选的功能,例如按照教学楼、楼层、容纳人数等过滤教室。
-
时间选择:利用
<picker>
组件让用户选择具体的日期和时间段,并验证所选时间段是否冲突。