CƠ SỞ LÝ THUYẾT VÀ KHẢO SÁT
HTML,CSS và JavaScript
HTML, CSS và JavaScript là những khái niệm cơ bản và thiết yếu cho lập trình website chuyên nghiệp Chúng tạo thành nền tảng quan trọng để xây dựng và làm phong phú các trang web Do đó, việc nắm vững HTML, CSS và JavaScript là điều bắt buộc cho những ai muốn theo đuổi sự nghiệp phát triển website.
HTML, hay còn gọi là ngôn ngữ đánh dấu siêu văn bản, là công cụ chính để mô tả cấu trúc của các trang web và tạo ra tài liệu có thể hiển thị trong trình duyệt.
HTML là nền tảng chính của tất cả các trang web, với mỗi trang được cấu thành từ các thẻ HTML đặc trưng cho từng loại nội dung Từng loại nội dung trên trang đều được "bọc" trong các thẻ HTML, giúp định hình và tổ chức thông tin một cách rõ ràng.
HTML không phải là ngôn ngữ lập trình, điều này có nghĩa là nó không thể tạo ra các chức năng động Thay vào đó, HTML giống như Microsoft Word, được sử dụng để bố cục và định dạng trang web.
CSS (Cascading Style Sheets) là ngôn ngữ định dạng dùng để mô tả cách trình bày trang web, bao gồm màu sắc, bố cục và phông chữ Nó giúp nội dung hiển thị đồng nhất trên nhiều thiết bị với kích thước màn hình khác nhau, từ màn hình lớn đến màn hình nhỏ và cả máy in.
HTML là cấu trúc cơ bản của một trang web, trong khi CSS mang đến phong cách và diện mạo mà bạn mong muốn cho trang web của mình CSS thực sự tạo nên bộ mặt của website.
− Cũng giống như HTML, CSS không phải là một ngôn ngữ lập trình
JavaScript (JS) là một ngôn ngữ kịch bản hướng đối tượng, nhẹ và chạy trên nhiều nền tảng Được thực thi trong môi trường máy chủ lưu trữ như trình duyệt web, JavaScript cho phép kết nối và điều khiển các đối tượng trong môi trường đó, mang lại khả năng kiểm soát chương trình hiệu quả.
JavaScript là ngôn ngữ lập trình logic, cho phép sửa đổi nội dung trang web và tạo ra các phản hồi linh hoạt theo hành động của người dùng Một số ứng dụng phổ biến của JavaScript bao gồm việc tạo hộp xác nhận, kêu gọi hành động, và bổ sung danh tính mới vào thông tin hiện có.
Bootstrap
− Bootstrap là một front-end framework miễn phí giúp quá trình phát triển web nhanh chóng và dễ dàng hơn
− Bootstrap bao gồm các mẫu thiết kế dựa trên HTML và CSS như typography, forms, buttons, tables, navigation, modals, image carousels… cũng như các plugin JavaScript tùy chọn
− Bootstrap cũng cung cấp cho bạn khả năng tạo ra các responsive designs một cách dễ dàng
1.2.2 Tại sao nên dùng Bootstrap?
− Dễ sử dụng: Bất kỳ ai có kiến thức cơ bản về HTML và CSS đều có thể bắt đầu sử dụng Bootstrap
− Các tính năng đáp ứng (Responsive features): responsive CSS của Bootstrap điều chỉnh cho điện thoại, máy tính bảng và máy tính để bàn
− Khả năng tương thích trình duyệt: Bootstrap tương thích với tất cả các trình duyệt hiện đại (Chrome, Firefox, Internet Explorer, Edge, Safari và Opera)
Bootstrap giúp lập trình viên tiết kiệm thời gian và công sức trong việc thiết kế giao diện website nhờ vào các thư viện chứa nhiều đoạn mã sẵn có Điều này cho phép họ áp dụng ngay vào dự án của mình, giảm thiểu thời gian cần thiết để viết mã từ đầu.
JQuery
jQuery là một thư viện JavaScript mạnh mẽ, giúp việc phát triển các chức năng bằng JavaScript trở nên dễ dàng và nhanh chóng hơn Thư viện này tích hợp nhiều module đa dạng, từ hiệu ứng cho đến truy vấn selector, mang lại tính năng phong phú cho người dùng Hiện nay, jQuery được sử dụng trên 99% tổng số website trên toàn cầu.
jQuery không phải là một ngôn ngữ lập trình độc lập mà là một thư viện được xây dựng trên nền tảng JavaScript Sử dụng jQuery giúp bạn thực hiện nhiều tác vụ phức tạp một cách dễ dàng và hiệu quả hơn.
1.3.2 Tại sao nên dùng jQuery?
− Gọn nhẹ: jQuery là một thư viện khá gọn nhẹ – có kích cỡ khoảng 19KB
− Tương thích đa nền tảng: Nó tự động sửa lỗi và chạy được trên mọi trình duyệt phổ biến như Chrome, Firefox, Safari, MS Edge, IE, Android và iOS
Việc tạo Ajax trở nên đơn giản hơn nhờ thư viện jQuery, cho phép mã Ajax tương tác dễ dàng với server và tự động cập nhật nội dung mà không cần tải lại trang.
jQuery cho phép xử lý DOM một cách nhanh nhạy, giúp người dùng dễ dàng lựa chọn và duyệt các phần tử DOM Bằng cách sử dụng Selector mã nguồn mở Sizzle, việc chỉnh sửa nội dung của các phần tử trở nên đơn giản hơn bao giờ hết.
Đơn giản hóa quá trình tạo hiệu ứng với code snippet giúp bạn dễ dàng áp dụng animation chỉ bằng cách thêm biến hoặc nội dung vào mà không cần viết lại toàn bộ mã.
jQuery hỗ trợ hiệu quả việc xử lý sự kiện HTML, giúp quản lý các sự kiện đa dạng mà không làm rối mã HTML bằng cách sử dụng các Event Handler.
Ajax là gì?
AJAX, viết tắt của Asynchronous JavaScript and XML, là một công nghệ cho phép tạo ra các trang web động mà không cần tải lại trang.
JavaScript và XML đều hỗ trợ hoạt động bất đồng bộ trong AJAX, cho phép nhiều ứng dụng web gửi và nhận dữ liệu từ server mà không cần tải lại toàn bộ trang.
1.4.2 Tại sao nên dùng Ajax?
AJAX cho phép thực hiện các cuộc gọi lại mà không cần tải lại toàn bộ trang, giúp truy xuất và lưu dữ liệu hiệu quả hơn Bằng cách gửi chỉ một phần của trang web đến máy chủ, AJAX giảm thiểu việc sử dụng băng thông và cải thiện tốc độ hoạt động của trang web Điều này đặc biệt có lợi cho các trang web có băng thông hạn chế, vì nó có thể nâng cao đáng kể hiệu suất mạng khi dữ liệu được gửi đi và nhận về một cách tối thiểu.
Ajax cho phép thực hiện các cuộc gọi không đồng bộ tới máy chủ web, giúp trình duyệt của người dùng không cần chờ đợi toàn bộ dữ liệu được tải về trước khi cho phép họ tiếp tục tương tác.
Các ứng dụng hỗ trợ Ajax mang lại trải nghiệm người dùng nhanh chóng và thân thiện hơn, vì không cần phải tải lại trang từ server.
Ajax giúp tăng tốc độ và hiệu suất của ứng dụng web, mang lại trải nghiệm người dùng mượt mà hơn Một ví dụ điển hình là tính năng xếp hạng phim trên Netflix, nơi người dùng có thể đánh giá phim mà không cần chờ trang tải lại, giúp lưu trữ xếp hạng ngay lập tức vào cơ sở dữ liệu.
Lararel
Là một framework PHP mã nguồn mở miễn phí, giúp phát triển ứng dụng theo mô hình MVC (Model - View - Controller) một cách nhanh chóng, nó được sáng tạo bởi một lập trình viên dày dạn kinh nghiệm trong lĩnh vực NET.
12 đó là Taylor Otwell Được phát hành lần đầu vào ngày 9 tháng 6 năm
Laravel, trước đây được gọi là Bootplant, đã được đổi tên thành Laravel, với nguồn gốc tên gọi lấy cảm hứng từ một tòa lâu đài trong Narnia - một vùng đất hư cấu trong thế giới tưởng tượng.
Các phiên bản của laravel đến tháng 4 năm 2020
Tiểu thuyết "Biên niên sử Narnia" của nhà văn Clive Staples Lewis đã trở thành nguồn cảm hứng cho nhiều tác phẩm điện ảnh Tòa lâu đài Paravel, khi đọc ngược lại, trở thành Laravel, phản ánh ước mơ của Taylor Otwell về một framework PHP phát triển mạnh mẽ và bền vững Đến nay, Laravel vẫn giữ vững vị trí là một trong những framework tốt nhất cho PHP.
1.5.2 Tại sao nên dùng Laravel?
Laravel là một framework PHP mạnh mẽ, cho phép phát triển các ứng dụng web phức tạp với hiệu năng cao Mặc dù dễ dàng tiếp cận cho người mới, Laravel vẫn đảm bảo kiến trúc hệ thống thống nhất và khoa học.
Cộng đồng Laravel trên Laracast rất lớn, cung cấp nhiều câu trả lời cho các vấn đề và tình huống mà lập trình viên gặp phải Tài nguyên liên quan đến Laravel cũng phong phú và dễ sử dụng Taylor Otwell, tác giả của framework này, đã biên soạn tài liệu hữu ích để giúp các lập trình viên khám phá và trải nghiệm Laravel một cách hiệu quả.
Artisan là công cụ dòng lệnh tích hợp trong Laravel, giúp tối ưu hóa ứng dụng, thực hiện migrate dữ liệu, và tạo các template cũng như controller một cách dễ dàng, hỗ trợ hiệu quả trong quá trình phát triển ứng dụng.
Laravel sở hữu một bộ máy template mạnh mẽ mang tên Blade, giúp đơn giản hóa việc tương tác giữa PHP và HTML Blade tách biệt rõ ràng mã hiển thị và mã logic, điều này trước đây chỉ thấy ở NET hoặc Java Ngoài ra, Blade còn hỗ trợ kế thừa template và tích hợp các script như JavaScript, jQuery.
− Laravel sử dụng gói thư viện Webpack kết hợp với npm, yarn nhằm giúp bạn tự động hóa thay vì build thủ công các ứng dụng và triển
Laravel hỗ trợ việc cài đặt các gói thư viện, giúp người dùng dễ dàng tạo ra những tính năng tuyệt vời cho ứng dụng của mình.
Laravel đảm bảo an toàn bảo mật thông qua việc sử dụng CSRF tokens, giúp kiểm tra mã CSRF trong mỗi yêu cầu POST, từ đó bảo vệ ứng dụng khỏi các tấn công thay đổi bản chất Hơn nữa, Laravel cung cấp các Middleware sẵn có, cho phép lập trình viên tạo ra Middleware riêng để nâng cao độ bảo mật cho website.
Laravel cung cấp hỗ trợ mạnh mẽ cho lập trình theo mô hình MVC, bao gồm các thành phần chính như Model, View và Controller Bên cạnh đó, Routes được sử dụng để định tuyến người dùng đến các URL chính xác.
− Laravel luôn thay đổi, cập nhật trong các phiên bản, luôn tìm kiếm những tính năng hay, những gói thư viện tốt và hữu ích để tích hợp vào
Cách thức hoạt động MVC trong Laravel
PHP
PHP bắt đầu như một dự án mã nguồn mở nhỏ, nhưng nhanh chóng trở thành một công cụ hữu ích cho nhiều người Được phát triển từ sản phẩm PHP/FI do Rasmus Lerdorf tạo ra vào năm 1994, PHP/FI ban đầu chỉ là một tập hợp mã kịch bản Perl đơn giản để theo dõi truy cập vào trang cá nhân của ông Rasmus đã đặt tên cho nó là "Personal Home Page Tools" Khi cần thêm chức năng, ông đã viết một bộ thực thi bằng C lớn hơn để hỗ trợ truy vấn cơ sở dữ liệu và phát triển ứng dụng web đơn giản Cuối cùng, ông quyết định công bố mã nguồn của PHP/FI để mọi người có thể xem, sử dụng, sửa lỗi và cải tiến nó.
− PHP viết hồi qui của "PHP: Hypertext Preprocessor"
PHP là ngôn ngữ lập trình kịch bản phía máy chủ, cho phép nhúng trong HTML và quản lý nội dung động Nó hỗ trợ quản lý cơ sở dữ liệu, theo dõi phiên làm việc và tương tác với nhiều hệ quản trị cơ sở dữ liệu phổ biến như MySQL, PostgreSQL, Oracle, Sybase và Informix.
PHP hoạt động rất hiệu quả, đặc biệt khi được biên dịch dưới dạng Apache Module trên hệ điều hành Unix MySQL Server, khi khởi động, có khả năng thực thi các truy vấn phức tạp với tập hợp kết quả lớn trong thời gian kỷ lục.
PHP hỗ trợ nhiều giao thức quan trọng như POP3, IMAP và LDAP Phiên bản PHP4 đã mở rộng khả năng hỗ trợ Java cùng với các cấu trúc đối tượng phân phối như COM và CORBA.
− Cú pháp PHP là giống C
Những ngôn ngữ lập trình phổ biến từ năm 1965 – 2019
1.6.2 Tại sao nên dùng PHP
Hiện nay, trong số hàng ngàn ngôn ngữ lập trình, PHP nổi bật như một trong những ngôn ngữ phổ biến nhất, được tin dùng rộng rãi PHP được thiết kế đặc biệt cho phát triển web và hiện đang được cài đặt trên hơn 20 triệu website.
Ngôn ngữ ASP là một trong những đối thủ cạnh tranh của PHP, cả hai đều được sử dụng để phát triển website động So với web tĩnh sử dụng HTML, ASP và PHP cho phép người dùng tương tác và trao đổi thông tin hiệu quả hơn.
Hiện nay, có hàng ngàn ngôn ngữ lập trình, nhưng chỉ một số ít được ưa chuộng và tin dùng rộng rãi Trong số đó, PHP nổi bật như một ngôn ngữ lập trình phổ biến, được thiết kế để phát triển web một cách hiệu quả.
17 để phục vụ cho việc phát triển web và được cài đặt trên 20 triệu website,
Ngôn ngữ ASP là một trong những đối thủ cạnh tranh chính của PHP trong lĩnh vực lập trình web Cả hai ngôn ngữ này đều được sử dụng để phát triển các trang web động, mang lại khả năng tương tác và trao đổi thông tin cho người dùng, vượt trội hơn so với các trang web tĩnh được xây dựng bằng HTML.
Khảo Sát Hiện Trạng
Trong bối cảnh kinh tế ngày càng phát triển, sự cạnh tranh giữa các doanh nghiệp ngày càng trở nên gay gắt Để tồn tại và phát triển trên thị trường, nhiều công ty đã xác định Marketing là yếu tố chiến lược quan trọng hàng đầu Một trong những chiến lược quảng bá thiết yếu trong thời đại internet hiện nay là việc sở hữu một website riêng để giới thiệu hình ảnh và thông tin của doanh nghiệp.
So sánh giữa ASP và PHP
Trong thời đại 4.0 hiện nay, việc tìm kiếm thông tin trên các website trực tuyến trở nên dễ dàng và phong phú hơn bao giờ hết Sự gia tăng đa dạng của các trang web đáp ứng nhu cầu của người dùng Với sự phổ biến của các thiết bị như smartphone và laptop, người dùng có thể dễ dàng truy cập internet và tìm kiếm những gì họ cần chỉ với một cú chạm.
1.7.2 Khảo sát các website tương tự
Nhằm đáp ứng nhu cầu giới thiệu và quảng bá hình ảnh, nhiều công ty đã xây dựng website riêng, trong đó tandaithanh.vn.net nổi bật như một trong những trang web hàng đầu Tandaithanh.vn.net đã thành công trong việc cung cấp cho khách hàng cái nhìn rõ nét về hình ảnh công ty, thông tin sản phẩm, cùng với nhiều tin tức quan trọng khác.
Tandaithanh.vn.net là một trang web chuyên cung cấp các loại cửa kính, sở hữu giao diện thân thiện và cách bố trí nội dung hợp lý, mang lại cho người dùng cảm giác thoải mái và dễ dàng tìm kiếm thông tin mong muốn.
*Phân tích website tandaithanh.vn.net:
+ Logo website, tên công ty
+ Silde tiêu đề hình ảnh sản phẩm
− Sản Phẩm Của Chúng Tôi: Cửa sổ nhôm kính, cửa sổ kính cường lực, kính ốp trang trí, cửa đi một cánh,
− Giới Thiệu: Cửa kính đẹp, lan can đẹp, cầu thang kính, kính cường lực ngoài trời
− Công Trình Tiêu Biểu: Lan can kính quận Tân Phú, công trình Bình Tiên quận 6, công trình cách mạng tháng 8, công trình Bùi Hữu Nghĩa quận Bình Thạnh,
Cửa nhôm kính mang lại nhiều ưu điểm vượt trội so với cửa truyền thống, như khả năng cách âm, cách nhiệt tốt hơn và độ bền cao Đặc biệt, cửa nhôm kính sơn tĩnh điện không chỉ tăng cường tính thẩm mỹ mà còn bảo vệ bề mặt khỏi tác động của thời tiết Nếu bạn đang tìm kiếm mẫu cửa nhôm kính đẹp cho công trình của mình, hãy tham khảo các thiết kế hiện đại và sang trọng để tạo điểm nhấn cho không gian sống.
− Chân Trang: Các thông tin liên hệ và địa chỉ của công ty
Slide hình ảnh sản phẩm
+ Các chức năng: tìm kiếm, xem thêm chi tiết của từng bài đăng, gửi yêu cầu tới công ty
− Trang sản phẩm: Danh mục các sản phẩm
Mẫu gửi thông tin yêu cầu tới công ty
Danh mục các sản phẩm
− Trang thông tin về sản phẩm:
− Thông Tin Sản Phẩm: Bài đăng thông tin về sản phẩm, các hình ảnh liên quan về sản phẩm
− Sản Phẩm Tương Tự: Danh sách các sản phẩm tương tự
Bài đăng thông tin về sản phẩm
− Trang báo giá: Thông tin báo giá của từng loại sản phẩm
− Trang tin tức: Danh mục các tin tức
− Trang chi tiết tin tức:
− Tin Tức: Bài đăng về tin tức
− Các tin tức khác: Danh sách các tin khác
− Trang công trình đã hoàn thiện: Danh mục các công trình đã hoàn thiện
− Trang thông tin về công trình:
− Thông Tin Công Trình: Bài đăng thông tin về công trình, các hình ảnh về công trình đã hoàn thiện
− Danh Sách Các Công Trình Khác: Danh sách các công trình khác
Danh sách các công trình khác
TỔNG QUAN CHỨC NĂNG WEBSITE
Quan Điểm Của Sản Phẩm
− Giao diện thân thiện, đẹp mắt
− Giúp người dùng tìm kiếm thông tin dễ dàng
− Tính bảo mật website cao.
Chức Năng Sản Phẩm
− Tìm kiếm thông tin về sản phẩm
− Gửi yêu cầu nhận báo giá
− Lọc các loại sản phẩm mong muốn
− Đánh giá, nhận xét bài đăng về sản phẩm
− Các chức năng riêng biệt dành cho admin như: quản lý bài đăng, quản lý tài khoản, nhận danh sách yêu cầu từ khách hàng.
Người Dùng
Quản trị viên có nhiệm vụ quản lý toàn bộ tin đăng trên website, tiếp nhận thông báo yêu cầu từ khách hàng và tự quản lý tài khoản, bao gồm việc cập nhật thông tin và thay đổi mật khẩu.
− Guest: Xem tin, tìm kiếm sản phẩm, lọc sản phẩm, nhận xét và gửi yêu cầu đến công ty
Các Ràng Buộc
Khách mời chỉ có thể thực hiện năm chức năng chính, bao gồm xem tin tức, tìm kiếm sản phẩm, lọc sản phẩm, nhận xét tin và gửi yêu cầu Họ không có quyền truy cập vào các hoạt động dành riêng cho quản trị viên.
YÊU CẦU CHỨC NĂNG WEBSITE
Xem tin
− Có thể xem các thông tin về công ty theo từng loại chủ đề khác nhau.
Tìm kiếm sản phẩm
− Có thể dễ dàng tìm kiếm thông tin về sản phẩm thông qua việc nhập từ khóa trên thanh tìm kiếm.
Lọc sản phẩm
− Dễ dàng lọc ra các sản phẩm thuộc những loại mong muốn một cách nhanh chóng.
Gửi yêu cầu nhận báo giá
− Hỗ trợ gửi yêu cầu dưới dạng tin nhắn đến công ty.
Nhận xét bài viết về sản phẩm
− Công khai nhận xét tất cả các bài đăng về sản phẩm của công ty.
Đăng nhập/đăng xuất
− Dành cho Admin: Đăng nhập để sử dụng tất cả quyền hạn cho việc quản lý website
Để bảo mật trang quản trị, bạn cần thoát khỏi trang này và trở về trang đăng nhập Lưu ý rằng bạn không thể truy cập vào trang quản trị thông qua đường link URL nếu chưa đăng nhập.
Quản lý các tin đăng trên website
− Dành cho Admin: Thực hiện các thao tác quản lý các tin đăng như: xem, thêm, sửa, xóa.
Nhận các thông báo yêu cầu từ khách hàng
− Dành cho Admin: Nhận danh sách những yêu cầu từ khách hàng, thông báo yêu cầu mới dưới dạng hộp thư.
Quản lý thông tin tài khoản
− Dành cho Admin: Quản lý tài khoản admin như thay đổi thông tin, đổi mật khẩu
MÔ HÌNH USECASE
Tác nhân
Bảng các tác nhân và quyền của tác nhân trong UseCase
STT Các Chức Năng Chính Admin Guest
1 Xem các thông tin về công ty X X
4 Lọc sản phẩm theo loại X X
5 Nhận xét bài viết về sản phẩm X X
6 Gửi yêu cầu nhận báo giá X X
7 Quản lý các tin đăng X
8 Nhận thông báo yêu cầu từ khách hàng
9 Quản lý thông tin tài khoản X
Các yêu cầu chức năng
Bảng các yêu cầu chức năng hệ thống
Chức Năng Hệ Thống Yêu Cầu Chức Năng Ký Hiệu Đăng nhập/Đăng xuất Đăng nhập UC_1.1 Đăng xuất UC_1.2
Xem các tin được đăng trên trang chủ UC_2.1 Xem chi tiết danh mục tin UC_2.2
Xem chi tiết tin đăng UC_2.3
Hiển thị tiêu đề các tin liên quan UC_2.4 Tìm/Lọc Sản Phẩm
Tìm kiếm sản phẩm UC_3.1
Nhận Xét Bài Đăng Đăng nhận xét UC_4.1
Gửi Yêu Cầu Báo Giá
Gửi yêu cầu nhận báo giá sản phẩm UC_5.1 Quản Lý Tài Khoản
Cập nhập thông tin UC_6.1
Thay đổi mật khẩu UC_6.2
Nhận Thông Báo Yêu Cầu
Nhận thông báo yêu cầu mới UC_7.1 Xem danh sách các yêu cầu UC_7.2
Xem chi tiết yêu cầu UC_7.3
Xem danh sách tin đăng UC_8.1
Lược Đồ Use Case
Lượt đồ tổng quan usecase
Chi Tiết Các Use Case
Bảng chi tiết các UseCase
Goal Đăng nhập thành công với tài khoản được cấp trước
(Thành công) 1 Hệ thống yâu cầu người truy cập cung cấp thông tin đăng nhập đã được cấp từ trước là tên đăng nhập và mật khẩu
2 Sau khi người truy cập điền đẩy đủ, sau đó nhấn vào nút đăng nhập
3 Hệ thống sẽ so sánh dữ liệu nhập vào với tên đăng nhập và mật khẩu được mã hóa với dữ liệu đã được cấp trong Database Nếu dữ liệu được cung cấp chính xác => Đăng nhập thành công, hệ thống sẽ trả về trang quản trị admin
1 Hệ thống yâu cầu người truy cập cung cấp thông tin đăng nhập đã được cấp từ trước là tên đăng nhập và mật khẩu
2 Sau khi người truy cập điền đẩy đủ sau, đó nhấn vào nút đăng nhập
3 Hệ thống sẽ so sánh dữ liệu nhập vào với tên đăng nhập và mật khẩu được mã hóa với dữ liệu đã được cấp trong Database Nếu dữ liệu được cung cấp sai, không trùng khớp Hệ thống sẽ trả lại trang đăng nhập với thông báo “Tên Đăng Nhập Hoặc Mật Khẩu Không Đúng”
Goal Đăng xuất tài khoản thành công chỉ khi đã đăng nhập
Pre-conditions Đã đăng nhập thành công (UC_1.1) và chưa đăng xuất sau đó Post-conditions
(Thành công) 1 Người dùng nhấp vào logo avatar người dùng
2 Hệ thống sẽ hiện ra một danh sách chức năng trong đó có nút đăng xuất sau đó nhấp vào đăng xuất
3 Hệ thống sẽ lập tức kết thúc section và quay lại trang đăng nhập
1 Không có Nút đăng xuất chỉ hiện lên khi người try cập đã đăng nhập thành công sau đó
Name Xem các tin được đăng trên trang chủ
Goal Các tin đăng được in lên trang chủ
(Thành công) 1 Truy cập vào đường dẫn Website
2 Tất cả tin đăng ở trang chủ với sắp xếp theo từng mục tương ứng với loại tin đó Một số tin đăng sẽ xuất hiện như tiêu đề tin để dẫn đến phần chi tiết của tin Một số
34 tin xuất hiện đóng vai trò làm danh mục cho những tin tương ứng Còn lại sẽ xuất hiện dưới dạng bài viết ngay trên trang
1 Không có tin đăng nào được hiển thị
Name Xem chi tiết mục tin
Goal Chuyển hướng đến trang chứa các tiêu đề tin thuộc mục tin được chọn
(Thành công) 1 Truy cập vào đường dẫn Website
2 Nhấp vào một mục tin bất kì trong danh sách mục tin
3 Hệ thống chuyển hướng đến trang chứa các tiêu đề tin thuộc mục tin được chọn
(Thất bại) 1 Truy cập vào đường dẫn Website
2 Nhấp vào một mục tin bất kì trong danh sách mục tin
3 Hệ thống ko có phản hồi Hoặc chuyển hướng lỗi
Name Xem chi tiết tin đăng
Goal Chuyển hướng đến trang chi tiết tin đăng với đầy đủ thông tin
(Thành công) 1 Truy cập vào đường dẫn Website
2 Nhấp vào một tiêu đề tin bất kỳ
3 Hệ thống sẽ chuyển hướng tới trang của tin vừa chọn Với đầy đủ thông tin chi tiết
(Thất bại) 1 Truy cập vào đường dẫn Website
2 Nhấp vào một tin bất kỳ
3 Hệ thống ko có phản hồi Hoặc chuyển hướng lỗi
Name Hiển thị tiêu đề các tin liên quan
Goal Hiển thị danh sách các tiêu đề tin có cùng loại mục tin với trang chi tiết tin đang truy cập
(Thành công) 1 Truy cập vào đường dẫn Website
2 Nhấp vào một tiêu đề tin bất kỳ
3 Hệ thống sẽ chuyển hướng tới trang của tin vừa chọn Với đầy đủ thông tin chi tiết cùng danh sách các tiêu đề tin có cùng loại mục với tin được truy cập
(Thất bại) 1 Truy cập vào đường dẫn Website
2 Nhấp vào một tin bất kỳ
3 Hệ thống sẽ chuyển hướng tới trang của tin vừa chọn Với đầy đủ thông tin chi tiết nhưng không hiển thị danh sách các tiêu đề tin có cùng loại mục với tin được truy cập hoặc danh sách không đúng
Name Tìm kiếm sản phẩm
Goal Hiển thị danh sách sản phẩm tương ứng với từ khóa được nhập
(Thành công) 1 Truy cập vào đường dẫn Website
2 Chọn công cụ tìm kiếm sản phẩm
3 Nhập từ khóa sản phẩm muốn tìm vào thanh tìm kiếm
4 Hệ thống trả về danh sách tên các sản phẩm tưng ứng với từ khóa được cung cấp
(Thất bại) 1 Truy cập vào đường dẫn Website
2 Chọn công cụ tìm kiếm sản phẩm
3 Nhập từ khóa sản phẩm muốn tìm vào thanh tìm kiếm
4 Hệ thống không phản hồi, hoặc phản hồi nhưng ko trả lại dữ liệu đúng
Goal Lọc ra danh sách sản phẩm theo những chủ đề được chọn
(Thành công) 1 Truy cập vào đường dẫn Website
2 Chọn mục loại sản phẩm
3 Hệ thống điều hướng đến trang danh sách loại sản phẩm
4 Tích chọn vào những chủ đề muốn lọc
5 Hệ thống sẽ trả về danh sách các sản phẩm tương ứng với những chủ đề được chọn
(Thất bại) 1 Truy cập vào đường dẫn Website
2 Chọn mục loại sản phẩm
3 Hệ thống điều hướng đến trang danh sách loại sản phẩm
4 Tích chọn vào những chủ đề muốn lọc
5 Hệ thống không phản hồi, hoặc phản hồi nhưng ko trả lại dữ liệu đúng
Goal Đăng nhận xét về một bài đăng sản phẩm bất kỳ
(Thành công) 1 Truy cập vào đường dẫn Website
2 Nhấp vào một tiêu đề tin bất kỳ
3 Hệ thống sẽ chuyển hướng tới trang chi tiết tin đăng
5 Hệ thống sẽ yêu cầu điền đầy đủ thông tin như là tên người nhận xét và nội dung nhận xét
6 Sau khi điền đầy đủ thông tin, nhấn nút nhận xét
7 Hệ thống sẽ đăng bài nhận xét trong trang chi tiết tin đăng đó
(Thất bại) 1 Truy cập vào đường dẫn Website
2 Nhấp vào một tiêu đề tin bất kỳ
3 Hệ thống sẽ chuyển hướng tới trang chi tiết tin đăng
5 Hệ thống sẽ yêu cầu điền đầy đủ thông tin như là tên người nhận xét và nội dung nhận xét
6 Sau khi điền đầy đủ thông tin, nhấn nút nhận xét
7 Hệ thống không đăng bài nhận xét
Name Gửi yêu cầu nhận báo giá sản phẩm
Goal Gửi tin nhắn thông báo yêu cầu nhận báo giá tới công ty
(Thành công) 1 Truy cập vào đường dẫn Website
2 Chọn nút “Nhận Báo Giá”
3 Hệ thống sẽ đưa ra một mẫu đơn đăng ký nhận báo giá với các thông tin yêu cầu như họ tên, số điện thoại, địa chỉ và nội dung yêu cầu
4 Sau khi điền đầy đủ các trường yêu cầu, nhấn nút xác nhận
5 Hệ thống chuyển yêu cầu đến trang quản trị của admin
6 Hệ thống trả về thông báo “Đăng ký nhận báo giá thành công”
(Thất bại) 1 Truy cập vào đường dẫn Website
2 Chọn nút “Nhận Báo Giá”
3 Hệ thống sẽ đưa ra một mẫu đơn đăng ký nhận báo giá với các thông tin yêu cầu như họ tên, số điện thoại, địa chỉ và nội dung yêu cầu
4 Sau khi điền đầy đủ các trường yêu cầu, nhấn nút xác nhận
5 Hệ thống không phản hồi hoặc không trả về bất kỳ thông báo nào
Name Cập nhập thông tin
Goal Thay đổi thông tin tài khoản
Pre-conditions Đã đăng nhập thành công (UC_1.1) và chưa đăng xuất sau đó Post-conditions
(Thành công) 1 Người dùng nhấp vào logo avatar người dùng
2 Hệ thống sẽ hiện ra một danh sách chức năng trong đó có nút cập nhập thông tin, chọn chức năng cập nhập thông tin
3 Hệ thống sẽ chuyển hướng đến trang cập nhập thông tin và hiển thị các thông tin đã được thiết lập lần trước trên trang như tên đăng nhập, tên người dùng
4 Người dùng tùy ý thay đổi thông tin được thiết lập lần trước, sau đó nhấn nút cập nhập
5 Hệ thống thay đổi thông tin của bản user trong Database, và sau đó xuất ra thông báo cập nhập thành công
(Thất bại) 1 Người dùng nhấp vào logo avatar người dùng
2 Hệ thống sẽ hiện ra một danh sách chức năng trong đó có nút cập nhập thông tin, chọn chức năng cập nhập thông tin
3 Hệ thống sẽ chuyển hướng đến trang cập nhập thông tin và hiển thị các thông tin đã được thiết lập lần trước trên trang như tên đăng nhập, tên người dùng
4 Người dùng tùy ý thay đổi thông tin được thiết lập lần trước, sau đó nhấn nút cập nhập
5 Hệ thống không phản hồi hoặc xuất ra thông báo các trường nhập bị lỗi
Name Thay đổi mật khẩu
Goal Thay đổi thông tin mật khẩu tài khoản
Pre-conditions Đã đăng nhập thành công (UC_1.1) và chưa đăng xuất sau đó Post-conditions
(Thành công) 1 Người dùng nhấp vào logo avatar người dùng
2 Hệ thống sẽ hiện ra một danh sách chức năng trong đó có nút cập nhập thông tin, chọn chức năng cập nhập thông tin
3 Hệ thống sẽ chuyển hướng đến trang cập nhập thông tin
4 Người dùng tích chọn vào checkbox đổi mật khẩu, sau đó hai phần mật khẩu và xác nhận mật khẩu sẽ sáng lên
5 Người dùng đặt mật khẩu mới trong phần mật khẩu và nhập lại mật khẩu mới trong phần xác nhận mật khẩu, sau đó nhấn nút cập nhập
6 Hệ thống thay đổi thông tin mật khẩu của bản user trong Database, và sau đó xuất ra thông báo cập nhập thành công
(Thất bại) 1 Người dùng nhấp vào logo avatar người dùng
2 Hệ thống sẽ hiện ra một danh sách chức năng trong đó có nút cập nhập thông tin, chọn chức năng cập nhập thông tin
3 Hệ thống sẽ chuyển hướng đến trang cập nhập thông tin
4 Người dùng tích chọn vào checkbox đổi mật khẩu, sau đó hai phần mật khẩu và xác nhận mật khẩu sẽ sáng lên
5 Người dùng đặt mật khẩu mới trong phần mật khẩu và nhập lại mật khẩu mới trong phần xác nhận mật khẩu, sau đó nhấn nút cập nhập
6 Hệ thống không phản hồi hoặc xuất ra thông báo các trường nhập bị lỗi
Name Nhận thông báo yêu cầu mới
Goal Thông báo các yêu cầu mới chưa xem từ khách hàng
Pre-conditions Đã đăng nhập thành công (UC_1.1) và chưa đăng xuất sau đó Post-conditions
(Thành công) 1 Biểu tượng lá thư bên cạnh logo người dùng sẽ hiện thông báo số yêu cầu từ khách hàng chưa được xem
2 Nhấn vào biểu tượng lá thư, sau đó hệ thống sẽ hiện ra một hộp danh sách chứa các tóm tắt về những yêu cầu chưa được đọc
(Thất bại) 1 Biểu tượng lá thư bên cạnh logo người dùng sẽ hiện thông báo số yêu cầu từ khách hàng chưa được xem
2 Nhấn vào biểu tượng lá thư, hệ thống không hiện ra bất kỳ danh sách nào mặc dù số yêu cầu chưa đọc lớn hơn 0
Name Xem danh sách các yêu cầu
Goal Hiển thị tất cả danh sách yêu cầu nhận báo giá từ khách hàng
Pre-conditions Đã đăng nhập thành công (UC_1.1) và chưa đăng xuất sau đó Post-conditions
(Thành công) 1 Nhấn vào biểu tượng lá thư bên cạnh logo người dùng, sau đó chọn mục xem tất cả ở vị trí dưới cùng
2 Hệ thống trả về trang danh sách tất cả các yêu cầu nhận báo giá của khách hàng từ trước đến nay
1 Nhấn vào biểu tượng lá thư bên cạnh logo người dùng, sau đó chọn mục xem tất cả ở vị trí dưới cùng
2 Hệ thống không phản hồi hoặc trả về sai trang
Name Xem chi tiết yêu cầu
Goal Hiển thị chi tiết nội dung yêu cầu nhận báo giá từ khách hàng
Pre-conditions Đã đăng nhập thành công (UC_1.1) và chưa đăng xuất sau đó Post-conditions
(Thành công) 1 Nhấn vào biểu tượng lá thư bên cạnh logo người dùng, sau đó chọn mục xem tất cả ở vị trí dưới cùng
2 Hệ thống trả về trang chứa danh sách tất cả các yêu cầu nhận báo giá của khách hàng
3 Chọn một yêu cầu bất kỳ trong danh sách
4 Hệ thống trả về trang nội dung chi tiết của yêu cầu đó
(Thất bại) 1 Nhấn vào biểu tượng lá thư bên cạnh logo người dùng, sau đó chọn mục xem tất cả ở vị trí dưới cùng
2 Hệ thống trả về trang chứa danh sách tất cả các yêu cầu nhận báo giá của khách hàng
3 Chọn một yêu cầu bất kỳ trong danh sách
4 Hệ thống không phản hồi hoặc trả về sai trang
Name Xem danh sách tin đăng
Goal Hiển thị danh sách các bài đăng tương ứng với mục bài đăng được chọn
Pre-conditions Đã đăng nhập thành công (UC_1.1) và chưa đăng xuất sau đó Post-conditions
(Thành công) 1 Chọn mục bài đăng bất kỳ
2 Hệ thống sẽ hiện ra danh sách chức năng trong đó có chức năng xem danh sách, chọn chức năng xem danh sách
3 Sau khi đã chọn, hệ thống lập tức điều hướng đến trang danh sách tin đăng tương ứng với mục tin đăng được chọn trước đó
(Thất bại) 1 Chọn mục bài đăng bất kỳ
2 Hệ thống sẽ hiện ra danh sách chức năng trong đó có chức năng xem danh sách, chọn chức năng xem danh sách
3 Sau khi đã chọn, hệ thống không phản hồi hoặc chuyển hướng sai trang
Goal Thêm tin đăng mới tương ứng với mục tin đăng được chọn lên website
Pre-conditions Đã đăng nhập thành công (UC_1.1) và chưa đăng xuất sau đó Post-conditions
(Thành công) 1 Chọn mục bài đăng bất kỳ
2 Hệ thống sẽ hiện ra danh sách chức năng trong đó có chức năng thêm tin đăng, chọn chức năng thêm tin đăng
3 Sau khi đã chọn, hệ thống lập tức điều hướng đến trang thêm tin đăng tương ứng với mục tin đăng được chọn trước đó
4 Tại trang thêm tin đăng, người dùng phải nhập các thông tin bắt buộc vào các trường của tin đăng như là tên tin, tóm tắt, hình ảnh, nội dung, …
5 Sau khi đã nhập thông tin đầy đủ, nhấn nút thêm
6 Hệ thống sẽ thêm tin đăng mới vào Database và in tin đăng đó lên website ở mục tin tương ứng với tin đăng
7 Xuất ra thông báo thêm thành công ở trang thêm tin đăng
(Thất bại) 1 Chọn mục bài đăng bất kỳ
2 Hệ thống sẽ hiện ra danh sách chức năng trong đó có chức năng thêm tin đăng, chọn chức năng thêm tin đăng
3 Sau khi đã chọn, hệ thống lập tức điều hướng đến trang thêm tin đăng tương ứng với mục tin đăng được chọn trước đó
4 Tại trang thêm tin đăng, người dùng phải nhập các thông tin bắt buộc vào các trường của tin đăng như là tên tin, tóm tắt, hình ảnh, nội dung, …
5 Sau khi đã nhập thông tin đầy đủ, nhấn nút thêm
6 Hệ thống không phản hồi hoặc xuất hiện thông báo trường nhập bị lỗi hoặc xuất hiện thông báo thành công nhưng trên website vẫn chưa in tin mới đăng
Goal Sửa tin đăng tương ứng với mục tin đăng được chọn trên website
Pre-conditions Đã đăng nhập thành công (UC_1.1) và chưa đăng xuất sau đó Post-conditions
(Thành công) 1 Chọn mục bài đăng bất kỳ
2 Hệ thống sẽ hiện ra danh sách chức năng trong đó có chức năng xem danh sách, chọn chức năng xem danh sách
3 Sau khi đã chọn, hệ thống lập tức điều hướng đến trang danh sách tin đăng tương ứng với mục tin đăng được chọn trước đó
4 Tại trang danh sách tin đăng, tại một tin đăng bất kỳ trong danh sách, chọn chức năng sửa
5 Hệ thống điều hướng đến trang sửa tin đăng và hiển thị các thông tin về tin đăng được thiết lập trước đó như tên tin, tóm tắt, hình ảnh, nội dung, …
6 Người dùng tùy ý thay đổi nội dung các trường trong trang sửa tin đăng Sau đó nhấn nút sửa
7 Hệ thống sẽ sửa tin đăng được chọn trong Database và cập nhập lại tin đăng đó trên website
8 Xuất ra thông báo sửa thành công ở trang sửa tin đăng
(Thất bại) 1 Chọn mục bài đăng bất kỳ
2 Hệ thống sẽ hiện ra danh sách chức năng trong đó có chức năng xem danh sách, chọn chức năng xem danh sách
3 Sau khi đã chọn, hệ thống lập tức điều hướng đến trang danh sách tin đăng tương ứng với mục tin đăng được chọn trước đó
4 Tại trang danh sách tin đăng, tại một tin đăng bất kỳ trong danh sách, chọn chức năng sửa
5 Hệ thống điều hướng đến trang sửa tin đăng và hiển thị các thông tin về tin đăng được thiết lập trước đó như tên tin, tóm tắt, hình ảnh, nội dung, …
6 Người dùng tùy ý thay đổi nội dung các trường trong trang sửa tin đăng Sau đó nhấn nút sửa
7 Hệ thống không phản hồi hoặc xuất hiện thông báo trường nhập bị lỗi hoặc xuất hiện thông báo thành công nhưng trên website tin đăng vẫn chưa được cập nhập
Goal Xóa tin đăng tương ứng với mục tin đăng được chọn trên website
Pre-conditions Đã đăng nhập thành công (UC_1.1) và chưa đăng xuất sau đó Post-conditions
(Thành công) 1 Chọn mục bài đăng bất kỳ
2 Hệ thống sẽ hiện ra danh sách chức năng trong đó có chức năng xem danh sách, chọn chức năng xem danh sách
3 Sau khi đã chọn, hệ thống lập tức điều hướng đến trang danh sách tin đăng tương ứng với mục tin đăng được chọn trước đó
4 Tại trang danh sách tin đăng, tại một tin đăng bất kỳ trong danh sách, chọn chức năng xóa
5 Hệ thống xóa tin đăng đó khỏi Database và cập nhập lại trên website
6 Xuất ra thông báo xóa thành công ở trang danh sách tin đăng
(Thất bại) 1 Chọn mục bài đăng bất kỳ
2 Hệ thống sẽ hiện ra danh sách chức năng trong đó có chức năng xem danh sách, chọn chức năng xem danh sách
3 Sau khi đã chọn, hệ thống lập tức điều hướng đến trang danh sách tin đăng tương ứng với mục tin đăng được chọn trước đó
4 Tại trang danh sách tin đăng, tại một tin đăng bất kỳ trong danh sách, chọn chức năng xóa
5 Hệ thống không phản hồi hoặc xuất hiện thông báo thành công nhưng trên website tin đăng vẫn chưa được xóa
THIẾT KẾ WEBSITE
Thiết kế cơ sở dữ liệu
5.1.1 Lược đồ cơ sở dữ liệu
Tên trường Kiểu dữ liệu Mô tả id Int Xác định từng bản ghi riêng
Lượt đồ cơ sở dữ liệu
Bài viết mô tả cấu trúc của một bảng cơ sở dữ liệu với các trường quan trọng như: "Tên đăng nhập tài khoản" (tenuser) được định dạng là VarChar, "Tên hiển thị người dùng", "Mật khẩu" (được mã hóa) cũng là VarChar, và hai trường thời gian "Thời gian tài khoản được tạo" (created_at) và "Thời gian tài khoản được sửa đổi" (updated_at) định dạng TimeStamp.
Tên trường Kiểu dữ liệu Mô tả
ID Int Xác định từng bản ghi riêng
TenCT Text Tên công ty
DiaChi Text Địa chỉ của công ty
SDT VarChar Số điện thoại liên hệ công ty
FB VarChar Facebook liên hệ công ty
Email VarChar Email liên hệ công ty
HinhAnh VarChar Hình ảnh về công ty
GioiThieu MediumText Bài đăng giới thiệu về công ty
Tên trường Kiểu dữ liệu Mô tả
ID Int Xác định từng bản ghi riêng
TenTP Text Tên thành phẩm đã hoàn thiện
DiaChi Text Địa chỉ của khách hàng
TomTat Text Tóm tắt về bài đăng thành phẩm
NoiDung MediumText Nội dung bài đăng thành phẩm
TenKH Text Tên khách hàng
NhanXet Text Nhận xét của khách hàng về thành phẩm
AnhKH VarChar Ảnh khách hàng
AnhTP VarChar Ảnh thành phẩm
Tên trường Kiểu dữ liệu Mô tả
ID Int Xác định từng bản ghi riêng
Khách hàng cần cung cấp thông tin để nhận báo giá bao gồm họ tên, địa chỉ, số điện thoại và nội dung yêu cầu Họ tên khách hàng được ghi trong trường "HoTen", địa chỉ trong trường "DiaChi", số điện thoại trong trường "SDT", và ghi chú yêu cầu trong trường "GhiChu".
DaXem Int cho phép người dùng đánh dấu tin yêu cầu đã được đọc hay chưa Thông tin về thời gian yêu cầu được tạo ra được lưu trữ trong trường created_at, trong khi thời gian sửa đổi yêu cầu được ghi lại trong trường updated_at.
Tên trường Kiểu dữ liệu Mô tả
ID Int Xác định từng bản ghi riêng
TenSP Text Tên sản phẩm công ty cung cấp
TomTat Text Tóm tắt về bài đăng
MoTa MediumText Nội dung bài đăng
NhaSX Text Nhà sản xuất ra sản phẩm mà công ty cung cấp AnhTD Varchar Ảnh đại diện sản phẩm
NoiBat Int Đánh dấu sản phẩm có nổi bật hay không
Tên trường Kiểu dữ liệu Mô tả
ID Int Xác định từng bản ghi riêng
TenLoai Text Tên loại sản phẩm công ty cung cấp
MoTa Text Mô tả về loại sản phẩm
HinhAnh VarChar Hình ảnh loại sản phẩm
Tên trường Kiểu dữ liệu Mô tả
ID Int xác định mỗi bản ghi riêng biệt, sanpham_id Int là ID sản phẩm liên kết với bản ghi sản phẩm, và loaisanpham_id Int là ID loại sản phẩm liên kết với bản ghi loại sản phẩm.
Tên trường Kiểu dữ liệu Mô tả
ID Int Xác định từng bản ghi riêng
IDSanPham Int ID sản phẩm liên kết với ID của bản sanpham HinhAnh Varchar Hình ảnh của sản phẩm
Tên trường Kiểu dữ liệu Mô tả
ID Int Xác định từng bản ghi riêng
IDSanPham Int ID sản phẩm liên kết với ID của bản sanpham
HoTen Text Họ tên người đăng nhận xét
NoiDung Text Nội dung nhận xét created_at TimeStamp Thời gian nhận xét được tạo updated_at TimeStamp Thời gian nhận xét được sửa
Mối quan hệ giữa các bản dữ liệu
Các bản dữ liệu có mối quan hệ với nhau
Thiết kế giao diện Website – Front-End
Mục giới thiệu trên trang chủ
Mục sản phẩm trên trang chủ
Mục sản phẩm nổi bật trên trang chủ
Mục tiêu chí hoạt động trên trang chủ
Mục dự án đã thực hiên trên trang chủ
Mục khách hàng nói về chúng tôi trên trang chủ
Mục liên hệ trên trang chủ
+ Trang danh sách sản phẩm
Trang danh sách sản phẩm
Mục lọc sản phẩm trên trang danh sách sản phẩm
+ Trang chi tiết sản phẩm
Trang chi tiết sản phẩm
Mục bài viết trên trang chi tiết sản phẩm
Mục bài viết trên trang chi tiết sản phẩm
Mục nhận xét cùng mục sản phẩm cùng loại trên trang chi tiết sản phẩm
+ Trang danh sách dự án thực hiện
Trang danh sách dự án đã thưc hiện
Mục các danh sách dự án đã thực hiện trên trang dự án đã thực hiện
+ Trang chi tiết dự án
Trang chi tiết dự án
Mục bài viết trên trang chi tiết dự án
Mục các dự án khác trên trang chi tiết dự án
+ Trang thêm loại sản phẩm (Admin)
Trang thêm loại sản phẩm
+ Trang danh sách loại sản phẩm (Admin)
Trang danh sách loại sản phẩm
+ Trang sửa loại sản phẩm(Admin)
Trang sửa loại sản phẩm
76 + Trang thêm sản phẩm (Admin)
77 + Trang danh sách sản phẩm (Admin)
Trang danh sách sản phẩm
78 + Trang sửa sản phẩm (Admin)
79 + Trang cập nhập hình ảnh sản phẩm liên quan (Admin)
Trang cập nhập hình ảnh sản phẩm liên quan
80 + Trang thêm dự án đã thực thiện (Admin)
Trang thêm dự án đã thực hiện
81 + Trang danh sách dự án đã thực thiện (Admin)
Trang danh sách dự án đã thực hiện
82 + Trang sửa dự án đã thực thiện (Admin)
Trang sửa dự án đã thực hiện
83 + Trang cập nhập thông tin công ty (Admin)
Trang cập nhật thông tin công ty
+ Trang danh sách yêu cầu báo giá sản phẩm (Admin)
Trang danh sách yêu cầu báo giá
+ Trang sửa thông tin tài khoản (Admin)
Trang sửa thông tin tài khoản
+ Trang báo lỗi Not Found
Trang báo lỗi Not Found khi không tìm thấy trang
Lập trình Website – Back-End với Laravel
− Tạo các Route định hướng request cho trang người dùng:
− Route::get('/home','HomeController@getHome') ->name('home');
− Route::post('/tim-kiem', 'HomeController@postSearchAjax')-
− Route::post('/nhan-bao-gia', 'HomeController@postBaoGia')-
− Route::get('/du-an','ShowDuAnController@getDuAn') -
− Route::get('/du-an/chi- tiet/{id}','ShowDuAnController@getChiTiet') -
− Route::get('/san- pham/{id?}','ShowSanPhamController@getDanhSach') -
− Route::get('/san-pham/chi- tiet/{id}','ShowSanPhamController@getChiTiet') -
− Route::post('/san-pham/chi-tiet/them-nhan- xet/{id}','ShowSanPhamController@postNhanXet') -
− Tạo các Route định hướng request kết hợp cùng Middleware để kiểm tra đăng nhập cho trang admin:
− Route::get('/admin/dang-nhap','UserController@getDangNhap');
− Route::post('/admin/dang-nhap','UserController@postDangNhap')-
− Route::get('/admin/dang-xuat','UserController@getDangXuat')-
− Route::group(['prefix'=>'admin','middleware'=>'AdminLogin'],funct ion () {
− Route::group(['prefix'=>'loai-san-pham'],function () {
− Route::get('/danh-sach','TheLoaiController@getDanhSach') -
− Route::get('/them','TheLoaiController@getThem') -
− Route::post('/them','TheLoaiController@postThem') -
− Route::get('/sua/{id}','TheLoaiController@getSua') -
− Route::post('/sua/{id}','TheLoaiController@postSua') -
− Route::get('/xoa/{id}','TheLoaiController@postXoa') -
− Route::group(['prefix'=>'du-an-da-thuc-hien'],function () {
− Route::get('/danh-sach','DuAnController@getDanhSach') -
− Route::get('/them','DuAnController@getThem') -
− Route::post('/them','DuAnController@postThem') -
− Route::get('/sua/{id}','DuAnController@getSua') -
− Route::post('/sua/{id}','DuAnController@postSua') -
− Route::get('/xoa/{id}','DuAnController@postXoa') -
− Route::get('/noi-dung/{id}','DuAnController@getNoiDung') -
− Route::group(['prefix'=>'thong-tin-cong-ty'],function () {
− Route::get('/sua/{id}','InfoCtController@getSua') -
− Route::post('/sua/{id}','InfoCtController@postSua') -
− Route::group(['prefix'=>'san-pham'],function () {
− Route::get('/danh-sach','SanPhamController@getDanhSach') -
− Route::get('/them','SanPhamController@getThem') -
− Route::post('/them','SanPhamController@postThem') -
− Route::get('/sua/{id}','SanPhamController@getSua') -
− Route::post('/sua/{id}','SanPhamController@postSua') -
− Route::get('/xoa/{id}','SanPhamController@postXoa') -
− Route::get('/xoacmt/{id}','SanPhamController@postXoaCmt') -
− Route::get('/noi- dung/{id}','SanPhamController@getNoiDung') -
− Route::get('/tom-tat/{id}','SanPhamController@getTomTat') -
− Route::get('/hinh- anh/{id}','SanPhamController@getHinhAnh') -
− Route::post('/hinh- anh/{id}','SanPhamController@postHinhAnh') -
− Route::group(['prefix'=>'user'],function () {
− Route::get('/sua/{id}','UserController@getSua') -
− Route::post('/sua/{id}','UserController@postSua') -
− Route::group(['prefix'=>'bao-gia'],function () {
− Route::get('/danh-sach','BaoGiaController@getDanhSach') -
− Route::get('/xoa/{id}','BaoGiaController@postXoa') -
− Route::get('/chi-tiet/{id}','BaoGiaController@getChiTiet') -
− Tạo Middleware AdminLogin để xác nhận đăng nhập:
− use Illuminate\Support\Facades\Auth;
− * @param \Illuminate\Http\Request $request
− public function handle($request, Closure $next)
− return redirect("admin/dang-nhap");
Tạo các Eloquent ORM cho từng bảng trong cơ sở dữ liệu, giúp mỗi bảng trở thành một Model, từ đó đơn giản hóa việc thao tác với cơ sở dữ liệu.
+ use Illuminate\Database\Eloquent\Model;
+ use Illuminate\Database\Eloquent\Model; +
+ use Illuminate\Database\Eloquent\Model; +
+ use Illuminate\Contracts\Auth\MustVerifyEmail;
+ use Illuminate\Foundation\Auth\User as Authenticatable; +
+ class tai_khoan extends Authenticatable
+ * The attributes that are mass assignable
+ * The attributes that should be hidden for arrays + *
+ use Illuminate\Database\Eloquent\Model;
>belongsToMany('App\loaisanpham','loaisanpham_sanpham','sa npham_id','loaisanpham_id');
>hasMany('App\hinhsanpham','IDSanPham','ID');
+ return $this -> hasMany('App\nhanxet','IDSanPham','ID'); + }
+ use Illuminate\Database\Eloquent\Model;
>belongsToMany('App\sanpham','loaisanpham_sanpham','loaisa npham_id','sanpham_id');
+ use Illuminate\Database\Eloquent\Model;
+ return $this -> belongsTo('App\sanpham','IDSanPham','ID');
+ use Illuminate\Database\Eloquent\Model;
+ return $this -> belongsTo('App\sanpham','IDSanPham','ID'); + }
− Tạo các Controller để xử lý, điều hướng giữa Model và View sau khi nhận request thông qua Route từ trình duyệt:
+ return view('admin.baogia.danhsachbaogia',['dsbaogias'=>$ baogias]);
+ public function postXoa(Request $request){
+ return redirect('admin/bao-gia/danh-sach') -
>with('thongbao','Xóa thành công');
+ return view('admin.erorr.notfound');
+ public function getChiTiet(Request $request){
+ return view('admin.baogia.chitietbaogia',['ctbaogia'=>$ctbao gia]);
+ return view('admin.erorr.notfound');
+ return view('admin.thanhpham.danhsachduan',['thanhphams' => $thanhpham]);
+ return view('admin.thanhpham.themduan');
+ public function postThem(Request $request){
+ else if($request ->input('anhtieude')!="" && $request -
>input('noidung')!="" && $request ->input('nhanxet')!=""){ + $this -> validate($request,[
+ 'tenduan.required'=>'Bạn chưa nhập tên dự án',
+ 'tenduan.min'=>'Tên dự án phải có độ dài lớn hơn 1 ký tự',
+ 'tenduan.max'=>'Tên dự án phải có độ dài nhỏ hơn 50 ký tự', + 'diachi.required'=>'Bạn chưa nhập địa chỉ',
+ 'diachi.min'=>'Địa chỉ phải có độ dài lớn hơn 1 ký tự', + 'diachi.max'=>'Địa chỉ phải có độ dài nhỏ hơn 100 ký t ự',
Để đảm bảo thông tin chính xác, vui lòng nhập tên khách hàng Tên khách hàng cần có độ dài lớn hơn 1 ký tự và nhỏ hơn 50 ký tự.
+ 'nhanxet.required'=>'Bạn chưa nhập nhận xét',
+ 'nhanxet.min'=>'Nhận xét phải có độ dài lớn hơn 1 ký t ự',
+ 'noidung.required'=>'Bạn chưa nhập nội dung',
+ 'noidung.min'=>'Nội dung phải có độ dài lớn hơn 1 ký tự',
+ 'tomtat.required'=>'Bạn chưa nhập tóm tắt',
+ 'tomtat.min'=>'Tóm tắt phải có độ dài lớn hơn 1 ký tự', + 'tomtat.max'=>'Tóm tắt phải có độ dài nhỏ hơn 300 ký tự',
+ return redirect('/admin/du-an-da-thuc-hien/them') -
> with('thongbao','Thêm thành công');
+ return redirect('/admin/du-an-da-thuc-hien/them')-
> with('err','Bạn cần thêm đầy đủ các trường bắt buộc');
+ public function postXoa(Request $request){
+ $image_path1 = "img/".$thanhpham -> AnhKH;
+ $image_path2 = "img/".$thanhpham -> AnhTP;
+ if (file_exists($image_path1)) {
+ if (file_exists($image_path2)) {
+ return redirect('/admin/du-an-da-thuc-hien/danh-sach') -
>with('thongbao','Xóa thành công');
+ return view('admin.erorr.notfound');
+ public function getSua(Request $request){
+ return view('admin.thanhpham.suaduan',['thanhpham'=>$tha nhpham]);
+ return view('admin.erorr.notfound');
+ public function postSua(Request $request){
+ else if($request ->input('tenduan')!="" && $request -
>input('nhanxet')!="" && $request ->input('noidung')!=""){ + $this -> validate($request,[
+ 'tenduan.required'=>'Bạn chưa nhập tên dự án',
+ 'tenduan.min'=>'Tên dự án phải có độ dài lớn hơn 1 ký tự',
+ 'tenduan.max'=>'Tên dự án phải có độ dài nhỏ hơn 50 ký tự', + 'diachi.required'=>'Bạn chưa nhập địa chỉ',
+ 'diachi.min'=>'Địa chỉ phải có độ dài lớn hơn 1 ký tự', + 'diachi.max'=>'Địa chỉ phải có độ dài nhỏ hơn 100 ký t ự',
Để đảm bảo thông tin khách hàng được chính xác, bạn cần nhập tên khách hàng Tên khách hàng phải có độ dài lớn hơn 1 ký tự và nhỏ hơn 50 ký tự.
+ 'nhanxet.required'=>'Bạn chưa nhập nhận xét',
+ 'nhanxet.min'=>'Nhận xét phải có độ dài lớn hơn 1 ký t ự',
+ 'noidung.required'=>'Bạn chưa nhập nội dung',
+ 'noidung.min'=>'Nội dung phải có độ dài lớn hơn 1 ký tự',
+ 'tomtat.required'=>'Bạn chưa nhập tóm tắt',
+ 'tomtat.min'=>'Tóm tắt phải có độ dài lớn hơn 1 ký tự', + 'tomtat.max'=>'Tóm tắt phải có độ dài nhỏ hơn 300 ký tự',
+ $image_path = "img/".$thanhpham -> AnhTP;
+ if (file_exists($image_path)) {
+ $image_path = "img/".$thanhpham -> AnhKH;
+ if (file_exists($image_path)) {
+ return view('admin.thanhpham.suaduan',['thanhpham'=>$ thanhpham]) -> with('thongbao','Sửa thành công');
+ return view('admin.thanhpham.suaduan',['thanhpham'=>$ thanhpham]) -> with('err','Bạn không được bỏ trống nội dung'); + }
+ public function getNoiDung(Request $request){
+ return view('admin.thanhpham.noidungduan',['thanhpham' > $thanhpham]);
+ return view('admin.erorr.notfound');
+ return view('admin.thongtinct.thongtinct',['info'=>$info]); + }
+ public function postSua(Request $request){
+ else if($request ->input('tenct')!="" && $request -
>input('diachi')!=""&& $request ->input('gioithieu')!=""
>input('fb')!="" && $request ->input('email')!=""){
+ 'sdt' =>'required|numeric|digits_between:3,10',
+ 'tenct.required'=>'Bạn chưa nhập tên công ty',
+ 'tenct.min'=>'Tên công ty phải có độ dài lớn hơn 1 ký t ự',
+ 'tenct.max'=>'Tên công ty phải có độ dài nhỏ hơn 50 k ý tự', + 'diachi.required'=>'Bạn chưa nhập địa chỉ',
+ 'diachi.min'=>'Địa chỉ phải có độ dài lớn hơn 1 ký tự',
+ 'diachi.max'=>'Địa chỉ phải có độ dài nhỏ hơn 100 ký t ự',
+ 'sdt.required'=>'Bạn chưa nhập số điện thoại',
+ 'sdt.numeric'=>'Số điện thoại chỉ bao gồm số',
The phone number must be greater than 2 digits and less than 11 digits Facebook information is required, must be longer than 1 character, and cannot exceed a certain length.
100 ký tự', + 'email.required'=>'Bạn chưa nhập thông tin email', + 'email.email'=>'Email không hợp lệ',
+ 'gioithieu.required'=>'Bạn chưa nhập giới thiệu',
+ 'gioithieu.min'=>'Gới thiệu phải có độ dài lớn hơn 1 ký tự',
+ if($request -> anhct !="" && $request -> anhct != $info -
+ $image_path = "img/".$info -> HinhAnh;
+ if (file_exists($image_path)) {
+ return view('admin.thongtinct.thongtinct',['info'=>$info]) -> with('thongbao','Sửa thành công');
+ return view('admin.thongtinct.thongtinct',['info'=>$info]) -> with('err','Bạn không được bỏ trống phần giới thiệu');
+ return view('admin.sanpham.danhsachsanpham',['sanphams'
+ return view('admin.sanpham.themsanpham',['loaisanphams'
+ public function postThem(Request $request){
+ else if($request ->input('hinhanh')!="" && $request -
>input('noidung')!="" && $request ->input('tomtat')!=""){
+ 'tensp' =>'required|min:2|max:50|unique:sanpham,TenS P',
+ 'tensp.required'=>'Bạn chưa nhập tên sản phẩm',
Tên sản phẩm cần đảm bảo có độ dài từ 2 đến 49 ký tự và không được trùng lặp với các tên sản phẩm đã có.
+ 'tomtat.required'=>'Bạn chưa nhập tóm tắt',
+ 'tomtat.min'=>'Phần tóm tắt phải có độ dài lớn hơn 1 k ý tự', + 'noidung.required'=>'Bạn chưa nhập nội dung',
+ 'noidung.min'=>'Phần nội dung phải có độ dài lớn hơn
1 ký tự', + 'nhasx.required'=>'Bạn chưa nhập tên nhà sản xuất',
+ 'nhasx.min'=>'Phần tên nhà sản xuất phải có độ dài lớn hơn 1 ký tự',
+ 'nhasx.max'=>'Phần tên nhà sản xuất phải có độ dài nh ỏ hơn 50 ký tự', + ]);
+ $pivot= sanpham::find($sanpham ->ID);
+ foreach($request ->loaisp as $lsp){
+ return redirect('/admin/san-pham/them') -
>with('thongbao','Thêm thành công');
+ return redirect('/admin/san-pham/them') -
>with('err','Bạn cần nhập đầy đủ các trường bắt buộc'); + }
+ public function postXoa(Request $request){
+ $image_path = "img/".$sanpham -> AnhTD; +
+ if (file_exists($image_path)) {
+ return redirect('/admin/san-pham/danh-sach') -
>with('thongbao','Xóa thành công');
+ return view('admin.erorr.notfound');
+ public function postXoaCmt(Request $request){ + $query = $request ->id;
+ return redirect('/admin/san-pham/sua/'.$idsanpham) -
>with('thongbao','Xóa thành công');
+ return view('admin.erorr.notfound');
+ public function getSua(Request $request){
+ return view('admin.sanpham.suasanpham',['sanpham'=>$san pham,'loaisanphams'=>$loaisanphams,'loaidcchons'=>$loaidcch ons,'comments'=>$comments]);
+ return view('admin.erorr.notfound');
+ public function postSua(Request $request){
+ $name = $hinhanh ->getClientOriginalName(); + $destinationPath = 'img/';
+ else if($request ->input('noidung')!="" &&$request -
+ if($request ->input('tensp')== $sanpham -> TenSP){ + $this -> validate($request,[
+ 'tensp.required'=>'Bạn chưa nhập tên sản phẩm',
Tên sản phẩm phải có độ dài từ 2 đến 49 ký tự, và bạn cần nhập tóm tắt cho sản phẩm.
+ 'tomtat.min'=>'Phần tóm tắt phải có độ dài lớn hơn 1 k ý tự', + 'noidung.required'=>'Bạn chưa nhập nội dung',
+ 'noidung.min'=>'Phần nội dung phải có độ dài lớn hơn
1 ký tự', + 'nhasx.required'=>'Bạn chưa nhập tên nhà sản xuất', + 'nhasx.min'=>'Phần tên nhà sản xuất phải có độ dài lớn hơn 1 ký tự',
+ 'nhasx.max'=>'Phần tên nhà sản xuất phải có độ dài nh ỏ hơn 50 ký tự', + ]);
+ 'tensp' =>'required|min:2|max:50|unique:sanpham,Te nSP',
+ 'tensp.required'=>'Bạn chưa nhập tên sản phẩm',
+ 'tensp.min'=>'Tên sản phẩm phải có độ dài lớn hơn 1 ký tự', + 'tensp.max'=>'Tên sản phẩm phải có độ dài nhỏ hơn
50 ký tự', + 'tensp.unique'=>'Tên sản phẩm đã tồn tại',
+ 'tomtat.required'=>'Bạn chưa nhập tóm tắt',
Phần tóm tắt phải có độ dài lớn hơn 1 ký tự Bạn chưa nhập nội dung, và phần nội dung cũng cần có độ dài lớn hơn 1 ký tự Tên nhà sản xuất là thông tin bắt buộc, vì vậy bạn cần nhập tên nhà sản xuất Lưu ý rằng tên nhà sản xuất phải có độ dài lớn hơn 1 ký tự và nhỏ hơn 50 ký tự.
+ $image_path = "img/".$sanpham -> AnhTD;
+ if (file_exists($image_path)) {
+ $pivot= sanpham::find($sanpham ->ID);
+ $pivot ->loaisanpham()->sync($request->loaisp);
+ return view('admin.sanpham.suasanpham',['sanpham'=>$s anpham,'loaisanphams'=>$loaisanphams,'loaidcchons'=>$loaidcc hons,'comments'=>$comments])-
> with('thongbao','Bạn đã sửa thành công');
+ return view('admin.sanpham.suasanpham',['sanpham'=>$s anpham,'loaisanphams'=>$loaisanphams,'loaidcchons'=>$loaidcc hons,'comments'=>$comments]) -
> with('err','Bạn không được bỏ trống nội dung hoặc tóm tắt'); + }
+ public function getNoiDung(Request $request){
+ return view('admin.sanpham.noidungsanpham',['sanpham' > $sanpham]);
+ return view('admin.erorr.notfound');
+ public function getTomTat(Request $request){
+ return view('admin.sanpham.tomtatsanpham',['sanpham' =>
+ return view('admin.erorr.notfound');
+ public function getHinhAnh(Request $request){
+ return view('admin.sanpham.hinhanhsanpham',['sanpham' > $sanpham,'hinhanhs' => $hinhanhs]);
+ return view('admin.erorr.notfound');
+ public function postHinhAnh(Request $request){
>hinhanh1 !=""&& $request ->hinhanh1 !="xoa"){ + $hinhsp = new hinhsanpham;
+ $hinhsp ->HinhAnh =$request ->hinhanh1; + $hinhsp -> save();
>hinhanh2 !=""&& $request ->hinhanh2 !="xoa"){ + $hinhsp = new hinhsanpham;
+ $hinhsp ->HinhAnh =$request ->hinhanh2; + $hinhsp -> save();
>hinhanh3 !=""&& $request ->hinhanh3 !="xoa"){ + $hinhsp = new hinhsanpham;
+ $hinhsp ->HinhAnh =$request ->hinhanh3; + $hinhsp -> save();
+ $hinhsp = hinhsanpham::find($request ->idanh1); + $image_path = "img/".$hinhsp -> HinhAnh; +
+ if (file_exists($image_path)) {
+ $hinhsp = hinhsanpham::find($request ->idanh2); + $image_path = "img/".$hinhsp -> HinhAnh; +
+ if (file_exists($image_path)) {
+ $hinhsp = hinhsanpham::find($request ->idanh3); + $image_path = "img/".$hinhsp -> HinhAnh; +
+ if (file_exists($image_path)) {
+ $hinhsp = hinhsanpham::find($request ->idanh4); + $image_path = "img/".$hinhsp -> HinhAnh;
+ if (file_exists($image_path)) {
+ $hinhsp = hinhsanpham::find($request ->idanh5); + $image_path = "img/".$hinhsp -> HinhAnh; +
+ if (file_exists($image_path)) {
+ $hinhsp = hinhsanpham::find($request ->idanh1); + if($request->hinhanh1 != $hinhsp ->HinhAnh){ + $image_path = "img/".$hinhsp -> HinhAnh; + if (file_exists($image_path)) {
+ $hinhsp = hinhsanpham::find($request ->idanh2); + if($request->hinhanh2 != $hinhsp ->HinhAnh){ + $image_path = "img/".$hinhsp -> HinhAnh; + if (file_exists($image_path)) {
+ $hinhsp = hinhsanpham::find($request ->idanh3); + if($request->hinhanh3 != $hinhsp ->HinhAnh){ + $image_path = "img/".$hinhsp -> HinhAnh; + if (file_exists($image_path)) {
+ $hinhsp = hinhsanpham::find($request ->idanh4); + if($request->hinhanh4 != $hinhsp ->HinhAnh){ + $image_path = "img/".$hinhsp -> HinhAnh; + if (file_exists($image_path)) {
+ $hinhsp = hinhsanpham::find($request ->idanh5); + if($request->hinhanh5 != $hinhsp ->HinhAnh){ + $image_path = "img/".$hinhsp -> HinhAnh; + if (file_exists($image_path)) {
+ return view('admin.sanpham.hinhanhsanpham',['sanpham' > $sanpham,'hinhanhs' => $hinhanhs]) -
>with('thongbao','Cập nhập thành công');
+ return view('admin.loaisanpham.danhsachloai',['theloais' =>
+ return view('admin.loaisanpham.themloai');
+ public function postThem(Request $request){
+ else if($request ->input('hinhanh')!=""){
+ 'tenloai' =>'required|min:2|max:50|unique:loaisanpham, TenLoai',
+ 'tenloai.required'=>'Bạn chưa nhập tên loại',
+ 'tenloai.min'=>'Tên loại phải có độ dài lớn hơn 1 ký tự', + 'tenloai.max'=>'Tên loại phải có độ dài nhỏ hơn 50 ký t ự',
+ 'tenloai.unique'=>'Tên loại đã tồn tại',
+ 'mota.required'=>'Bạn chưa nhập mô tả',
+ 'mota.min'=>'Phần mô tả phải có độ dài lớn hơn 1 ký t ự',
+ 'mota.max'=>'Phần mô tả phải có độ dài nhỏ hơn 200 k ý tự' + ]);
+ return redirect('/admin/loai-san-pham/them') -
> with('thongbao','Thêm thành công');
+ return redirect('/admin/loai-san-pham/them') -
> with('err','Bạn cần thêm đầy đủ các trường bắt buộc');
+ public function getSua(Request $request){
+ return view('admin.loaisanpham.sualoai',['loaisp'=>$loaisp])
+ return view('admin.erorr.notfound');
+ public function postSua(Request $request){
+ else if($request ->input('tenloai')!="" && $request -
+ if($request ->input('tenloai')== $loaisp -> TenLoai){ + $this -> validate($request,[
+ 'tenloai.required'=>'Bạn chưa nhập tên loại',
+ 'tenloai.min'=>'Tên loại phải có độ dài lớn hơn 1 ký tự', + 'tenloai.max'=>'Tên loại phải có độ dài nhỏ hơn 50 ký t ự',
+ 'mota.required'=>'Bạn chưa nhập mô tả',
+ 'mota.min'=>'Phần mô tả phải có độ dài lớn hơn 1 ký t ự',
+ 'mota.max'=>'Phần mô tả phải có độ dài nhỏ hơn 200 k ý tự' + ]);
+ 'tenloai' =>'required|min:2|max:50|unique:loaisanpha m,TenLoai',
+ 'tenloai.required'=>'Bạn chưa nhập tên loại',
+ 'tenloai.min'=>'Tên loại phải có độ dài lớn hơn 1 ký tự',
+ 'tenloai.max'=>'Tên loại phải có độ dài nhỏ hơn 50 k ý tự',
+ 'tenloai.unique'=>'Tên loại đã tồn tại',
+ 'mota.required'=>'Bạn chưa nhập mô tả',
+ 'mota.min'=>'Phần mô tả phải có độ dài lớn hơn 1 ký tự',
+ 'mota.max'=>'Phần mô tả phải có độ dài nhỏ hơn 20
+ $image_path = "img/".$loaisp -> HinhAnh;
+ if (file_exists($image_path)) {
+ return view('admin.loaisanpham.sualoai',['loaisp'=>$loais p]) -> with('thongbao','Sửa thành công');
+ public function postXoa(Request $request){
+ $image_path = "img/".$loaisp -> HinhAnh;
+ if (file_exists($image_path)) {
+ return redirect('/admin/loai-san-pham/danh-sach') -
>with('thongbao','Xóa thành công');
+ return view('admin.erorr.notfound');
+ use Illuminate\Support\Facades\Auth;
+ public function getSua(Request $request){
+ $user = tai_khoan::find($query);
+ return view('admin.user.suauser',['user'=>$user]); + }
+ return view('admin.erorr.notfound');
+ public function postSua(Request $request){
+ $user = tai_khoan::find($query);
+ 'tendn.required'=>'Bạn chưa nhập tên đăng nhập',
+ 'tendn.min'=>'Tên đăng nhập phải có độ dài lớn hơn 3 ký tự',
Tên đăng nhập cần phải có độ dài dưới 13 ký tự Người dùng phải nhập tên người dùng, và tên này phải dài hơn 1 ký tự nhưng không vượt quá 5 ký tự.
+ 'mk.required'=>'Bạn chưa nhập mật khẩu',
Mật khẩu cần có độ dài từ 4 đến 12 ký tự Đảm bảo bạn đã nhập lại mật khẩu để xác nhận.
+ 'nhaplaimk.same'=>'Nhập lại mật khẩu không khớp với mật khẩu',
+ $user ->password rypt($request->mk);
+ return view('admin.user.suauser',['user'=>$user])-
>with('thongbao','Cập nhập thành công');
+ return view('admin.user.login');
+ public function postDangNhap(Request $request){
+ 'tendn.required'=>'Bạn chưa nhập tên đăng nhập',
+ 'tendn.min'=>'Tên đăng nhập phải có độ dài lớn hơn 3 ký tự',
+ 'tendn.max'=>'Tên đăng nhập phải có độ dài nhỏ hơn 13 k ý tự', + 'matkhau.required'=>'Bạn chưa nhập mật khẩu',
+ 'matkhau.min'=>'Mật khẩu phải có độ dài lớn hơn 3 ký tự',
+ 'matkhau.max'=>'Mật khẩu phải có độ dài nhỏ hơn 13 ký tự',
+ if(Auth::attempt(['tendn'=>$request-
+ return redirect("admin/loai-san-pham/danh-sach");
+ return view('admin.user.login')-
>with('err','Sai tên tài khoản hoặc mật khẩu');
+ return view('admin.user.login');
+ $sanphamnoibats= sanpham::where('NoiBat',1)->get(); + $thanhphams= thanhpham::all()->sortByDesc('ID');
+ return view('pages.home.home',['rdsanphams'=>$rdsanpham s,'intro'=>$intro,'loaisanphams'=>$loaisanphams,'sanphamnoibat s'=>$sanphamnoibats,'thanhphams'=>$thanhphams]);
+ public function postSearchAjax(Request $request){
+ $output = '