from flask import Blueprint, request, redirect, url_for, flash, g, jsonify from flask_login import current_user, login_required from app.models.book import Book from app.models.borrow import BorrowRecord from app.models.inventory import InventoryLog from app.models.user import db # 修正:从 user 模型导入 db from app.utils.auth import login_required import datetime # 创建借阅蓝图 borrow_bp = Blueprint('borrow', __name__, url_prefix='/borrow') @borrow_bp.route('/book', methods=['POST']) @login_required def borrow_book(): book_id = request.form.get('book_id', type=int) borrow_days = request.form.get('borrow_days', type=int, default=14) if not book_id: flash('请选择要借阅的图书', 'danger') return redirect(url_for('book.book_list')) book = Book.query.get_or_404(book_id) # 检查库存 if book.stock <= 0: flash(f'《{book.title}》当前无库存,无法借阅', 'danger') return redirect(url_for('book.book_detail', book_id=book_id)) # 检查当前用户是否已借阅此书 existing_borrow = BorrowRecord.query.filter_by( user_id=g.user.id, book_id=book_id, status=1 # 1表示借阅中 ).first() if existing_borrow: flash(f'您已借阅《{book.title}》,请勿重复借阅', 'warning') return redirect(url_for('book.book_detail', book_id=book_id)) try: # 创建借阅记录 now = datetime.datetime.now() due_date = now + datetime.timedelta(days=borrow_days) borrow_record = BorrowRecord( user_id=g.user.id, book_id=book_id, borrow_date=now, due_date=due_date, status=1, # 1表示借阅中 created_at=now, updated_at=now ) # 更新图书库存 book.stock -= 1 book.updated_at = now db.session.add(borrow_record) db.session.commit() # 添加库存变更日志 inventory_log = InventoryLog( book_id=book_id, change_type='借出', change_amount=-1, after_stock=book.stock, operator_id=g.user.id, remark='用户借书', changed_at=now ) db.session.add(inventory_log) db.session.commit() flash(f'成功借阅《{book.title}》,请在 {due_date.strftime("%Y-%m-%d")} 前归还', 'success') except Exception as e: db.session.rollback() flash(f'借阅失败: {str(e)}', 'danger') return redirect(url_for('book.book_detail', book_id=book_id)) @borrow_bp.route('/add/', methods=['POST']) @login_required def add_borrow(book_id): # 验证图书存在 book = Book.query.get_or_404(book_id) # 默认借阅天数 borrow_days = 14 # 检查库存 if book.stock <= 0: return jsonify({ 'success': False, 'message': f'《{book.title}》当前无库存,无法借阅' }) # 检查是否已借阅 existing_borrow = BorrowRecord.query.filter_by( user_id=current_user.id, # 使用current_user book_id=book_id, status=1 # 1表示借阅中 ).first() if existing_borrow: return jsonify({ 'success': False, 'message': f'您已借阅《{book.title}》,请勿重复借阅' }) try: # 创建借阅记录 now = datetime.datetime.now() due_date = now + datetime.timedelta(days=borrow_days) borrow_record = BorrowRecord( user_id=current_user.id, # 使用current_user book_id=book_id, borrow_date=now, due_date=due_date, status=1, # 1表示借阅中 created_at=now, updated_at=now ) # 更新图书库存 book.stock -= 1 book.updated_at = now db.session.add(borrow_record) db.session.commit() # 添加库存变更日志 inventory_log = InventoryLog( book_id=book_id, change_type='借出', change_amount=-1, after_stock=book.stock, operator_id=current_user.id, # 使用current_user remark='用户借书', changed_at=now ) db.session.add(inventory_log) db.session.commit() return jsonify({ 'success': True, 'message': f'成功借阅《{book.title}》,请在 {due_date.strftime("%Y-%m-%d")} 前归还' }) except Exception as e: db.session.rollback() return jsonify({ 'success': False, 'message': f'借阅失败: {str(e)}' })