团队项目冲刺4--Day4
团队项目冲刺4--Day4
一、一、今日站立式会议照片

二、昨日已完成内容
| 成员 | 完成内容 | Work Item |
|---|---|---|
| 宋可月 | 预约 API 数据结构设计 | T-10 |
| 齐畅 | 场馆详情页与后台接口联通 | T-8 |
| 颜宏宇 | 完成数据库驱动版本场馆 API | T-6 |
| 戴清 | 完成预约表结构 + 唯一约束 | T-9 |
| 缪子睿 | 场馆 API 测试执行完毕 | T-20 |
| 曹伟斌 | 邮件发送模块研究完成 | T-19 |
| 赖彦彤 | 场馆 UI 页面优化 | T-7 |
三、今日计划工作
| 成员 | 今日任务 | Work Item |
|---|---|---|
| 宋可月 | 实现预约创建 API + 冲突检测 | T-10 |
| 齐畅 | 创建预约页面 UI 实现 | T-13 |
| 颜宏宇 | 预约查询 API | T-14 |
| 戴清 | 数据库索引优化、唯一索引验证 | T-9 |
| 缪子睿 | 预约模块测试用例初版 | T-20 |
| 曹伟斌 | 邮件发送绑定预约成功流程 | T-19 |
| 赖彦彤 | 预约页面 UI 联调 | T-13 |
四、今日遇到的困难
1️⃣ 冲突检测逻辑复杂度远超预期(宋可月)
预约冲突需要同时满足:
同一场馆
同一天
时间段交叉就算冲突(即便不是完全重叠)
必须支持判断:
A.start < B.end AND B.start < A.end
已成功加入 SQLAlchemy 查询。
2️⃣ 数据库唯一约束需要考虑时间段组合(戴清)
SQLAlchemy 不支持 Time 类型的组合索引自动比较,
但 MySQL / SQLite 都支持。
已测试成功。
3️⃣ 前端时间选择器与后端 Time 格式不统一(齐畅)
前端是 "09:00" 字符串
后端需要 datetime.time 对象
解决:后端统一用 "HH:MM" 字符串解析
4️⃣ 邮件模板需要补充预约详情(曹伟斌)
例如:
场馆名称
日期
时间段
费用
五、燃尽图

六、新增代码
- routes/reservation.py(核心:预约创建 + 冲突检测)
from flask import Blueprint, request
from datetime import datetime, time
from flask_jwt_extended import jwt_required, get_jwt_identity
from extensions import db
from models import Reservation, Venue
reservation_bp = Blueprint("reservation", __name__)
def parse_time(tstr):
# "09:00" → time(9, 0)
return datetime.strptime(tstr, "%H:%M").time()
@reservation_bp.post("/")
@jwt_required()
def create_reservation():
uid = get_jwt_identity()["id"]
data = request.json
venue_id = data.get("venue_id")
date_str = data.get("date")
start = parse_time(data.get("start"))
end = parse_time(data.get("end"))
date_obj = datetime.strptime(date_str, "%Y-%m-%d").date()
# 查询冲突预约
conflict = Reservation.query.filter(
Reservation.venue_id == venue_id,
Reservation.date == date_obj,
Reservation.start_time < end,
Reservation.end_time > start
).first()
if conflict:
return {"msg": "Time slot already booked"}, 400
venue = Venue.query.get_or_404(venue_id)
# 简单计费逻辑(按小时)
duration_hours = (datetime.combine(date_obj, end) -
datetime.combine(date_obj, start)).seconds / 3600
price = duration_hours * venue.price_student
reservation = Reservation(
user_id=uid,
venue_id=venue_id,
date=date_obj,
start_time=start,
end_time=end,
price=price
)
db.session.add(reservation)
db.session.commit()
return {
"msg": "Reservation created",
"reservation_id": reservation.id,
"price": price
}, 200
七、每日总结
宋可月: 预约冲突逻辑终于写完,系统跑顺了!
齐畅: 页面逻辑已经清楚,准备接入真实 API。
颜宏宇: 查询 API 基本成型。
戴清: 表结构成功支撑预约逻辑,满意。
缪子睿: 预约的测试点比预想多,会继续补充。
曹伟斌: 邮件整合环节明天尝试跑通。
赖彦彤: 前端预定页面布局越来越合理了。
浙公网安备 33010602011771号