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

二、项目燃尽图

三、昨日已完成的工作
| 成员 | 昨日完成内容 | Work Item |
|---|---|---|
| 宋可月 | 完成后端项目骨架、启动配置、基础蓝图结构 | T-1 |
| 齐畅 | 完成登录 / 注册页面初版 UI | T-4 |
| 颜宏宇 | 场馆模块 API 的接口结构草稿 | T-6 |
| 戴清 | 完成 users 表结构设计与 ER 图初版 | T-2 |
| 缪子睿 | 测试文档架构搭建,用例模板建立 | T-23 |
| 曹伟斌 | 完成 Flask-Mail 初始配置 + 发送测试邮件 | T-18 |
| 赖彦彤 | 场馆列表 UI 草稿设计 | T-7 |
四、今日计划完成的工作
| 成员 | 今日任务 | Work Item |
|---|---|---|
| 宋可月 | 实现注册/登录接口、加密、JWT | T-3 |
| 齐畅 | 前端表单校验、联调注册 API | T-4 |
| 颜宏宇 | 实现场馆 API(测试数据) | T-6 |
| 戴清 | 设计 venues、reservations 表结构 | T-5, T-9 |
| 缪子睿 | 登录/注册用例设计、Postman 集合初始化 | T-20 |
| 曹伟斌 | 封装 send_mail() 函数 | T-18 |
| 赖彦彤 | 开发场馆详情页框架 | T-8 |
五、今日遇到的困难
-
JWT 登录过期配置冲突(宋可月)
SECRET_KEY 与 JWT_SECRET_KEY 没区分导致验证失败
解决:拆分配置 + 单独创建 jwt.py 管理 -
前端联调出现 CORS 错误(齐畅)
Flask 未添加 CORS
解决:pip install flask-cors → 后端添加 CORS(app) -
场馆收费字段较多(戴清)
学生收费、教师免费、时段收费不同
计划先固定逻辑,Beta 再扩展 -
邮件模块中文乱码(曹伟斌)
邮件头字符集缺失
解决:加入 UTF-8 MIMEText 设置
六、最新模块代码
- app.py
from flask import Flask
from flask_cors import CORS
from extensions import db, migrate, jwt, mail
from config import Config
def create_app():
app = Flask(__name__)
app.config.from_object(Config)
# init extensions
db.init_app(app)
migrate.init_app(app, db)
jwt.init_app(app)
mail.init_app(app)
CORS(app)
# register blueprints
from routes.auth import auth_bp
from routes.venue import venue_bp
app.register_blueprint(auth_bp, url_prefix="/api/auth")
app.register_blueprint(venue_bp, url_prefix="/api/venues")
@app.route("/")
def home():
return {"msg": "Sports Venue Reservation System Backend Running"}
return app
if __name__ == "__main__":
app = create_app()
app.run(debug=True)
- models.py
from extensions import db
from werkzeug.security import generate_password_hash, check_password_hash
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80))
email = db.Column(db.String(120), unique=True, nullable=False)
password_hash = db.Column(db.String(200))
role = db.Column(db.String(20), default="student") # student / teacher / admin
def set_password(self, raw):
self.password_hash = generate_password_hash(raw)
def check_password(self, raw):
return check_password_hash(self.password_hash, raw)
- routes/auth.py(注册 & 登录 API)
from flask import Blueprint, request
from extensions import db
from models import User
from flask_jwt_extended import create_access_token
auth_bp = Blueprint("auth", __name__)
@auth_bp.post("/register")
def register():
data = request.json
email = data.get("email")
pwd = data.get("password")
role = data.get("role", "student")
if User.query.filter_by(email=email).first():
return {"msg": "Email already exists"}, 400
user = User(email=email, name=data.get("name"), role=role)
user.set_password(pwd)
db.session.add(user)
db.session.commit()
return {"msg": "Register success"}, 200
@auth_bp.post("/login")
def login():
data = request.json
email = data.get("email")
pwd = data.get("password")
user = User.query.filter_by(email=email).first()
if not user or not user.check_password(pwd):
return {"msg": "Invalid credentials"}, 401
token = create_access_token(identity={"id": user.id, "role": user.role})
return {"token": token, "role": user.role}, 200
- routes/venue.py(场馆 API – Day2 版本仅返回测试数据)
from flask import Blueprint
venue_bp = Blueprint("venue", __name__)
@venue_bp.get("/")
def list_venues():
return {
"venues": [
{"id": 1, "name": "羽毛球馆", "price_student": 10, "free_for_teacher": True},
{"id": 2, "name": "篮球馆", "price_student": 12, "free_for_teacher": True},
]
}
@venue_bp.get("/<int:vid>")
def venue_detail(vid):
return {
"id": vid,
"name": "羽毛球馆" if vid == 1 else "篮球馆",
"location": "体育中心一楼",
"open_time": "08:00 - 22:00",
"price_student": 10,
"free_for_teacher": True,
"description": "场馆示例信息,用于前端联调"
}
七、每日总结
宋可月: 用户模块已跑通,明天进入鉴权 & 会话保护。
齐畅: 前端表单已经顺畅,准备和后端联调。
颜宏宇: 场馆 API 已成型,明天接数据库。
戴清: 表结构定了,预约表字段较多但清晰了。
缪子睿: 登录测试用例已准备完毕,等待联调。
曹伟斌: 邮件模块异常处理还需完善。
赖彦彤: 场馆详情页面基本结构可用了。
浙公网安备 33010602011771号