项目随笔
HTML实践代码分析:

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

下面解释一下一段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等后端文件形如

刚才那一串前端代码有对应如下后端
@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
)

浙公网安备 33010602011771号