跳转至

项目实战:图书管理系统#

来源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 阶段最重要的综合练习,建议自己完整复现一遍:先搭窗体 → 建模型类 → 写文件读写 → 联调业务。


相关笔记#