Đồ án Hệ thống quản lý phần cứng máy tính áp dụng cho các cơ quan trường học

pdf 193 trang thiennha21 14/04/2022 180
Bạn đang xem 20 trang mẫu của tài liệu "Đồ án Hệ thống quản lý phần cứng máy tính áp dụng cho các cơ quan trường học", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfdo_an_he_thong_quan_ly_phan_cung_may_tinh_ap_dung_cho_cac_co.pdf

Nội dung text: Đồ án Hệ thống quản lý phần cứng máy tính áp dụng cho các cơ quan trường học

  1. TRƯỜNG ĐẠI HỌC BÀ RỊA VŨNG TÀU VIỆN CÔNG NGHỆ THÔNG TIN – ĐIỆN – ĐIỆN TỬ NGÀNH CÔNG NGHỆ THÔNG TIN TRÌNH ĐỘ ĐÀO TẠO: ĐẠI HỌC ĐỀ TÀI: Hệ thống quản lý phần cứng máy tính áp dụng cho các cơ quan trường học GIẢNG VIÊN HƯỚNG DẪN: TS. PHAN NGỌC HOÀNG SINH VIÊN THỰC HIỆN: LÊ ĐỨC ANH TUẤN LỚP: DH15MT2 MSSV: 15032304 Vũng tàu, tháng 6 năm 2019.
  2. LỜI CẢM ƠN Hệ thống quản lý phần cứng máy tính áp dụng cho các cơ quan trường học là nội dung tôi chọn sau 4 năm theo học Công nghệ Thông tin chuyên ngành Kỹ Thuật Máy Tính tại trường Đại học Bà Rịa – Vũng Tàu. Để hoàn thành thành quá trình nghiên cứu và hoàn thiện luận văn này, lời đầu tiên tôi xin chân thành cảm ơn sâu sắc đến thầy Phan Ngọc Hoàng của Viện Công nghệ Thông tin – Điện – Điện tử. Thầy đã trực tiếp chỉ bảo và hướng dẫn tôi trong suốt quá trình nghiên cứu để tôi có thể hoàn thiện luận văn này. Tôi cũng xin cảm ơn thầy Cao Quang Tín thuộc trung tâm Công nghệ Thông tin Trường Đại học Bà Rịa – Vũng Tàu đã phác họa ý tưởng và hướng dẫn tôi những bước đầu tiên của đề tài này. Ngoài ra, tôi xin cảm ơn tất cả các thầy cô thuộc viện Công nghệ Thông tin – Điện – Điện tử. Kho kiến thức quý giá và tinh thần tiếp lửa tràn đầy nhiệt huyết của các thầy cô có lẽ là thứ quý giá nhất tôi nhận được trong 4 năm học tập tại Trường Đại học Bà Rịa – Vũng Tàu. Nhân dịp này, tôi cũng xin cảm ơn Viện Công nghệ Thông tin – Điện – Điện tử, Trường Đại học Bà Rịa – Vũng Tàu, lãnh đạo và các anh chị đã tạo điều kiện và thời gian cho tôi trong suốt quá trình học tập và nghiên cứu. Một lần nữa, tôi xin trân trọng cảm ơn. 2
  3. LỜI CAM ĐOAN Tôi xin cam đoan: 1 Những nội dung trong luận văn này là do tôi thực hiện dưới sự hướng dẫn trực tiếp của thầy Phan Ngọc Hoàng. 2 Mọi tham khảo dùng trong luận văn đều được trích dẫn rõ ràng tên tác giả, tên công trình, thời gian, địa điểm công bố. 3 Mọi sao chép không hợp lệ, vi phạm quy chế đào tạo, hay gian trá, tôi xin chịu hoàn toàn trách nhiệm. Sinh viên Lê Đức Anh Tuấn 3
  4. Thuật ngữ, ký hiệu và chữ viết tắt CSDL : Cơ sở dữ liệu. [PK] : Primary key, khóa chính của bảng trong CSDL. Phòng máy : Phòng có sử dụng máy tính. Người dùng : Các cá nhân có quyền đăng nhập vào hệ thống nói chung. Người sử dụng : Những người dùng hệ thống cấp thấp không có quyền quản trị. Nhân viên IT : Nhân viên làm việc trong hệ thống, được cấp một số quyền quản trị nhất định. 4
  5. MỤC LỤC I. Đặt vấn đề 8 II. Giải quyết vấn đề 9 III. Thực hiện đề tài 11 3.1. Thiết kế xây dựng CSDL 11 3.1.1. Các đối tượng trong phạm vi làm việc 11 3.1.2. Thiết kế cấu trúc cơ sở dữ liệu 12 3.1.2.1. Thông tin máy tính 12 3.1.2.2. Thông tin linh kiện đã được lắp đặt máy tính 13 3.1.2.3. Thông tin phần cứng 15 3.1.2.4. Thông tin người dùng 17 3.1.2.5. Lịch sử cập nhật thông tin. 19 3.1.2.6. Thông tin phòng máy 21 3.1.2.7. Thông tin Báo cáo người dùng 22 3.1.3. Phân tích thiết kế hệ thống 24 3.1.4. Quan hệ của các nhóm đối tượng thao tác 27 3.1.5. Sơ đồ trang Web 27 3.2. Thiết kế - Xây dựng trang Web 29 3.2.1. Chức năng đăng nhập/Đăng xuất 33 3.2.2. Trang chủ Website 34 3.2.2.1. Trang chủ của nhân viên IT và quản trị viên 34 3.2.2.2. Trang chủ của người dùng 35 3.2.3. Chức năng tìm kiếm – quản lý máy tính 36 3.2.4. Chức năng thêm mới máy tính 42 3.2.5. Chức năng theo dõi lịch sử cập nhật hệ thống 44 3.2.6. Chức năng Báo cáo vấn đề và Phản hồi báo cáo. 45 3.2.7. Chức năng Quản lý phần cứng 53 3.2.8. Chức năng Quản lý loại phần cứng – Hãng sản xuất 57 3.2.9. Chức năng Quản lý phòng máy 59 3.2.10. Chức năng quản lý người dùng 60 5
  6. 3.2.11. Chức năng quản lý tài khoản cá nhân 62 IV. Kết quả nghiên cứu 63 V. Tài liệu tham khảo 64 Phụ lục: Code dùng trong chương trình 67 1.Lớp DataAcessLayer 67 1.1. Dataprovider.cs 67 1.2. Maytinh.cs 68 1.3 Program.cs 71 1.4 ThaoTacNguoiDung_DAO.cs 71 1.5 ThongTinMayTinh_DAO.cs 72 2. Lớp DataTransferObject 73 2.1 Program.cs 73 3. Lớp BusinessLogicLayer 74 3.1 LichSuMayTinh.cs 74 3.2 Maytinh_BUS.cs 76 3.9 User.cs 104 4. Lớp PresentationLayer 105 4.1 Sitemaster.master 105 4.1.1 StyleMaster.Master.cs 107 4.2 User.Master 108 4.2.1 User.Master.cs 110 4.3 TrangChu.aspx 110 4.3.1 Trangchu.aspx.cs 114 4.4 Quanlymaytinh.aspx 116 4.4.1 Quanlymaytinh.aspx.cs 118 4.5 ChinhSuaMayTinh.aspx 120 4.5.1 ChinhSuaMayTinh.aspx.cs 123 4.6 LichSuCapNhatMayTinh.aspx 131 4.6.1 LichSuCapNhatMayTinh.aspx.cs 133 4.8 ChinhSuaPhanCung.aspx 139 4.8.1 ChinhSuaPhanCung.aspx.cs 140 6
  7. 4.9 ChiTietBaoCao.aspx 142 4.9.1 ChiTietBaoCao.aspx.cs 145 4.10 DangNhap.aspx 148 4.10.1 DangNhap.aspx.cs 151 4.11 Logout.aspx 152 4.11.1 Logout.aspx.cs 152 4.12 QuanLyLoaiPhanCung.aspx 153 4.12.1 QuanLyLoaiPhanCung.aspx.cs 155 4.13 QuanLyNguoiDung.aspx 157 4.13.1 QuanLyNguoiDung.aspx.cs 160 4.14 QuanLyPhanCung.aspx 165 4.15 Quanlyphongmay.aspx 171 4.15.1 Quanlyphongmay.aspx.cs 172 4.16 Taikhoancanhan.aspx 174 4.16.1 Taikhoancanhan.aspx.cs 176 4.17 Taikhoanuser.aspx 177 4.17.1 Taikhoanuser.aspx.cs 178 4.18 ThemMoiBaoCao.aspx 179 4.18.1 ThemMoiBaoCao.aspx.cs 180 4.19 ThemMoiMayTinh.aspx 180 4.19.1 ThemMoiMayTinh.aspx.cs 181 4.20 ThongBao.aspx 182 4.20.1 ThongBao.aspx.cs 183 4.21 UserChiTietBaoCao.aspx 185 4.21.1 UserChiTietBaoCao.aspx.cs 186 4.22 UserThongBao.aspx 189 4.22.1 UserThongBao.aspx.cs 190 4.23 UserTrangChu.aspx 192 4.23.1 UserTrangChu.aspx.cs 193 7
  8. Lời nói đầu I. Đặt vấn đề Trên tinh thần đổi mới căn bản, toàn tiện nền giáo dục Việt Nam, báo cáo chính trị của Ban chấp hành Trung ương Đảng khóa X đã chỉ ra: « Tiếp tục phát triển và nâng cấp cơ sở vật chất - kỹ thuật cho các cơ sở giáo dục, đào tạo. Đầu tư hợp lý, có hiệu quả xây dựng một số cơ sở giáo dục, đào tạo đạt trình độ quốc tế. ». Cùng với những thay đổi căn bản về nội dung chương trình và phương pháp dạy học, phát triển và nâng cấp cơ sở vật chất sẽ là nhiệm vụ then chốt trong thời gian sắp tới của toàn bộ ngành Giáo dục. Do đó, có thể thấy rằng Cơ sở vật chất của trường học sẽ là một yếu tố rất quan trọng trong quá trình đảm bảo và nâng cao nội dung chất lượng giảng dạy của nhà trường. Hiểu rõ điều đó, Trường Đại học Bà Rịa – Vũng Tàu đã áp dụng nhiều biện pháp quản lý Cơ sở vật chất trong thời gian qua, trong đó có hệ thống phần mềm quản lý cơ sở vật chất Bước đầu, phần mềm đã nhận được phản hồi tốt và nâng cao chất lượng quản lý cơ sở vật chất trong nhà trường. Bên cạnh đó, có một số nhóm đối tượng đặc thù mà những phần mềm quản lý cơ sở vật chất chung chưa thể kiểm soát chặt chẽ, tiêu biểu cho nhóm đối tượng này là Máy vi tính. Bước vào thời đại 4.0, máy vi tính là công cụ quan trọng trong gần như mọi hoạt động của xã hội nói chung và trường học nói riêng. Đại học Bà Rịa – Vũng Tàu cũng không ngoại lệ. Kể từ khi thành lập đến nay, nhà trường luôn cố gắng đưa công nghệ vào cuộc sống hằng ngày của sinh viên và giảng viên. Chúng ta có thể kể đến một số công cụ rất mạnh mà nhà trường đã sử dụng như Cổng thông tin điện tử cho sinh viên tại địa chỉ 8
  9. sinhvien.bvu.edu.vn, cổng thông tin cho từng khoa cũng như website riêng cho từng giảng viên. Những tiện ích vô cùng thực tế này đã tiết kiệm được rất nhiều thời gian và công sức cho cả sinh viên lẫn giảng viên. Đi cùng tiện ích này sẽ là một lượng lớn máy tính được sử dụng trong phạm vi nhà trường. Do được triển khai đầu tư vào những thời điểm khác nhau trải dài từ lúc trường Đại học Bà Rịa – Vũng Tàu vừa thành lập đến nay, các máy tính này có chất lượng không đồng đều, tạo nên nhiều bất cập và khó khăn trong công tác quản lý. Các phần mềm quản lý cơ sở vật chất thông thường mới chỉ có khả năng kiểm soát đến từng đầu máy tính chứ chưa thể đi sâu vào quản lý các thành phần bên trong như bộ nhớ truy xuất ngẫu nhiên (RAM), vi xử lí trung tâm (CPU) hay các thành phần khác. Xuất phát từ thực tiễn này, tôi đã chọn và nghiên cứu đề tài Hệ thống quản lý phần cứng máy tính áp dụng cho các cơ quan trường học, áp dụng đầu tiên tại trường Đại học Bà Rịa – Vũng Tàu. II. Giải quyết vấn đề Mục tiêu chính của đề tài hướng đến việc xây dựng ứng dụng Web hỗ trợ khả năng quản lý các máy tính đang hoạt động trong phạm vi Trường Đại học Bà Rịa – Vũng Tàu. Không chỉ vậy, ứng dụng web này cũng cần phải sở hữu khả năng sửa đổi, nâng cấp hệ thống dễ dàng trong tương lai. Trang Web sẽ cung cấp cho giảng viên, nhân viên IT và quản trị viên trang web cái nhìn bao quát về hệ thống máy tính đang hoạt động trong nhà trường. Do đó, trang Web sẽ cung cấp cho người dùng những tính năng chính sau : • Báo cáo lỗi từ phía người dùng và khả năng phản hồi trực tuyến của nhân viên IT cũng như quản trị viên. • Khả năng quản lý máy tính đến mức phần cứng cũng như quản lý các loại phần cứng, hãng sản xuất phần cứng. 9
  10. • Theo dõi lịch sử cập nhật của từng máy trên hệ thống, theo dõi quá trình hệ thống làm việc. • Thêm mới, chỉnh sửa, xóa từng máy tính cũng như linh kiện bên trong máy tính. • Hiển thị, tìm kiếm, lọc kết quả tìm kiếm máy tính cũng như phần cứng máy tính. • Quản lý hệ thống theo từng cơ sở và phòng máy. • Trang trợ giúp cho người sử dụng. Để thực hiện mục tiêu trên, đề tài sẽ tiến hành nghiên cứu xây dựng trang Web quản lý hệ thống máy tính BVU phù hợp với : • Công nghệ đang được sử dụng rộng rãi. • Yêu cầu thực tiễn của công việc quản lý hệ thống máy tính. • Nhu cầu thẩm mỹ của người sử dụng. Ngoài ra, trang Web sẽ có thể phục vụ thêm nhiều chức năng phục vụ công tác quản lý máy tính như : • Theo dõi quá trình cập nhật thông tin của mọi thành phần dữ liệu trong hệ thống • Cung cấp thông tin về các thành phần linh kiện có mặt bên trong máy tính 10
  11. III. Thực hiện đề tài 3.1. Thiết kế xây dựng CSDL Công việc chính của phần thiết kế CSDL nhằm thực hiện nhiệm vụ ghi nhận và phân loại dữ liệu đầu vào của hệ thống máy tính mà trường Đại học Bà Rịa – Vũng Tàu đang sử dụng để lưu trữ vào cơ sở dữ liệu đám mây phục vụ cho công tác quản lý. 3.1.1. Các đối tượng trong phạm vi làm việc Theo khảo sát về nhiệm vụ quản lý máy tính, các đối tượng và nhóm đối tượng chính mà chương trình sẽ phải làm việc cùng gồm có : a) Máy tính cá nhân - Lưu trữ thông tin sơ bộ về máy tính : Tên máy, phòng máy, ngày thêm mới vào hệ thống. - Lưu trữ thông tin chi tiết về máy tính : Các phần cứng đang có trong máy, trạng thái hoạt động, lịch sử thay đổi của máy tính. - Các máy tính sẽ bao gồm nhiều phần cứng khác nhau. Các phần cứng này sẽ có giới hạn nhất định về số lượng được lắp ráp trong từng máy. b) Hệ thống phần cứng - Lưu trữ thông tin về những dòng phần cứng mà nhà trường đang sử dụng. Ghi nhận về thời gian bắt đầu đưa vào sử dụng, số lượng, chi tiết thành phần, . - Lưu trữ thông tin về những phần cứng đang được sử dụng trong từng máy tính, thời gian bắt đầu sử dụng, người sử dụng, trạng thái hoạt động hiện tại, c) Cơ sở vật chất - Lưu trữ thông tin về những phòng máy đang được nhà trường sử dụng. Ghi nhận những thay đổi đã và sẽ xảy ra của những máy tính có trong phòng máy. 11
  12. - Lưu trữ thông tin về vị trí phòng máy, ngày đi vào hoạt động, trạng thái hoạt động của phòng máy. 3.1.2. Thiết kế cấu trúc cơ sở dữ liệu 3.1.2.1. Thông tin máy tính Để tiến hành quản lý một cách hiệu quả, các máy tính được phân biệt với nhau bằng mã số id. Các mã id này là độc nhất, không trùng hợp. Ngoài ra, thông tin máy tính cơ bản cũng bao gồm tên máy, ngày đăng ký vào hệ thống, người đăng ký vào hệ thống, vị trí máy tính (nằm ở phòng máy nào) và trạng thái máy tính hiện tại. Các thông tin cần lưu trữ : • Tên máy tính : Tên của máy tính. Các máy tính khác nhau được phân biệt qua mã định danh. Mã định danh do hệ thống tự xử lí, người dùng chỉ thao tác với tên máy tính. • Vị trí hiện tại của máy tính : Là tài sản của nhà trường, mỗi máy tính cần được bố trí trong một phòng máy/phòng làm việc nhất định. Do đó, máy tính sẽ được gán cùng phòng máy để tiện cho việc quản lý. - Vị trí hiện tại của máy tính được biểu diễn bằng mã số của phòng máy/phòng làm việc mà máy tính đó đang được đặt vào. - Thông tin cơ sở được gắn liền với thông tin phòng máy. Do đó, không cần lưu trữ thông tin cơ sở chung với thông tin máy tính. • Thời gian đăng ký máy tính : Đánh dấu thời gian máy tính đang làm việc bắt đầu tham gia vào hệ thống. - Thời gian máy tính bắt đầu tham gia vào hệ thống được tính bằng thời gian mã định danh của máy tính xuất hiện trên hệ thống. - Thời gian đăng ký máy tính được ghi lại theo định dạng : yyyy-MM- dd HH:mm:ss phù hợp với kiểu dữ liệu DATETIME của hệ quản trị CSDL MySQL. 12
  13. • Người đăng ký máy tính vào hệ thống : Người thêm mới máy tính vào hệ thống, dùng cho công tác quản lý. - Mỗi máy tính chỉ có duy nhất một người đăng ký và không thay đổi trong suốt quá trình hoạt động của hệ thống. - Người đăng ký máy tính được ghi nhận ngay từ lúc máy tính có mã định danh. Dựa vào những yêu cầu trên, thông tin cơ bản về máy tính có thể được biểu diễn trong một bảng của CSDL như sau : Bảng 1. Cấu trúc bảng lưu trữ thông tin cơ bản của máy tính Tên trường Giải thích nội dung [PK] idMay Đánh số id cho từng máy tính Tenmay Tên của máy tính Status Trạng thái hoạt động của máy tính idPhong Mã định danh của phòng máy chứa máy tính đang thao tác ThoiGianThemMoi Thời gian máy tính được đăng ký vào hệ thống NguoiThemMoi Người dùng đăng ký máy vào hệ thống 3.1.2.2. Thông tin linh kiện đã được lắp đặt máy tính Trên thực tế, mỗi máy tính có thể có nhiều linh kiện khác nhau và không giống nhau về những loại phần cứng mà chúng được trang bị. Chẳng hạn, cùng một tổng dung lượng RAM 4 GB, máy tính A có thể sử dụng 4 thanh RAM 1 GB còn máy tính B sử dụng 2 thanh RAM 2 GB. Do đó, hệ thống sẽ lưu trữ thông tin của tất cả các phần cứng được sử dụng trong tất cả các máy tính. Trong quá trình truy vấn dữ liệu, tiến hành đối chiếu bảng thông tin linh kiện với bảng Thông tin phần cứng (Bảng 3) và bảng Thông tin máy tính (Bảng 1) trong quá trình sử dụng sẽ là biện pháp tốt nhất. Các thông tin cần lưu trữ : 13
  14. • Máy tính sử dụng phần cứng : Mỗi máy tính lại có một cách lắp đặt linh kiện khác nhau. Do đó, cần lưu lại mã định danh của máy tính để phân biệt. - Một số loại phần cứng có thể được lắp với số lượng nhiều hơn 1 trên máy tính. Vì vậy, mã định danh của máy tính không thể được dùng như cột ID của bảng. • Loại phần cứng : Thông tin cụ thể về linh kiện được lắp đặt trong máy tính. Thông tin này được lấy trực tiếp từ cơ sở dữ liệu của chương trình. • Thời gian thêm mới linh kiện : Được ghi lại theo định dạng : yyyy- MM-dd HH:mm:ss phù hợp với kiểu dữ liệu DATETIME của hệ quản trị CSDL MySQL. - Thời gian thêm mới linh kiện được tính theo thời gian cập nhật vào hệ thống, không phải thời gian lắp đặt thực tế của linh kiện. • Người thêm mới phần cứng : Người thêm mới máy tính vào hệ thống, dùng cho công tác quản lý. - Người đăng ký máy tính được ghi nhận từ lúc linh kiện có mã định danh. Dựa vào yêu cầu trên, thông tin về những phần cứng được lắp đặt trong máy tính có thể được biểu diễn trong bảng của CSDL như sau : Bảng 2. Cấu trúc bảng lưu trữ thông tin phần cứng máy tính Tên trường Giải thích nội dung [PK] id Mã định danh cho linh kiện hiện tại đang thao tác, dùng để liên kết giữa máy tính và phần cứng. idMayTinh Mã định danh của máy tính mà linh kiện này đang lắp vào. idPhanCung Mã số định danh của loại linh kiện đang thao tác, dùng để tham chiếu qua bảng Thông tin phần cứng (Bảng 3) 14
  15. NgayThemMoi Ngày thêm mới phần cứng vào máy tính. NguoiThemMoi Người thêm mới phần cứng. 3.1.2.3. Thông tin phần cứng Mỗi kiểu phần cứng sẽ thuộc một loại phần cứng xác định được tham chiếu bằng bảng Loại phần cứng (Bảng 4). Ngoài ra, mỗi kiểu phần cứng sẽ có một nhà sản xuất xác định (được tham chiếu qua bảng 5) và hình ảnh minh họa đi kèm. Các thông tin cần lưu trữ : • Tên của kiểu phẩn cứng : • Nhà sản xuất : Được tham chiếu trên dữ liệu về các nhà sản xuất phần cứng đang có trong hệ thống (Bảng 5). Mỗi kiểu phần cứng chỉ có một nhà sản xuất xác định. • Thời gian cập nhật : Được ghi lại theo định dạng : yyyy-MM-dd HH:mm:ss phù hợp với kiểu dữ liệu DATETIME của hệ quản trị CSDL MySQL. - Thời gian cập nhật được xác định theo thời gian mà kiểu phần cứng được đăng ký lên hệ thống. • Loại phần cứng : Được tham chiếu trên dữ liệu về loại phần cứng đang có trên hệ thống (Bảng 4). Mỗi kiểu phần cứng chỉ thuộc một loại phần cứng xác định. • Hình ảnh : Đường dẫn đến hình ảnh minh họa của kiểu phần cứng. • Mô tả phần cứng : Đưa ra mô tả chi tiết về kiểu phần cứng. • Trạng thái : Trạng thái hoạt động của phần cứng trong hệ thống. - Phần cứng không hoạt động sẽ không xuất hiện trong các tùy chọn thêm mới phần cứng cũng như chỉnh sửa phần cứng. Tuy nhiên, những máy tính đã được lắp đặt phần cứng này vẫn sẽ nhìn thấy thông tin như bình thường. 15
  16. Dựa vào các yêu cầu trên, chúng ta có thể thành lập bảng lưu trữ thông tin của các linh kiện máy tính vào cơ sở dữ liệu như sau : Bảng 3. Cấu trúc bảng lưu trữ thông tin kiểu phần cứng Tên trường Giải thích nội dung [PK] Mã định danh của kiểu phần cứng idphancung TenPhanCung Tên gọi của kiểu phần cứng NhaSanXuat Mã định danh của nhà sản xuất phần cứng NgayCapNhat Thời gian cập nhật kiểu phần cứng vào hệ thống LoaiPhanCung Mã định danh của loại phần cứng HinhAnh Đường dẫn đến hình ảnh minh họa của phần cứng. MoTa Mô tả về phần cứng. TrangThai Trạng thái hiện tại của phần cứng Tuy có nhiều kiểu phần cứng nhưng chỉ có một số loại phần cứng nhất định có thể được gắn vào máy tính và mỗi máy tính cũng chỉ có khả năng gắn một lượng xác định các thiết bị cùng loại vào trong cùng một thời điểm. Do đó, chúng ta cần lưu trữ những thông tin sau về loại phần cứng : • Tên loại phần cứng : Giúp người dùng phân biệt dễ dàng từng loại phần cứng • Giới hạn số lượng : Số lượng phần cứng tối đa cùng một loại có thể được lắp đặt trong máy tính. - Các phần cứng khác kiểu nhưng cùng loại sẽ được hệ thống tính chung. Vì vậy, chúng ta có bảng sau để lưu trữ thông tin theo yêu cầu : 16
  17. Bảng 4. Cấu trúc bảng lưu trữ thông tin Loại phần cứng Tên trường Giải thích nội dung [PK] Mã định danh của loại phần cứng idLoaiPhanCung TenLoaiPhanCung Tên của loại phần cứng GioiHanSoLuong Giới hạn số lượng của những linh kiện cùng loại trong cùng một máy tính. TrangThai Trạng thái hiện tại của loại phần cứng Ngoài ra, thông tin về nhà sản xuất phần cứng cũng là một nhóm dữ liệu cần được lưu trữ. Chúng ta có bảng sau dùng để lưu trữ thông tin nhà sản xuất phần cứng : Bảng 5. Cấu trúc bảng lưu trữ thông tin nhà sản xuất Tên trường Giải thích nội dung [PK] Mã định danh của nhà sản xuất idNhaSanXuat TenNhaSanXuat Tên gọi của nhà sản xuất TrangThai Trạng thái hiện tại của nhà sản xuất 3.1.2.4. Thông tin người dùng Với 3 nhóm người dùng : Quản trị viên, kỹ thuật viên và giảng viên, chúng ta cần có các thông tin đăng nhập cơ bản như tài khoản mật khẩu, thời gian bắt đầu gia nhập hệ thống và quan trọng nhất là thông tin về vai trò của user trong hệ thống. Do đó, chúng ta cần lưu trữ những thông tin sau : • Tên đăng nhập : Tên đăng nhập của người dùng. Mỗi một người dùng sẽ có một tên đăng nhập duy nhất trên hệ thống và không thể trùng lặp. • Mật khẩu : Mật khẩu đăng nhập của người dùng. Mật khẩu 17
  18. • Quyền hạn : Quyền hạn đăng nhập hệ thống của người dùng. Có 3 cấp độ quyền hạn : Người dùng, nhân viên IT và quản trị viên. - Người dùng có thể đăng nhập, xem tình trạng về tài khoản cá nhân, xem lại các báo cáo vấn đề mình đã gửi lên hệ thống, tạo mới báo cáo, xem trạng thái báo cáo, thay đổi thông tin cá nhân. - Nhân viên IT có thể đăng nhập, xem tình trạng hệ thống, thêm mới, xóa, thay thế phần cứng trong máy tính, xem thông tin về loại phần cứng – hãng sản xuất phần cứng, xem thông tin về người dùng, xem lịch sử cập nhật hệ thống, xem lịch sử cập nhật máy tính, xem những báo cáo của người dùng thuộc trách nhiệm xử lí của mình, thay đổi trạng thái của báo cáo vấn đề. - Quản trị viên là nhân sự có quyền tối đa của hệ thống. Quản trị viên có thể đăng nhập, xem tình trạng hệ thống, thêm mới máy tính, chỉnh sửa thông tin máy tính, Thêm, sửa, xóa toàn bộ các thông tin liên quan về kiểu phần cứng – loại phần cứng – hãng sản xuất phần cứng. Quản trị viên cũng có toàn quyền điều chỉnh thông tin của các người dùng trong hệ thống, có thể xem báo cáo của người dùng và chỉ thị nhân viên giải quyết vấn đề đó. Ngoài ra, quản trị viên còn có thể đóng báo cáo vấn đề đã xử lí hoàn thành. • Ngày tham gia hệ thống : Thời gian người dùng được thêm mới vào hệ thống. • Người thêm mới user : Người thêm mới người dùng vào hệ thống • Trạng thái hoạt động của người dùng : Đang hoạt động hoặc không. Nếu người dùng không hoạt động, tạm thời quyền đăng nhập hệ thống của người dùng sẽ bị khóa. Để lưu trữ những thông tin trên, chúng ta có bảng sau thoả mãn yêu cầu : 18
  19. Bảng 6. Cấu trúc bảng lưu trữ thông tin người dùng Tên trường Giải thích nội dung [PK]idNguoiDung Mã định danh của người dùng TenDangNhap Tên đăng nhập của người dùng MatKhau Mật khẩu của người dùng Role Vai trò của người dùng trên hệ thống NgayThemMoi Thời gian người dùng tham gia vào hệ thống NguoiThemMoi Người thêm mới người dùng TrangThai Trạng thái hoạt động của người dùng Ngoài ra, chúng ta cần thêm một bảng phụ lưu giữ danh mục vai trò của người dùng trong hệ thống. Cấu trúc bảng như sau : Bảng 7. Cấu trúc bảng lưu trữ vai trò hệ thống của người dùng Tên trường Giải thích nội dung [PK]idQuyen Mã định danh của quyền TenQuyen Tên quyền người dùng 3.1.2.5. Lịch sử cập nhật thông tin. Mỗi máy tính có thể trải qua nhiều lần sửa chữa, nâng cấp với rất nhiều khác biệt về mặt phần cứng. Do đó, việc ghi nhận lại lịch sử thay đổi của từng máy tính là điều cần thiết. Để làm được việc này, chúng ta cần lưu lại những thông tin sau : • Máy tính được thay đổi : Mã định danh của máy tính thực hiện thay đổi, đối chiếu qua bảng 1. • Phần cứng được thay đổi : Mã định danh của phần cứng được thay đổi, đối chiếu qua bảng 2. • Mục đích thay đổi : Xóa, sửa, thêm mới. • Thời gian diễn ra : Thời gian diễn ra hoạt động cập nhật, được ghi nhận tại thời điểm cập nhật thông tin lên hệ thống. 19
  20. • Người tiến hành : Người tiến hành cập nhật thông tin. Để thực hiện yêu cầu trên, chúng ta có bảng trong CSDL : Bảng 8. Cấu trúc bảng lưu trữ thông tin về lịch sử thay đổi của máy tính Tên trường Giải thích nội dung [PK]idThayDoi Mã định danh của lần thay đổi idMayTinh Mã định danh của máy tính tiến hành thay đổi idPhanCung Mã định danh của phần cứng được thay đổi GhiChu Nội dung thay đổi ThoiGian Thời gian tiến hành thay đổi NguoiThayDoi Người tiến hành thay đổi Ngoài ra, những thay đổi khác trong hệ thống cũng cần được ghi nhận lại như thêm máy tính, xóa máy tính, thêm mới người dùng, sửa đổi thông tin phần cứng, cập nhật thông tin người dùng, Để làm được việc này, chúng ta cần lưu lại những thông tin sau : • Nội dung cập nhật : Ghi nhận lại nội dung cập nhật đã được thực hiện. • Máy tính (tùy chọn) : Ghi nhận lại máy tính đã được thao tác. Tuy nhiên, không phải mọi hoạt động cập nhật hệ thống đều là hành động cập nhật máy tính. Do đó, đây chỉ là một thông tin bổ sung thêm. • Thời gian : Thời gian diễn ra hoạt động cập nhật thông tin. Được tính theo thời điểm thao tác cập nhật thông tin được tiến hành. • Người cập nhật : Người tiến hành cập nhật thông tin. Để lưu trữ những thông tin trên, chúng ta có bảng sau trong CSDL : Bảng 9. Cấu trúc bảng Thông tin cập nhật hệ thống Tên trường Giải thích ý nghĩa [PK]idLichSu Mã định danh của lần cập nhật thông tin idMayTinh Mã định danh của máy tính được tiến hành cập nhật thông tin 20
  21. NoiDung Ghi lại nội dung cập nhật thông tin ThoiGian Thời gian thao tác cập nhật được tiến hành NguoiThaoTac Tên của người tiến hành thao tác cập nhật 3.1.2.6. Thông tin phòng máy Các phòng máy sẽ được đặt ở những cơ sở khác nhau của trường Đại học Bà Rịa – Vũng Tàu. Do đó, chúng ta cần lưu giữ thông tin về các cơ sở trước : Bảng 10. Cấu trúc bảng lưu trữ thông tin cơ sở Tên trường Giải thích ý nghĩa [PK]idCoSo Mã định danh của cơ sở TenCoSo Tên của cơ sở Để phục vụ mục đích quản lý, chúng ta cần lưu giữ những thông tin sau của từng phòng máy : • Tên phòng máy : Giúp người dùng dễ dàng phân biệt giữa các phòng máy. • Cơ sở đặt phòng máy : Lưu trữ lại cơ sở nơi có phòng máy. Dữ liệu về cơ sở được tham chiếu qua bảng 9. • Ngày thêm mới phòng máy : Được xác định theo thời gian thêm mới phòng máy ở hệ thống, ghi nhận theo định dạng yyyy-MM-dd HH:mm:ss phù hợp với kiểu dữ liệu DATETIME của hệ quản trị CSDL MySQL. • Người thêm mới phòng máy : Lưu trữ lại tên của người dùng thực hiện thao tác thêm mới phòng máy. Bảng sau đây đáp ứng việc lưu trữ những thông tin trên vào CSDL : Bảng 11. Cấu trúc bảng lưu trữ thông tin phòng máy. Tên trường Giải thích ý nghĩa [PK]idPhongMay Mã định danh của phòng máy 21
  22. TenPhongMay Tên phòng máy idCoSo Mã định danh của cơ sở nơi phòng máy tọa lạc NgayThemMoi Ngày thêm mới phòng máy vào hệ thống NguoiThemMoi Người thêm mới phòng máy vào hệ thống 3.1.2.7. Thông tin Báo cáo người dùng Báo cáo sẽ được chia thành từng luồng riêng biệt, mỗi người dùng có thể có nhiều báo cáo. Mỗi vấn đề được báo cáo lại được quản trị viên hệ thống chỉ định một nhân viên IT giải quyết. Sau khi nhân viên IT giải quyết thành công, hệ thống sẽ gửi lại thông báo về quản trị viên để quản trị viên xác nhận và đóng báo cáo, kết thúc vấn đề. Để thực hiện được các yêu cầu trên, chúng ta cần lưu trữ những thông tin sau : • Tiêu đề báo cáo : Tóm tắt nội dung của vấn đề được báo cáo. • Nội dung trao đổi : Nội dung chính mà người dùng, nhân viên IT và quản trị viên trao đổi qua tính năng gửi phản hồi của hệ thống. • Thời gian trao đổi : Thời gian mà người dùng, nhân viên IT và quản trị viên tiến hành trao đổi thông tin qua tính năng gửi phản hồi của hệ thống. • Người trao đổi : Tài khoản tiến hành gửi phản hồi trong luồng báo cáo qua tính năng gửi phản hồi của hệ thống. • Trạng thái : Trạng thái hiện tại của báo cáo. Trạng thái này được xác định giá trị bằng cách tham chiếu qua bảng Trạng thái báo cáo (Bảng ). • Ngày báo cáo : Lưu trữ lại thời gian vấn đề báo cáo bắt đầu được gửi lên hệ thống. • Người báo cáo : Lưu trữ lại thông tin của người dùng gửi báo cáo. • Người xử lí : Nhân viên được quản trị viên chỉ định nhiệm vụ giải quyết vấn đề trong báo cáo. 22
  23. • Trạng thái thông báo : Xác định trạng thái đã đọc thông báo của người dùng, nhân viên IT và quản trị viên để hệ thống có thể tiến hành gửi thông báo. Để thỏa mãn công việc lưu trữ những thông tin trên, chúng ta có 2 bảng sau trong CSDL để sử dụng : Bảng 12. Cấu trúc bảng lưu trữ thông tin báo cáo Tên trường Giải thích ý nghĩa [PK]idBaoCao Mã định danh của báo cáo TieuDeBaoCao Tiêu đề báo cáo idTrangThai Chỉ ra trạng thái hiện tại của báo cáo (đang giải quyết, đã giải quyết, đã khóa, ) NguoiBaoCao Người bắt đầu báo cáo NguoiXuLi Người chịu trách nhiệm xử lí vấn đề được báo cáo NgayBaoCao Ngày bắt đầu báo cáo vấn đề TrangThaiThongBao Xác định người dùng đã đọc báo cáo hay chưa để tiến hành thông báo Bảng 13. Cấu trúc bảng lưu trữ lời nhắn của báo cáo. Tên trường Giải thích ý nghĩa [PK]idLogBaoCao Mã định danh của lời nhắn idBaoCao Mã định danh của luồng báo cáo mà lời nhắn thuộc về NoiDungTraoDoi Nội dung của lời nhắn UserTraoDoi Người viết lời nhắn ThoiGianBaoCao Thời gian gửi lời nhắn Ngoài ra, hệ thống cũng cần thêm một bảng phụ nữa để tham chiếu trạng thái báo cáo lúc cần thiết. Cấu trúc của bảng phụ đó như sau : Bảng 14. Cấu trúc bảng lưu trữ thông tin trạng thái của báo cáo. 23
  24. Tên trường Giải thích ý nghĩa [PK]idTrangThai Mã định danh của trạng thái TenTrangThai Tên gọi của trạng thái báo cáo 3.1.3. Phân tích thiết kế hệ thống Sơ đồ cấu trúc tổng quát hệ thống 24
  25. Cấu trúc nhánh Quản lý máy tính Cấu trúc nhánh Quản lý hệ thống phần cứng Cấu trúc nhánh Quản lý người dùng 25
  26. Cấu trúc nhánh Thông báo người dùng phía người dùng Cấu trúc nhánh Thông báo người dùng phía quản trị 26
  27. 3.1.4. Quan hệ của các nhóm đối tượng thao tác Quan hệ của các nhóm đối tượng mà trang Web làm việc cùng được thể hiện qua sơ đồ sau : Sơ đồ quan hệ giữa các bảng dữ liệu 3.1.5. Sơ đồ trang Web • Người dùng sẽ bắt đầu từ trang đăng nhập hệ thống • Sau khi nhập đúng thông tin tài khoản, người dùng sẽ được chuyển hướng đến từng nhánh làm việc phù 27
  28. hợp với vai trò trong hệ thống. • Một số thành phần trong 2 nhánh làm việc là giống nhau về mặt nội dung. Tuy nhiên, vì yêu cầu bảo mật, các thành phần này sẽ được dùng riêng với nhau. 28
  29. 3.2. Thiết kế - Xây dựng trang Web Công việc chính của phần này là thiết kế và xây dựng trang web phục vụ công tác quản lý máy tính. Trang Web phải thực hiện được các nhiệm vụ chính sau: • Quản lý đăng nhập/đăng xuất của người dùng, chuyển hướng đến trang riêng dành cho từng đối tượng người dùng dựa trên quyền hạn của họ trên hệ thống. • Trang chủ đưa ra thông tin thống kê về hệ thống, cho phép người dùng có khả năng nhanh chóng nắm bắt tổng quan tình trạng hiện tại của hệ thống. • Trang quản lý máy tính cho phép người dùng đủ quyền hạn có khả năng theo dõi - cập nhật thông tin của từng máy tính một cách tiện lợi và trực quan. • Trang quản lý – theo dõi lịch sử cập nhật cho phép người dùng có thể tra cứu và sàng lọc mọi thay đổi được ghi nhận lại trong hệ thống. • Cung cấp khả năng trao đổi liên tục và mạch lạc giữa người dùng – nhân viên IT và quản trị viên qua hệ thống phản hồi báo cáo vấn đề. • Cung cấp khả năng theo dõi – cập nhật thông tin của bộ dữ liệu về phòng máy – cơ sở, phần cứng – loại phần cứng – nhà sản xuất phần cứng một cách tiện lợi và trực quan. • Đảm bảo được khả năng bảo mật, phòng chống tấn công từ bên ngoài và hư hỏng dữ liệu từ nội bộ hệ thống. • Cung cấp môi trường làm việc thân thiện, trực quan cũng như hợp thẩm mỹ cho người sử dụng. Để phục vụ nhu cầu trên, cấu trúc trang web được chia thành 4 lớp chính: 29
  30. Cấu trúc nội bộ trang web DataAccessLayer là lớp đầu tiên trực tiếp làm việc cùng hệ thống cơ sở dữ liệu. Lớp DataAccessLayer cũng cho phép tầng BussinessLogic thực hiện truy vấn dữ liệu. Để xem chi tiết nội dung mã nguồn của lớp DataAccessLayer, xem phụ lục 5.1 DataAccessLayer. Cấu trúc lớp DataAccessLayer Sau lớp DataAccessLayer sẽ là lớp BusinessLogicLayer. Đây là nơi đáp ứng các yêu cầu thao tác dữ liệu của GUI layer, xử lý chính nguồn dữ liệu từ Presentation Layer trước khi truyền xuống Data Access Layer và lưu xuống hệ quản trị CSDL. ngoài ra, BusinessLogicLayer còn là nơi kiểm tra các ràng buộc, tính toàn vẹn và hợp lệ dữ liệu, thực hiện tính toán và xử lý các yêu cầu nghiệp vụ, trước khi trả kết quả về Presentation Layer. Để xem chi tiết nội dung mã nguồn của lớp BusinessLogicLayer, xem phụ lục 5.3 BusinessLogicLayer. 30
  31. Cấu trúc lớp BusinessLogicLayer Để hiển thị dữ liệu và làm việc với người dùng, trang web sẽ sử dụng lớp giao diện PresentationLayer được đặt tên thành WepApp-Quanlymaytinh. Lớp này gồm các thành phần giao diện và thực hiện các công việc như nhập liệu, hiển thị dữ liêu, kiểm tra tính đúng đắn dữ liệu trước khi gọi lớp Business Logic Layer (BLL). Để xem chi tiết nội dung mã nguồn của lớp PresentationLayer, xem phụ lục 5.4 PresentationLayer. 31
  32. Cấu trúc lớp PresentationLayer Ngoài ra, để trung chuyển dữ liệu giữa các lớp khác nhau, trang Web còn sử dụng thêm đối tượng DataTranferObject. Để xem chi tiết về nội dung mã nguồn của lớp DataTransferObject, xem phụ lục 5.2 Cấu trúc đối tượng DataTranferObject 32
  33. 3.2.1. Chức năng đăng nhập/Đăng xuất Hình 1 : Giao diện trang đăng nhập Trang đăng nhập là nơi người dùng bắt đầu phiên làm việc. Nếu người dùng cố tình vào các trang khác khi chưa bắt đầu phiên làm việc, người dùng sẽ bị chuyển hướng về trang đăng nhập. Tại trang đăng nhập, người dùng sẽ nhập thông tin tài khoản vào ô Tên đăng nhập và mật khẩu vào ô Mật khẩu. Sau đó, nhấn chuột vào nút Đăng nhập để tiến hành đăng nhập. Sau khi xác nhận thông tin, tùy vào quyền của người dùng trên hệ thống, người dùng sẽ được chuyển hướng đến các trang tương ứng. Để xem chi tiết thông tin về mã nguồn của trang đăng nhập, xem phụ lục 5.4.10. 33
  34. 3.2.2. Trang chủ Website 3.2.2.1. Trang chủ của nhân viên IT và quản trị viên Hình 2 : Trang chủ của nhân viên IT và quản trị viên Trang chủ của nhân viên IT và quản trị viên cung cấp cái nhìn tổng quan về hệ thống với các thông tin : thông tin cập nhật hệ thống, thông tin phòng máy trong cơ sở, thống kê tổng số máy, . được phân theo từng cơ sở. Người sử dụng có thể nhấn vào từng tab để xem thông tin chi tiết của từng cơ sở. 34
  35. Hình 3 : Phân tab cho thông tin thống kê của từng cơ sở 3.2.2.2. Trang chủ của người dùng Hình4 : Giao diện trang chủ dành cho người dùng 35
  36. Tại giao diện trang chủ, người sử dụng có thể xem tổng quan thông tin sơ lược về tài khoản cũng như thống kê tổng quan về những báo cáo vấn đề mình đã gửi lên hệ thống. Để xem chi tiết thông tin về mã nguồn của trang chủ cho người quản lý, xem phụ lục 5.4.3 Để xem chi tiết thông tin về mã nguồn của trang chủ cho người sử dụng, xem phụ lục 5.4.23. 3.2.3. Chức năng tìm kiếm – quản lý máy tính Ở bất kỳ đâu trong hệ thống trang web, nhấn vào menu Quản lý máy tính để truy cập vào chức năng tìm kiếm – quản lý máy tính. Hình 5 : Giao diện trang tìm kiếm máy tính Sau khi nhấn vào menu Quản lý máy tính, người dùng sẽ được đưa đến giao diện Tìm kiếm máy tính. Ở đây, người dùng có thể sử dụng các bộ lọc và thành phần điều khiển được hệ thống cung cấp để tìm ra máy tính phù hợp. 36
  37. Để tìm kiếm nhanh, người dùng có thể nhập từ khóa vào ô Từ khóa tìm kiếm, chọn mục cơ sở thành Tất cả và nhấn vào nút tìm kiếm để hiển thị ra kết quả mong muốn. Để tìm kiếm nâng cao, sau khi nhập từ khóa vào ô Từ khóa tìm kiếm, người dùng có thể chọn cơ sở - phòng máy thuộc cơ sở để lọc ra kết quả tìm kiếm phù hợp. Sau khi đã chọn xong, nhấn vào nút Tìm kiếm để hiển thị kết quả. Hình 6 : Phân trang trong kết quả tìm kiếm Nếu kết quả tìm kiếm có nhiều hơn 10 mục, người dùng có thể di chuyển đến những trang sau để tiếp tục xem kết quả tìm kiếm bằng cách nhấn vào nút Trang kế tiếp hoặc trở về trang đã xem bằng cách nhấn vào nút Trang trước. Để xem chi tiết thông tin về mã nguồn của trang tìm kiếm máy tính, xem phụ lục 5.4.4 Tại kết quả tìm kiếm máy tính, nhấn vào nút Chi Tiết để xem thông tin chi tiết của máy tính. 37
  38. Hình 7 : Giao diện trang chi tiết thông tin máy tính. Trang Thông tin máy tính cho người dùng xem những thông tin chi tiết về máy tính như Tên máy tính, vị trí máy tính, ngày bắt đầu đăng ký vào hệ thống, chi tiết phần cứng, lịch sử cập nhật phần cứng, Tại trang Thông tin máy tính, nhấn vào nút Thay đổi thông tin để tiến hành cập nhật thông tin tổng quan về máy tính. Hình 8 : Thay đổi thông tin chi tiết máy tính Người dùng có thể cập nhật tên máy tính bằng cách thay đổi giá trị trong hộp thoại Tên máy tính, thay đổi vị trí đặt máy tính bằng cách thay đổi giá trị 38
  39. trong danh sách Cơ sở và Phòng máy. Sau khi hoàn thành, nhấn vào nút Xác nhận thay đổi để cập nhật thông tin. Hệ thống sẽ trả về thông báo xác nhận cập nhật thông tin thành công hoặc cảnh báo nếu cập nhật thông tin thất bại. Hình 9 : Thông báo xác nhận cập nhật thông tin thành công. Ở phần thứ hai của trang Thông tin máy tính, người dùng có thể theo dõi chi tiết và chỉnh sửa thông tin về những phần cứng đang được sử dụng trong máy. Để thêm mới một phần cứng, nhấn vào nút Thêm mới phần cứng. 39
  40. Hình 10 : Giao diện mục Thêm mới phần cứng Tại hộp thoại Thêm mới phần cứng, người dùng sẽ phải chọn loại phần cứng và tên phần cứng cụ thể mình muốn thêm vào máy tính bằng cách thay đổi thông tin phù hợp trong 2 danh sách xổ của hộp thoại. Sau khi chọn phần cứng xong, nhấn vào nút Thêm mới phần cứng để tiến hành cập nhật thông tin hoặc Đóng để hủy thay đổi. Nếu hợp lệ, hệ thống sẽ quay lại trang thông tin máy tính để người dùng sử dụng. Nếu phần cứng đã đạt tới giới hạn số lượng có trong một máy, hệ thống sẽ gửi lại thông báo cho người dùng và hoàn tác thay đổi. 40
  41. Hình 11 : Cảnh báo khi thêm phần cứng Ở cuối trang Thông tin máy tính là nút Lịch sử cập nhật máy tính. Sau khi nhấn vào đây, người dùng sẽ được chuyển hướng đến trang Thông tin lịch sử cập nhật máy tính. Để xem chi tiết thông tin về mã nguồn của trang Thông tin máy tính, xem phụ lục 5.4.5 Hình 12 : Giao diện trang Lịch sử cập nhật phần cứng của máy tính 41
  42. Tại trang Lịch sử cập nhật máy tính, người dùng có thể xem lại toàn bộ những thay đổi mà máy tính đã trải qua. Nếu muốn tìm kiếm một nội dung bất kỳ, người dùng có thể nhập từ khóa vào ô Từ khóa tìm kiếm và nhấn vào nút Tìm kiếm để lọc kết quả. Hình 13 : Tìm kiếm lịch sử cập nhật phần cứng của máy tính Để xem chi tiết thông tin về mã nguồn của trang lịch sử cập nhật phần cứng máy tính, xem phụ lục 5.4.6 3.2.4. Chức năng thêm mới máy tính Để đi tới mục Thêm mới máy tính, tại bất kỳ trang nào nằm trong phần Quản lý máy tính, nhấn vào nút Thêm mới máy tính ở thanh điều hướng con. 42
  43. Hình 14 : Mục Thêm mới máy tính nằm ở thanh điều hướng con Hình 15 : Giao diện Thêm mới máy tính Tại giao diện Thêm mới máy tính, nhập tên máy tính vào hộp thoại Tên máy tính. Sau đó, người dùng có thể chọn vị trí đặt máy tính bằng cách thay đổi các tham số trong mục Cơ sở và Phòng. Sau khi hoàn tất thay đổi, nhấn vào nút Thêm mới máy tính để tiến hành thêm mới. Sau khi thêm mới thành công, người dùng sẽ được điều hướng đến trang Thông tin máy tính để tiến hành cập nhật thông tin phần cứng cho máy tính. 43
  44. Hình 16 : Ngay sau khi thêm mới, người dùng được chuyển hướng đến trang Chi tiết thông tin máy tính. Để xem chi tiết thông tin về mã nguồn của trang thêm mới máy tính, xem phụ lục 5.4.19 3.2.5. Chức năng theo dõi lịch sử cập nhật hệ thống Hình 17 : Giao diện Lịch sử cập nhật thông tin hệ thống 44
  45. Tại trang Lịch sử cập nhật thông tin hệ thống, người dùng có thể theo dõi mọi sự thay đổi đã được ghi nhận lại trong hệ thống. Để tiến hành học thay đổi, nhập từ khóa vào ô Từ khóa tìm kiếm và chọn mốc thời gian ở 2 lịch biểu phía dưới. Sau đó, nhấn vào nút Tìm kiếm để tiến hành tìm kiếm thông tin. Nếu không chọn mốc thời gian, hệ thống sẽ tự tìm tất cả mọi kết quả phù hợp với từ khóa người dùng cung cấp. Hình 18 : Kết quả tìm kiếm lịch sử cập nhật Để xem chi tiết thông tin về mã nguồn của trang lịch sử cập nhật hệ thống máy tính, xem phụ lục 5.4.6 3.2.6. Chức năng Báo cáo vấn đề và Phản hồi báo cáo. Đây là tính năng tương tác chính giữa người dùng máy tính, nhân viên IT và quản trị viên. Để truy cập vào chức năng này, nhấn vào nút Báo cáo ở thanh điều hướng chủ để đi tới giao diện Danh sách báo cáo. 45
  46. Hình 19 : Giao diện trang Báo cáo của người dùng Để xem chi tiết thông tin về mã nguồn của trang Báo cáo người dùng, xem phụ lục 5.4.22. Khi chưa cần truy cập ngay, người sử dụng cũng có thể nhìn vào con số bên cạnh nút Thông báo để theo dõi những báo cáo mới hoặc phản hồi báo cáo mới mình chưa đọc. Hình 20 : Số lượng thông báo chưa đọc được hiển thị Tại giao diện Danh sách báo cáo, nhấn vào nút Thêm mới báo cáo để tạo mới báo cáo vấn đề. Sau khi nhập tiêu đề và nội dung chính của báo cáo, nhấn Thêm mới báo cáo để gửi lên hệ thống. 46
  47. Hình 21 : Giao diện Thêm mới báo cáo vấn đề Để xem chi tiết thông tin về mã nguồn của trang Thêm mới báo cáo vấn đề, xem phụ lục 5.4.18. Sau khi người sử dụng thêm mới báo cáo vấn đề thành công, màn hình của nhân viên IT và quản trị viên sẽ xuất hiện thông báo mới chưa đọc. Hình 22 : Thông báo mới xuất hiện sau khi người dùng thêm mới báo cáo vào hệ thống Để truy cập vào danh sách báo cáo, nhấn vào nút Thông báo. 47
  48. Hình 23 : Giao diện trang Thông báo người dùng của quản trị viên Tại trang Thông báo người dùng, nhân viên IT và quản trị viên có thể xem được danh sách tổng quan về những thông báo của người dùng lên hệ thống. Tuy nhiên, chỉ có quản trị viên mới có quyền xem tất cả những báo cáo được người dùng gửi đến. Nhân viên IT chỉ có thể xem những báo cáo mình được quyền giải quyết. Để xem chi tiết thông tin về mã nguồn của trang Báo cáo người dùng, xem phụ lục 5.4.20. Hình 24 : Giao diện trang Thông báo người dùng của nhân viên IT. 48
  49. Tại đây, nhấn vào nút Xem chi tiết để xem chi tiết báo cáo hoặc nhấn vào nút Trang trước/Trang sau để đi tới các trang liệt kê kế tiếp (nếu có) Hình 25 : Giao diện Chi tiết Báo cáo của người dùng của nhân viên IT và quản trị viên Tại trang Chi tiết Báo cáo người dùng, người sử dụng hệ thống có thể quan sát các thông tin tổng quan về luồng báo cáo ở phần đầu tiên và các trao đổi chi tiết trong luồng báo cáo ở phần thứ hai của trang. Nếu đã đọc nhưng chưa có thời gian giải quyết, người dùng có thể nhấn vào nút « Đánh dấu là chưa đọc » để tạm thời đánh dấu chưa đọc thông báo vào hệ thống. Để xem chi tiết thông tin về mã nguồn của trang Chi tiết báo cáo, xem phụ lục 5.4.9. 49
  50. Hình 26 : Những báo báo có dấu (*) là những báo cáo có thông báo chưa đọc Để tiến hành trao đổi thông tin, nhập nội dung cần trao đổi vào ô Viết nội dung trao đổi và nhấn vào nút Gửi phản hồi để gửi phản hồi. Hình 27 : Trao đổi thông tin trong luồng báo cáo. Để phân công nhiệm vụ giải quyết vấn đề cho nhân viên IT bất kỳ, quản trị viên có thể dùng chức năng Thay đổi người giải quyết. Nhấn vào nút Thay đổi để phân công nhiệm vụ cho nhân viên. 50
  51. Hình 28 : Hộp thoại Chọn nhân viên giải quyết báo cáo. Sau khi nhập tên nhân viên giải quyết vấn đề vào mục Tên nhân viên, nhấn vào nút Xác nhận để hoàn thành cập nhật hoặc Đóng để hủy bỏ. Sau khi gán thành công, nhân viên IT được chọn sẽ nhìn thấy báo cáo ở trang Thông báo. Trong quá trình làm việc, nhân viên IT có thể thay đổi trạng thái báo cáo thành « Đang chờ xử lí », « Đang xử lí » hoặc « Đã xử lí » tùy vào tình hình làm việc thực tế. Để thay đổi trạng thái báo cáo, nhấn vào danh sách Trạng thái, chọn giá trị phù hợp và nhấn vào nút Cập nhật ở dưới. Hình 29 : Nhân viên IT thay đổi trạng thái báo cáo. 51
  52. Tuy nhiên, chỉ quản trị viên hệ thống mới có quyền hạn Đóng báo cáo. Khi báo cáo đã được đóng, không ai có thể gửi thêm phản hồi về báo cáo và nhân viên IT cũng không thể thay đổi trạng thái báo cáo thêm nữa. Hình 30 : Báo cáo ở trạng thái « Đã khóa » sẽ không thể được gửi thêm phản hồi. 52
  53. 3.2.7. Chức năng Quản lý phần cứng Hình 31 : Giao diện trang Quản lý phần cứng Tại trang Quản lý phần cứng, người dùng có thể xem danh sách tất cả các dòng phần cứng đã được đăng ký trong hệ thống và thông tin sơ lược của chúng. Để tìm kiếm và sàng lọc kết quả, người dùng có thể nhập từ khóa tìm kiếm vào ô Từ khóa tìm kiếm và chọn loại phần cứng thích hợp trong bảng chọn Loại phần cứng. Sau khi tiến hành điền thông tin, nhấn vào nút Tìm kiếm phần cứng để tiến hành tìm và lọc kết quả. 53
  54. Hình 32 : Kết quả tìm kiếm Để thêm mới một phần cứng bất kỳ, nhấn vào nút Thêm mới phần cứng. Sau khi kích hoạt nút, hộp thoại sau sẽ xuất hiện : Hình 33 : Hộp thoại Thêm mới phần cứng Tại hộp thoại Thêm mới phần cứng, người dùng sẽ điền tên của phần cứng vào ô Tên phần cứng, chọn loại phần cứng và hãng sản xuất thích hợp trong bảng chọn Loại phần cứng và Hãng sản xuất, điền đường dẫn chứa ảnh minh họa và Mô tả sản phẩm vào các mục tương ứng. 54
  55. Sau khi điền thông tin xong, nhấn vào nút Thêm mới phần cứng để tiến hành thêm mới hoặc Đóng để hủy bỏ thay đổi. Để xóa một phần cứng đã được đăng ký vào hệ thống, nhấn vào nút Xóa ở trong danh sách liệt kê phần cứng. Để xem chi tiết thông tin và thay đổi một phần cứng đã được đăng ký vào hệ thống, nhấn vào nút Chỉnh sửa trong danh sách liệt kê phần cứng. Sau khi nhấn vào đây, người dùng sẽ được chuyển hướng đến trang Chỉnh sửa phần cứng. Để xem chi tiết thông tin về mã nguồn của trang Quản lý phần cứng, xem phụ lục 5.4.14 55
  56. Hình 34 : Trang chỉnh sửa thông tin phần cứng. Tại trang Chỉnh sửa thông tin phần cứng, người dùng có thể tiến hành cập nhật thông tin của phần cứng bằng cách thay đổi giá trị của các trường thích hợp. Sau quá trính sửa đổi, nhấn vào nút Cập nhật thông tin để tiến hành cập nhật hoặc nhấn vào nút Xóa để xóa phần cứng. 56
  57. Để xem chi tiết thông tin về mã nguồn của trang Chỉnh sửa phần cứng, xem phụ lục 5.4.8 3.2.8. Chức năng Quản lý loại phần cứng – Hãng sản xuất Trang Quản lý loại phần cứng – hãng sản xuất được chia thành 2 mục nhỏ : Quản lý loại phần cứng và quản lý Hãng sản xuất. Hình 35 : Giao diện Quản lý loại phần cứng Tại trang Quản lý loại phần cứng, người dùng có thể có cái nhìn tổng quan về tất cả các loại phần cứng đang được đăng ký trên hệ thống. Để thêm mới loại phần cứng, điền tên vào hộp thoại Tên loại phần cứng và giới hạn số lượng của loại phần cứng đó trong một máy tính vào hộp thoại Giới hạn số lượng trong máy tính. Sau khi hoàn tất quá trình điền thông tin, nhấn vào nút Thêm mới loại phần cứng để tiến hành thêm mới. Hộp thoại sẽ hiện ra thông báo quá trình thêm mới thành công : 57
  58. Hình 36 : Thông báo cập nhật thành công Hình 37 : Giao diện Quản lý hãng sản xuất Tại trang Quản lý hãng sản xuất, người dùng có thể có cái nhìn tổng quan về tất cả các hãng sản xuất phần cứng đang được đăng ký trên hệ thống. Để thêm mới hãng sản xuất, điền tên vào hộp thoại Tên hãng sản xuất .Sau khi hoàn tất quá trình điền thông tin, nhấn vào nút Thêm mới hãng sản xuất để tiến hành thêm mới. Để xem chi tiết thông tin về mã nguồn của trang Quản lý loại phần cứng – hãng sản xuất, xem phụ lục 5.4.12 58
  59. 3.2.9. Chức năng Quản lý phòng máy Hình 38 : Giao diện trang Quản lý phòng máy. Tại trang Quản lý phòng máy, người dùng có thể có cái nhìn tổng quan về tất cả các phòng máy đang được đăng ký trên hệ thống. Để thêm mới phòng máy, điền tên vào hộp thoại Tên phòng máy và chọn cơ sở đặt phòng máy tại danh sách Cơ sở. Sau khi hoàn tất quá trình điền thông tin, nhấn vào nút Thêm mới để tiến hành thêm mới. Tại danh sách liệt kê phòng máy, nhấn vào nút Xóa để xóa phòng máy đang được chọn. Để xem chi tiết thông tin về mã nguồn của trang Quản lý phòng máy, xem phụ lục 5.4.15 59
  60. 3.2.10. Chức năng quản lý người dùng Hình 39 : Giao diện trang Quản lý người dùng Tại trang Quản lý người dùng, quản trị viên và nhân viên IT có thể có cái nhìn tổng quan về tất cả các người dùng đang được đăng ký trên hệ thống. Tuy nhiên, chỉ có quản trị viên mới có khả năng thay đổi thông tin của những người dùng này. Để thêm mới người dùng, nhấn vào nút Thêm mới người dùng. Hộp thoại sau sẽ xuất hiện : 60
  61. Hình 40 : Hộp thoại Thêm mới người dùng. Sau khi điền những thông tin cần thiết vào hộp thoại, nhấn vào nút Xác nhận thay đổi để thêm mới người dùng vào hệ thống hoặc nhấn Đóng để hủy thao tác. Hình 41 : Hộp thoại Chi tiết người dùng 61
  62. Tại danh sách liệt kê người dùng đang hoạt động, nhấn vào nút Xem chi tiết để mở hộp thoại Chi tiết người dùng. Tại hộp thoại này, quản trị viên có thể thay đổi mọi thông số của tài khoản người dùng được chọn. Đặc biệt, quản trị viên có thể chọn/bỏ chọn dấu kiểm « Đang hoạt động » của người dùng để tạm thời vô hiệu hóa người dùng ra khỏi hệ thống mà không cần xóa. Sau khi hoàn tất quá trình thay đổi thông tin, nhấn vào nút Xác nhận thay đổi để cập nhật thông tin vào hệ thống, Xóa người dùng để xóa người dùng và Đóng để hủy thao tác. Để xem chi tiết thông tin về mã nguồn của trang Quản lý người dùng, xem phụ lục 5.4.13 3.2.11. Chức năng quản lý tài khoản cá nhân Hình 42 : Thông tin tài khoản cá nhân Tại trang Tài khoản cá nhân, người dùng có thể xem một số thông tin về tài khoản đang được sử dụng trong phiên làm việc hiện tại. 62
  63. Để thay đổi mật khẩu, nhấn vào nút Đổi mật khẩu để mở hộp thoại Đổi mật khẩu. Hình 43 : Hộp thoại đổi mật khẩu Sau khi điền mật khẩu cũ, mật khẩu mới và nhập lại mật khẩu mới vào các trường tương ứng, nhấn vào nút Xác nhận để hoàn tất thay đổi hoặc Hủy để hủy bỏ thao tác. Để xem chi tiết thông tin về mã nguồn của trang Tài khoản cá nhân, xem phụ lục 5.4.16 cho trang quản trị viên và phụ lục 5.4.17 cho trang tài khoản người dùng. IV. Kết quả nghiên cứu Đề tài đã tiến hành nghiên cứu và xây dựng hoàn chỉnh trang Web hỗ trợ quá trình quản lý máy tính của trường Đại học Bà Rịa – Vũng Tàu dựa vào : • Công nghệ đang được sử dụng rộng rãi. • Yêu cầu thực tiễn của công việc quản lý hệ thống máy tính. • Nhu cầu thẩm mỹ của người sử dụng. Trang Web quản lý máy tính đã hoàn thành những nhiệm vụ chính mà đề tài đưa ra như sau : 63
  64. • Báo cáo lỗi từ phía người dùng và khả năng phản hồi trực tuyến của nhân viên IT cũng như quản trị viên. • Khả năng quản lý máy tính đến mức phần cứng cũng như quản lý các loại phần cứng, hãng sản xuất phần cứng. • Theo dõi lịch sử cập nhật của từng máy trên hệ thống, theo dõi quá trình hệ thống làm việc. • Thêm mới, chỉnh sửa, xóa từng máy tính cũng như linh kiện bên trong máy tính. • Hiển thị, tìm kiếm, lọc kết quả tìm kiếm máy tính cũng như phần cứng máy tính. • Quản lý hệ thống theo từng cơ sở và phòng máy. Ứng dụng : • Cán bộ, nhân viên trường Đại học Bà Rịa – Vũng Tàu sử dụng trang Web để nâng cao chất lượng quản lí hệ thống máy tính trong trường, góp phần tăng năng suất làm việc, giải phóng sức lao động. V. Tài liệu tham khảo 1. Báo cáo chính trị của Ban Chấp hành Trung Ương tại đại hội X của Đảng Cộng Sản Việt Nam 2. Microsoft Azure Essentials Fundamentals of Azure – Microsoft 2nd Edition. 3. MySQL 5.7 Reference Manual 4. Fundamentals of Computer Programming with C# 5. Beginning Object-Oriented Programming with C# 6. Learning jQuery 4th Edition 64
  65. ĐÁNH GIÁ CỦA GIẢNG VIÊN HƯỚNG DẪN 1. Thái độ tác phong khi tham gia đề tài: . . . 2. Kiến thức chuyên môn: . . . . . . 2. Nhận thức thực tế: . . . . 65
  66. . . 3. Đánh giá khác: . . . . . . 4. Đánh giá kết quả đề tài: . . . . . . Giảng viên hướng dẫn (Ký ghi rõ họ tên) 66
  67. Phụ lục: Mã nguồn dùng trong chương trình 1.Lớp DataAcessLayer 1.1. Dataprovider.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MySql.Data.MySqlClient; using System.Data; namespace DataAccessLayer { public class DataProvider { public static MySqlConnection MoKetNoi() { string connectionstring = "Server=13.67.38.34;Database= Quanlymaytinh;port=3306;User Id=bvu;password=bariavungtau; CharSet=utf8"; MySqlConnection ketnoi = new MySqlConnection(connectionstring); ketnoi.Open(); return ketnoi; } public static void DongKetNoi(MySqlConnection connection) { connection.Close(); } public static DataTable TruyVanDuLieu(string struyvan, MySqlConnection KetNoi) { MySqlDataAdapter da = new MySqlDataAdapter(struyvan, KetNoi); DataTable dt = new DataTable(); da.Fill(dt); KetNoi.Close(); return dt; } public static bool TruyVanKhongLayDuLieu(string struyvan, MySqlConnection KetNoi) { try { MySqlCommand cm = new MySqlCommand(struyvan, KetNoi); cm.ExecuteNonQuery(); KetNoi.Close(); return true; } catch (Exception) { KetNoi.Close(); return false; } } public static bool KiemTraDangNhap(string TenDangNhap, string MatKhau, MySqlConnection KetNoi) { string sTruyVan = "SELECT * FROM login WHERE tendangnhap='" + TenDangNhap + "' and matkhau='" + MatKhau + "';"; MySqlCommand KiemTra = new MySqlCommand(sTruyVan, KetNoi); MySqlDataReader res = KiemTra.ExecuteReader(); KetNoi.Close(); 67
  68. return res.HasRows; } } } 1.2. Maytinh.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MySql.Data.MySqlClient; using System.Data; using DataTransferObject; namespace DataAccessLayer { public class MayTinh_DAO { // static MySqlConnection con; public static List LayThongTinMayTinh() { string sTruyVan = "SELECT * FROM Quanlymaytinh.thongtinmaytinh;"; con = DataProvider.MoKetNoi(); DataTable dt = DataProvider.TruyVanDuLieu(sTruyVan, con); if (dt.Rows.Count == 0) { return null; } List lstThongTin = new List (); for (int i = 0; i < dt.Rows.Count; i++) { ThongTinMayTinh_DTO ThongTin = new ThongTinMayTinh_DTO(); ThongTin.SIdMay = dt.Rows[i]["idmay"].ToString(); ThongTin.SCPU = dt.Rows[i]["CPU"].ToString(); ThongTin.STenMayTinh = dt.Rows[i]["tenmaytinh"].ToString(); ThongTin.SHeDieuHanh = dt.Rows[i]["hedieuhanh"].ToString(); ThongTin.SPhienBanHeDieuHanh = dt.Rows[i]["phienbanhedieuhanh"].ToString(); ThongTin.SUser = dt.Rows[i]["User"].ToString(); lstThongTin.Add(ThongTin); } return lstThongTin; } public static bool dangnhap(string tendangnhap, string matkhau) { con = DataProvider.MoKetNoi(); return DataProvider.KiemTraDangNhap(tendangnhap, matkhau, con); } public static DataTable LayDuLieu(string queryString) { con=DataProvider.MoKetNoi(); DataTable dt = new DataTable(); dt = DataProvider.TruyVanDuLieu(queryString, con); return dt; } public static bool ChayLenhSQL(string queryString) { con = DataProvider.MoKetNoi(); return DataProvider.TruyVanKhongLayDuLieu(queryString, con); } public static bool SaoLuuPhanCung(string idphancungmaytinh) //clone phần cứng có id gốc vào bảng lịch sử thay đổi 68
  69. { bool a; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM Phancungmaytinh WHERE id='" + idphancungmaytinh + "'"); if (dt.Rows.Count == 0) return false; else { string idmay; idmay = dt.Rows[0][1].ToString(); string idphancung; idphancung = dt.Rows[0][2].ToString(); a = ThongTinMayTinh_DAO.ChayLenhSQL("INSERT INTO LichSuPhanCung(idMayTinh, idPhanCung) VALUES ('" + idmay + "', '" + idphancung + "');"); return a; } } public static void CapNhatMayCuoiCungChinhSuaTrongPhong(string idmay) { string q; q = "UPDATE `Quanlymaytinh`.`PhongMay` SET `MayCapNhatCuoi` = '"+idmay+"' WHERE (`idPhongMay` = '"+idPhong(idmay)+"');"; bool a; a = MayTinh_DAO.ChayLenhSQL(q); } public static bool SaoLuuPhanCung(string idphancungmaytinh, string GhiChu, string TenNguoiSua) { CapNhatMayCuoiCungChinhSuaTrongPhong(idMay(idphancungmaytinh)); bool a; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM Phancungmaytinh WHERE id='" + idphancungmaytinh + "'"); if (dt.Rows.Count == 0) return false; else { string idmay; idmay = dt.Rows[0][1].ToString(); string idphancung; idphancung = dt.Rows[0][2].ToString(); a = ThongTinMayTinh_DAO.ChayLenhSQL("INSERT INTO LichSuPhanCung(idMayTinh, idPhanCung, GhiChu, NguoiThayDoi, ThoiGian) VALUES ('" + idmay + "', '" + idphancung + "', '"+GhiChu+"', '"+TenNguoiSua+"', '"+DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "');"); return a; } } public static bool XoaPhanCung(string idphancungmaytinh, string TenNguoiSua) { bool a; string query; if (SaoLuuPhanCung(idphancungmaytinh, "Xóa phần cứng", TenNguoiSua)) { query = "DELETE FROM `Quanlymaytinh`.`Phancungmaytinh` WHERE (`id` = '" + idphancungmaytinh + "'); "; a = MayTinh_DAO.ChayLenhSQL(query); return a; } else { 69
  70. return false; } } public static bool CapNhatPhanCung(string idBangPhanCung, string idPhanCungMoi, string tennguoisua) //Cập nhật lại phần cứng được chọn, phần cứng cũ bỏ vào bảng lichsuphancung //idBangPhanCung (cột 0 của bảng) là id của tổ hợp máy tính và idphần cứng, miêu tả số thứ tự phần cứng được đăng ký trong bảng { bool a; a = MayTinh_DAO.SaoLuuPhanCung(idBangPhanCung, "Cập nhật phần cứng", tennguoisua); if (a == false) return false; else { string query; query = "UPDATE `Quanlymaytinh`.`Phancungmaytinh` SET `idphancung` = '" + idPhanCungMoi + "' WHERE (`id` = '" + idBangPhanCung + "');"; a = MayTinh_DAO.ChayLenhSQL(query); query= "UPDATE `Quanlymaytinh`.`Phancungmaytinh` SET `NguoiThemMoi` = '" + tennguoisua + "' WHERE (`id` = '" + idBangPhanCung + "');"; a = MayTinh_DAO.ChayLenhSQL(query); query = "UPDATE `Quanlymaytinh`.`Phancungmaytinh` SET `NgayThemMoi`= '" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "' WHERE (`id` = '" + idBangPhanCung + "');"; a = MayTinh_DAO.ChayLenhSQL(query); return a; } } public static string idPhanCungMoiNhat() { string query = "SELECT DISTINCT id FROM Phancungmaytinh ORDER BY id desc LIMIT 1;"; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt.Rows[0][0].ToString(); } public static bool ThemMoiPhanCung(string idMayTinh, string idPhanCungMoi, string TenNguoiThem) { bool a; string query; string formatForMySql = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); query = "INSERT INTO `Quanlymaytinh`.`Phancungmaytinh`(idmaytinh, idphancung,NgayThemMoi, NguoiThemMoi) VALUES ('" + idMayTinh + "', '" + idPhanCungMoi + "', '"+formatForMySql+"', '"+TenNguoiThem+"');"; a = MayTinh_DAO.ChayLenhSQL(query); a = SaoLuuPhanCung(idPhanCungMoiNhat(), "Thêm mới", TenNguoiThem); return a; } public static DataTable LocPhanCungTheoIdMayTinh(string idmaytinh) //Lấy tất cả các phần cứng gắn với id máy được nhập { bool a; string query; query = "SELECT * FROM Phancungmaytinh WHERE idmaytinh='" + idmaytinh + "';"; DataTable dt; dt = MayTinh_DAO.LayDuLieu(query); return dt; } 70
  71. public static DataTable TimKiemMayTinh(string keyword) //Tìm kiếm mọi máy tính có dính đến keyword, có thể là phòng máy, cơ sở, tên máy tính, { string query; query = "SELECT * FROM Quanlymaytinh.maytinh, Quanlymaytinh.PhongMay, Quanlymaytinh.CoSo where Quanlymaytinh.maytinh.idPhong = Quanlymaytinh.PhongMay.idPhongMay and Quanlymaytinh.PhongMay.idCoSo=Quanlymaytinh.CoSo.idCoSo and (tenmay like '%" + keyword + "%' or TenPhongMay like '%" + keyword + "%' or TenCoSo like '%" + keyword + "%'); "; DataTable dt; dt = MayTinh_DAO.LayDuLieu(query); return dt; } public static string idPhong(string idmaytinh) { string q; DataTable dt; q = "SELECT * FROM maytinh WHERE idmay='" + idmaytinh + "';"; dt = MayTinh_DAO.LayDuLieu(q); q = dt.Rows[0]["idPhong"].ToString(); return q; } public static string idMay(string idphancung) { string q; DataTable dt; q = "SELECT * FROM Phancungmaytinh WHERE id='" + idphancung + "';"; dt = MayTinh_DAO.LayDuLieu(q); q = dt.Rows[0]["idMayTinh"].ToString(); return q; } } } 1.3 Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace DataAccessLayer { static class Program { /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } } 1.4 ThaoTacNguoiDung_DAO.cs using System; using System.Collections.Generic; 71
  72. using System.Linq; using System.Text; using System.Threading.Tasks; using MySql.Data.MySqlClient; using System.Data; namespace DataAccessLayer { public class ThaoTacNguoiDung_DAO { static MySqlConnection con; public static DataTable TruyVanDataTable(string querry) { con = DataProvider.MoKetNoi(); DataTable dt = new DataTable(); dt = DataProvider.TruyVanDuLieu(querry, con); return dt; } } } 1.5 ThongTinMayTinh_DAO.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MySql.Data.MySqlClient; using System.Data; using DataTransferObject; namespace DataAccessLayer { public class ThongTinMayTinh_DAO { // static MySqlConnection con; public static List LayThongTinMayTinh() { string sTruyVan = "SELECT * FROM Quanlymaytinh.thongtinmaytinh;"; con = DataProvider.MoKetNoi(); DataTable dt = DataProvider.TruyVanDuLieu(sTruyVan, con); if (dt.Rows.Count == 0) { return null; } List lstThongTin = new List (); for (int i = 0; i < dt.Rows.Count; i++) { ThongTinMayTinh_DTO ThongTin = new ThongTinMayTinh_DTO(); ThongTin.SIdMay = dt.Rows[i]["idmay"].ToString(); ThongTin.SCPU = dt.Rows[i]["CPU"].ToString(); ThongTin.STenMayTinh = dt.Rows[i]["tenmaytinh"].ToString(); ThongTin.SHeDieuHanh = dt.Rows[i]["hedieuhanh"].ToString(); ThongTin.SPhienBanHeDieuHanh = dt.Rows[i]["phienbanhedieuhanh"].ToString(); ThongTin.SUser = dt.Rows[i]["User"].ToString(); lstThongTin.Add(ThongTin); } return lstThongTin; } public static bool dangnhap(string tendangnhap, string matkhau) { 72
  73. con = DataProvider.MoKetNoi(); return DataProvider.KiemTraDangNhap(tendangnhap, matkhau, con); } public static DataTable LayDuLieu(string queryString) { con=DataProvider.MoKetNoi(); DataTable dt = new DataTable(); dt = DataProvider.TruyVanDuLieu(queryString, con); return dt; } public static bool ChayLenhSQL(string queryString) { con = DataProvider.MoKetNoi(); return DataProvider.TruyVanKhongLayDuLieu(queryString, con); } } } 2. Lớp DataTransferObject 2.1 Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace DataTransferObject { static class Program { /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } } 2.2 ThongTinMayTinh_DTO.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace DataTransferObject { public class ThongTinMayTinh_DTO { private string sIdMay; public string SIdMay { get { return sIdMay; } set { sIdMay = value; } } private string sTenMayTinh; public string STenMayTinh 73
  74. { get { return sTenMayTinh; } set { sTenMayTinh = value; } } private string sCPU; public string SCPU { get { return sCPU; } set { sCPU = value; } } private string sHeDieuHanh; public string SHeDieuHanh { get { return sHeDieuHanh; } set { sHeDieuHanh = value; } } private string sPhienBanHeDieuHanh; public string SPhienBanHeDieuHanh { get { return sPhienBanHeDieuHanh; } set { sPhienBanHeDieuHanh = value; } } private string sUser; public string SUser { get { return sUser; } set { sUser = value; } } } } 3. Lớp BusinessLogicLayer 3.1 LichSuMayTinh.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DataAccessLayer; using DataTransferObject; using System.Data; namespace BusinessLogicLayer { public class LichSuMayTinh_BUS { public static DataTable LayLichSuPhanCungMayTinh(string idmay) { //bool a; DataTable dt; string query = "SELECT * FROM LichSuPhanCung WHERE idMayTinh='" + idmay + "';"; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable LoadLichSuMayTinh() { DataTable dt; string query; query = "SELECT * FROM LichSuMayTinh ORDER BY ThoiGian DESC;"; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; 74
  75. } public static DataTable LoadLichSuMayTinh(string idmay) { DataTable dt; string query; query = "SELECT * FROM LichSuMayTinh WHERE idMayTinh='"+idmay+ "' ORDER BY ThoiGian DESC;;"; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static bool ThemMoiLichSu(string idmaytinh, string NoiDung, string NguoiThaoTac) { string query; query = "INSERT INTO `Quanlymaytinh`.`LichSuMayTinh` (`idMayTinh`, `NoiDung`, `ThoiGian`, `NguoiThaoTac`) VALUES ('"+idmaytinh+"', '"+NoiDung+"', '"+ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "', '"+NguoiThaoTac+"');"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); return a; } public static string TestThemMoiLichSu(string idmaytinh, string NoiDung, string NguoiThaoTac) { string query; query = "INSERT INTO `Quanlymaytinh`.`LichSuMayTinh` (`idMayTinh`, `NoiDung`, `ThoiGian`, `NguoiThaoTac`) VALUES ('" + idmaytinh + "', '" + NoiDung + "', '" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "', '" + NguoiThaoTac + "');"; return query; } public static DataTable TimKiemLichSuMayTinh(string NoiDung, string NguoiThaoTac, DateTime ThoiGianDau, DateTime ThoiGianCuoi) { string query; query = ""; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable TimKiemLichSuMayTinh(string NoiDung, string NguoiThaoTac) { string query; query = "SELECT * FROM LichSuMayTinh WHERE LichSuMayTinh.NoiDung LIKE '%"+NoiDung+"%' and LichSuMayTinh.NguoiThaoTac='"+NguoiThaoTac+"' ORDER BY ThoiGian DESC;"; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable TimKiemLichSuMayTinh(string NoiDung) { string query; query = "SELECT * FROM LichSuMayTinh WHERE LichSuMayTinh.NoiDung LIKE '%" + NoiDung + "%' or LichSuMayTinh.NoiDung LIKE '"+NoiDung+"%' or LichSuMayTinh.NoiDung LIKE '%"+NoiDung+"' or LichSuMayTinh.NguoiThaoTac LIKE '%" + NoiDung + "%' ORDER BY ThoiGian DESC;"; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } 75
  76. public static DataTable TimKiemLichSuMayTinh(string NoiDung, string Ngaybatdau, string Ngayketthuc) { string query; query = "SELECT * FROM LichSuMayTinh WHERE (LichSuMayTinh.NoiDung LIKE '%" + NoiDung + "%' or LichSuMayTinh.NguoiThaoTac LIKE '%" + NoiDung + "%') and LichSuMayTinh.ThoiGian BETWEEN '"+Ngaybatdau+"' AND '"+Ngayketthuc+"' ORDER BY ThoiGian DESC;"; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } } } 3.2 Maytinh_BUS.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DataAccessLayer; using DataTransferObject; using System.Data; namespace BusinessLogicLayer { public class MayTinh_BUS { public static List LayThongTin() { return ThongTinMayTinh_DAO.LayThongTinMayTinh(); } public static bool KiemTraDangNhap(string tendangnhap, string matkhau) { return ThongTinMayTinh_DAO.dangnhap(tendangnhap, matkhau); } public static DataTable LayThongTinDataTable(string querryString) { DataTable dt = new DataTable(); dt = ThongTinMayTinh_DAO.LayDuLieu(querryString); return dt; 76
  77. } //public static bool ThemMoiPhancung(string TenPhanCung, string idNhaSanXuat, string giathanh, string idLoaiPhanCung) //{ // string queryString; // queryString = "INSERT INTO `Quanlymaytinh`.`phancung` (`tenphancung`, `nhasanxuat`, `giathanh`, `loaiphancung`) VALUES ('"+TenPhanCung+"', '"+idNhaSanXuat+"', '"+giathanh+"', '"+idLoaiPhanCung+"');"; // bool a; // a = ThongTinMayTinh_DAO.ChayLenhSQL(queryString); // return a; //} public static bool XoaMayTinh(string idmay) //Tạm thời vô hiệu hóa máy tính trong hệ thống, status=1 { string query; //query = "UPDATE `Quanlymaytinh`.`Phancungmaytinh` SET `TrangThai` = '1' WHERE (`id` = '9');"; query = "UPDATE `Quanlymaytinh`.`maytinh` SET `status` = '1' WHERE (`idmay` = '"+idmay+"');"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); return a; } public static bool XoaMayTinh(string idmay, bool check) //Xóa hẳn máy tính, kể cả check true/false, dùng overload { string queryString; queryString = "DELETE FROM `Quanlymaytinh`.`maytinh` WHERE (`idmay` = '" + idmay + "');"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(queryString); queryString = "DELETE FROM `Quanlymaytinh`.`Phancungmaytinh` WHERE (`idmaytinh` = '" + idmay+"');"; bool b; b = ThongTinMayTinh_DAO.ChayLenhSQL(queryString); return a && b; } 77
  78. public static bool Xoamaytinh() //Xóa sạch các máy đang bị treo (status=1), cẩn thận khi dùng { string query; query = "DELETE FROM `Quanlymaytinh`.`maytinh` WHERE (status='1');"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); return a; } public static bool CapNhatMayTinh(string idMay, string TenMay, string idPhong) { string query = "UPDATE `Quanlymaytinh`.`maytinh` SET `tenmay` = '"+TenMay+"', `idPhong` = '"+idPhong+"' WHERE (`idmay` = '"+idMay+"');"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); return a; } public static bool CapNhatMayTinh(string idMay, string TenMay, string idPhong,string TenNguoiThayDoi) { string query = "UPDATE `Quanlymaytinh`.`maytinh` SET `tenmay` = '" + TenMay + "', `idPhong` = '" + idPhong + "' WHERE (`idmay` = '" + idMay + "');"; bool a; LichSuMayTinh_BUS.ThemMoiLichSu(idMay, "Cập nhật thông tin cho máy mang id " + idMay + " - Tên máy: " + TenMay + ", phòng máy: " + QuanLiCoSoVatChat_BUS.TenPhongMay(idPhong), TenNguoiThayDoi); a = ThongTinMayTinh_DAO.ChayLenhSQL(query); return a; } public static bool ThemMoiPhanCung (string idmaytinh, string idphancung, string TenNguoiThem) { bool a; a=MayTinh_DAO.ThemMoiPhanCung(idmaytinh, idphancung, TenNguoiThem); return a; } public static bool ThemMoiMayTinh(string TenMayTinh,string Owner) 78
  79. { bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL("INSERT INTO maytinh(tenmay, owner) VALUES ('" + TenMayTinh + "', '" + Owner + "')"); return a; } public static bool ThemMoiMayTinh(string TenMayTinh, string owner, string idphong) { bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL("INSERT INTO `Quanlymaytinh`.`maytinh` (`tenmay`, `owner`, `idPhong`) VALUES ('" + TenMayTinh + "', '" + owner + "', '" + idphong + "');"); return a; } public static bool ThemMoiMayTinh(string TenMayTinh, string owner, string idphong, string NguoiThemMoi) { string query; query = "INSERT INTO `Quanlymaytinh`.`maytinh` (`tenmay`, `status`, `owner`, `idPhong`, `ThoiGianThemMoi`, `NguoiThemMoi`) VALUES ('" + TenMayTinh + "', 'NULL', '" + owner + "', '" + idphong + "', '" + DateTime.Now.ToString("yyyy- MM-dd HH:mm:ss") + "', '" + NguoiThemMoi + "');"; bool a; LichSuMayTinh_BUS.ThemMoiLichSu("", "Thêm mới máy tính " + TenMayTinh + " tại phòng máy " + QuanLiCoSoVatChat_BUS.TenPhongMay(idphong), NguoiThemMoi); a = ThongTinMayTinh_DAO.ChayLenhSQL(query); return a; } public static string idMayMoiNhat() { string query = "SELECT DISTINCT idmay FROM maytinh ORDER BY idmay desc LIMIT 1;"; DataTable dt = new DataTable(); dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt.Rows[0][0].ToString(); } public static bool xoaphancung(string idphancung, string TenNguoiXoa) { 79
  80. bool a; a = MayTinh_DAO.XoaPhanCung(idphancung, TenNguoiXoa); return a; } public static bool suamaytinh(string idmay, string tenmaytinh, string Owner, string idMainboard, string idCPU, string idRAM, string idGPU, string os, string osbuild) { bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL("UPDATE thongtinmaytinh SET tenmaytinh='" + tenmaytinh + "', CPU='" + idCPU + "', hedieuhanh='" + os + "', phienbanhedieuhanh='" + osbuild + "', GPU='" + idGPU + "', RAM='" + idRAM + "', Mainboard='" + idMainboard + "' WHERE idmay='"+idmay+"';"); bool b; b = ThongTinMayTinh_DAO.ChayLenhSQL("UPDATE maytinh SET tenmay='" + tenmaytinh + "' WHERE idmay='"+idmay+"';"); return a && b; } public static DataTable LayDanhSachPhancung() { DataTable a; a = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM phancung;"); ; return a; } public static DataTable LayDanhSachPhanCung(string idmay) //overload nhẹ tí { DataTable a; a = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM phancung, Phancungmaytinh WHERE Phancungmaytinh.idphancung=phancung.idphancung and Phancungmaytinh.idmaytinh='"+idmay+"';"); return a; } public static DataTable LayDanhSachMayTinh() { DataTable a; a = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM maytinh"); 80
  81. return a; } public static DataTable TimKiemMayTinh(string keyword) { DataTable dt; dt = MayTinh_DAO.TimKiemMayTinh(keyword); return dt; } public static DataTable TimKiemMayTinh(string keyword, string idPhongMay) { DataTable dt; string query; query = "SELECT * FROM Quanlymaytinh.maytinh, Quanlymaytinh.PhongMay, Quanlymaytinh.CoSo where Quanlymaytinh.maytinh.idPhong = Quanlymaytinh.PhongMay.idPhongMay and Quanlymaytinh.PhongMay.idCoSo=Quanlymaytinh.CoSo.idCoSo and Quanlymaytinh.PhongMay.idPhongMay='"+idPhongMay+"' and (tenmay like '%" + keyword + "%' or TenPhongMay like '%" + keyword + "%' or TenCoSo like '%" + keyword + "%'); "; dt = MayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable TimKiemMayTinhTheoCoSo(string idcoso) { DataTable dt; string query; query = "SELECT * FROM Quanlymaytinh.maytinh, Quanlymaytinh.PhongMay, Quanlymaytinh.CoSo where Quanlymaytinh.maytinh.idPhong = Quanlymaytinh.PhongMay.idPhongMay and Quanlymaytinh.PhongMay.idCoSo=Quanlymaytinh.CoSo.idCoSo and Quanlymaytinh.PhongMay.idCoSo='"+idcoso+"';"; dt = MayTinh_DAO.LayDuLieu(query); return dt; } public static bool CapNhatPhanCung(string idBangPhanCung, string idPhanCungMoi,string TenNguoiCapNhat) { bool a; a = MayTinh_DAO.CapNhatPhanCung(idBangPhanCung, idPhanCungMoi, TenNguoiCapNhat); 81
  82. return a; } public static string TenMayTinh(string idmay) { DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM maytinh WHERE idmay='" + idmay + "';"); string s; if (dt.Rows.Count>0) { s = dt.Rows[0][1].ToString(); } else s = "Trống"; return s; } public static string LayidMayTinhMoiNhatTheoCoSo(string idcoso) { DataTable dt; string query; query = "SELECT * FROM Quanlymaytinh.maytinh, Quanlymaytinh.PhongMay, Quanlymaytinh.CoSo where Quanlymaytinh.maytinh.idPhong = Quanlymaytinh.PhongMay.idPhongMay and Quanlymaytinh.PhongMay.idCoSo=Quanlymaytinh.CoSo.idCoSo and Quanlymaytinh.PhongMay.idCoSo='" + idcoso + "' order by idmay desc LIMIT 1 ;"; dt = ThongTinMayTinh_DAO.LayDuLieu(query); string idmay; idmay = dt.Rows[0][0].ToString(); return idmay; } public static string DemSoMayCuaCoSo(string idcoso) { DataTable dt; string query; query = "SELECT count(*) from Quanlymaytinh.PhongMay WHERE idCoSo='" + idcoso + "' order by idCoSo;"; dt = ThongTinMayTinh_DAO.LayDuLieu(query); 82
  83. query = dt.Rows[0][0].ToString(); return query; } } } 3.3 Quanlybaocao.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DataAccessLayer; using DataTransferObject; using System.Data; namespace BusinessLogicLayer { public class QuanLiBaoCao_BUS { static DataTable dt; public static bool ThemBaoCao(string TieuDeBaoCao, string NguoiBaoCao, string NoiDungBaoCao) { string query; query = "INSERT INTO `Quanlymaytinh`.`BaoCaoUser` (`TieuDeBaoCao`, `idTrangThai`, `NguoiBaoCao`, `NgayBaoCao`) VALUES ('" + TieuDeBaoCao + "', '1', '" + NguoiBaoCao + "', '" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "');"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu("SELECT * from BaoCaoUser order by idBaoCao desc limit 1;"); string idbaocao = dt.Rows[0]["idBaoCao"].ToString(); query = "INSERT INTO `Quanlymaytinh`.`LogBaoCao` (`idBaoCao`, `NoiDungTraoDoi`, `UserTraoDoi`, `ThoiGianBaoCao`) VALUES ('" + idbaocao + "', '" + NoiDungBaoCao + "', '" + NguoiBaoCao + "', '" + DateTime.Now.ToString("yyyy-MM- dd HH:mm:ss") + "');"; a = a && ThongTinMayTinh_DAO.ChayLenhSQL(query); return a; } public static void TraLoiBaoCao(string idBaoCao, string NoiDungTraoDoi, string NguoiTraoDoi) { string query; query = "INSERT INTO `Quanlymaytinh`.`LogBaoCao` (`idBaoCao`, `NoiDungTraoDoi`, `UserTraoDoi`, `ThoiGianBaoCao`) VALUES ('" + idBaoCao + "', '" + NoiDungTraoDoi + "', '" + NguoiTraoDoi + "', '"+ DateTime.Now.ToString("yyyy-MM- dd HH:mm:ss") + "');"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); } public static bool HieuLucBaoCao(string idBaoCao) { string query; query = "SELECT * FROM BaoCaoUser WHERE idBaoCao='" + idBaoCao + "';"; DataTable dt; 83
  84. dt = ThongTinMayTinh_DAO.LayDuLieu(query); query = dt.Rows[0]["idTrangThai"].ToString(); if (query != "4") return true; else return false; } public static void ThayDoiTrangThaiBaoCao(string idBaoCao, string idTrangThai) { string query; query = "UPDATE `Quanlymaytinh`.`BaoCaoUser` SET `idTrangThai` = '" + idTrangThai + "' WHERE (`idBaoCao` = '" + idBaoCao + "');"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); } public static void DongBaoCao(string idBaoCao) { string query; query = "UPDATE `Quanlymaytinh`.`BaoCaoUser` SET `idTrangThai` = '4' WHERE (`idBaoCao` = '" + idBaoCao + "');"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); } public static DataTable LoadBaoCao() { string query; query = "SELECT * FROM Quanlymaytinh.BaoCaoUser, Quanlymaytinh.TrangThaiBaoCao where Quanlymaytinh.BaoCaoUser.idTrangThai = Quanlymaytinh.TrangThaiBaoCao.idTrangThaiBaoCao order by BaoCaoUser.idBaoCao desc; "; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable LoadBaoCao(string idbaocao) { string query; query = "SELECT * FROM LogBaoCao WHERE idBaoCao='" + idbaocao + "';"; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable LoadBaoCao(string tenuser, bool a) { string query; query = "SELECT * FROM Quanlymaytinh.BaoCaoUser, Quanlymaytinh.TrangThaiBaoCao where Quanlymaytinh.BaoCaoUser.idTrangThai = Quanlymaytinh.TrangThaiBaoCao.idTrangThaiBaoCao and Quanlymaytinh.BaoCaoUser.NguoiGiaiQuyet='"+tenuser+"' order by BaoCaoUser.idBaoCao desc; "; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable LoadTrangThai() { string query; query = "SELECT * FROM TrangThaiBaoCao;"; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; 84
  85. } public static DataTable LoadTrangThai(bool a) { string query; query = "SELECT * FROM TrangThaiBaoCao LIMIT 3;"; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable ThongTinBaoCao(string idbaocao) { string query; query = "SELECT * FROM BaoCaoUser WHERE idBaoCao='" + idbaocao + "' LIMIT 1;"; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable TimBaoCao(string tenuser) { string query; query = "SELECT * FROM BaoCaoUser, TrangThaiBaoCao WHERE BaoCaoUser.idTrangThai=TrangThaiBaoCao.idTrangThaiBaoCao and NguoiBaoCao='" + tenuser + "' order by BaoCaoUser.idBaoCao desc;"; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static string TrangThaiBaoCao(string idbaocao) { string query; query = "SELECT * FROM BaoCaoUser WHERE idBaoCao='" + idbaocao + "';"; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); string s; s = dt.Rows[0]["idTrangThai"].ToString(); return s; } public static bool GiaiQuyetBaoCao(string tennguoigiaiquyet, string idbaocao) { string query; query = "UPDATE `Quanlymaytinh`.`BaoCaoUser` SET `NguoiGiaiQuyet` = '"+tennguoigiaiquyet+"' WHERE (`idBaoCao` = '"+idbaocao+"');"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); return a; } public static string DemBaoCao(string tennguoidung) { string query; if (QuanLiUser_BUS.KiemTraQuyenAdmin(tennguoidung)) query = "select count(*) from BaoCaoUser WHERE Noti='1'"; else query = "select count(*) from BaoCaoUser WHERE (NguoiGiaiQuyet='" + tennguoidung + "' and Noti_IT='1') or (Noti_user='1' and NguoiBaoCao='"+tennguoidung+"');"; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); query = dt.Rows[0][0].ToString(); return query; } public static bool DocThongBao(string idbaocao, string role) { 85
  86. string query; query = "UPDATE `Quanlymaytinh`.`BaoCaoUser` SET `Noti"+role+"` = '0' WHERE (`idBaoCao` = '" + idbaocao + "')"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); return a; } public static bool DanhDauLaChuaDoc(string idbaocao, string role) { string query; query = "UPDATE `Quanlymaytinh`.`BaoCaoUser` SET `Noti"+role+"` = '1' WHERE (`idBaoCao` = '" + idbaocao + "')"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); return a; } } } 3.4 Quanlicosovatchat.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DataAccessLayer; using DataTransferObject; using System.Data; namespace BusinessLogicLayer { public class QuanLiCoSoVatChat_BUS { static DataTable dt; public static DataTable LayDanhSachCoSo() { dt = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM CoSo;"); return dt; } public static DataTable LayDanhSachPhongMay() { dt = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM PhongMay;"); return dt; } public static DataTable LayDanhSachPhongMay(string idCoSo) { dt = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM PhongMay WHERE idCoSo='" + idCoSo + "';"); return dt; } public static string SoMayCuaPhongMay(string idPhongMay) { string query; query = "SELECT count(*) FROM Quanlymaytinh.maytinh, Quanlymaytinh.PhongMay, Quanlymaytinh.CoSo WHERE Quanlymaytinh.maytinh.idPhong = Quanlymaytinh.PhongMay.idPhongMay and Quanlymaytinh.PhongMay.idCoSo = Quanlymaytinh.CoSo.idCoSo and Quanlymaytinh.PhongMay.idPhongMay = '"+idPhongMay+"' group by Quanlymaytinh.PhongMay.TenPhongMay; "; dt = ThongTinMayTinh_DAO.LayDuLieu(query); string a; a = dt.Rows[0][0].ToString(); 86
  87. return a; } public static DataTable LaySoLuongMay(string idCoSo) { string query; query = "SELECT Quanlymaytinh.PhongMay.idPhongMay, Quanlymaytinh.PhongMay.TenPhongMay, Quanlymaytinh.PhongMay.MayCapNhatCuoi, count(*) as 'a' from Quanlymaytinh.maytinh, Quanlymaytinh.PhongMay, Quanlymaytinh.CoSo where Quanlymaytinh.maytinh.idPhong = Quanlymaytinh.PhongMay.idPhongMay and Quanlymaytinh.PhongMay.idCoSo = Quanlymaytinh.CoSo.idCoSo and Quanlymaytinh.PhongMay.idCoSo = '" + idCoSo + "' group by Quanlymaytinh.PhongMay.idPhongMay; "; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable ThongTinPhongMay(string idphongmay) { string query; query = "select * from PhongMay, CoSo, maytinh where PhongMay.idCoSo=CoSo.idCoSo and maytinh.idmay='" + idphongmay + "' and PhongMay.idPhongMay=maytinh.idPhong;"; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static void ThemPhongMay(string tenphongmay, string idcoso, string nguoithemmoi) { string query; query = "INSERT INTO `Quanlymaytinh`.`PhongMay` (`TenPhongMay`, `idCoSo`, `NgayThemMoi`, `NguoiThemMoi`) VALUES ('"+tenphongmay+"', '"+idcoso+"', '"+ DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "', '"+nguoithemmoi+"');"; bool a; LichSuMayTinh_BUS.ThemMoiLichSu("", "Thêm mới phòng máy " + tenphongmay + " tại cơ sở " + TenCoSo(idcoso), nguoithemmoi); a = ThongTinMayTinh_DAO.ChayLenhSQL(query); } public static void XoaPhongMay(string idphongmay, string tennguoixoa) { bool a; LichSuMayTinh_BUS.ThemMoiLichSu("", "Xoá phòng máy " + TenPhongMay(idphongmay), tennguoixoa); a = ThongTinMayTinh_DAO.ChayLenhSQL("DELETE FROM `Quanlymaytinh`.`PhongMay` WHERE (`idPhongMay` = '" + idphongmay + "');"); } public static void DoiTenPhongMay(string idphongmay, string TenPhongMayMoi, string tennguoidoi) { bool a; LichSuMayTinh_BUS.ThemMoiLichSu("", "Đổi tên phòng máy " + TenPhongMay(idphongmay) + " thành " + TenPhongMayMoi, tennguoidoi); a = ThongTinMayTinh_DAO.ChayLenhSQL("UPDATE `Quanlymaytinh`.`PhongMay` SET `TenPhongMay` = '" + TenPhongMayMoi + "' WHERE (`idPhongMay` = '" + idphongmay + "');"); } public static DataTable LoadPhongMay() { DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM Quanlymaytinh.PhongMay, Quanlymaytinh.CoSo WHERE Quanlymaytinh.PhongMay.idCoSo = Quanlymaytinh.CoSo.idCoSo; "); return dt; } 87
  88. public static string TenPhongMay(string idphongmay) { string query; query = "SELECT * FROM PhongMay WHERE idPhongMay='" + idphongmay + "';"; dt = ThongTinMayTinh_DAO.LayDuLieu(query); string s; s = dt.Rows[0]["TenPhongMay"].ToString(); return s; } public static string TenCoSo(string idcoso) { DataTable dt; dt = LayDanhSachCoSo(); string s; s = ""; foreach (DataRow dr in dt.Rows) { if (dr["idCoSo"].ToString() == idcoso) { s = dr["TenCoSo"].ToString(); } } return s; } } } 3.5 Quanlyphancung_BUS.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data; using DataAccessLayer; namespace BusinessLogicLayer { public class QuanLiPhanCung_BUS { //Lấy danh sách tất cả các phần cứng public static DataTable LayDanhSachPhanCung() { DataTable a = new DataTable(); a = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM phancung;"); return a; 88
  89. } //Lấy danh sách 1 loại phần cứng public static DataTable LayDanhSachPhanCung(string idLoaiPhanCung) { DataTable a = new DataTable(); a = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM phancung WHERE loaiphancung='" + idLoaiPhanCung + "' and TrangThai!='0';"); return a; } public static DataTable LayDanhSachPhanCung(string idLoaiPhanCung, bool b) { DataTable a = new DataTable(); a = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM phancung WHERE loaiphancung='" + idLoaiPhanCung + "';"); return a; } //Lấy danh sách phần cứng theo máy tính public static DataTable LayDanhSachPhanCungMayTinh(string idmay) { DataTable a; a = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM phancung, Phancungmaytinh, LoaiPhanCung WHERE Phancungmaytinh.idphancung=phancung.idphancung and LoaiPhanCung.idLoaiPhanCung=phancung.loaiphancung and Phancungmaytinh.idmaytinh='" + idmay + "';"); return a; } //Lấy danh sách hãng sản xuất phần cứng public static DataTable LayDanhSachHangSanXuat() { DataTable a = new DataTable(); a = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM Quanlymaytinh.HangSanXuat WHERE TrangThai !='0'"); return a; } public static DataTable LayDanhSachHangSanXuat(bool b) { DataTable a = new DataTable(); 89
  90. a = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM Quanlymaytinh.HangSanXuat;"); return a; } //Lấy danh sách loại phần cứng public static DataTable LayDanhSachLoaiPhanCung() { DataTable a = new DataTable(); a = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM Quanlymaytinh.LoaiPhanCung WHERE TrangThai!='0'"); return a; } public static DataTable LayDanhSachLoaiPhanCung(bool b) { DataTable a = new DataTable(); a = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM Quanlymaytinh.LoaiPhanCung"); return a; } //Thêm mới phần cứng public static bool ThemPhanCung(string idmaytinh, string idphancung, string TenNguoiThem) { bool a; string s; s = "Thêm mới phần cứng " + QuanLiPhanCung_BUS.TenPhanCung(idphancung) + " tại máy tính " + MayTinh_BUS.TenMayTinh(idmaytinh); LichSuMayTinh_BUS.ThemMoiLichSu(idmaytinh, s, TenNguoiThem); a = MayTinh_BUS.ThemMoiPhanCung(idmaytinh, idphancung, TenNguoiThem); return a; } public static bool XoaPhanCung(string idphancung) { bool a; LichSuMayTinh_BUS.ThemMoiLichSu("", "Xoá loại phần cứng" + TenPhanCung(idphancung), ""); 90
  91. a = ThongTinMayTinh_DAO.ChayLenhSQL("DELETE FROM phancung WHERE idphancung='" + idphancung + "';"); return a; } public static bool XoaPhanCung(string idphancung, string tennguoixoa, bool a) { a = ThongTinMayTinh_DAO.ChayLenhSQL("UPDATE `Quanlymaytinh`.`phancung` SET `TrangThai` = '0' WHERE (`idphancung` = '" + idphancung + "');"); if (a) LichSuMayTinh_BUS.ThemMoiLichSu("", "Xoá loại phần cứng" + TenPhanCung(idphancung), tennguoixoa); //a = ThongTinMayTinh_DAO.ChayLenhSQL("DELETE FROM phancung WHERE idphancung='" + idphancung + "';"); return a; } public static bool XoaPhanCung(string idmaytinh, string idphancung) { bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL("DELETE FROM Phancungmaytinh WHERE idmaytinh='" + idmaytinh + "' and idphancung='" + idphancung + "';"); if (a) { LichSuMayTinh_BUS.ThemMoiLichSu(idmaytinh, "Xóa phần cứng " + TenPhanCung(idphancung) + " tại máy tính " + MayTinh_BUS.TenMayTinh(idmaytinh), ""); } return a; } public static bool XoaPhanCung(string idmaytinh, string idphancung, string tennguoixoa) { bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL("DELETE FROM Phancungmaytinh WHERE idmaytinh='" + idmaytinh + "' and idphancung='" + idphancung + "';"); if (a) { MayTinh_DAO.SaoLuuPhanCung(idphancung, "Xóa phần cứng", tennguoixoa); 91
  92. LichSuMayTinh_BUS.ThemMoiLichSu(idmaytinh, "Xóa phần cứng " + TenPhanCung(idphancung) + " tại máy tính " + MayTinh_BUS.TenMayTinh(idmaytinh), tennguoixoa); } return a; } public static bool TaoMoiPhanCung(string TenPhancung, string idLoaiPhanCung, string idnhasanxuat, string HinhAnh) { bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL("INSERT INTO phancung(tenphancung, loaiphancung, nhasanxuat, ngaycapnhat, HinhAnh) VALUES ('" + TenPhancung + "', '" + idLoaiPhanCung + "', '" + idnhasanxuat + "', '" + DateTime.Now.ToString("yyyy- MM-dd HH:mm:ss") + "', '" + HinhAnh + "');"); LichSuMayTinh_BUS.ThemMoiLichSu("", "Thêm mới loại phần cứng '" + TenPhancung + "'", ""); return a; } public static bool TaoMoiPhanCung(string TenPhancung, string idLoaiPhanCung, string idnhasanxuat, string HinhAnh, string tennguoitao) { bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL("INSERT INTO phancung(tenphancung, loaiphancung, nhasanxuat, ngaycapnhat, HinhAnh) VALUES ('" + TenPhancung + "', '" + idLoaiPhanCung + "', '" + idnhasanxuat + "', '" + DateTime.Now.ToString("yyyy- MM-dd HH:mm:ss") + "', '" + HinhAnh + "');"); LichSuMayTinh_BUS.ThemMoiLichSu("", "Thêm mới loại phần cứng " + TenPhancung, tennguoitao); return a; } public static bool TaoMoiPhanCung(string TenPhancung, string idLoaiPhanCung, string idnhasanxuat, string HinhAnh, string MoTa, string tennguoitao) { bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL("INSERT INTO phancung(tenphancung, loaiphancung, nhasanxuat, ngaycapnhat, HinhAnh, MoTa) VALUES ('" + TenPhancung + "', '" + idLoaiPhanCung + "', '" + idnhasanxuat + "', '" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "', '" + HinhAnh + "', '" + MoTa + "');"); LichSuMayTinh_BUS.ThemMoiLichSu("", "Thêm mới loại phần cứng " + TenPhancung, tennguoitao); 92
  93. return a; } public static DataTable TimKiemPhanCung(string keyword) { DataTable dt; string query; query = "SELECT * FROM Quanlymaytinh.phancung, Quanlymaytinh.LoaiPhanCung WHERE Quanlymaytinh.phancung.loaiphancung=Quanlymaytinh.LoaiPhanCung.idLoaiPhanCung and (Quanlymaytinh.phancung.tenphancung like '%" + keyword + "%' or Quanlymaytinh.LoaiPhanCung.TenLoaiPhanCung like '%" + keyword + "%');"; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable LichSuPhanCungMayTinh() { string query; query = "SELECT * FROM Quanlymaytinh.LichSuPhanCung, Quanlymaytinh.maytinh, Quanlymaytinh.phancung where Quanlymaytinh.phancung.idphancung=Quanlymaytinh.LichSuPhanCung.idPhanCung and Quanlymaytinh.LichSuPhanCung.idMayTinh=Quanlymaytinh.maytinh.idmay;"; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable LichSuPhanCungMayTinh(string idmay) { string query; query = "SELECT * FROM Quanlymaytinh.LichSuPhanCung, Quanlymaytinh.maytinh, Quanlymaytinh.phancung where Quanlymaytinh.phancung.idphancung=Quanlymaytinh.LichSuPhanCung.idPhanCung and Quanlymaytinh.LichSuPhanCung.idMayTinh=Quanlymaytinh.maytinh.idmay and Quanlymaytinh.maytinh.idmay='" + idmay + "';"; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable LayLoaiPhanCung() { 93
  94. DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu("SELECT * FROM Quanlymaytinh.LoaiPhanCung;"); return dt; } public static DataTable TimKiemLichSuPhanCung(string keyword) { string query; query = "SELECT * FROM Quanlymaytinh.LichSuPhanCung, Quanlymaytinh.maytinh, Quanlymaytinh.phancung WHERE Quanlymaytinh.LichSuPhanCung.idMayTinh = Quanlymaytinh.maytinh.idmay and Quanlymaytinh.LichSuPhanCung.idPhanCung = Quanlymaytinh.phancung.idphancung and(Quanlymaytinh.LichSuPhanCung.GhiChu like '%" + keyword + "%' or Quanlymaytinh.LichSuPhanCung.NguoiThayDoi like '%" + keyword + "%' or Quanlymaytinh.maytinh.tenmay like '%" + keyword + "%' or Quanlymaytinh.phancung.tenphancung like '%" + keyword + "%'); "; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static void CapNhatLoaiPhanCung(string idloaiphancung, string tenloaiphancung, string soluongtoida, string tennguoicapnhat) { string query; query = "UPDATE `Quanlymaytinh`.`LoaiPhanCung` SET `TenLoaiPhanCung` = '" + tenloaiphancung + "', `GioiHanSoLuong` = '" + soluongtoida + "', `NgayThemMoi` = '" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "', `NguoiThemMoi` = '" + tennguoicapnhat + "' WHERE (`idLoaiPhanCung` = '" + idloaiphancung + "');"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); LichSuMayTinh_BUS.ThemMoiLichSu("Không", "Cập nhật thông tin loại phần cứng " + tenloaiphancung + ", số lượng tối đa: " + soluongtoida, tennguoicapnhat); } public static void ThemMoiLoaiPhanCung(string TenLoaiPhanCung, string SoLuongToiDa, string TenNguoiTao) { string query; query = "INSERT INTO `Quanlymaytinh`.`LoaiPhanCung` (`TenLoaiPhanCung`, `GioiHanSoLuong`, `NgayThemMoi`, `NguoiThemMoi`) VALUES ('" + TenLoaiPhanCung + "', '" + SoLuongToiDa + "','" + DateTime.Now.ToString("yyyy-MM- dd HH:mm:ss") + "', '" + TenNguoiTao + "');"; 94
  95. bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); LichSuMayTinh_BUS.ThemMoiLichSu("", "Thêm mới loại phần cứng: " + TenLoaiPhanCung + ", số lượng tối đa: " + SoLuongToiDa, TenNguoiTao); } public static void XoaLoaiPhanCung(string idloaiphancung) { bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL("DELETE FROM LoaiPhanCung WHERE idLoaiPhanCung='" + idloaiphancung + "';"); } public static bool XoaLoaiPhanCung(string idloaiphancung, string tennguoixoa) { bool a; LichSuMayTinh_BUS.ThemMoiLichSu("", "Xóa loại phần cứng " + QuanLiPhanCung_BUS.TenPhanCung(idloaiphancung), tennguoixoa); //a = ThongTinMayTinh_DAO.ChayLenhSQL("DELETE FROM LoaiPhanCung WHERE idLoaiPhanCung='" + idloaiphancung + "';"); a = ThongTinMayTinh_DAO.ChayLenhSQL("UPDATE `Quanlymaytinh`.`LoaiPhanCung` SET `TrangThai` = '0' WHERE (`idLoaiPhanCung` = '" + idloaiphancung + "');"); return a; } public static void ThemMoiHangSanXuat(string TenHangSanxuat, string TenNguoiThem) { bool a; string query; query = "INSERT INTO `Quanlymaytinh`.`HangSanXuat` (`TenHangSanXuat`, `NgayThemMoi`, `NguoiThemMoi`) VALUES ('" + TenHangSanxuat + "', '" + DateTime.Now.ToString("yyyy - MM - dd HH: mm: ss") + "', '" + TenNguoiThem + "');"; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); LichSuMayTinh_BUS.ThemMoiLichSu("", "Thêm hãng sản xuất mới: " + TenHangSanxuat, TenNguoiThem); } public static void XoaHangSanXuat(string idhang) { bool a; 95
  96. LichSuMayTinh_BUS.ThemMoiLichSu("", "Xóa hãng sản xuất: " + TenHangSanXuat(idhang), ""); a = ThongTinMayTinh_DAO.ChayLenhSQL("DELETE FROM HangSanXuat WHERE idHangSanXuat='" + idhang + "';"); } public static bool XoaHangSanXuat(string idhang, string tennguoixoa) { bool a; LichSuMayTinh_BUS.ThemMoiLichSu("", "Xóa hãng sản xuất: " + TenHangSanXuat(idhang), tennguoixoa); a = ThongTinMayTinh_DAO.ChayLenhSQL("UPDATE `Quanlymaytinh`.`HangSanXuat` SET `TrangThai` = '0' WHERE (`idHangSanXuat` = '" + idhang + "');"); return a; } public static string TenPhanCung(string idPhanCung) { string query; query = "SELECT * FROM phancung WHERE idphancung='" + idPhanCung + "';"; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); if (dt.Rows.Count > 0) return dt.Rows[0]["tenphancung"].ToString(); else return ""; } public static string TenHangSanXuat(string idhangsanxuat) { string query; query = "SELECT * FROM HangSanXuat WHERE idHangSanXuat='" + idhangsanxuat + "';"; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt.Rows[0]["TenHangSanXuat"].ToString(); } public static DataTable ThongTinPhanCung(string idphancung) 96
  97. { string query; query = "SELECT * FROM Quanlymaytinh.phancung, Quanlymaytinh.LoaiPhanCung, Quanlymaytinh.HangSanXuat WHERE Quanlymaytinh.phancung.loaiphancung = Quanlymaytinh.LoaiPhanCung.idLoaiPhanCung and Quanlymaytinh.phancung.nhasanxuat = Quanlymaytinh.HangSanXuat.idHangSanXuat and Quanlymaytinh.phancung.idphancung = '" + idphancung + "'; "; DataTable dt; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static void CapNhatThongTinPhanCung(string idphancung, string CotCapNhat, string GiaTriCapNhat) { string query; query = "UPDATE `Quanlymaytinh`.`phancung` SET `" + CotCapNhat + "` = '" + GiaTriCapNhat + "' WHERE (`idphancung` = '" + idphancung + "');"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); } public static void CapNhatThongTinPhanCung(string idphancung, string tenphancung, string loaiphancung, string nhasanxuat, string giathanh, string mota, string hinhanh) { string query; query = "UPDATE `Quanlymaytinh`.`phancung` SET `tenphancung` = '" + tenphancung + "', `nhasanxuat` = '" + nhasanxuat + "', `giathanh` = '" + giathanh + "', `ngaycapnhat` = '" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "', `loaiphancung` = '" + loaiphancung + "', `HinhAnh` = '" + hinhanh + "', `MoTa` = '" + mota + "' WHERE (`idphancung` = '" + idphancung + "');"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); } public static string LoaiPhanCung(string idphancung) { DataTable dt; string query = "SELECT * FROM phancung WHERE idphancung='" + idphancung + "';"; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt.Rows[0]["loaiphancung"].ToString(); 97
  98. } } } 3.6 Quanlyuser.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DataAccessLayer; using DataTransferObject; using System.Data; namespace BusinessLogicLayer { public class QuanLiUser_BUS { static DataTable dt; public static bool KiemTraTenDangNhap(string TenDangNhap) { dt = ThaoTacNguoiDung_DAO.TruyVanDataTable("SELECT * FROM login WHERE tendangnhap='" + TenDangNhap + "'"); if (dt.Rows.Count == 0) return false; else return true; } public static bool KiemTraDangNhap(string TenDangNhap, string MatKhau) { dt = ThaoTacNguoiDung_DAO.TruyVanDataTable("SELECT * FROM login WHERE tendangnhap='" + TenDangNhap + "' AND matkhau='" + MatKhau + "'"); if (dt.Rows.Count == 0) return false; else return true; } public static DataTable LayDanhSachUser() { dt = ThaoTacNguoiDung_DAO.TruyVanDataTable("SELECT * FROM login"); return dt; } public static DataTable LayDanhSachUser(string tenuser) { dt = ThaoTacNguoiDung_DAO.TruyVanDataTable("SELECT * FROM login WHERE tendangnhap='"+tenuser+"';"); return dt; } public static DataTable TimNhanVienIT(string tenuser) { dt = ThaoTacNguoiDung_DAO.TruyVanDataTable("SELECT * FROM login WHERE tendangnhap='" + tenuser + "' and (role='IT' or role ='admin');"); return dt; } public static bool XoaNguoiDung(string tennguoidung, string TenNguoiXoa) { bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL("DELETE FROM login WHERE tendangnhap='" + tennguoidung + "';"); if (a) LichSuMayTinh_BUS.ThemMoiLichSu("", "Xóa người dùng " + tennguoidung, TenNguoiXoa); return a; } public static bool KiemTraQuyenAdmin(string tendangnhap) 98
  99. { dt = ThaoTacNguoiDung_DAO.TruyVanDataTable("SELECT * FROM login WHERE tendangnhap='" + tendangnhap + "' and role='admin'"); if (dt.Rows.Count > 0) return true; else return false; } public static bool KiemTraQuyenDangnhap(string tendangnhap) { dt = ThaoTacNguoiDung_DAO.TruyVanDataTable("SELECT * FROM login WHERE tendangnhap='" + tendangnhap + "' and (role='admin' or role='IT');"); if (dt.Rows.Count > 0) return true; else return false; } public static bool ThemNguoiDung(string username, string password, string role, string NguoiThemMoi) { bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL("INSERT INTO login VALUES ('" + username + "', '" + password + "', '" + role + "', '"+DateTime.Now.ToString("yyyy- MM-dd HH:mm:ss") + "', '"+NguoiThemMoi+"', '1');"); return a; } public static bool ThayDoiQuyenDangNhap(string tendangnhap, string quyendangnhap) { string query; query = "UPDATE `Quanlymaytinh`.`login` SET `"+quyendangnhap+"` = 'admin' WHERE (`tendangnhap` = '"+tendangnhap+"');"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); return a; } public static bool DoiMatKhauUser(string tendangnhap, string matkhaumoi) { string query; query = "UPDATE `Quanlymaytinh`.`login` SET `matkhau` = '" + matkhaumoi + "' WHERE (`tendangnhap` = '" + tendangnhap + "');')"; bool a; a = ThongTinMayTinh_DAO.ChayLenhSQL(query); return a; } public static DataTable LayDanhSachQuyen() { string query; query = "SELECT * FROM bangphanquyen"; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable TimKiemUser(string keyword) { string query; query = "SELECT * FROM login WHERE tendangnhap like '%" + keyword + "%';"; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } public static DataTable TimKiemUser(string keyword, string role) { string query; query = "SELECT * FROM login WHERE tendangnhap like '%" + keyword + "%' and role ='"+role+"';"; dt = ThongTinMayTinh_DAO.LayDuLieu(query); return dt; } 99