轻量级图书馆借阅管理系统(读者管理、借还书记录)

为你设计一个基于 Python + Flask + SQLite​ 的轻量级图书馆借阅管理系统,包含读者管理借还书记录两个核心模块。以下是完整的功能说明与代码实现。


系统功能概览

1. 读者管理

  • 添加读者(姓名、学号/工号、联系方式)

  • 查看所有读者列表

  • 删除读者

2. 借还书管理

  • 借书:记录读者ID、图书ID、借书日期

  • 还书:更新借书记录的还书日期

  • 查看所有借还记录(含读者姓名、书名、借书日期、还书日期)


技术栈

  • 后端:Flask (Python)

  • 数据库:SQLite

  • 前端:HTML + Bootstrap(简易界面)


项目结构

library_system/
├── app.py
├── templates/
│   ├── index.html
│   ├── readers.html
│   ├── add_reader.html
│   └── records.html
└── library.db (自动生成)

数据库表设计

-- 读者表
CREATE TABLE readers (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    student_id TEXT UNIQUE NOT NULL,
    phone TEXT
);

-- 图书表(简化)
CREATE TABLE books (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    title TEXT NOT NULL,
    author TEXT,
    isbn TEXT UNIQUE
);

-- 借还记录表
CREATE TABLE borrow_records (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    reader_id INTEGER NOT NULL,
    book_id INTEGER NOT NULL,
    borrow_date DATE NOT NULL,
    return_date DATE,
    FOREIGN KEY (reader_id) REFERENCES readers(id),
    FOREIGN KEY (book_id) REFERENCES books(id)
);

核心代码 (app.py)

from flask import Flask, render_template, request, redirect, url_for
import sqlite3
from datetime import date

app = Flask(__name__)
DATABASE = 'library.db'

def get_db():
    conn = sqlite3.connect(DATABASE)
    conn.row_factory = sqlite3.Row
    return conn

def init_db():
    with app.app_context():
        db = get_db()
        db.execute('''CREATE TABLE IF NOT EXISTS readers
                    (id INTEGER PRIMARY KEY AUTOINCREMENT,
                     name TEXT NOT NULL,
                     student_id TEXT UNIQUE NOT NULL,
                     phone TEXT)''')
        db.execute('''CREATE TABLE IF NOT EXISTS books
                    (id INTEGER PRIMARY KEY AUTOINCREMENT,
                     title TEXT NOT NULL,
                     author TEXT,
                     isbn TEXT UNIQUE)''')
        db.execute('''CREATE TABLE IF NOT EXISTS borrow_records
                    (id INTEGER PRIMARY KEY AUTOINCREMENT,
                     reader_id INTEGER NOT NULL,
                     book_id INTEGER NOT NULL,
                     borrow_date DATE NOT NULL,
                     return_date DATE,
                     FOREIGN KEY(reader_id) REFERENCES readers(id),
                     FOREIGN KEY(book_id) REFERENCES books(id))''')
        # 插入示例图书
        if db.execute("SELECT COUNT(*) FROM books").fetchone()[0] == 0:
            sample_books = [
                ("Python编程从入门到实践", "Eric Matthes", "978-7-115-54608-1"),
                ("数据结构与算法分析", "Mark Allen Weiss", "978-7-111-12345-6"),
                ("计算机网络", "James F. Kurose", "978-7-302-45678-9")
            ]
            for title, author, isbn in sample_books:
                db.execute("INSERT INTO books (title, author, isbn) VALUES (?, ?, ?)", 
                          (title, author, isbn))
        db.commit()

@app.route('/')
def index():
    return render_template('index.html')

# ---- 读者管理 ----
@app.route('/readers')
def readers_list():
    db = get_db()
    readers = db.execute("SELECT * FROM readers").fetchall()
    return render_template('readers.html', readers=readers)

