项目随笔

HTML实践代码分析:

image
这么写相当于模板的继承,比如里面是一个基本框架,直接引用

逻辑
 
        ![image](https://img2024.cnblogs.com/blog/2448947/202507/2448947-20250710120140249-30472220.png)
  

下面解释一下一段html代码

<!-- 成绩表格 -->
    <div class="table-container">
        {% if results %}//这里是判断flask后端的result中是否有数据,这个带%的意思是进行逻辑判断
        <table class="grade-table">
            <thead>
                <tr>
                    <th>序号</th>
                    <th>学科名称</th>
                    <th>考试名称</th>
                    <th>考试时间</th>
                    <th>成绩</th>
                </tr>
            </thead>
            <tbody>
                {% for record in results %}//这个record是一个自定义循环变量名,在循环里调用后端变量在前面需要加一个record.
                <tr {% if record.grade < 60 %}class="warning-row"{% endif %}>
                    <td>{{ loop.index }}</td>//像这个不带%并且多一重{},意思就是直接td显示loop.index的内容 
                    <td>
                        {{ record.subject_name }}
                        {% if record.subject_name in warning_subjects %}
                        <span class="warning-badge">挂科预警</span>
                        {% endif %}//这个是of逻辑判断的结束标志
                    </td>
                    <td>{{ record.test_name }}</td>
                    <td>{{ record.test_time }}</td>
                    <td {% if record.grade < 60 %}class="warning-cell"{% endif %}>
                        {{ record.grade }}
                        {% if record.grade < 60 %}(不及格){% endif %}
                    </td>
                </tr>
                {% endfor %}//结束for
            </tbody>
        </table>
        {% else %}
        <div class="empty-state">
            <i class="fas fa-file-alt"></i>
            <h3>没有找到成绩记录</h3>
            <p>当前筛选条件下没有找到成绩记录,请尝试其他筛选条件</p>
        </div>

result等后端文件形如
image

刚才那一串前端代码有对应如下后端

@app.route('/stu_ps_grade', methods=['GET'])
def stu_ps_grade():
    # 检查学生是否登录
    if session.get("login") != 'OK' or session.get("role") != 'student':
        flash("请先登录学生账号", "danger")
        return redirect('/')

    # 获取当前学生ID
    student_id = session.get('student_id')
    if not student_id:
        flash("无法获取学生信息", "danger")
        return redirect('/')

    # 初始化变量
    warning_subjects = set()  # 挂科科目
    subjects = []  # 所有学科列表
    results = []  # 成绩记录
    total_records = 0
    warning_count = 0
    student_name = ""  # 学生姓名

    # 获取筛选参数
    subject_name_filter = request.args.get('subject_name', '')
    test_name_filter = request.args.get('test_name', '')
    warning_filter = request.args.get('warning', '')

    # 构建基础查询 - 使用联合查询获取学生姓名
    base_sql = """
    SELECT 
        g.id,
        g.subject_name,
        g.test_name,
        g.test_time,
        g.grade,
        s.student_name AS student_name
    FROM ps_grade g
    JOIN students_infos s ON g.student_id = s.student_id
    WHERE g.student_id = %s
    """
    params = [student_id]
    conditions = []

    # 添加筛选条件
    if subject_name_filter:
        conditions.append("g.subject_name LIKE %s")
        params.append(f"%{subject_name_filter}%")

    if test_name_filter:
        conditions.append("g.test_name LIKE %s")
        params.append(f"%{test_name_filter}%")

    # 挂科预警条件
    if warning_filter == 'true':
        conditions.append("g.grade < 60")

    # 构建完整查询
    if conditions:
        base_sql += " AND " + " AND ".join(conditions)
    base_sql += " ORDER BY g.test_time DESC"

    # 从连接池获取连接
    db = db_pool.connection()
    try:
        # 使用DictCursor
        with db.cursor(DictCursor) as cursor:
            # 执行主查询
            cursor.execute(base_sql, params)
            results = cursor.fetchall()

            # 获取学生姓名(从第一条记录中获取)
            if results:
                student_name = results[0]['student_name']

            # 获取挂科科目
            warning_sql = """
            SELECT DISTINCT g.subject_name 
            FROM ps_grade g
            WHERE g.student_id = %s AND g.grade < 60
            """
            cursor.execute(warning_sql, (student_id,))
            warning_results = cursor.fetchall()
            warning_subjects = {row['subject_name'] for row in warning_results}

            # 获取所有学科
            subjects_sql = """
            SELECT DISTINCT g.subject_name 
            FROM ps_grade g
            WHERE g.student_id = %s
            """
            cursor.execute(subjects_sql, (student_id,))
            subject_results = cursor.fetchall()
            subjects = [row['subject_name'] for row in subject_results]

            # 获取记录总数
            count_sql = """
            SELECT COUNT(*) as total 
            FROM ps_grade g
            WHERE g.student_id = %s
            """
            cursor.execute(count_sql, (student_id,))
            total_row = cursor.fetchone()
            total_records = total_row['total'] if total_row else 0

            # 获取挂科科目数量
            warning_count_sql = """
            SELECT COUNT(DISTINCT g.subject_name) as warning_total 
            FROM ps_grade g
            WHERE g.student_id = %s AND g.grade < 60
            """
            cursor.execute(warning_count_sql, (student_id,))
            warning_row = cursor.fetchone()
            warning_count = warning_row['warning_total'] if warning_row else 0

    except Exception as e:
        app.logger.error(f"数据库操作错误: {str(e)}")
        flash(f"数据库操作错误: {str(e)}", "danger")
    finally:
        db.close()

    return render_template(//这里的内容实际就是把后端变量给与对应的前端名字,当前端调用时能在后端找到对应值.后端==前端
        'stu_ps_grade.html',
        results=results,
        warning_subjects=warning_subjects,
        subjects=subjects,
        student_id=student_id,
        student_name=student_name,  # 传递学生姓名到模板
        filter_subject_name=subject_name_filter,
        filter_test_name=test_name_filter,
        filter_warning=warning_filter,
        total_records=total_records,
        warning_count=warning_count
    )
posted @ 2025-07-10 12:02  暂未成功人士  阅读(10)  评论(0)    收藏  举报