项目实战:图书管理系统#
来源:
D:\study\C#1\WinForm\stu0807\图书管理系统
WinForm 阶段的综合大项目:多窗体、数据模型、文件存储、DataGridView、借还书业务逻辑。
1. 项目结构#
图书管理系统/
├── Program.cs # 入口
├── Login.cs # 登录验证
├── Reg.cs # 注册
├── Student.cs # 学生数据模型
├── Book.cs # 图书数据模型
├── RecordBook.cs # 借阅记录模型
├── Center.cs # 个人中心
├── StudentPage.cs # 学生主页面
├── Root.cs # 管理员登录
├── RootManage.cs # 管理员主页面
├── AddBo.cs # 添加图书
├── AddRoot.cs # 添加管理员
├── DelBo.cs # 删除图书
├── Borrow.cs # 借阅图书
├── ReturnBook.cs # 归还图书
└── Data/
├── Students.txt # 学生数据
├── Root.txt # 管理员数据
├── AllBooks.txt # 图书数据
└── StuBook.txt # 借阅记录
💡 设计思想:一个窗体一个类文件;文本文件当数据库;数据模型类承载字段。
2. 数据模型#
// 学生
public class Student
{
public string Account { get; set; }
public string Password { get; set; }
public string Name { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
public string Addr { get; set; }
public List<string> Book { get; set; } = new List<string>(); // 借阅书名
public List<string> BookId { get; set; } = new List<string>(); // 借阅书ID
public string Path { get; set; } // 头像路径
public string Identity { get; set; } // 身份
}
// 图书
public class Book
{
public int Id { get; set; }
public string Title { get; set; }
public string Author { get; set; }
public string Publish { get; set; } // 出版社
public int Sum { get; set; } // 总库存
public int Count { get; set; } // 可借数量
}
// 借阅记录
public class RecordBook
{
public string Acc { get; set; } // 学号
public string Name { get; set; } // 姓名
public string Id { get; set; } // 图书编号
public string Title { get; set; } // 书名
public string BorrowTime { get; set; } // 借阅时间
public string ReturnTime { get; set; } // 归还时间
}
3. 登录验证#
private void button1_Click(object sender, EventArgs e)
{
Reader(); // 从文件加载数据
// 查找匹配账号密码的学生
if (students.Contains(students.Find(a => a.Account == textBox1.Text && a.Password == textBox2.Text)))
{
new StudentPage(textBox1.Text, textBox2.Text).Show(); // 打开学生主页
this.Hide();
return;
}
MessageBox.Show("账号或密码错误!");
}
public void Reader()
{
using (FileStream fs = new FileStream(@"../../Data/Students.txt", FileMode.Open, FileAccess.Read))
using (StreamReader sr = new StreamReader(fs))
{
string line;
while ((line = sr.ReadLine()) != null)
{
string[] strings = line.Split('|'); // 竖线分隔
students.Add(new Student(strings[0], strings[1]));
}
}
}
4. 学生端功能#
| 功能 | 实现方式 |
|---|---|
| 查看所有图书 | DataGridView 绑定 List<Book> |
| 查询图书 | FindAll() 按书名或编号筛选 |
| 借阅图书 | 写入 StuBook.txt + 图书 Count-- |
| 归还图书 | 更新 StuBook.txt 归还时间 + 图书 Count++ |
| 个人中心 | 显示头像、姓名、借阅数量等信息 |
借阅流程#
public void Borrow()
{
// 1. 检查图书是否可借
if (books[i].Num > 0)
{
// 2. 写入借阅记录(| 分隔)
sw.WriteLine($"{name}|{books[i].Id}|{books[i].Title}|{DateTime.Now}||未归还");
// 3. 减少可借数量
books[i].Num--;
}
}
归还流程#
public void WStu()
{
// 1. 找到借阅记录,标记为已归还
int i = stuRe.FindIndex(a => a.Acc == student.Account && a.Id == student.BookId[stubi] && a.ReturnTime == "未归还");
stuRe[i].ReturnTime = DateTime.Now.ToString();
// 2. 重写整个文件
using (FileStream fs = new FileStream(@"../../Data/StuBook.txt", FileMode.Create, FileAccess.Write))
using (StreamWriter sw = new StreamWriter(fs))
{
foreach (RecordBook book in stuRe)
{
sw.WriteLine($"{book.Acc}|{book.Name}|{book.Id}|{book.Title}|{book.BorrowTime}|{book.ReturnTime}");
}
}
}
public void WBook()
{
// 3. 恢复图书可借数量
books[ibx].Count++;
// 4. 重写图书文件
using (var fs = new FileStream(@"../../Data/AllBooks.txt", FileMode.Create, FileAccess.Write))
using (var sw = new StreamWriter(fs))
{
foreach (var a in books)
{
sw.WriteLine($"{a.Id}|{a.Title}|{a.Author}|{a.Publish}|{a.Sum}|{a.Count}");
}
}
}
💡 「重写整个文件」模式:改内存中的 List → 用
FileMode.Create全部重写文件。数据量不大时最简单可靠。
5. 管理员端功能#
| 功能 | 实现方式 |
|---|---|
| 添加图书 | 写入 AllBooks.txt |
| 查看所有图书 | DataGridView 绑定图书列表 |
| 查看借阅记录 | DataGridView 绑定 RecordBook 列表 |
| 添加管理员 | 写入 Root.txt |
| 删除图书 | 从列表中移除 + 重写 AllBooks.txt |
6. 知识点串联#
| 技术点 | 用到的地方 |
|---|---|
| 多窗体切换 | Login → StudentPage / RootManage |
| 构造函数传参 | new StudentPage(账号, 密码) |
| 文件读写 | 四个 Data 文本文件 |
| List 查找 | Find / FindAll / FindIndex + Lambda |
| DataGridView | 绑定 Book / RecordBook 列表 |
| 面向对象 | Student / Book / RecordBook 模型类 |
💡 这是 WinForm 阶段最重要的综合练习,建议自己完整复现一遍:先搭窗体 → 建模型类 → 写文件读写 → 联调业务。
相关笔记#
- 数据控件 ListView 与 DataGridView — DataGridView
- 窗体之间数据传递 — 数据传递
- 文件操作综合实战 — 文件操作