@app.route('/add_reader', methods=['GET', 'POST'])
def add_reader():
    if request.method == 'POST':
        name = request.form['name']
        student_id = request.form['student_id']
        phone = request.form.get('phone', '')
        db = get_db()
        try:
            db.execute("INSERT INTO readers (name, student_id, phone) VALUES (?, ?, ?)",
                      (name, student_id, phone))
            db.commit()
        except sqlite3.IntegrityError:
            return "学号已存在,请重新输入"
        return redirect(url_for('readers_list'))
    return render_template('add_reader.html')

@app.route('/delete_reader/<int:id>')
def delete_reader(id):
    db = get_db()
    db.execute("DELETE FROM readers WHERE id=?", (id,))
    db.commit()
    return redirect(url_for('readers_list'))

# ---- 借还书管理 ----
@app.route('/records')
def records():
    db = get_db()
    records = db.execute('''
        SELECT br.id, r.name AS reader_name, b.title AS book_title,
               br.borrow_date, br.return_date
        FROM borrow_records br
        JOIN readers r ON br.reader_id = r.id
        JOIN books b ON br.book_id = b.id
        ORDER BY br.borrow_date DESC
    ''').fetchall()
    return render_template('records.html', records=records)

@app.route('/borrow_book', methods=['GET', 'POST'])
def borrow_book():
    db = get_db()
    if request.method == 'POST':
        reader_id = request.form['reader_id']
        book_id = request.form['book_id']
        today = date.today().isoformat()
        db.execute("INSERT INTO borrow_records (reader_id, book_id, borrow_date) VALUES (?, ?, ?)",
                  (reader_id, book_id, today))
        db.commit()
        return redirect(url_for('records'))
    readers = db.execute("SELECT * FROM readers").fetchall()
    books = db.execute("SELECT * FROM books").fetchall()
    return render_template('borrow_book.html', readers=readers, books=books)

@app.route('/return_book/<int:record_id>')
def return_book(record_id):
    db = get_db()
    today = date.today().isoformat()
    db.execute("UPDATE borrow_records SET return_date=? WHERE id=?", (today, record_id))
    db.commit()
    return redirect(url_for('records'))

if __name__ == '__main__':
    init_db()
    app.run(debug=True)

HTML 模板示例

templates/index.html

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>图书馆借阅管理系统</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body class="container mt-4">
    <h1>📚 图书馆借阅管理系统</h1>
    <div class="list-group mt-3">
        <a href="/readers" class="list-group-item list-group-item-action">👥 读者管理</a>
        <a href="/records" class="list-group-item list-group-item-action">📋 借还书记录</a>
        <a href="/borrow_book" class="list-group-item list-group-item-action">📖 借书</a>
    </div>
</body>
</html>

templates/readers.html

{% extends 'base.html' %}
{% block content %}
<h2>读者列表</h2>
<a href="/add_reader" class="btn btn-success mb-3">添加读者</a>
<table class="table table-bordered">
    <thead><tr><th>ID</th><th>姓名</th><th>学号</th><th>电话</th><th>操作</th></tr></thead>
    <tbody>
        {% for r in readers %}
        <tr>
            <td>{{ r.id }}</td>
            <td>{{ r.name }}</td>
            <td>{{ r.student_id }}</td>
            <td>{{ r.phone or '' }}</td>
            <td><a href="/delete_reader/{{ r.id }}" class="btn btn-danger btn-sm">删除</a></td>
        </tr>
        {% endfor %}
    </tbody>
</table>
<a href="/" class="btn btn-secondary">返回首页</a>
{% endblock %}

其他模板类似,可根据需要扩展。


如何运行

  1. 安装依赖:

pip install flask
  1. 保存以上代码为 app.py,创建 templates文件夹并放入上述 HTML 文件。

  2. 运行:

python app.py
  1. 打开浏览器访问:http://127.0.0.1:5000


可扩展功能建议

  • ✅ 图书查询与搜索

  • ✅ 借书超期提醒(逾期罚款)

  • ✅ 读者借阅历史统计

  • ✅ 管理员登录权限控制

  • ✅ 导出 Excel / CSV 报表

如果需要我帮你扩展某个具体功能(如“超期罚款计算”或“图书搜索”),可以告诉我。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值