diff --git a/app/__init__.py b/app/__init__.py index 10e84e9..67247c1 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -154,6 +154,25 @@ def create_app(): {"new_cat": new_cat, "old_cat": old_cat} ) db.session.commit() + + # 检查student_goals表是否有新字段 + result8 = db.session.execute(text("PRAGMA table_info(student_goals)")) + sg_columns = [row[1] for row in result8] + if "start_date" not in sg_columns: + db.session.execute(text("ALTER TABLE student_goals ADD COLUMN start_date TIMESTAMP")) + db.session.commit() + if "assessment_date" not in sg_columns: + db.session.execute(text("ALTER TABLE student_goals ADD COLUMN assessment_date TIMESTAMP")) + db.session.commit() + if "achievement_date" not in sg_columns: + db.session.execute(text("ALTER TABLE student_goals ADD COLUMN achievement_date TIMESTAMP")) + db.session.commit() + if "comment" not in sg_columns: + db.session.execute(text("ALTER TABLE student_goals ADD COLUMN comment TEXT")) + db.session.commit() + # 删除不再使用的字段 + # deadline 和 completed_at 已被 start_date, assessment_date, achievement_date 取代 + # status 字段现在由日期计算,不再存储 except Exception as e: print(f"数据库迁移: {e}") diff --git a/app/models.py b/app/models.py index 19ad9ad..e2a8fe4 100644 --- a/app/models.py +++ b/app/models.py @@ -235,25 +235,43 @@ class StudentGoal(db.Model): id = db.Column(db.Integer, primary_key=True) student_id = db.Column(db.Integer, db.ForeignKey("students.id"), nullable=False) goal_id = db.Column(db.Integer, db.ForeignKey("goals.id"), nullable=False) - status = db.Column(db.String(20), default="未开始") # 未开始/进行中/已完成 - mastery_level = db.Column(db.Integer, default=1) # 1-5 - deadline = db.Column(db.DateTime) - completed_at = db.Column(db.DateTime) + start_date = db.Column(db.DateTime) # 开始日期 + assessment_date = db.Column(db.DateTime) # 评估日期 + mastery_level = db.Column(db.Integer, nullable=True) # 掌握程度 1-5(评估时填写) + achievement_date = db.Column(db.DateTime, nullable=True) # 达成日期 + comment = db.Column(db.Text, nullable=True) # 评语 created_at = db.Column(db.DateTime, default=datetime.now) student = db.relationship("Student", backref="goal_records") goal = db.relationship("Goal") + def get_status(self): + """根据日期自动计算状态""" + from datetime import datetime + now = datetime.now() + if self.start_date and now < self.start_date: + return "未开始" + elif self.assessment_date and now > self.assessment_date: + return "已结束" + else: + return "进行中" + def to_dict(self): + status = self.get_status() return { "id": self.id, "student_id": self.student_id, "goal_id": self.goal_id, "goal_name": self.goal.name if self.goal else None, - "status": self.status, + "goal_level": self.goal.level if self.goal else None, + "goal_category": self.goal.category if self.goal else None, + "status": status, + "start_date": self.start_date.isoformat() if self.start_date else None, + "assessment_date": self.assessment_date.isoformat() if self.assessment_date else None, "mastery_level": self.mastery_level, - "deadline": self.deadline.isoformat() if self.deadline else None, - "completed_at": self.completed_at.isoformat() if self.completed_at else None, + "achievement_date": self.achievement_date.isoformat() if self.achievement_date else None, + "comment": self.comment, + "created_at": self.created_at.isoformat() if self.created_at else None, } diff --git a/app/routes/student_goals.py b/app/routes/student_goals.py index 7f5ee92..6b857c2 100644 --- a/app/routes/student_goals.py +++ b/app/routes/student_goals.py @@ -1,13 +1,34 @@ from flask import Blueprint, request, jsonify from app.models import db, StudentGoal, Goal from app.routes.auth import login_required_json +from datetime import datetime, timedelta student_goals_bp = Blueprint("student_goals", __name__) +def compute_status(start_date, assessment_date): + """根据日期计算状态""" + now = datetime.now() + if start_date and now < start_date: + return "未开始" + elif assessment_date and now > assessment_date: + return "已结束" + else: + return "进行中" + @student_goals_bp.route("/api/students//goals", methods=["GET"]) @login_required_json def get_student_goals(student_id): records = StudentGoal.query.filter_by(student_id=student_id).all() + + # 计算状态并排序 + def sort_key(r): + status_order = {"进行中": 1, "未开始": 2, "已结束": 3} + status = compute_status(r.start_date, r.assessment_date) + order = status_order.get(status, 4) + assessment = r.assessment_date if r.assessment_date else datetime.min + return (order, -assessment.timestamp() if assessment else 0) + + records.sort(key=sort_key) return jsonify([r.to_dict() for r in records]) @student_goals_bp.route("/api/students//goals", methods=["POST"]) @@ -25,12 +46,28 @@ def assign_goal(student_id): if existing: return jsonify({"error": "目标已分配"}), 400 + # 处理评估日期 + assessment_date = None + if data.get("assessment_date"): + # 直接指定日期 + assessment_date = datetime.fromisoformat(data["assessment_date"]) + elif data.get("assessment_days"): + # 指定天数后 + assessment_date = datetime.now() + timedelta(days=int(data["assessment_days"])) + + # 处理开始日期 + start_date = None + if data.get("start_date"): + start_date = datetime.fromisoformat(data["start_date"]) + # 如果没有指定开始日期,默认为当前时间 + elif data.get("start_now"): + start_date = datetime.now() + record = StudentGoal( student_id=student_id, goal_id=data["goal_id"], - status=data.get("status", "未开始"), - mastery_level=data.get("mastery_level", 1), - deadline=data.get("deadline") + start_date=start_date, + assessment_date=assessment_date ) db.session.add(record) db.session.commit() @@ -42,15 +79,25 @@ def update_student_goal(student_id, goal_id): record = StudentGoal.query.filter_by(student_id=student_id, goal_id=goal_id).first_or_404() data = request.get_json() - if "status" in data: - record.status = data["status"] - if data["status"] == "已完成" and not record.completed_at: - from datetime import datetime - record.completed_at = datetime.now() + if "start_date" in data: + if data["start_date"]: + record.start_date = datetime.fromisoformat(data["start_date"]) + else: + record.start_date = None + if "assessment_date" in data: + if data["assessment_date"]: + record.assessment_date = datetime.fromisoformat(data["assessment_date"]) + else: + record.assessment_date = None if "mastery_level" in data: record.mastery_level = data["mastery_level"] - if "deadline" in data: - record.deadline = data["deadline"] + if "achievement_date" in data: + if data["achievement_date"]: + record.achievement_date = datetime.fromisoformat(data["achievement_date"]) + else: + record.achievement_date = None + if "comment" in data: + record.comment = data["comment"] db.session.commit() return jsonify(record.to_dict()) @@ -61,4 +108,4 @@ def remove_student_goal(student_id, goal_id): record = StudentGoal.query.filter_by(student_id=student_id, goal_id=goal_id).first_or_404() db.session.delete(record) db.session.commit() - return jsonify({"message": "移除成功"}) \ No newline at end of file + return jsonify({"message": "移除成功"}) diff --git a/app/templates/student.html b/app/templates/student.html index bb1cf5a..ac77ae5 100644 --- a/app/templates/student.html +++ b/app/templates/student.html @@ -254,7 +254,7 @@