小李:老王,我最近在研究一个项目,是关于大学资产管理的。你对这个有了解吗?
老王:哦,你说的是固定资产管理系统吧?我们学校去年刚上线了一个类似的系统,挺不错的。不过具体怎么实现的,我还真不太清楚。
小李:那正好,我打算用Python做一个简易版的,用来模拟大学的资产管理系统。你觉得可行吗?
老王:当然可以!Python语言简洁,而且有很多库支持,比如Django或者Flask,都可以用来做Web系统。不过你得先想清楚系统需要哪些功能。
小李:对,我初步规划了一下,系统应该包括资产登记、查询、借出、归还、盘点等功能。同时还要有用户权限管理,比如管理员和普通教师的不同权限。
老王:听起来不错。那你打算用什么数据库来存储数据呢?
小李:我想用SQLite,因为它轻量,不需要复杂的配置,适合小型项目。不过如果以后扩展的话,可能需要用MySQL或者PostgreSQL。
老王:没错,SQLite确实很适合起步阶段。那代码方面呢?有没有具体的结构?
小李:我打算用Flask框架搭建后端,前端用HTML、CSS和JavaScript,再加上一些简单的jQuery来处理交互。这样整个系统就比较完整了。
老王:很好。那我可以帮你看看代码结构是否合理。你有没有写过类似系统的代码?
小李:还没有,我准备先从基础开始,比如定义数据库模型,然后逐步添加功能。
老王:那我们可以一步步来。首先,我们需要创建一个资产表,包含资产编号、名称、类别、购买日期、状态等字段。
小李:对,那我先用SQLAlchemy来定义模型。
老王:好的,那你可以这样写代码:
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///assets.db'
db = SQLAlchemy(app)
class Asset(db.Model):
id = db.Column(db.Integer, primary_key=True)
asset_id = db.Column(db.String(50), unique=True, nullable=False)
name = db.Column(db.String(100), nullable=False)
category = db.Column(db.String(50), nullable=False)
purchase_date = db.Column(db.Date, nullable=False)
status = db.Column(db.String(20), default='Available')
@app.route('/')
def index():
assets = Asset.query.all()
return render_template('index.html', assets=assets)
@app.route('/add', methods=['POST'])
def add_asset():
asset_id = request.form['asset_id']
name = request.form['name']
category = request.form['category']
purchase_date = request.form['purchase_date']
new_asset = Asset(asset_id=asset_id, name=name, category=category, purchase_date=purchase_date)
db.session.add(new_asset)
db.session.commit()
return redirect(url_for('index'))
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True)
小李:这段代码看起来没问题。不过还需要考虑用户权限,比如只有管理员才能添加或修改资产信息。
老王:是的,这时候可以用Flask-Login来管理用户登录状态。你可以定义一个User模型,然后根据角色判断是否有权限操作。
小李:明白了。那我接下来应该怎么做?
老王:你可以继续添加登录功能,然后为不同用户分配不同的权限。比如管理员可以进行增删改查,而普通用户只能查看。
小李:那我可以先实现一个简单的登录界面,然后在视图中检查用户是否为管理员。
老王:对,你可以使用Flask-Login来简化这部分逻辑。例如,定义一个User类,并继承UserMixin。
小李:那我可以这样写代码:
from flask_login import LoginManager, UserMixin, login_required, login_user, logout_user
login_manager = LoginManager()
login_manager.init_app(app)
class User(UserMixin, 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)
is_admin = db.Column(db.Boolean, default=False)
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@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 user.password == password:
login_user(user)
return redirect(url_for('index'))
return render_template('login.html')
@app.route('/logout')
@login_required
def logout():
logout_user()
return redirect(url_for('index'))
小李:这样就可以控制用户的访问权限了。那接下来我是不是该考虑资产的借出和归还功能?
老王:对,这部分可以通过在Asset模型中增加一个借用人字段,以及借出和归还的时间记录。
小李:那我可以这样修改模型:
class Asset(db.Model):
id = db.Column(db.Integer, primary_key=True)
asset_id = db.Column(db.String(50), unique=True, nullable=False)
name = db.Column(db.String(100), nullable=False)
category = db.Column(db.String(50), nullable=False)
purchase_date = db.Column(db.Date, nullable=False)
status = db.Column(db.String(20), default='Available')
borrower = db.Column(db.String(100))
borrow_date = db.Column(db.Date)
return_date = db.Column(db.Date)
老王:这样就能记录借出和归还的信息了。然后你可以在前端页面中添加相应的按钮,比如“借出”和“归还”,并绑定到对应的路由。
小李:对,那我可以写一个借出的路由,比如:
@app.route('/borrow/')
@login_required
def borrow(id):
asset = Asset.query.get_or_404(id)
if asset.status == 'Available':
asset.status = 'Borrowed'
asset.borrower = current_user.username
asset.borrow_date = datetime.date.today()
db.session.commit()
return redirect(url_for('index'))
老王:很好。那归还的逻辑也类似,只是要更新状态和归还时间。
小李:是的,那我可以这样写归还的路由:
@app.route('/return/')
@login_required
def return_asset(id):
asset = Asset.query.get_or_404(id)
if asset.status == 'Borrowed':
asset.status = 'Available'
asset.return_date = datetime.date.today()
db.session.commit()
return redirect(url_for('index'))

老王:这样一来,整个系统的基本功能就完成了。接下来你可以考虑添加更多功能,比如搜索、导出Excel、定时盘点等。
小李:对,尤其是导出Excel,可以用pandas库来实现。另外,还可以加入一个盘点页面,让用户手动确认资产状态。
老王:这些功能都很实用。如果你有兴趣,还可以把系统部署到服务器上,比如使用Heroku或者阿里云。
小李:好的,我会继续完善这个项目。感谢你的帮助,老王!

老王:不客气,随时欢迎你来找我讨论。希望你的项目能顺利上线,为学校的资产管理提供帮助。
