b Xác định Đối tượng sử dụng hệ thống Qua khảo sát chúng em đã xác định được 2 đối tượng sử dụng đó là Quản lý: Quản lý nhân viên và kiểm tra doanh thu Nhân viên : Bán hàng và quản lý c
Giới thiệu về đề tài
Giới thiệu về đề tài
Theo tổng kết của Cục Xuất bản, In và Phát hành, năm qua toàn ngành xuất bản trên 33.000 cuốn sách (năm 2018 đạt gần 32.000 cuốn) Lượng bản sách trên
Với 400 triệu bản sách được phát hành, việc trao đổi và mượn sách tại thư viện hiện nay gặp nhiều bất tiện và khó khăn trong việc thống kê đầu sách Sự phát triển của công nghệ thông tin đã tạo ra nhu cầu tìm kiếm thông tin từ sách vở ngày càng cao Hình thức trao đổi và tìm kiếm sách cũng trở nên đa dạng hơn Ứng dụng công nghệ thông tin vào quản lý sách mang lại nhiều lợi ích cho thư viện, giúp giảm thời gian quản lý và đơn giản hóa quá trình tìm kiếm Điều này cho phép độc giả dễ dàng và nhanh chóng lựa chọn những cuốn sách cần thiết.
Kế hoạch làm đề tài
1.2.1 Khởi tạo dự án a) Các hoạt động Đội ngũ ban đầu hệ thống:
Chức vụ Tên thành viên đội ngũ hệ thống Hoạt động chính
Leader Nguyễn Trọng Đạo Quản lý và hỗ trợ các thành viên đội ngũ hệ thống
Nguyễn Trọng Đạo Đàm Đức Minh Hoàng Hữu Thành
Trần Công Anh Tuyến Nguyễn Phú Quang Hưng
Test Đàm Đức Minh Hoàng Hữu Thành
Nguyên tắc quản lý trong dự án:
Để đảm bảo sự hợp tác hiệu quả trong nhóm, việc xác định rõ ràng vai trò và trách nhiệm của từng thành viên là rất quan trọng Khi các thành viên không hiểu rõ vai trò của mình hoặc mối liên hệ với người khác, điều này có thể dẫn đến sự vượt ranh giới và xung đột không cần thiết Do đó, việc làm rõ vai trò giúp mọi người làm việc cùng nhau một cách hiệu quả hơn.
Để bắt đầu và thực hiện dự án, cần xây dựng một chiến lược rõ ràng, chia sẻ tầm nhìn và kế hoạch với các thành viên trong nhóm, đồng thời phân công nhiệm vụ cụ thể cho từng người để đảm bảo tiến độ công việc được hoàn thành hiệu quả.
Xác định các ưu tiên và mốc quan trọng trước thời hạn là bước cần thiết trong giai đoạn lập kế hoạch dự án Việc này giúp bạn theo dõi tiến độ và đảm bảo rằng bạn đang đi đúng hướng để hoàn thành dự án đúng thời gian.
Minh bạch là yếu tố quan trọng trong việc xây dựng một hệ thống, nơi mọi thành viên trong nhóm có thể dễ dàng và hiệu quả truy cập tất cả thông tin liên quan đến dự án.
-Theo dõi và đo lường tiến độ: Kiểm tra KPI để có thể nắm bắt các vấn đề và sửa chữa nhanh chóng
-Đánh giá rủi do: Đánh giá rủi do có thể xảy ra giúp bạn tránh thất bại trong dự án.
Kế hoạch đối với toàn bộ dự án như thời gian bắt đầu và các giai đoạn dự kiến hoàn thiện
Giai đoạn Tên công việc Người thực hiện Thời gian bắt đầu
Phân tích và thiết kế hệ thống
1.1 Phân tích luồng và chức năng 20-06-
2.1 Thiết kế giao diện đăng nhập
2.2 Thiết kế giao diện màn hình chính
2.3 Thiết kế giao diện đổi mật khẩu
2.4 Thiết kế giao diện quản lý sách
2.5 Thiết kế giao diện quản lý tác giả
2.6 Thiết kế giao diện quản lý nhà xuất bản
2.7 Thiết kế giao diện quản lý thể loại
2.8 Thiết kế giao diện quản lý gửi OTP
2.9Thiết kế giao diện quên mật khẩu
2.10 Thiết kế giao diện quản lý phiếu trả
2.11 Thiết kế giao diện quản lý phiếu mượn
2.12 Thiết kế giao diện quản lý người dùng
3.5 Quản lý thông tin sách
3.8 Quản lý nhà xuất bản
9 b) Xác định Đối tượng sử dụng hệ thống
Qua khảo sát chúng em đã xác định được 2 đối tượng sử dụng đó là
Quản lý: Quản lý nhân viên và kiểm tra doanh thu Nhân viên : Bán hàng và quản lý các đơn hàng c) Phương pháp phát triển phần mềm
Lý do mà một dự án có thể được triển khai theo phương pháp Waterfall có thể bao gồm:
1 Yêu cầu rõ ràng từ đầu: Khi yêu cầu của dự án được xác định và thay đổi ít, Waterfall có thể phù hợp Nếu yêu cầu không thay đổi nhiều trong quá trình phát triển, việc theo dõi và hoàn thành từng giai đoạn một theo Waterfall sẽ dễ dàng hơn
2 Dự án có kích thước nhỏ và ít phức tạp: Nếu dự án có phạm vi rõ ràng, ít phức tạp và không yêu cầu sự linh hoạt cao trong quá trình phát triển, Waterfall có thể hiệu quả
3 Yêu cầu không thay đổi đột ngột: Nếu không có sự thay đổi đột ngột trong yêu cầu hoặc môi trường của dự án, Waterfall có thể dễ dàng quản lý hơn so với các phương pháp phát triển linh hoạt hơn như Agile
4 Phù hợp với nguồn lực và thời gian: Waterfall thường cho phép việc ước lượng thời gian và nguồn lực một cách rõ ràng từ đầu Nếu việc ước lượng này quan trọng trong dự án và có sẵn nguồn lực đủ để thực hiện từng giai đoạn một, Waterfall có thể được lựa chọn d) Đánh giá tính khả thi của dự án
Phần mềm tìm kiếm sách giúp tiết kiệm thời gian và công sức cho nhân viên, cho phép họ dễ dàng tìm thấy tên sách và vị trí của chúng mà không cần phải tra cứu qua sổ sách thủ công như trước đây.
Phần mềm quản lý sách giúp kiểm soát số lượng hiệu quả hơn và linh hoạt hơn so với sổ sách thủ công Nó cung cấp thông báo khi một loại sách sắp hết, giúp người dùng kịp thời bổ sung để tránh tình trạng thiếu sách khi khách hàng có nhu cầu.
-Dễ quản lý hơn sổ sách thủ công: Tất cả dữ liệu được lưu trong CSDL dễ dàng truy xuất bằng phần mềm qua các chức năng quản lý
-Tiện lợi: Thay vì phải đến của hàng mua sách thì người mua có thể đặt mua sách tại nhà
Phù hợp với tình hình dịch bệnh hiện nay
Các công nghệ sử dụng
Ngôn ngữ C# là một ngôn ngữ lập trình hiện đại và mạnh mẽ, được thiết kế để đơn giản hóa quá trình phát triển phần mềm Phát triển bởi Microsoft, C# là một phần của nền tảng NET và được sử dụng phổ biến trong việc phát triển ứng dụng máy tính để bàn, web, di động và nhiều loại ứng dụng khác.
Dưới đây là một số khía cạnh chính của C# và cách sử dụng C# trên Visual Studio: Đặc điểm chính của C#
1 Cú pháp dễ hiểu: C# có cú pháp tương tự như C, C++, và Java, giúp lập trình viên dễ dàng học và sử dụng
2 Quản lý bộ nhớ: C# sử dụng một cơ chế gọi là "garbage collection" để tự động quản lý bộ nhớ, giảm nguy cơ lỗi bộ nhớ
3 Hỗ trợ lập trình hướng đối tượng (OOP): C# hỗ trợ các khái niệm OOP như kế thừa, đa hình, và đóng gói, giúp tổ chức mã nguồn một cách logic và dễ quản lý
4 Tích hợp mạnh mẽ với NET Framework: C# có thể tận dụng toàn bộ thư viện và công cụ của NET, từ đó mở rộng khả năng phát triển phần mềm
1.3.2 Sử dụng ngôn ngữ c# trên Visual studio
Visual Studio là một IDE mạnh mẽ, phổ biến cho việc phát triển ứng dụng C# Để bắt đầu với C# trong Visual Studio, bạn cần thực hiện một số bước cơ bản.
• Tải và cài đặt Visual Studio từ trang web chính thức của Microsoft
• Chọn các thành phần cần thiết cho phát triển C# và NET khi cài đặt, chẳng hạn như NET desktop development, ASP.NET and web development, v.v
• Mở Visual Studio và chọn Create a new project
• Chọn loại dự án mà bạn muốn tạo, chẳng hạn như Console App, WPF App,
• Đặt tên cho dự án và chọn vị trí lưu trữ, sau đó nhấn Create
• Sau khi tạo dự án, Visual Studio sẽ tạo sẵn một số tệp và thư mục cần thiết
• Mở tệp Program.cs (hoặc tương tự tùy thuộc vào loại dự án) để viết mã nguồn C#
4 Biên dịch và chạy ứng dụng
• Nhấn Ctrl + F5 để biên dịch và chạy ứng dụng
• Kết quả sẽ hiển thị trong cửa sổ Console
• Sử dụng các tính năng gỡ lỗi của Visual Studio như breakpoints, watch, và step through để tìm và sửa lỗi trong mã nguồn
• Nhấn F5 để bắt đầu gỡ lỗi
• Sử dụng NuGet Package Manager để thêm các thư viện và công cụ của bên thứ ba vào dự án
• Chọn Tools -> NuGet Package Manager -> Manage NuGet Packages for
• Tạo và chạy các bài kiểm thử đơn vị (unit tests) bằng cách sử dụng các framework như MSTest, NUnit, hoặc xUnit
• Visual Studio tích hợp sẵn công cụ Test Explorer để quản lý và chạy các bài kiểm thử
Mô hình hệ thống
Các chức năng của hệ thống
-Sơ đồ để phân ra chức năng quản lý thư viện:
Dùng để đăng nhập vào hệ thống để sử dụng các tính năng của phần mềm
Chức năng đăng nhập yêu cầu tính bảo mật cao; khi bạn điền đầy đủ và chính xác thông tin, hệ thống sẽ cho phép bạn truy cập Ngược lại, nếu thông tin không đúng, hệ thống sẽ thông báo lỗi và yêu cầu bạn nhập lại.
Quản lý được sử dụng toàn bộ chức năng bảo gồm tìm kiếm, thêm, cập nhật thông tin của nhân viên
Quản lý được sử dụng toàn bộ chức năng bảo gồm tìm kiếm, thêm, cập nhật thông tin của nhân viên
Quản lý, nhân viên sử dụng các chức năng và theo dõi thông tin dữ liệu của chức năng Quản lý
5 Quản lý tác giả, thể loại, nhà xuất bản
Quản lý, nhân viên sử dụng các chức năng và theo dõi thông tin dữ liệu của chức năng Quản lý
Quản lý, nhân viên theo dõi thông tin dữ liệu của chức năng
Các giao diện có trong hệ thống
STT Tên đối tượng Kiểu Ý nghĩa
1 Frmlogin Form là form chính
2 Lblogin Label Hiển thị dòng chữ login
Hiển thị dòng chữ tài khoản
Hiển thị dòng chữ mật khẩu
5 Btlogin Button Nút ấn để đăng nhập
6 Btloginotp Label Đăng nhập bằng otp
7 Tb1 Texbox Để nhập tài khoản
8 Tb2 Texbox Để nhập mật khẩu
-Giao diện đổi mật khẩu
STT Tên đối tượng Kiểu Ý nghĩa Ghi chú
1 Frmdoimk Form là form chính
Hiển thị dòng chữ đổi mật khẩu
3 Tbmkc Textbox Nhập mật khẩu cũ
4 Tbmkm Textbox Nhập mật khẩu mới
5 Btldoimk Button Nút ấn để đổi mật khẩu
6 Tbnhaplaimk Textbox Nhập lại mật khẩu
- Giao diện quên mật khẩu:
STT Tên đối tượng Kiểu Ý nghĩa
1 Frmquenmk Form là form chính
Hiển thị dòng chữ quên mật khẩu
5 Btotp Button Nút ấn để đổi mật khẩu
6 Btxacnhan Button Nhấn nút để xác nhận
6 Btquayai Button Nhấn nút để quay lại
-Giao diện quản lý sách:
STT Tên đối tượng Kiểu Ý nghĩa Ghi chú
1 Frmnguoidung Form là form chính
Hiển thị dòng chữ người dùng
Chứa các nội dung thông tin người dùng
Chứa thông tin nhiều người dùng
5 Btthem Button ấn để thêm thông tin
6 Btsua Button ấn để sửa thông tin
7 Btthoat Button ấn để xóa thông tin
8 Btxoa Button ấn để thoát
-Giao diện quản lý sách:
STT Tên đối tượng Kiểu Ý nghĩa Ghi chú
1 Frmsach Form là form chính
Hiển thị dòng chữ quản lý sách
Chứa các nội dung thông tin sách
Chứa thông tin nhiều thông tin sách
5 Btthem Button ấn để thêm thông tin
6 Btsua Button ấn để sửa thông tin
7 Btthoat Button ấn để xóa thông tin
8 Btxoa Button ấn để thoát
-Giao diện hóa đơn mượn
STT Tên đối tượng Kiểu Ý nghĩa Ghi chú
1 Frmmuon Form là form chính
Hiển thị dòng chữ quản lý sách
Chứa các nội dung thông tin sách
Chứa thông tin nhiều thông tin sách
5 Btthem Button ấn để thêm thông tin
6 Btsua Button ấn để sửa thông tin
7 Btthoat Button ấn để xóa thông tin
8 Btxoa Button ấn để thoát
-Giao diện hóa đơn trả
STT Tên đối tượng Kiểu Ý nghĩa
1 Frmtra Form là form chính
Hiển thị dòng chữ quản lý sách
Chứa các nội dung thông tin sách
Chứa thông tin nhiều thông tin sách
5 Btthem Button ấn để thêm thông tin
6 Btsua Button ấn để sửa thông tin
7 Btthoat Button ấn để xóa thông tin
8 Btxoa Button ấn để thoát
STT Tên đối tượng Kiểu Ý nghĩa Ghi chú
1 Frmtacgia Form là form chính
2 Lbltacgia Label Hiển thị dòng chữ tác giả
Chứa các nội dung thông tin tác giả
Chứa thông tin nhiều thông tin tác giả
5 Btthem Button ấn để thêm thông tin
6 Btsua Button ấn để sửa thông tin
7 Btthoat Button ấn để xóa thông tin
STT Tên đối tượng Kiểu Ý nghĩa Ghi chú
1 Frmaddmin Form là form chính
Hiển thị dòng chữ quản lý thư viện
3 Btttcn Button ấn để xem thông tin cá nhân
4 Btqlpq Button ấn để xem quản lý phân quyền
5 Bttttcn Button ấn để xem thông tin cá nhân
6 Btdoimk Button ấn để đổi mk
7 Bttdx Button ấn để xóa thông tin
8 Btqls Button ấn để quản lý sách
9 Btqltg ấn để quản lý tác giả
10 Btqlpm Button ấn để quản lý phiếu mượn
11 Btqlpt Button ấn để quản lý phiếu trả
12 Bttqlnxb Button ấn để quản lý nhà xuất bản
STT Tên đối tượng Kiểu Ý nghĩa Ghi chú
1 Frmtheloai Form là form chính
2 Lbltheloai Label Hiển thị dòng chữ thể loại
Chứa các nội dung thông tin thể loại
Chứa thông tin nhiều thông tin thể loại
5 Btthem Button ấn để thêm thông tin
6 Btsua Button ấn để sửa thông tin
7 Btthoat Button ấn để xóa thông tin
Mô hình lớp
Mô hình cơ sở dữ liệu
Thuộc tính Kiểu dữ liệu Ràng buộc
MATL VARCHAR(10) PK X Mã Thể Loại
TENTL NVARCHAR(50) X Tên Thể Loại
Thuộc tính Kiểu dữ liệu Ràng buộc
MATACGIA VARCHAR(10) PK X Mã Tác Giả
TENTACGIA NVARCHAR(50) X Tên Tác Giả
Thuộc tính Kiểu dữ liệu Ràng buộc
MAND VARCHAR(10) PK X Mã Người Dùng
HOTEN NVARCHAR(50) X Họ và Tên Nhân Viên
DIACHI NVARCHAR(MAX) X Địa Chỉ
SDT VARCHAR(10) X Số Điện Thoại
CCCD VARCHAR(12) X Căn Cước Công Dân
Thuộc tính Kiểu dữ liệu Ràng buộc Not null Mô tả
MASACH VARCHAR(10) PK X Mã Sách
NGAYXB DATE Ngày Xuất Bản
TRANGTHAI NVARCHAR(MAX) Trạng Thái
Thuộc tính Kiểu dữ liệu Ràng buộc Not null Mô tả
ID int identity(1,1) PK X Mã Sách Chi Tiết
MASACH VARCHAR(10) FK X Mã Sách
MATACGIA VARCHAR(10) FK X Mã Tác Giả
MATHELOAI VARCHAR(10) FK X Mã Thể Loại
MANHAXUATBAN VARCHAR(10) FK X Mã Nhà Xuất Bản
Thuộc tính Kiểu dữ liệu Ràng buộc Not null Mô tả
MAMUON VARCHAR(10) PK X Mã Phiếu Mượn
MAND VARCHAR(10) X Mã Người Dùng
TRANGTHAI NVARCHAR(MAX) Trạng Thái
Thuộc tính Kiểu dữ liệu Ràng buộc
MAMUONCT int identity(1,1) PK X Mã Phiếu Mượn Chi Tiết
MAMUON VARCHAR(10) X Mã Phiếu Mượn
MASACH VARCHAR(10) FK X Tên Mã Sách
Thuộc tính Kiểu dữ liệu Ràng buộc Not null Mô tả
MATRA VARCHAR(10) PK X Mã Phiếu Trả
MAND VARCHAR(10) FK X Mã Người Dùng
Thuộc tính Kiểu dữ liệu Ràng buộc
MATRACT int identity(1,1) PK X Mã Phiếu Mượn Chi Tiết
MATRA VARCHAR(10) X Mã Phiếu Trả
MASACH VARCHAR(10) FK X Tên Mã Sách
MAMUON VARCHAR(10) FK X Mã Mượn
Các tiện ích
Phát triển hệ thống
Lớp GUI
-Các Giao diện của lớp GUI:
The code for the password change interface utilizes the DAL.Repository and includes essential namespaces such as System, System.Collections.Generic, System.ComponentModel, System.Data, System.Drawing, System.Linq, System.Text, System.Threading.Tasks, and System.Windows.Forms within the PRL.Forms namespace.
{ public partial class DoiMK : Form
NguoidungRepos _repos = new NguoidungRepos(); string username, pass; public DoiMK(string tk, string mk)
//aa private void btnChnage_Click(object sender, EventArgs e)
DialogResult result = MessageBox.Show("Bạn có muốn đổi mật khẩu không?",
"Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes)
{ if (newpass.Text == nhaplaiPaxx.Text)
{ var a = _repos.ChangePass(username, oldPass.Text, newpass.Text); if (a)
MessageBox.Show("Đổi mật khẩu thành công", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information); var b = _repos.GetAll().FirstOrDefault(x => x.Mand == username && x.Chucdanh == false); if (b != null)
GiaodienAdmin gd = new GiaodienAdmin(username, pass); gd.Show(); this.Hide();
GiaodienNV gd = new GiaodienNV(username, pass); gd.Show(); this.Hide();
MessageBox.Show("Mật khẩu cũ không chính xác!", "Lỗi",
MessageBox.Show("Mật khẩu mới và nhập lại mật khẩu mới không trùng khớp!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
} private void button2_Click(object sender, EventArgs e)
NguoidungRepos _ng = new NguoidungRepos(); var a = _ng.GetAll().FirstOrDefault(x => (x.Mand == username || x.Email
== username) && x.Matkhau == pass && x.Chucdanh == false); if (a! == null)
GiaodienAdmin ad = new GiaodienAdmin(username, pass); ad.Show(); this.Hide();
GiaodienNV ad = new GiaodienNV(username, pass); ad.Show(); this.Hide();
} private void oldPass_TextChanged(object sender, EventArgs e)
The code for the Admin interface utilizes the DAL.Models and DAL.Repository namespaces It incorporates essential system libraries, including System, System.Collections.Generic, System.ComponentModel, System.Data, System.Drawing, System.Drawing.Drawing2D, System.Linq, System.Text, System.Threading.Tasks, and System.Windows.Forms This structure is part of the PRL.Forms namespace, which facilitates the development of user-friendly administrative functionalities in the application.
{ public partial class GiaodienAdmin : Form
38 string username; string pass; public GiaodienAdmin(string tk, string mk)
} private void button6_Click(object sender, EventArgs e)
Nguoidung ng = new Nguoidung(username, pass); ng.Show(); this.Hide();
} private void button3_Click(object sender, EventArgs e)
DoiMK mk = new DoiMK(username, pass); mk.Show(); this.Hide();
} private void button2_Click(object sender, EventArgs e)
Login login = new Login(); login.Show(); this.Hide();
} private void button4_Click(object sender, EventArgs e)
DialogResult result = MessageBox.Show("Bạn có chắc muốn thoát chương trình không?", "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes)
} private void button8_Click(object sender, EventArgs e)
Theloai tl = new Theloai(username, pass); tl.Show(); this.Hide();
} private void button10_Click(object sender, EventArgs e)
Nhaxuatban nxb = new Nhaxuatban(username, pass); nxb.Show(); this.Hide();
} private void button7_Click(object sender, EventArgs e)
Tacgia nxb = new Tacgia(username, pass); nxb.Show(); this.Hide();
} private void button9_Click(object sender, EventArgs e)
Phieumuon nxb = new Phieumuon(username, pass); nxb.Show(); this.Hide();
} private void button11_Click(object sender, EventArgs e)
Phieutra nxb = new Phieutra(username, pass); nxb.Show(); this.Hide();
} private void button5_Click(object sender, EventArgs e)
Sach nxb = new Sach(username, pass); nxb.Show(); this.Hide();
} private void button1_Click(object sender, EventArgs e)
ThongTinCaNha thongTinCaNha = new ThongTinCaNha(username, pass); thongTinCaNha.Show(); this.Hide();
} private void button12_Click(object sender, EventArgs e)
ThongKe thongKe = new ThongKe(username, pass); thongKe.Show(); this.Hide();
} private void button13_Click(object sender, EventArgs e)
PhieuPhatVP thongKe = new PhieuPhatVP(username, pass); thongKe.Show(); this.Hide();
} private void label2_Click(object sender, EventArgs e)
- Code của Giao diện đăng nhập using DAL.Repository; using System; using System.Collections.Generic; using System.ComponentModel;
40 using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace PRL.Forms
{ public partial class Login : Form
NguoidungRepos _repos = new NguoidungRepos(); public Login()
} private void Login_Load(object sender, EventArgs e)
} private void checkBox1_CheckedChanged(object sender, EventArgs e) { if (checkBox1.Checked == true)
} private void label4_Click(object sender, EventArgs e)
Quenmk quenmk = new Quenmk(); quenmk.Show(); this.Hide();
} private void button1_Click(object sender, EventArgs e)
{ string username = textBox1.Text; string password = textBox3.Text; if (username != "" && password != "")
{ if (_repos.Login(username, password, true))
GiaodienAdmin gd = new GiaodienAdmin(username, password); gd.Show(); this.Hide();
MessageBox.Show("Đăng nhập thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
} else if (_repos.Login(username, password, false))
GiaodienNV gd = new GiaodienNV(username, password); gd.Show();
MessageBox.Show("Đăng nhập thành công!", "Thông báo",
MessageBox.Show("Đăng nhập thất bại!", "Thông báo",
MessageBox.Show("Vui lòng nhập tài khoản!", "Thông báo",
MessageBox.Show("Vui lòng nhập mật khẩu!", "Thông báo",
MessageBox.Show("Vui lòng nhập thông tin!", "Thông báo",
} private void label4_MouseEnter(object sender, EventArgs e)
{ label4.ForeColor = Color.Red; label4.Font = new Font(label4.Font, FontStyle.Italic | FontStyle.Bold | FontStyle.Underline);
} private void label4_MouseLeave(object sender, EventArgs e)
{ label4.ForeColor = SystemColors.ControlText; label4.Font = new Font(label4.Font, FontStyle.Regular);
} private void btnOTP_Click(object sender, EventArgs e)
LoginOTP otp = new LoginOTP(); otp.Show(); this.Hide();
} private void label1_Click(object sender, EventArgs e)
} private void textBox1_TextChanged(object sender, EventArgs e)
The article discusses the implementation of a user interface code using various namespaces in a C# application, specifically focusing on the DAL (Data Access Layer) for models and repositories Key components include importing essential libraries such as System, System.Collections.Generic, and System.Windows.Forms, which facilitate data handling and UI development The use of static visual styles enhances the appearance of list views and rebar elements within the application Overall, this code snippet serves as a foundational structure for building a robust user interface in a Windows Forms application.
{ public partial class Nguoidung : Form
NguoidungRepos _repos = new NguoidungRepos(); string username, password; public Nguoidung(string tk, string mk)
LoadData(_repos.GetAll()); dateTimePicker1.Format = DateTimePickerFormat.Custom; dateTimePicker1.CustomFormat = "dd/MM/yyyy";
} private void button5_Click(object sender, EventArgs e)
} public void LoadData(dynamic data)
To configure a DataGridView in a Windows Forms application, first clear any existing rows using `dataGridView1.Rows.Clear()` Set the column count to 11 and adjust the column size to fill the available space with `dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill` Define the column names by assigning values to `dataGridView1.Columns`, including "STT", "ID", "Họ và tên" (Full Name), "Giới tính" (Gender), "Địa chỉ" (Address), "Ngày sinh" (Date of Birth), "Số điện thoại" (Phone Number), and "Email" This setup creates a structured and user-friendly interface for displaying data.
44 dataGridView1.Columns[8].Name = "CCCD"; dataGridView1.Columns[9].Name = "Mật khẩu"; dataGridView1.Columns[10].Name = "Chức danh"; foreach (var x in data)
{ dataGridView1.Rows.Add(stt++, x.Mand, x.Hoten, x.Gioitinh ? "Nam" : "Nữ", x.Diachi, x.Ngaysinh, x.Sdt, x.Email, x.Cccd, x.Matkhau, x.Chucdanh ? "Admin" :
} private void button1_Click(object sender, EventArgs e)
{ bool gt; if (radioButton1.Checked)
} bool chucdanh; if (comboBox1.Text == "Admin")
} bool isValid = true; if (!Regex.IsMatch(textBox6.Text, @"^0\d{9}$"))
MessageBox.Show("Số điện thoại không hợp lệ! Số điện thoại phải bắt đầu bằng 0 và có 10 chữ số.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error); isValid = false;
} else if (!textBox7.Text.EndsWith("@gmail.com"))
MessageBox.Show("Email không hợp lệ! Email phải có định dạng
@gmail.com.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error); isValid = false;
} else if (textBox8.Text.Length != 11 || !textBox8.Text.All(char.IsDigit))
MessageBox.Show("CCCD không hợp lệ! CCCD phải có 11 chữ số.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error); isValid = false;
} else if (dateTimePicker1.Value.Year >= 2006 || dateTimePicker1.Value.Year x.Sdt == textBox6.Text); var checkCCCD = _repos.GetAll().FirstOrDefault(x => x.Cccd = textBox8.Text);
MessageBox.Show("Thêm tài khoản thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
MessageBox.Show("Mã ID đã tồn tại! Vui lòng nhập lại mã Id", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
MessageBox.Show("Đã có số điện thoại này! Vui lòng nhập số điện thoại khác!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
MessageBox.Show("Bạn nhập sai mã định danh! Vui lòng nhập lại mã định danh!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
{ textBox1.Text = textBox2.Text = textBox5.Text = textBox6.Text textBox7.Text = textBox8.Text = textBox9.Text = textBox11.Text = ""; radioButton1.Checked = radioButton2.Checked = false; comboBox1.SelectedIndex = -1; dateTimePicker1.Value = DateTime.Today;
} private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{ int index = e.RowIndex; var selected = dataGridView1.Rows[index]; textBox1.Text = selected.Cells[1].Value.ToString(); textBox2.Text = selected.Cells[2].Value.ToString(); if (selected.Cells[3].Value.ToString() == "Nam")
{ radioButton1.Checked = true; radioButton2.Checked = false;
The code snippet retrieves and displays data from a selected cell in a grid It assigns the value from the fourth cell to `textBox5`, sets `dateTimePicker1` to the date from the fifth cell, and populates `textBox6` to `textBox9` with values from the subsequent cells Additionally, it checks if the value in the eleventh cell is "Admin."
} private void button2_Click(object sender, EventArgs e)
{ bool gt; if (radioButton1.Checked)
} bool chucdanh; if (comboBox1.Text == "Admin")
} bool isValid = true; if (!Regex.IsMatch(textBox6.Text, @"^0\d{9}$"))
MessageBox.Show("Số điện thoại không hợp lệ! Số điện thoại phải bắt đầu bằng 0 và có 10 chữ số.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error); isValid = false;
} else if (!textBox7.Text.EndsWith("@gmail.com"))
MessageBox.Show("Email không hợp lệ! Email phải có định dạng
@gmail.com.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error); isValid = false;
} else if (textBox8.Text.Length != 11 || !textBox8.Text.All(char.IsDigit))
MessageBox.Show("CCCD không hợp lệ! CCCD phải có 11 chữ số.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error); isValid = false;
} else if (dateTimePicker1.Value.Year >= 2006 || dateTimePicker1.Value.Year (x.Mand == username || x.Email = username) && x.Matkhau == password && x.Chucdanh == false); if (a! == null)
GiaodienAdmin ad = new GiaodienAdmin(username, password); ad.Show(); this.Hide();
GiaodienNV ad = new GiaodienNV(username, password); ad.Show(); this.Hide();
} private void Nguoidung_Load(object sender, EventArgs e)
The code for the personal information interface utilizes the DAL.Repository and incorporates essential namespaces such as System, System.Collections.Generic, System.ComponentModel, System.Data, System.Drawing, System.Linq, System.Text, System.Threading.Tasks, and System.Windows.Forms This implementation is part of the PRL.Forms namespace.
{ public partial class ThongTinCaNha : Form
NguoidungRepos _repos = new NguoidungRepos(); public ThongTinCaNha(string username, string pass)
InitializeComponent(); this.username = username; this.pass = pass;
LoadData(); dateTimePicker1.Format = DateTimePickerFormat.Custom; dateTimePicker1.CustomFormat = "dd/MM/yyyy";
{ var a = _repos.GetAll().FirstOrDefault(x => (x.Email == username || x.Mand == username)); if (a != null)
{ txtid.Text = a.Mand; txtname.Text = a.Hoten; if (a.Gioitinh == true)
{ radioButton1.Checked = true; radioButton2.Checked = false;
{ radioButton1.Checked = false; radioButton2.Checked = true;
} txtDC.Text = a.Diachi; dateTimePicker1.Value = a.Ngaysinh; txtsdt.Text = a.Sdt; txtemail.Text = a.Email; txtcccd.Text = a.Cccd;
} private void button1_Click(object sender, EventArgs e)
DialogResult result = MessageBox.Show("Bạn có muốn sửa thông tin cá nhân hay không?", "Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes)
{ bool gt; if (radioButton1.Checked)
} var a = _repos.Update(txtid.Text, new DAL.Models.Nguoidung
MessageBox.Show("Cập nhật thông tin thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
MessageBox.Show("Cập nhật thông tin thất bại", "Lỗi",
} private void button2_Click(object sender, EventArgs e)
NguoidungRepos _ng = new NguoidungRepos(); var a = _ng.GetAll().FirstOrDefault(x => (x.Mand == username || x.Email
== username) && x.Matkhau == pass && x.Chucdanh == false); if (a! == null)
GiaodienAdmin ad = new GiaodienAdmin(username, pass); ad.Show(); this.Hide();
GiaodienNV ad = new GiaodienNV(username, pass); ad.Show(); this.Hide();
57 private void ThongTinCaNha_Load(object sender, EventArgs e) {
The article discusses the implementation of a borrowing slip code using various namespaces, including DAL.Models and DAL.Repository, along with iTextSharp for PDF generation It emphasizes the use of essential libraries such as System, System.IO, and System.Text.RegularExpressions within a Windows Forms application, specifically under the PRL.Forms namespace.
{ public partial class Phieumuon : Form
{ string username, pass; int maID = 0; public Phieumuon(string username, string mk)
LoadCombobox(); dateTimePicker1.Format = DateTimePickerFormat.Custom; dateTimePicker1.CustomFormat = "dd/MM/yyyy"; dateTimePicker1.Value = DateTime.Today; dateTimePicker2.Format = DateTimePickerFormat.Custom; dateTimePicker2.CustomFormat = "dd/MM/yyyy"; dateTimePicker2.Value = DateTime.Today;
} private void LoadSach(dynamic data)
ViewSach.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; ViewSach.ColumnCount = 4;
ViewSach.Columns[2].Name = "Tên sách";
ViewSach.Columns[3].Name = "Số lượng"; int stt = 1; foreach (var x in data)
ViewSach.Rows.Add(stt++, x.Masach, x.Tensach, x.Soluong);
} private void ViewSach_CellClick(object sender, DataGridViewCellEventArgs e) { int index = e.RowIndex; var selected = ViewSach.Rows[index]; txtMaSach.Text = selected.Cells[1].Value.ToString();
} private void LoadViewHD(dynamic data)
ViewHD.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; ViewHD.Columns[0].Name = "STT";
ViewHD.Columns[2].Name = "Mã nhân viên";
ViewHD.Columns[3].Name = "Tên nhân viên";
ViewHD.Columns[4].Name = "Trạng thái"; int stt = 1;
ViewHD.Columns.Add(new DataGridViewButtonColumn
ViewHD.Rows.Add(stt++, x.Mamuon, x.Manv, x.Tennv, x.Trangthai); }
In the ViewHD_CellClick event handler, when a cell in the DataGridView is clicked, the index of the clicked row is retrieved The selected row's data is then used to populate various controls: the ID is displayed in the txtId textbox, the corresponding value from the third cell is set in comboBox1, and the status from the fourth cell is shown in the txtTrangthai textbox.
} private void ViewHD_CellContentClick(object sender,
PhieuMuonRepos _repos = new PhieuMuonRepos(); if (e.ColumnIndex == ViewHD.Columns[""].Index && e.RowIndex >= 0) { string maID = ViewHD.Rows[e.RowIndex].Cells[1].Value.ToString();
61 var result = MessageBox.Show("Bạn có chắc muốn xóa thông tin này?",
"Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes)
{ var deleted = _repos.DeleteHoaDon(maID); if (deleted)
MessageBox.Show("Xóa thông tin thành công!", "Thông báo",
MessageBox.Show("Xóa thông tin thất bại!", "Lỗi",
} private void LoadHDCT(string id)
ViewCT.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; ViewCT.ColumnCount = 9;
ViewCT.Columns[1].Name = "ID"; ViewCT.Columns[1].Visible = false;
ViewCT.Columns[2].Name = "Mã mượn"; ViewCT.Columns[2].Visible = false; ViewCT.Columns[3].Name = "Mã sách"; ViewCT.Columns[3].Visible = false; ViewCT.Columns[4].Name = "Tên sách";
ViewCT.Columns[5].Name = "Số lượng";
ViewCT.Columns[6].Name = "Tiền cọc";
ViewCT.Columns[7].Name = "Ngày mượn";
ViewCT.Columns[8].Name = "Ngày trả";
ViewCT.Columns.Add(new DataGridViewButtonColumn
PhieuMuonCTRepos _repos = new PhieuMuonCTRepos(); foreach (var x in _repos.GetByPhieumuonCT(id))
ViewCT.Rows.Add(stt++, x.Mamuonct, x.Mamuon, x.Masach, x.Tensach, x.Soluong, x.Tiencoc, x.Ngaymuon, x.Ngaytra);
} private void ViewCT_CellClick(object sender, DataGridViewCellEventArgs e) { int index = e.RowIndex; var selected = ViewCT.Rows[index];
The code snippet retrieves data from selected cells in a grid, assigning values to various text fields and date pickers Specifically, it sets the text for `txtMaSach`, `txtSL`, and `txtTien` from the respective cells, while also updating two date pickers with values from the selected row Additionally, it parses an integer from a cell to assign to `maID`.
} private void ViewCT_CellContentClick(object sender, DataGridViewCellEventArgs e)
PhieuMuonCTRepos _repos = new PhieuMuonCTRepos(); if (ViewCT.Columns[e.ColumnIndex].HeaderText == " Xóa" && e.RowIndex >0)
{ int maID = int.Parse(ViewCT.Rows[e.RowIndex].Cells[1].Value.ToString()); var result = MessageBox.Show("Bạn có chắc muốn xóa thông tin này?",
"Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes)
{ var deleted = _repos.DeleteCT(maID); if (deleted)
MessageBox.Show("Xóa thông tin thành công!", "Thông báo",
MessageBox.Show("Mã phiếu không tồn tại hoặc chưa được chọn!",
"Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
Random random = new Random(); string maPhieu; do
} while (_repos.GetAllPhieumuon().Any(p => p.Mamuon == maPhieu)); return maPhieu;
} private void btnAdd_Click(object sender, EventArgs e)
DialogResult result = MessageBox.Show("Bạn có muốn tạo phiếu mới hay không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes)
PhieuMuonRepos _repos = new PhieuMuonRepos(); var a = _repos.AddHoaDon(new DAL.Models.Phieumuon
MessageBox.Show("Tạo thông tin thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
MessageBox.Show("Vui lòng nhập chọn nhân viên!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
} private void btnEdit_Click(object sender, EventArgs e)
DialogResult result = MessageBox.Show("Bạn có muốn tạo phiếu mới hay không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes)
PhieuMuonRepos _repos = new PhieuMuonRepos(); var a = _repos.UpdateHoaDon(txtId.Text, new DAL.Models.Phieumuon {
MessageBox.Show("Sửa thông tin thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
MessageBox.Show("Mã phiếu không tồn tại hoặc bị bỏ trống!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
MessageBox.Show("Vui lòng nhập chọn nhân viên!", "Lỗi",
{ txtId.Text = txtMaSach.Text = txtSL.Text = txtTien.Text = txtTrangthai.Text textBox1.Text = ""; comboBox1.SelectedIndex = -1; dateTimePicker1.Value = dateTimePicker2.Value = DateTime.Today;
} private void btnClear_Click(object sender, EventArgs e)
NguoidungRepos _ng = new NguoidungRepos(); comboBox1.DataSource = _ng.GetAll();
68 comboBox1.DisplayMember = "Hoten"; comboBox1.ValueMember = "Mand"; comboBox1.SelectedIndex = -1;
} private void button1_Click(object sender, EventArgs e)
NguoidungRepos _ng = new NguoidungRepos(); var a = _ng.GetAll().FirstOrDefault(x => x.Mand == username && x.Chucdanh
GiaodienAdmin ad = new GiaodienAdmin(username, pass); ad.Show(); this.Hide();
GiaodienNV ad = new GiaodienNV(username, pass); ad.Show(); this.Hide();
} private void button2_Click(object sender, EventArgs e)
DialogResult result = MessageBox.Show("Bạn có muốn thanh toán không?",
"Xác nhận", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes)
PhieuMuonRepos _repos = new PhieuMuonRepos(); var a = _repos.GetByIDPhieumuon(txtId.Text); if (a != null)
Hoadoncho hoadoncho = new Hoadoncho(username, pass, x.Mamuon.ToString()); hoadoncho.Show(); this.Hide();
MessageBox.Show("Vui lòng nhập mã phiếu!", "Lỗi",
MessageBox.Show("Không tìm thấy phiếu!", "Lỗi",
} private void txtSL_TextChanged(object sender, EventArgs e)
TimeSpan difference = endDate.Subtract(startDate); int numberOfDays = 0;
SachRepos sach = new SachRepos(); var gia = sach.GetAll().FirstOrDefault(x => x.Masach == txtMaSach.Text); if (gia != null)
{ numberOfDays = difference.Days; decimal giasach = 0; foreach (var x in sach.GetBy(txtMaSach.Text))
71 if (int.TryParse(txtSL.Text, out int intValue) && intValue > 0)
{ txtTien.Text = (intValue * giasach + 1000 * numberOfDays).ToString(); } else
{ numberOfDays = 1; decimal giasach = 0; foreach (var x in sach.GetBy(txtMaSach.Text))
} if (int.TryParse(txtSL.Text, out int intValue) && intValue > 0)
{ txtTien.Text = (intValue * giasach + 1000 * numberOfDays).ToString(); } else
} private void button4_Click(object sender, EventArgs e)
DialogResult result = MessageBox.Show("Bạn có muốn thêm thông tin cho phiếu hay không?", "Thông báo", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes)
{ if (int.Parse(txtSL.Text) > 0)
{ if (dateTimePicker1.Value 0 && dateTimePicker1.Value