6.3日报

今天进行课程设计仓储管理系统的完善,

from flask import Flask, render_template, request, redirect, url_for, flash
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user
from werkzeug.security import generate_password_hash, check_password_hash
import os
import subprocess
import sys
import traceback
import secrets

app = Flask(__name__)
app.config['SECRET_KEY'] = secrets.token_hex(16) # 生成随机密钥
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///warehouse.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

db = SQLAlchemy(app)
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = 'login'

# 用户模型
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password_hash = db.Column(db.String(120), nullable=False)

def set_password(self, password):
self.password_hash = generate_password_hash(password)

def check_password(self, password):
return check_password_hash(self.password_hash, password)

# 商品模型
class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(100), nullable=False)
description = db.Column(db.Text)
quantity = db.Column(db.Integer, default=0)
price = db.Column(db.Float, nullable=False)
inventory_logs = db.relationship('InventoryLog', backref='product', lazy=True)

# 库存记录模型
class InventoryLog(db.Model):
id = db.Column(db.Integer, primary_key=True)
product_id = db.Column(db.Integer, db.ForeignKey('product.id'), nullable=False)
quantity_change = db.Column(db.Integer, nullable=False) # 正数表示入库,负数表示出库
timestamp = db.Column(db.DateTime, server_default=db.func.now())
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))

# 路由
@app.route('/')
@login_required
def products():
products = Product.query.all()
return render_template('products.html', products=products)

@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.check_password(password):
login_user(user)
flash('登录成功', 'success')
return redirect(url_for('products'))

flash('用户名或密码错误', 'danger')

return render_template('login.html')

@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']

if User.query.filter_by(username=username).first():
flash('用户名已存在', 'danger')
return redirect(url_for('register'))

user = User(username=username)
user.set_password(password)
db.session.add(user)
db.session.commit()

flash('注册成功,请登录', 'success')
return redirect(url_for('login'))

return render_template('register.html')

@app.route('/logout')
@login_required
def logout():
logout_user()
flash('已退出登录', 'info')
return redirect(url_for('login'))

@app.route('/add_product', methods=['GET', 'POST'])
@login_required
def add_product():
if request.method == 'POST':
name = request.form['name']
description = request.form['description']
quantity = int(request.form['quantity'])
price = float(request.form['price'])

if Product.query.filter_by(name=name).first():
flash('商品名称已存在', 'danger')
return redirect(url_for('add_product'))

product = Product(name=name, description=description, quantity=quantity, price=price)
db.session.add(product)

if quantity != 0:
log = InventoryLog(product=product, quantity_change=quantity, user_id=current_user.id)
db.session.add(log)

db.session.commit()
flash('商品添加成功', 'success')
return redirect(url_for('products'))

return render_template('add_product.html')

@app.route('/update_inventory/<int:product_id>', methods=['GET', 'POST'])
@login_required
def update_inventory(product_id):
product = Product.query.get_or_404(product_id)

if request.method == 'POST':
quantity_change = int(request.form['quantity_change'])
product.quantity += quantity_change

log = InventoryLog(product=product, quantity_change=quantity_change, user_id=current_user.id)
db.session.add(log)
db.session.commit()

flash('库存更新成功', 'success')
return redirect(url_for('products'))

return render_template('update_inventory.html', product=product)

@app.route('/inventory_logs')
@app.route('/inventory_logs/<int:product_id>')
@login_required
def inventory_logs(product_id=None):
if product_id:
product = Product.query.get_or_404(product_id)
logs = InventoryLog.query.filter_by(product_id=product_id).order_by(InventoryLog.timestamp.desc()).all()
return render_template('inventory_logs.html', logs=logs, product=product)
else:
logs = InventoryLog.query.order_by(InventoryLog.timestamp.desc()).all()
return render_template('inventory_logs.html', logs=logs)

@app.route('/test')
@login_required
def test_page():
return render_template('test.html')

@app.route('/run_tests')
@login_required
def run_tests():
try:
# 使用 -v 参数显示详细输出,使用 -s 参数显示打印语句,使用 --capture=no 确保输出不被捕获
result = subprocess.run(
[sys.executable, '-m', 'pytest', 'test_app.py', '-v', '-s', '--capture=no'],
capture_output=True,
text=True,
env={**os.environ, 'PYTHONPATH': os.getcwd()}
)

# 如果测试失败,也返回错误输出
if result.returncode != 0:
return f"{result.stdout}\n{result.stderr}"
return result.stdout
except Exception as e:
return f"测试执行出错:{str(e)}\n{traceback.format_exc()}"

if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True, host='0.0.0.0', port=5000)
posted @ 2025-06-03 23:05  Code13  阅读(9)  评论(0)    收藏  举报