小明:嘿,李工,我最近在做一个教材发放管理系统,想看看能不能把“免费”这个功能加进去,但又不想让随便谁都能用。你有什么建议吗?
李工:嗯,这个问题挺常见的。首先,你要考虑的是权限控制,也就是用户登录机制。只有登录后才能访问或领取教材。
小明:那怎么实现登录呢?是不是要写个登录页面?
李工:对,你可以先做一个简单的登录界面,用HTML和CSS做前端,然后用后端处理登录逻辑。比如用Python的Flask或者Django框架。
小明:那具体代码怎么写呢?能给我一个例子吗?
李工:当然可以。我们可以先从后端开始。比如用Flask来创建一个简单的登录接口。
小明:好的,那我先试着写一个简单的登录逻辑。比如用户输入用户名和密码,然后验证是否正确。
李工:没错,不过要注意安全性。不能直接用明文密码存储,最好用哈希加密。
小明:明白了。那我先写一个简单的登录页面吧。
李工:好的,下面是一个简单的HTML登录页面示例:
登录页面 教材发放管理系统
小明:看起来不错。那后端怎么处理呢?
李工:我们用Flask来处理POST请求。下面是一个简单的Python代码示例:
from flask import Flask, request, redirect, url_for
app = Flask(__name__)
# 模拟数据库
users = {
'admin': '123456'
}
@app.route('/login', methods=['POST'])
def login():
username = request.form['username']
password = request.form['password']
if username in users and users[username] == password:
return "登录成功!"
else:
return "用户名或密码错误,请重试。"
if __name__ == '__main__':
app.run(debug=True)
小明:这太棒了!那这样就能控制用户登录了。接下来我想加入“免费”功能,就是说用户登录后可以领取免费教材。
李工:好,那我们可以再加一个路由,比如“/free-books”,用户登录后才能访问。
小明:那怎么判断用户是否已经登录呢?
李工:可以用会话(session)来记录用户是否登录。比如在登录成功后设置一个session变量。
小明:那我该怎么修改上面的代码呢?
李工:我们可以使用Flask的session对象。下面是修改后的代码:
from flask import Flask, request, redirect, url_for, session
app = Flask(__name__)
app.secret_key = 'your_secret_key' # 设置密钥用于session加密
users = {
'admin': '123456'
}
@app.route('/login', methods=['POST'])
def login():
username = request.form['username']
password = request.form['password']
if username in users and users[username] == password:
session['logged_in'] = True
return redirect(url_for('free_books'))
else:
return "用户名或密码错误,请重试。"
@app.route('/free-books')
def free_books():
if 'logged_in' in session:
return "欢迎登录!您可领取免费教材。"
else:
return "请先登录!"
if __name__ == '__main__':
app.run(debug=True)
小明:这样就实现了登录后的访问控制。那如果用户没有登录,直接访问“/free-books”就会被跳转到登录页面吗?
李工:是的,你可以进一步优化,比如在未登录时自动跳转到登录页。
小明:那我可以加一个中间件或者装饰器来统一处理这些逻辑吗?
李工:当然可以。我们可以用Flask的装饰器来实现一个简单的登录保护函数。
小明:那怎么写这个装饰器呢?
李工:下面是一个简单的例子:

from functools import wraps
def login_required(f):
@wraps(f)
def wrapper(*args, **kwargs):
if 'logged_in' in session:
return f(*args, **kwargs)
else:
return redirect(url_for('login_page'))
return wrapper
@app.route('/login-page')
def login_page():
return """
登录页面
"""
@app.route('/free-books')
@login_required
def free_books():
return "欢迎登录!您可领取免费教材。"
小明:这样就更规范了,而且方便维护。那现在整个系统的基本结构就出来了。
李工:是的。接下来你可以考虑添加更多功能,比如教材列表、领取记录等。
小明:那我要怎么管理教材数据呢?是不是需要一个数据库?
李工:没错,建议使用数据库来存储教材信息和用户领取记录。可以使用SQLite、MySQL或PostgreSQL。
小明:那我应该怎么做呢?
李工:我们可以用SQLAlchemy来操作数据库。下面是一个简单的模型定义示例:
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///books.db'
db = SQLAlchemy(app)
class Book(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
author = db.Column(db.String(100), nullable=False)
is_free = db.Column(db.Boolean, default=True) # 是否为免费教材
class UserBook(db.Model):
id = db.Column(db.Integer, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
book_id = db.Column(db.Integer, db.ForeignKey('book.id'))
status = db.Column(db.String(50)) # 领取状态
小明:这样就能把教材信息和用户领取情况保存下来了。
李工:没错。然后你可以编写一些API接口,让用户登录后可以查看并领取免费教材。
小明:听起来很专业啊!那我现在就可以把这些代码整合起来,做一个完整的教材发放管理系统了。
李工:是的,你已经掌握了基本的登录机制和系统架构。接下来就是完善功能和提升用户体验了。
小明:谢谢你的帮助,李工!这次真的学到了很多。
李工:不客气!记住,安全性和可扩展性也很重要,尤其是涉及用户数据的时候。
