当前位置: 首页 > news >正文

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

为你设计一个基于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 报表

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

http://www.jsqmd.com/news/1094464/

相关文章:

  • Minecraft光影终极指南:用Revelation打造电影级方块世界
  • 从单点工具到全链路智能体:跨境电商自动化的下一步:2026全链路AI Agent架构深度拆解与落地指南
  • 【工具推荐】剁手前先泼盆冷水!我做了一个让你理性消费的神器——消费泼冷水计算器
  • 3个MeEdu二次开发实战技巧:从API调用到Hook扩展的深度定制指南
  • 5步掌握Res-Downloader:跨平台资源下载工具全面指南
  • Audition软件安装步骤(附安装包)Audition AU2026 超详细下载安装教程
  • CAD看图入门教程:4步掌握文件新建、打开、保存、关闭基础操作
  • 2026年小程序和网站到底有什么区别?企业到底该做哪个?
  • 【那黎宣大学主办 | IEEE出版 | 连续2届稳定EI检索,往届快至会后4个月EI检索 |支持latex和word双通道投稿】第三届图像处理、多媒体技术与机器学习国际学术会议(IPMML 2026)
  • Vulnhuntr架构解析:LLM与符号查找器如何革新自动化漏洞挖掘
  • 企业级Python自动化利器:we-work-bot企业微信机器人框架深度解析
  • UltraStar Deluxe终极指南:免费开源卡拉OK游戏的完全探索
  • (安装包)Windows OpenClaw 超详细安装!纯可视化操作,小白一遍装好
  • UltraStar Deluxe:终极免费卡拉OK唱歌游戏完全指南 [特殊字符]
  • 黑龙江省熙慧科技服务有限公司
  • 基于AI与工作流引擎构建网络安全威胁情报自动化分析平台
  • 配音工具怎选?2026自媒体避坑指南,新手选配音工具看这4点就够了
  • 板书笔记如何搭配会议录音精准归档?方法来了
  • Windows风扇控制终极指南:用Fan Control彻底解决电脑噪音与散热问题
  • 办公自动化工具 OpenClaw 完整安装流程,小白友好指南(包含安装包)
  • 一套源码就能搞家政平台?听听过来人怎么说
  • 偏振旋转器的设计与应用
  • 史上最详细蓝凌EKP V16安装教程及安装包(完整)
  • Spring AI 2.0 正式发布,让 Java 再次伟大!!
  • 一款桌面端 Docker 自托管的开源数据库管理工具!
  • ChatGPT Plus企业版 vs 个人版价格结构大起底:5人团队年省$1,280的合规采购策略
  • AI 标「已完成」,清单却是空的——让 .ai/ 规矩自检一次(附提示语)
  • 显卡内存稳定性终极检测指南:5分钟快速诊断GPU硬件故障
  • OpenVINO™ C# API 3.3 全新发布!正式接入 OpenVINO GenAI,C# 本地大模型开发全面启航!
  • 苹果用户用了十年的功能,我终于在Windows上实现了