智能排课系统,集成AI智能算法与教务管理需求,支持自定义排课规则(教师课时、教室容量、课程优先级等),
自动规避时间 / 资源冲突,一键生成课表并支持可视化调整,让排课从繁琐耗时变高效简单!
小明:嘿,李老师,我最近在做一个排课系统,但登录功能一直搞不定,你能帮我看看吗?
李老师:当然可以。你用的是什么语言和框架?比如 Java、Python 还是 PHP?还有数据库用的是 MySQL 还是 SQLite?
小明:我是用 Python 和 Flask 框架写的,数据库是 SQLite。
李老师:好的,那我们先从基础开始。登录功能的核心就是验证用户输入的用户名和密码是否匹配数据库中的记录。
小明:对,但我现在不知道怎么写这个验证逻辑。
李老师:那我们可以先设计一个简单的登录页面,然后在后端处理登录请求。首先,你需要一个 HTML 表单,让用户输入用户名和密码。
小明:HTML 表单我懂,但是怎么和后端连接呢?
李老师:在 Flask 中,你可以使用路由来处理表单提交。例如,当用户点击“登录”按钮时,表单数据会发送到服务器上的某个 URL,比如 /login。
小明:明白了,那我应该怎么编写这个路由函数呢?
李老师:我们可以用 Flask 的 request 对象来获取表单数据。然后查询数据库,看看是否有对应的用户信息。
小明:那数据库怎么设计呢?我应该创建一个用户表。
李老师:没错,用户表一般包括 username(用户名)、password(密码)等字段。为了安全起见,密码不能直接存储,而是要加密保存。
小明:哦,对了,加密怎么处理?我之前看到有人用 SHA256 或者 bcrypt。
李老师:是的,bcrypt 是比较推荐的方式,因为它可以防止彩虹表攻击。你可以使用 Flask-Bcrypt 扩展来简化加密和验证过程。
小明:那我需要先安装 Flask-Bcrypt 吗?
李老师:是的,你可以用 pip 安装:`pip install flask-bcrypt`。
小明:好的,那我现在应该怎么做呢?
李老师:我们可以先写一个用户注册功能,把用户的密码加密后存入数据库。然后再写登录功能,从数据库中取出密码,进行比对。
小明:那我可以先写一个注册的页面吗?
李老师:当然可以。注册页面和登录页面类似,只不过它会把用户信息插入到数据库中。
小明:那我应该怎么编写注册的代码呢?
李老师:下面是一个简单的注册示例代码:
from flask import Flask, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_bcrypt import Bcrypt
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
db = SQLAlchemy(app)
bcrypt = Bcrypt(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password = db.Column(db.String(120), nullable=False)
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
hashed_password = bcrypt.generate_password_hash(password).decode('utf-8')
new_user = User(username=username, password=hashed_password)
db.session.add(new_user)
db.session.commit()
return "注册成功!"
return '''
'''
if __name__ == '__main__':
app.run(debug=True)

小明:这段代码看起来不错,那登录功能该怎么写呢?
李老师:登录功能的关键在于验证用户输入的密码是否与数据库中存储的哈希值一致。下面是登录功能的示例代码:
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
user = User.query.filter_by(username=username).first()
if user and bcrypt.check_password_hash(user.password, password):
return "登录成功!"
else:
return "用户名或密码错误!"
return '''
'''
小明:这样就完成了登录功能?是不是还需要会话管理?比如用户登录后跳转到主页?
李老师:非常好的问题。在实际开发中,通常会使用 Flask 的 session 来管理用户状态。比如,在登录成功后,可以设置 session['user'] = username,这样在其他页面就可以判断用户是否已登录。
小明:那我应该怎么修改代码呢?
李老师:你可以添加如下代码:
from flask import session
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
user = User.query.filter_by(username=username).first()
if user and bcrypt.check_password_hash(user.password, password):
session['user'] = username
return redirect(url_for('dashboard'))
else:
return "用户名或密码错误!"
return '''
'''
小明:那我还需要一个 dashboard 页面对吧?

李老师:是的,可以在 Flask 中定义一个 /dashboard 路由,并在其中检查 session 是否有用户信息。如果没有,就重定向回登录页。
小明:那我可以这样写:
@app.route('/dashboard')
def dashboard():
if 'user' in session:
return f"欢迎回来,{session['user']}!"
else:
return redirect(url_for('login'))
小明:这感觉已经很完整了,那有没有可能被攻击,比如 SQL 注入或者 XSS 攻击?
李老师:这是个非常重要的问题。虽然 Flask 自带了一些保护机制,但在实际开发中,还是要注意防范这些安全风险。
小明:那我应该如何防范呢?
李老师:对于 SQL 注入,Flask-SQLAlchemy 已经帮你做了很多防护,但还是要避免直接拼接 SQL 语句。对于 XSS 攻击,建议在显示用户输入内容时使用 Jinja2 的 escape 函数,或者使用 WTForms 等表单验证库。
小明:明白了,那我是不是还需要考虑 CSRF 攻击?
李老师:是的,CSRF(跨站请求伪造)也是一种常见的安全威胁。Flask 提供了 Flask-WTF 扩展来帮助防御 CSRF 攻击,建议你在表单中加入 CSRF token。
小明:那我可以使用 Flask-WTF 吗?
李老师:当然可以。你可以通过 `pip install flask-wtf` 安装,然后在表单中添加 csrf_token 字段。
小明:那我应该怎么修改之前的代码呢?
李老师:以下是修改后的登录表单示例:
from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect(app)
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
# 验证 CSRF token
if not csrf.validate_csrf(request.form['csrf_token']):
return "CSRF 令牌无效!"
username = request.form['username']
password = request.form['password']
user = User.query.filter_by(username=username).first()
if user and bcrypt.check_password_hash(user.password, password):
session['user'] = username
return redirect(url_for('dashboard'))
else:
return "用户名或密码错误!"
return '''
'''
小明:看来我已经掌握了很多关于登录功能的知识了。
李老师:是的,你现在已经有能力开发一个基本的排课系统平台了。不过,这只是登录功能的一部分,后续你还需要实现更多功能,比如课程管理、教师分配、学生选课等。
小明:谢谢您,李老师!我会继续努力的。
李老师:不客气,有问题随时来找我。