下面是一个完整的C++图书管理系统课程设计,包含详细源码解析和设计思路。基于面向对象思想实现,涵盖图书管理核心功能(增删改查、借阅归还、权限控制等),适合课程设计或学习参考。
📚 图书管理系统设计思路
1. 系统功能模块
- 用户权限管理:读者、图书管理员、系统管理员
- 图书管理:添加、删除、修改、查询(书名/作者/出版社)、统计
- 借阅管理:借书、还书、续借、借阅记录
- 文件存储:图书数据、用户信息、借阅记录持久化存储
- 菜单驱动:分层级菜单控制操作流程
2. 核心类设计
类名 | 功能 |
---|---|
User | 基类,存储用户名/密码,提供登录验证和菜单接口(虚函数) |
Reader | 派生类,读者权限(查书、借阅、查看个人记录) |
Librarian | 派生类,图书管理员权限(增删改图书、处理借阅) |
Admin | 派生类,系统管理员权限(创建用户、权限管理) |
Book | 图书信息(编号/书名/作者/出版社/库存状态) |
Record | 借阅记录(用户ID、图书ID、借阅日期、应还日期) |
💻 完整源码及解析
1. 数据结构定义(Book.h
)
#include <iostream>
#include <vector>
#include <fstream>
#include <ctime>
// 日期类(用于借阅记录)
class Date {
public:
int year, month, day;
Date(int y = 0, int m = 0, int d = 0) : year(y), month(m), day(d) {}
// 计算还书日期(借期+30天)
Date addDays(int days) {
// ... 日期计算逻辑(略) [9](@ref)
return Date(year, month, day + days);
}
};
// 图书信息类
class Book {
public:
std::string id; // 图书编号
std::string name; // 书名
std::string author; // 作者
std::string press; // 出版社
bool isBorrowed; // 借出状态
Book(std::string i, std::string n, std::string a, std::string p)
: id(i), name(n), author(a), press(p), isBorrowed(false) {}
};
// 借阅记录类
class Record {
public:
int userId; // 借阅人ID
std::string bookId; // 图书ID
Date borrowDate; // 借书日期
Date returnDate; // 应还日期
};
2. 用户权限系统(User.h
)
class User {
protected:
std::string username;
std::string password;
public:
User(const std::string& u, const std::string& p) : username(u), password(p) {}
virtual bool login() = 0; // 纯虚函数(接口)
virtual void showMenu() = 0;
};
class Reader : public User {
public:
Reader(const std::string& u, const std::string& p) : User(u, p) {}
bool login() override {
// 从文件验证读者账号 [1](@ref)
return true;
}
void showMenu() override {
std::cout << "==== 读者菜单 ====\n";
std::cout << "1. 查询图书\n2. 借阅图书\n3. 查看借阅记录\n";
}
};
class Librarian : public User {
// 增加图书管理功能 [9](@ref)
void showMenu() override {
std::cout << "==== 管理员菜单 ====\n";
std::cout << "1. 添加图书\n2. 删除图书\n3. 处理借阅\n";
}
};
class Admin : public User {
// 增加用户管理功能 [1](@ref)
void showMenu() override {
std::cout << "==== 系统管理员菜单 ====\n";
std::cout << "1. 创建用户\n2. 重置密码\n3. 权限管理\n";
}
};
3. 核心功能实现(LibrarySystem.cpp
)
class LibrarySystem {
private:
std::vector<Book> books;
std::vector<Record> records;
public:
// 添加新书
void addBook(const Book& book) {
books.push_back(book);
saveBooksToFile(); // 保存到文件 [1](@ref)
}
// 按书名搜索
void searchByTitle(const std::string& title) {
for (const auto& book : books) {
if (book.name.find(title) != std::string::npos) {
std::cout << "ID: " << book.id << " 书名: " << book.name
<< " 作者: " << book.author << " 状态: "
<< (book.isBorrowed ? "已借出" : "在馆") << std::endl;
}
}
}
// 借书操作
void borrowBook(int userId, const std::string& bookId) {
for (auto& book : books) {
if (book.id == bookId && !book.isBorrowed) {
book.isBorrowed = true;
Record record{userId, bookId, Date(), Date().addDays(30)};
records.push_back(record);
saveRecordsToFile(); // 保存记录 [9](@ref)
return;
}
}
std::cout << "借书失败!图书不存在或已被借出\n";
}
};
// 文件存储示例(保存图书信息)
void LibrarySystem::saveBooksToFile() {
std::ofstream out("books.txt");
for (const auto& book : books) {
out << book.id << "," << book.name << ","
<< book.author << "," << book.press << "\n";
}
}
🔑 系统特色与关键技术
- 多态与继承
- 通过
User
基类统一接口,派生类实现不同权限菜单
- 通过
- 文件持久化
- 使用
fstream
将数据保存到文本文件(books.txt
,users.txt
)
- 使用
- 数据封装
- 每个类封装自身数据和行为(如
Book
类管理借阅状态)
- 每个类封装自身数据和行为(如
- 菜单驱动
- 分层级菜单控制用户操作流程(主菜单→子菜单)
📊 运行示例
==== 主菜单 ====
1. 读者登录 2. 管理员登录 3. 退出
> 1
输入用户名: stu001
输入密码: ******
==== 读者菜单 ====
1. 查询图书 2. 借阅图书
> 1
输入书名: C++
ID: B001 书名: C++ Primer 作者: Lippman 状态: 在馆
ID: B005 书名: Effective C++ 作者: Meyers 状态: 已借出
源码获取:<<点击获取源码