BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC BÀ RỊA - VŨNG TÀU
KHOA CÔNG NGHỆ KỸ THUẬT - NÔNG NGHIỆP CÔNG NGHỆ CAO
ĐỒ ÁN TỐT NGHIỆP
ĐỀ TÀI
THIẾT KẾ VÀ LẬP TRÌNH WEBSITE
Giảng viên hướng dẫn : ThS. Nguyễn Lan Hương
Sinh viên thực hiện : Phan Tiến Đạt
Trình độ đào tạo : Đại Học Chính Quy
Ngành đào tạo : Công Nghệ Thông Tin
Chuyên Ngành : Máy Tính
MSSV : 16031147
Lớp : DH16MT
Niên khóa : 2016 - 2020
VŨNG TÀU, NĂM 2020
ĐẠI HỌC BÀ RỊA – VŨNG TÀU CỘNG HÒA
168 trang |
Chia sẻ: huong20 | Ngày: 07/01/2022 | Lượt xem: 448 | Lượt tải: 0
Tóm tắt tài liệu Đề tài Thiết kế và lập trình website, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
XÃ HỘI CHỦ NGHĨA VIỆT NAM
KHOA KỸ THUẬT CN-NNCN CAO Độc lập – Tự do – Hạnh phúc
⎯ ⎯ ⎯ ⎯ ⎯ ⎯ ⎯ ⎯ ⎯ ⎯ ⎯ ⎯ ⎯ ⎯ ⎯ ⎯ ⎯ ⎯ ⎯ ⎯
PHIẾU GIAO ĐỀ TÀI ĐỒ ÁN/ KHÓA LUẬN TỐT NGHIỆP
Họ tên sinh viên: Phan Tiến Đạt Mã SV: 16031147
Lớp: DH16MT Ngành: Công Nghệ Thông Tin Khóa: 16
Tên đề tài: Thiết kế và lập trình Website
Mục tiêu đề tài:
Thiết kế và lập trình website giới thiệu, quảng bá về công ty (công ty lấy tên
Viko), đưa tới mọi người hình ảnh về công ty cùng những thông tin sản phẩm, dự
án của công ty đó. Đồng thời bên phía công ty cũng được cung cấp những chức
năng để quản trị website một cách tốt nhất.
Kết quả dự kiến:
Sản phẩm website có giao diện đẹp mắt, bố cục đơn giản, tích hợp nhiều chức
năng để người dùng dễ dàng tra cứu, tìm hiểu các thông tin về công ty. Qua đó
hình ảnh công ty sẽ được quảng bá một cách tốt nhất đến mọi người.
Thời gian thực hiện: Bắt đầu từ 02/03/2020 đến 10/05/2020.
Vũng Tàu, ngày.. tháng..năm
TRƯỞNG KHOA CNTT GIẢNG VIÊN HƯỚNG DẪN
(Ký và ghi rõ họ tên) (Ký và ghi rõ họ tên)
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
Ngày.........Tháng..........Năm.........
Giáo Viên Hướng Dẫn
(Ký, ghi rõ họ và tên)
NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
.............................................................................................................................
Ngày.........Tháng..........Năm.........
Giáo Viên Phản Biện
(Ký, ghi rõ họ và tên)
LỜI CAM ĐOAN
Đồ án này là công trình nghiên cứu và xây dựng của cá nhân tôi, được thực
hiện dưới sự hướng dẫn khoa học của Ths. Nguyễn Lan Hương. Các số liệu,
những kết luận nghiên cứu được trình bày trong đồ án này là do tôi tự tìm hiểu
và hoàn toàn trung thực.
Tôi xin hoàn toàn chịu trách nhiệm về lời cam đoan này.
Vũng Tàu, tháng 4 năm 2020
Sinh Viên Thực Hiện
Phan Tiến Đạt
LỜI CẢM ƠN
Tôi xin chân thành cảm ơn khoa Công nghệ thông tin, trường Đại
học Bà Rịa – Vũng Tàu đã tạo điều kiện thuận lợi cho tôi thực hiện đề
tài này.
Tôi cũng xin được gửi lời cảm ơn chân thành nhất đến Ths.
Nguyễn Lan Hương, người đã tận tình chỉ bảo, định hướng đi và hướng
dẫn tôi thực hiện đề tài này.
Bên cạnh đó, tôi xin gửi lời cảm ơn đến các thầy cô, những người
đã giảng dạy, tạo điều kiện cho tôi tích lũy được những kiến thức quý
báu trong những năm học qua.
Dù đã cố gắng hoàn thành đề tài Website giới thiệu công ty Viko,
nhưng do thời gian hạn hẹp và khả năng còn hạn chế nên chắc chắn sẽ
có những thiếu sót không tránh khỏi. Tôi mong nhận được sự thông cảm
và tận tình chỉ bảo của các thầy cô và góp ý từ các bạn.
Vũng Tàu, tháng 4 năm 2020
Sinh viên thực hiện
Phan Tiến Đạt
MỤC LỤC
DANH MỤC CÁC BẢNG ........................................................................................ 1
DANH MỤC CÁC HÌNH ẢNH ............................................................................... 2
LỜI MỞ ĐẦU ............................................................................................................ 5
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT VÀ KHẢO SÁT ........................................... 7
1.1 HTML,CSS và JavaScript ............................................................................. 7
1.1.1 HTML là gì? ............................................................................................... 7
1.1.2 CSS là gì? ................................................................................................... 7
1.1.3 JavaScript là gì? ......................................................................................... 8
1.2 Bootstrap .......................................................................................................... 8
1.2.1 Bootstrap là gì? .......................................................................................... 8
1.2.2 Tại sao nên dùng Bootstrap? ...................................................................... 9
1.3 JQuery .............................................................................................................. 9
1.3.1 JQuery là gì? .............................................................................................. 9
1.3.2 Tại sao nên dùng jQuery? .......................................................................... 9
1.4 Ajax ................................................................................................................. 10
1.4 Ajax là gì? ................................................................................................... 10
1.4.2 Tại sao nên dùng Ajax? ............................................................................ 11
1.5 Lararel ............................................................................................................ 11
1.5.1 Laravel là gì? ............................................................................................ 11
1.5.2 Tại sao nên dùng Laravel? ....................................................................... 13
1.6 PHP ................................................................................................................. 15
1.6.1 PHP là gì? ................................................................................................. 15
1.6.2 Tại sao nên dùng PHP .............................................................................. 16
1.7 Khảo Sát Hiện Trạng .................................................................................... 17
1.7.1 Khảo sát thực tế ........................................................................................ 17
1.7.2 Khảo sát các website tương tự ................................................................. 18
CHƯƠNG 2: TỔNG QUAN CHỨC NĂNG WEBSITE ..................................... 24
2.1 Quan Điểm Của Sản Phẩm........................................................................... 24
2.2 Chức Năng Sản Phẩm ................................................................................... 24
2.3 Người Dùng .................................................................................................... 24
2.4 Các Ràng Buộc .............................................................................................. 25
CHƯƠNG 3: YÊU CẦU CHỨC NĂNG WEBSITE ............................................ 26
3.1 Xem tin .......................................................................................................... 26
3.2 Tìm kiếm sản phẩm ...................................................................................... 26
3.3 Lọc sản phẩm ................................................................................................ 26
3.4 Gửi yêu cầu nhận báo giá ............................................................................ 26
3.5 Nhận xét bài viết về sản phẩm .................................................................... 26
3.6 Đăng nhập/đăng xuất ................................................................................... 26
3.7 Quản lý các tin đăng trên website ............................................................... 27
3.8 Nhận các thông báo yêu cầu từ khách hàng .............................................. 27
3.9 Quản lý thông tin tài khoản ........................................................................ 27
CHƯƠNG 4: MÔ HÌNH USECASE ..................................................................... 28
4.1 Tác nhân ........................................................................................................ 28
4.2 Các yêu cầu chức năng ................................................................................ 28
4.3 Lược Đồ Use Case ........................................................................................ 30
4.4 Chi Tiết Các Use Case.................................................................................. 31
CHƯƠNG 5: THIẾT KẾ WEBSITE .................................................................... 59
5.1 Thiết kế cơ sở dữ liệu ................................................................................... 59
5.1.1 Lược đồ cơ sở dữ liệu ............................................................................. 59
5.1.2 Chi tiết các trường ................................................................................... 59
5.2 Mối quan hệ giữa các bản dữ liệu ............................................................... 64
5.3 Thiết kế giao diện Website – Front-End .................................................... 64
5.4 Lập trình Website – Back-End với Laravel ................................................ 85
5.5 Một số đoạn code nổi bật ........................................................................... 145
KẾT LUẬN ............................................................................................................ 156
TÀI LIỆU THAM KHẢO .................................................................................... 159
DANH MỤC CÁC BẢNG
TT Số hiệu Nội dung Trang
Bảng các tác nhân và quyền của
1 Bảng 4.1 28
tác nhân trong UseCase
Bảng các yêu cầu chức năng hệ
2 Bảng 4.2 28
thống
3 Bảng 4.3 Bảng chi tiết các UseCase 31 - 58
4 Bảng 5.1 Bảng Table tai_khoans 59 - 60
5 Bảng 5.2 Bảng Table infoct 60
6 Bảng 5.3 Bảng Table thanhpham 60 - 61
7 Bảng 5.4 Bảng Table baogia 61
8 Bảng 5.5 Bảng Table sanpham 61
9 Bảng 5.6 Bảng Table loaisanpham 62
10 Bảng 5.7 Bảng Table loaisanpham_sanpham 62
11 Bảng 5.8 Bảng Table hinhsanpham 62
12 Bảng 5.9 Bảng Table nhanxet 62 - 63
1
DANH MỤC CÁC HÌNH ẢNH
TT Số hiệu Nội dung Trang
Các phiên bản của laravel đến tháng
1 Hình 1.1 12
4 năm 2020
Cách thức hoạt động MVC trong
2 Hình 1.2 14
Laravel
Những ngôn ngữ lập trình phổ biến
3 Hình 1.3 16
từ năm 1965 – 2019
4 Hình 1.4 So sánh giữa ASP và PHP 17
5 Hình 1.5 Slide hình ảnh sản phẩm 19
Mẫu gửi thông tin yêu cầu tới công
6 Hình 1.6 20
ty
7 Hình 1.7 Danh mục các sản phẩm 20
8 Hình 1.8 Bài đăng thông tin về sản phẩm 21
9 Hình 1.9 Bài đăng báo giá 22
10 Hình 1.10 Bài đăng tin tức 22
11 Hình 1.11 Danh sách các công trình khác 23
12 Hình 4.1 Lượt đồ tổng quan usecase 30
13 Hình 5.1 Lượt đồ cơ sở dữ liệu 59
Các bản dữ liệu có mối quan hệ với
14 Hình 5.2 64
nhau
15 Hình 5.3 Trang chủ website Viko 64
16 Hình 5.4 Mục giới thiệu trên trang chủ 65
17 Hình 5.5 Mục sản phẩm nổi bật trên trang chủ 66
2
Mục tiêu chí hoạt động trên trang
18 Hình 5.6 66
chủ
Mục dự án đã thực hiên trên trang
19 Hình 5.7 67
chủ
Mục khách hàng nói về chúng tôi
20 Hình 5.8 67
trên trang chủ
21 Hình 5.9 Mục liên hệ trên trang chủ 68
22 Hình 5.10 Trang danh sách sản phẩm 68
Mục lọc sản phẩm trên trang danh
23 Hình 5.11 69
sách sản phẩm
24 Hình 5.12 Trang chi tiết sản phẩm 69
Mục bài viết trên trang chi tiết sản
25 Hình 5.13 70
phẩm
Mục nhận xét cùng mục sản phẩm
26 Hình 5.14 71
cùng loại trên trang chi tiết sản phẩm
27 Hình 5.15 Trang danh sách dự án đã thưc hiện 71
Mục các danh sách dự án đã thực
28 Hình 5.16 72
hiện trên trang dự án đã thực hiện
29 Hình 5.17 Trang chi tiết dự án 72
30 Hình 5.18 Mục bài viết trên trang chi tiết dự án 73
Mục các dự án khác trên trang chi
31 Hình 5.19 73
tiết dự án
32 Hình 5.20 Trang đăng nhập Admin 73
33 Hình 5.21 Trang Admin 74
34 Hình 5.22 Trang thêm loại sản phẩm 74
35 Hình 5.23 Trang danh sách loại sản phẩm 75
3
36 Hình 5.24 Trang sửa loại sản phẩm 75
37 Hình 5.25 Trang thêm sản phẩm 76
38 Hình 5.26 Trang danh sách sản phẩm 77
39 Hình 5.27 Trang sửa sản phẩm 78
40 Hình 5.28 Trang thêm dự án đã thực hiện 80
41 Hình 5.29 Trang danh sách dự án đã thực hiện 81
42 Hình 5.30 Trang sửa dự án đã thực hiện 82
43 Hình 5.31 Trang cập nhật thông tin công ty 83
44 Hình 5.32 Trang danh sách yêu cầu báo giá 84
45 Hình 5.33 Trang sửa thông tin tài khoản 84
Trang báo lỗi Not Found khi không
46 Hình 5.34 84
tìm thấy trang
4
LỜI MỞ ĐẦU
1. Tính cấp thiết của đề tài
Theo thống kê mới nhất, tính đến đầu năm 2019, Việt Nam đã có
hơn 60 triệu người sử dụng internet, chiếm hơn 60% dân số. Và trong
tương lai con số này sẽ vẫn tiếp tục tăng lên không ngừng. Có thể nói đối
với các nhà kinh doanh thì môi trường internet chính là một môi trường
chứa đầy khách hàng tiềm năng nhất mà mọi doanh nghiệp hay tổ chức
nào cũng đều thèm khát. Do đó để khai thác tiềm năng này một cách tốt
nhất thì điều không thể thiếu đó chính là đầu tư, phát triển cho riêng mình
một Website giới thiệu, quảng bá bản thân doanh nghiệp hoặc bất kỳ tổ
chức nào.
2. Tình hình nghiên cứu
Có thể nói việc nghiên cứu và phát triển website đã không còn là
một vấn đề xa lạ trong kỷ nghiên 4.0 ngày này. Và đặc biệt trong thời đại
kinh tế cạnh tranh thì các website phục vụ trong mục đích kinh doanh,
quảng bá luôn được ưu tiên phát triển hàng đầu. Điều này có thể dễ dàng
thấy thông qua các website của các thương hiệu nổi tiếng hàng đầu trong
lĩnh vực kinh doanh như samsung.com, lazada.vn, sony.com.vn,
Những website của các thương hiệu này luôn được trao chuốt một cách
kĩ lưỡng. Ngoài ra không chỉ những các thương hiệu lớn mới có riêng
cho mình một website để quảng bá thương hiệu của mình, mà còn hàng
ngàn các công ty, doanh nghiêp lớn nhỏ đều sỡ hữu một website để quảng
bá thương hiệu của mình đến mọi người.
5
3. Mục đích nghiên cứu
Đề tài có mục đích xây dựng website giới thiệu công ty giúp đưa
tới khách hàng những hình ảnh, thông tin một cách đầy đủ và rõ nét về
công ty đó. Qua đó tạo được thêm nhiều ưu thế trên môi trường
marketing.
4. Nhiệm vụ nghiên cứu
Để thực hiện được đề tài một cách trọn vẹn phải trãi qua nhiều giai
đoạn nghiên cứu, tìm hiểu, chọn lọc và cuối cùng mới đến công đoạn bắt
tay vào xây dựng nên một website. Đầu tiên việc tìm hiểu về cơ sở lý
thuyết để tạo ra một website là điều tất yếu. Kế đến cần phải khảo sát
thực tế xem website có phù hợp cũng như đồng thời tham khảo những
website tương tự. Tiếp đến phải xây dựng mô hình về website như các
chức năng, ràng buộc, Và cuối cùng là công việc xây dựng website
hoàn chỉnh.
5. Các kết quả đạt được của đề tài
Thông qua đề tài sẽ mang đến những kiến thức và cách xây dựng
lên một website hoàn chỉnh. Đồng thời website được xây dựng trong đề
tài sẽ đạt được một cách đầy đủ và tốt nhất các mục tiêu ban đầu đề.
6
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT VÀ KHẢO SÁT
1.1 HTML,CSS và JavaScript
− HTML, CSS và JavaScript là những khái niệm không hề xa lạ với
những người lập trình website chuyên nghiệp. Chúng chính là nền tảng
không thể thiếu để xây dựng,tô vẽ và làm sống động cho chính những trang
web. Và vì lẽ đó mà HTML, CSS, JavaScript là những khái niệm mà bắt
buộc ai cũng phải có khi muốn bước chân vào con đường phát triển website.
1.1.1 HTML là gì?
− HTML là viết tắt của HyperText Markup Language (ngôn ngữ
đánh dấu siêu văn bản) dùng mô tả cấu trúc của các trang Web và tạo ra
các loại tài liệu có thể xem được trong trình duyệt.
− HTML là cốt lõi của mọi trang web. Mỗi trang web được tạo thành
từ một loạt các thẻ HTML mà chúng biểu thị từng loại nội dung trên
trang. Mỗi loại nội dung trên trang được “bọc”, tức là được bao quanh
bởi các thẻ HTML.
− HTML không phải là ngôn ngữ lập trình, đồng nghĩa với việc nó
không thể tạo ra các chức năng “động” được. Nó chỉ giống như Microsoft
Word, dùng để bố cục và định dạng trang web.
1.1.2 CSS là gì?
− CSS (viết tắt của Cascading Style Sheets) là một ngôn ngữ định
dạng được sử dụng để mô tả trình bày các trang Web, bao gồm màu sắc,
cách bố trí và phông chữ. Nó cho phép hiển thị nội dung tương thích trên
các loại thiết bị có kích thước màn hình khác nhau, chẳng hạn như màn
hình lớn, màn hình nhỏ, hoặc máy in.
7
− Trong khi HTML là cấu trúc cơ bản của trang web. CSS mang lại
cho trang web của bạn phong cách mà bạn muốn. CSS gần như tạo nên
bộ mặt của một website.
− Cũng giống như HTML, CSS không phải là một ngôn ngữ lập
trình.
1.1.3 JavaScript là gì?
− JS (viết tắt của Javascript) là một nền tảng (cross-platform), ngôn
ngữ kịch bản hướng đối tượng (object-oriented). Nó là một ngôn ngữ nhỏ
và nhẹ. Chạy trong môi trường máy chủ lưu trữ (ví dụ: trình duyệt web),
JavaScript có thể được kết nối với các đối tượng của môi trường để cung
cấp kiểm soát chương trình đối với chúng.
− JavaScript là ngôn ngữ lập trình dựa trên logic. Nó có thể được sử
dụng để sửa đổi nội dung trang web. Và khiến nó hoạt động theo nhiều
cách khác nhau để đáp ứng với hành động của người dùng. Các cách sử
dụng phổ biến cho JavaScript bao gồm các hộp xác nhận, kêu gọi hành
động và thêm các danh tính mới vào thông tin hiện có.
1.2 Bootstrap
1.2.1 Bootstrap là gì?
− 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.
8
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).
− Tiết kiệm thời gian: Bootstrap giúp cho lập trình viên thiết kế giao
diện website tiết kiệm rất nhiều thời gian và công sức, bởi các thư viện
của Bootstrap có nhiều đoạn mã có thể sẵn sàng áp dụng ngay vào
website. Khi đó sẽ tiết kiệm được rất nhiều thời gian để tự viết code cho
giao diện website của bản thân.
1.3 JQuery
1.3.1 JQuery là gì?
− JQuery là thư viện được viết từ JavaScript, jQuery giúp xây dựng
các chức năng bằng Javascript dễ dàng, nhanh và giàu tính năng
hơn. jQuery được tích hợp nhiều module khác nhau. Từ module hiệu ứng
cho đến module truy vấn selector. jQuery được sử dụng đến 99% trên
tổng số website trên thế giới.
− JQuery không phải là một ngôn ngữ lập trình riêng biệt mà hoạt
động liên kết với JavaScript. Với jQuery, bạn có thể làm được nhiều việc
hơn mà lại tốn ít công sức 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.
9
− 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.
− Dễ dàng tạo Ajax: Nhờ thư viện jQuery, code được viết bởi Ajax
có thể dễ dàng tương tác với server và cập nhật nội dung tự động mà
không cần phải tải lại trang.
− Xử lý nhanh nhạy thao tác DOM: jQuery giúp lựa chọn các phần
tử DOM để traverse (duyệt) một cách dễ dàng, và chỉnh sửa nội dung của
chúng bằng cách sử dụng Selector mã nguồn mở, mà còn được gọi là
Sizzle.
− Đơn giản hóa việc tạo hiệu ứng: Giống với code snippet có hiệu
ứng animation, nó phủ các dòng code và bạn chỉ việc thêm biến/nội dung
vào thôi.
− Hỗ trợ tốt phương thức sự kiện HTML: Xử lý sự kiện − jQuery xử
lý các sự kiện đa dạng mà không làm cho HTML code trở nên lộn xộn
với các Event Handler.
1.4 Ajax
1.4 Ajax là gì?
− AJAX là chữ viết tắt của Asynchronous JavaScript and XML. Đây
là một công nghệ giúp chung ta tạo ra những Web động mà hoàn toàn
không reload lại trang.
− Cả JavaScript và XML đều hoạt động bất đồng bộ trong AJAX.
Kết quả là, nhiều ứng dụng web có thể sử dụng AJAX để gửi và nhận
data từ server mà không phải toàn bộ trang.
10
1.4.2 Tại sao nên dùng Ajax?
− Callbacks: Ajax được sử dụng để thực hiện một cuộc gọi
lại. AJAX thực hiện việc truy xuất và / hoặc lưu dữ liệu mà không gửi
toàn bộ trang trở lại máy chủ. Bằng cách gửi lại một phần trang web đến
máy chủ, việc sử dụng mạng được giảm thiểu và các hoạt động diễn ra
nhanh hơn. Trong các trang web băng thông hạn chế, điều này có thể cải
thiện đáng kể hiệu suất mạng. Dữ liệu được gửi đến và đi từ máy chủ
một cách tối thiểu.
− Thực hiện các cuộc gọi không đồng bộ: Ajax cho phép bạn thực
hiện các cuộc gọi không đồng bộ đến một máy chủ web. Điều này cho
phép trình duyệt của người dùng tránh phải chờ tất cả dữ liệu đến trước
khi cho phép người dùng hành động một lần nữa.
− Thân thiện với người dùng: Vì không phải post lại trang lên server,
các ứng dụng hỗ trợ Ajax sẽ luôn nhanh hơn và thân thiện với người dùng
hơn.
− Tăng tốc độ: Mục đích chính của Ajax là cải thiện tốc độ, hiệu
suất và khả năng sử dụng của một ứng dụng web. Một ví dụ tuyệt vời
của Ajax là tính năng xếp hạng phim trên Netflix. Người dùng đánh giá
một bộ phim và xếp hạng cá nhân của họ cho bộ phim đó sẽ được lưu
vào cơ sở dữ liệu của họ mà không cần chờ trang làm mới hoặc tải lại.
1.5 Lararel
1.5.1 Laravel là gì?
− Là một framework PHP có mã nguồn mở miễn phí, giúp xây dựng
các ứng dụng theo mô hình MVC (Model - View – Controller) một cách
nhanh chóng, được tạo ra bởi một lập trình viên kỳ cựu từng làm .NET
11
đó là Taylor Otwell. Được phát hành lần đầu vào ngày 9 tháng 6 năm
2011.
Các phiên bản của laravel đến tháng 4 năm 2020
− Trước đây Laravel có tên là Bootplant sau đó thì đổi thành là
Laravel, nguồn gốc tên bắt nguồn từ tên một tòa lâu đài ở Narnia, một
vùng đất không có thật, mà nó ở trong một thế giới được tưởng tượng ra
12
bởi nhà văn Clive Staples Lewis, và viết thành cuốn tiểu thuyết “Biên
niên sử Narnia” [4] rất nổi tiếng được dựng thành phim. Tòa lâu đài có
tên là Paravel đọc lái đi sẽ thành Laravel, mục đích của Taylor Otwell là
mong muốn đứa con tinh thần Laravel phát triển một cách mạnh mẽ và
vững trải như tòa lâu đài. Và rồi đến tận bây giờ thì Laravel vẫn luôn là
một trong những framework tốt nhất của PHP.
1.5.2 Tại sao nên dùng Laravel?
− Laravel có thể xây dựng hệ thống các ứng dụng web phức tạp với
hiệu năng cao. Cho dù laravel rất đơn giản và dễ dàng cho người mới
tiếp cận với framework PHP nhưng vẫn đảm bảo hệ thống có kiến trúc
thống nhất và khoa học.
− Cộng đồng Laravel rất lớn trên Laracast, bạn có thể tìm câu trả lời
cho những vấn đề, tình huống mà bạn thắc mắc hay là không biết trong
Laravel. Không những thế các tài nguyên liên quan đến Laravel cũng rất
đa dạng, dễ sử dụng. Tác giả của framework này -Taylor Otwell cũng đã
biên soạn ra tài liệu để cho các lập trình viên khám phá và trải nghiệm.
− Có tích hợp công cụ dòng lệnh là Artisan, hỗ trợ rất nhiều trong
việc phát triển ứng dụng: tối ưu hóa ứng dụng, migrate dữ liệu, tạo các
template, controller,
− Trong Laravel có một bộ máy template rất hay, đó là blade
template, giúp thực hiện làm việc tương tác giữa PHP và HTML đơn giản
hơn, tách biệt hơn giữa mã hiển thị và mã logic nghiệp, cái mà trước đó
chỉ có thể biết đến ở .NET hoặc Java. Blade template còn có thể kế thừa
một template khác và có thể còn script js, 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
13
khai sản phẩm. Từ đó có thể thấy được Laravel hỗ trợ việc các đặt các
gói thư viện và sử dụng nhằm tạo ra các tính năng tuyệt vời.
− Laravel rất an toàn trong việc chỉn chu bảo mật với CSRF tokens.
Với cách kiểm tra mã CSRF trong mỗi POST, về cơ bản là đã bảo vệ
chương trình khi bị cố tình thay đổi bản chất, kể cả từ POST đến GET.
Ngoài ra Laravel còn cung cấp sẵn các Middleware cho trước hoặc lập
trình viên có thể được hỗ trợ để tạo riêng cho mình một Middleware
nhằm mục đích tăng thêm độ bảo mật cho ứng dụng website.
− Laravel hỗ trợ lập trình theo mô hình MVC khá mạnh mẽ. Ngoài
...ời dùng
password VarChar Mật khẩu của người dùng, được mã hóa
created_at TimeStamp Thời gian tài khoản được tạo
updated_at TimeStamp Thời gian tài khoản được sửa đổi
Bảng Table infoct
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
Bảng Table thanhpham
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
60
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
Bảng Table baogia
Tên trường Kiểu dữ liệu Mô tả
ID Int Xác định từng bản ghi riêng
HoTen Text Họ tên khách hàng yêu cầu nhận báo giá
DiaChi Text Địa chỉ khách hàng yêu cầu nhận báo giá
SDT VarChar Số điện thoại khách hàng yêu cầu nhận báo
giá
GhiChu Text Nội dung yêu cầu của khách hàng
DaXem Int Đánh dấu tin yêu cầu đã đọc hay chưa
created_at TimeStamp Thời gian yêu cầu được tạo
updated_at TimeStamp Thời gian yêu cầu được sửa đổi
Bảng Table sanpham
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
61
Bảng Table loaisanpham
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
Bảng Table loaisanpham_sanpham
Tên trường Kiểu dữ liệu Mô tả
ID Int Xác định từng bản ghi riêng
sanpham_id Int ID sản phẩm liên kết với ID của bản
sanpham
loaisanpham_id Int ID loại sản phẩm liên kết với ID của bản
loaisanpham
Bảng Table hinhsanpham
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
Bảng Table nhanxet
Tên trường Kiểu dữ liệu Mô tả
ID Int Xác định từng bản ghi riêng
62
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
63
5.2 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
5.3 Thiết kế giao diện Website – Front-End
− Danh sách các trang:
+ Trang chủ.
Trang chủ website Viko
64
Mục giới thiệu trên trang chủ
Mục sản phẩm trên trang chủ
65
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ủ
66
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ủ
67
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
68
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
69
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
70
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
71
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
72
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 đăng nhập Admin.
Trang đăng nhập Admin
73
+ Trang Admin.
Trang Admin
+ Trang thêm loại sản phẩm (Admin).
Trang thêm loại sản phẩm
74
+ 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
75
+ Trang thêm sản phẩm (Admin).
Trang thêm sản phẩm
76
+ Trang danh sách sản phẩm (Admin).
Trang danh sách sản phẩm
77
+ Trang sửa sản phẩm (Admin).
Trang sửa sản phẩm
78
+ 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
79
+ Trang thêm dự án đã thực thiện (Admin).
Trang thêm dự án đã thực hiện
80
+ Trang danh sách dự án đã thực thiện (Admin).
Trang danh sách dự án đã thực hiện
81
+ Trang sửa dự án đã thực thiện (Admin).
Trang sửa dự án đã thực hiện
82
+ Trang cập nhập thông tin công ty (Admin).
Trang cập nhật thông tin công ty
83
+ 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
84
5.4 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')-
>name('timkiem');
− Route::post('/nhan-bao-gia', 'HomeController@postBaoGia')-
>name('baogia');
− Route::get('/du-an','ShowDuAnController@getDuAn') -
>name('duan');
− Route::get('/du-an/chi-
tiet/{id}','ShowDuAnController@getChiTiet') -
> name('chitietduan');
− Route::get('/san-
pham/{id?}','ShowSanPhamController@getDanhSach') -
>name('sanpham');
− Route::get('/san-pham/chi-
tiet/{id}','ShowSanPhamController@getChiTiet') -
>name('chitietsanpham');
− Route::post('/san-pham/chi-tiet/them-nhan-
xet/{id}','ShowSanPhamController@postNhanXet') -
>name('nhanxet');
− 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')-
>name('postdangnhap');
85
− Route::get('/admin/dang-xuat','UserController@getDangXuat')-
>name('getdangxuat');
− Route::group(['prefix'=>'admin','middleware'=>'AdminLogin'],funct
ion () {
− Route::group(['prefix'=>'loai-san-pham'],function () {
− Route::get('/danh-sach','TheLoaiController@getDanhSach') -
>name('dsloaisp');
− Route::get('/them','TheLoaiController@getThem') -
>name('getthemloaisp');
− Route::post('/them','TheLoaiController@postThem') -
>name('postthemloaisp');
− Route::get('/sua/{id}','TheLoaiController@getSua') -
>name('getsualoaisp');
− Route::post('/sua/{id}','TheLoaiController@postSua') -
>name('postsualoaisp');
− Route::get('/xoa/{id}','TheLoaiController@postXoa') -
>name('postxoaloaisp');
− });
− Route::group(['prefix'=>'du-an-da-thuc-hien'],function () {
− Route::get('/danh-sach','DuAnController@getDanhSach') -
>name('dsduan');
− Route::get('/them','DuAnController@getThem') -
>name('getthemduan');
− Route::post('/them','DuAnController@postThem') -
>name('postthemduan');
86
− Route::get('/sua/{id}','DuAnController@getSua') -
>name('getsuaduan');
− Route::post('/sua/{id}','DuAnController@postSua') -
>name('postsuaduan');
− Route::get('/xoa/{id}','DuAnController@postXoa') -
>name('postxoaduan');
− Route::get('/noi-dung/{id}','DuAnController@getNoiDung') -
>name('getndduan');
− });
− Route::group(['prefix'=>'thong-tin-cong-ty'],function () {
− Route::get('/sua/{id}','InfoCtController@getSua') -
>name('getsuainfoct');
− Route::post('/sua/{id}','InfoCtController@postSua') -
>name('postsuainfoct');
− });
− Route::group(['prefix'=>'san-pham'],function () {
− Route::get('/danh-sach','SanPhamController@getDanhSach') -
>name('dssanpham');
− Route::get('/them','SanPhamController@getThem') -
>name('getthemsanpham');
− Route::post('/them','SanPhamController@postThem') -
>name('postthemsanpham');
− Route::get('/sua/{id}','SanPhamController@getSua') -
>name('getsuasanpham');
− Route::post('/sua/{id}','SanPhamController@postSua') -
>name('postsuasanpham');
87
− Route::get('/xoa/{id}','SanPhamController@postXoa') -
>name('postxoasanpham');
− Route::get('/xoacmt/{id}','SanPhamController@postXoaCmt') -
>name('postxoacmt');
− Route::get('/noi-
dung/{id}','SanPhamController@getNoiDung') -
>name('getndsanpham');
− Route::get('/tom-tat/{id}','SanPhamController@getTomTat') -
>name('getttsanpham');
− Route::get('/hinh-
anh/{id}','SanPhamController@getHinhAnh') -
>name('gethasanpham');
− Route::post('/hinh-
anh/{id}','SanPhamController@postHinhAnh') -
>name('posthasanpham');
− });
− Route::group(['prefix'=>'user'],function () {
− Route::get('/sua/{id}','UserController@getSua') -
>name('getsuauser');
− Route::post('/sua/{id}','UserController@postSua') -
>name('postsuauser');
− });
− Route::group(['prefix'=>'bao-gia'],function () {
− Route::get('/danh-sach','BaoGiaController@getDanhSach') -
>name('dsbaogia');
88
− Route::get('/xoa/{id}','BaoGiaController@postXoa') -
>name('postxoabaogia');
− Route::get('/chi-tiet/{id}','BaoGiaController@getChiTiet') -
>name('getchitietbaogia');
− });
− });
− Tạo Middleware AdminLogin để xác nhận đăng nhập:
− <?php
−
− namespace App\Http\Middleware;
−
− use Closure;
− use Illuminate\Support\Facades\Auth;
− class AdminLogin
− {
− /**
− * Handle an incoming request.
− *
− * @param \Illuminate\Http\Request $request
− * @param \Closure $next
− * @return mixed
− */
− public function handle($request, Closure $next)
− {
− if(Auth::check()){
89
− return $next($request);
− }
− else{
− return redirect("admin/dang-nhap");
− }
− }
− }
− Tạo các Eloquent ORM tương ứng với từng bảng trong Database,
thông qua đó mỗi bảng trong Database sẽ là một Model giúp cho việc
thao tác với Database một cách dễ dàng:
+ Bảng baogia:
+ <?php
+
+ namespace App;
+
+ use Illuminate\Database\Eloquent\Model;
+
+ class baogia extends Model
+ {
+ //
+ protected $table = 'baogia';
+ public $primaryKey = 'ID';
+ }
+
90
+ Bảng thanhpham:
+ <?php
+
+ namespace App;
+
+ use Illuminate\Database\Eloquent\Model;
+
+ class thanhpham extends Model
+ {
+ //
+ protected $table = 'thanhpham';
+ public $timestamps = false;
+ public $primaryKey = 'ID';
+ }
+
+ Bảng infoct:
+ <?php
+
+ namespace App;
+
+ use Illuminate\Database\Eloquent\Model;
+
+ class infoct extends Model
+ {
+ //
91
+ protected $table = 'infoct';
+ public $timestamps = false;
+ public $primaryKey = 'ID';
+ }
+ Bảng tai_khoans:
+ <?php
+
+ namespace App;
+
+ use Illuminate\Notifications\Notifiable;
+ use Illuminate\Contracts\Auth\MustVerifyEmail;
+ use Illuminate\Foundation\Auth\User as Authenticatable;
+
+ class tai_khoan extends Authenticatable
+ {
+ //
+ use Notifiable;
+
+ /**
+ * The attributes that are mass assignable.
+ *
+ * @var array
+ */
+ protected $fillable = [
+ 'tendn','tenuser', 'password',
+ ];
92
+
+ /**
+ * The attributes that should be hidden for arrays.
+ *
+ * @var array
+ */
+ protected $hidden = [
+ 'password', 'remember_token',
+ ];
+ }
+
+ Bảng sanpham:
+ <?php
+
+ namespace App;
+
+ use Illuminate\Database\Eloquent\Model;
+
+ class sanpham extends Model
+ {
+ //
+ protected $table = 'sanpham';
+ public $timestamps = false;
+ public $primaryKey = 'ID';
+ public function loaisanpham(){
93
+ return $this-
>belongsToMany('App\loaisanpham','loaisanpham_sanpham','sa
npham_id','loaisanpham_id');
+ }
+
+ public function hinhsanpham(){
+ return $this-
>hasMany('App\hinhsanpham','IDSanPham','ID');
+ }
+
+ public function nhanxet(){
+ return $this -> hasMany('App\nhanxet','IDSanPham','ID');
+ }
+ }
+
+ Bảng loaisanpham:
+ <?php
+
+ namespace App;
+
+ use Illuminate\Database\Eloquent\Model;
+
+ class loaisanpham extends Model
+ {
+ //
94
+ protected $table = 'loaisanpham';
+ public $timestamps = false;
+ public $primaryKey = 'ID';
+
+ public function sanpham(){
+ return $this-
>belongsToMany('App\sanpham','loaisanpham_sanpham','loaisa
npham_id','sanpham_id');
+ }
+ }
+
+ Bảng nhanxet:
+ <?php
+
+ namespace App;
+
+ use Illuminate\Database\Eloquent\Model;
+
+ class nhanxet extends Model
+ {
+ //
+ protected $table = 'nhanxet';
+ public $primaryKey = 'ID';
+ public function sanpham(){
+ return $this -> belongsTo('App\sanpham','IDSanPham','ID');
95
+ }
+ }
+
+ Bảng hinhsanpham:
+ <?php
+
+ namespace App;
+
+ use Illuminate\Database\Eloquent\Model;
+
+ class hinhsanpham extends Model
+ {
+ //
+ protected $table = 'hinhsanpham';
+ public $timestamps = false;
+ public $primaryKey = 'ID';
+
+ public function sanpham(){
+ 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:
96
+ BaoGiaController:
+ <?php
+
+ namespace App\Http\Controllers;
+
+ use Illuminate\Http\Request;
+ use App\baogia;
+
+ class BaoGiaController extends Controller
+ {
+ //
+ public function getDanhSach(){
+ $baogias = baogia::all();
+ return view('admin.baogia.danhsachbaogia',['dsbaogias'=>$
baogias]);
+ }
+ public function postXoa(Request $request){
+ $query = $request ->id;
+ $baogia = baogia::find($query);
+ if(isset($baogia)){
+ $baogia ->delete();
+ return redirect('admin/bao-gia/danh-sach') -
>with('thongbao','Xóa thành công');
+ }
+ else{
+ return view('admin.erorr.notfound');
97
+ }
+ }
+ public function getChiTiet(Request $request){
+ $query = $request ->id;
+ $ctbaogia = baogia::find($query);
+ if(isset($ctbaogia)){
+ $ctbaogia ->DaXem=1;
+ $ctbaogia ->save();
+ return view('admin.baogia.chitietbaogia',['ctbaogia'=>$ctbao
gia]);
+ }
+ else{
+ return view('admin.erorr.notfound');
+ }
+ }
+ }
+ DuAnController:
+ <?php
+
+ namespace App\Http\Controllers;
+
+ use Illuminate\Http\Request;
+ use App\thanhpham;
+ use SebastianBergmann\Environment\Console;
+
98
+ class DuAnController extends Controller
+ {
+ //
+ public function getDanhSach(){
+ $thanhpham = thanhpham::all();
+ return view('admin.thanhpham.danhsachduan',['thanhphams'
=> $thanhpham]);
+ }
+ public function getThem(){
+ return view('admin.thanhpham.themduan');
+ }
+ public function postThem(Request $request){
+ if($request ->hasFile('file')){
+ $hinhanh = $request ->file('file');
+ $name = $hinhanh ->getClientOriginalName();
+ $destinationPath = 'img/';
+ if (!file_exists($destinationPath)) {
+ mkdir($destinationPath, 0755, true);
+ }
+ $hinhanh->move($destinationPath, $name);
+ }
+ else if($request ->input('anhtieude')!="" && $request -
>input('anhkh')!="" && $request -
>input('noidung')!="" && $request ->input('nhanxet')!=""){
+ $this -> validate($request,[
+ 'tenduan' =>'required|min:2|max:50',
99
+ 'diachi' =>'required|min:2|max:100',
+ 'tenkh' =>'required|min:2|max:50',
+ 'nhanxet' =>'required|min:2',
+ 'noidung' =>'required|min:2',
+ 'tomtat' =>'required|min:2|max:300',
+ ],
+ [
+ '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
ự',
+ 'tenkh.required'=>'Bạn chưa nhập tên khách hàng',
+ 'tenkh.min'=>'Tên khách hàng phải có độ dài lớn hơn 1
ký tự',
+ 'tenkh.max'=>'Tên khách hàng có độ dài 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',
100
+ '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ự',
+ ]);
+ $thanhpham = new thanhpham;
+ $thanhpham -> TenTP = $request -> tenduan;
+ $thanhpham -> DiaChi = $request -> diachi;
+ $thanhpham -> NoiDung = $request -> noidung;
+ $thanhpham -> TenKH = $request -> tenkh;
+ $thanhpham -> NhanXet = $request -> nhanxet;
+ $thanhpham -> TomTat =$request -> tomtat;
+ $thanhpham -> AnhKH = $request -> anhkh;
+ $thanhpham -> AnhTP = $request -> anhtieude;
+ $thanhpham ->save();
+ return redirect('/admin/du-an-da-thuc-hien/them') -
> with('thongbao','Thêm thành công');
+
+ }
+ else{
+ 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');
+ }
+ }
101
+ public function postXoa(Request $request){
+ $query = $request ->id;
+ $thanhpham = thanhpham::find($query);
+ if(isset($thanhpham)){
+ $image_path1 = "img/".$thanhpham -> AnhKH;
+ $image_path2 = "img/".$thanhpham -> AnhTP;
+
+ if (file_exists($image_path1)) {
+
+ @unlink($image_path1);
+ }
+ if (file_exists($image_path2)) {
+
+ @unlink($image_path2);
+ }
+ $thanhpham ->delete();
+ return redirect('/admin/du-an-da-thuc-hien/danh-sach') -
>with('thongbao','Xóa thành công');
+ }
+ else{
+ return view('admin.erorr.notfound');
+ }
+ }
+ public function getSua(Request $request){
+ $query = $request ->id;
+ $thanhpham = thanhpham::find($query);
102
+ if(isset($thanhpham)){
+ return view('admin.thanhpham.suaduan',['thanhpham'=>$tha
nhpham]);
+ }
+ else{
+ return view('admin.erorr.notfound');
+ }
+ }
+ public function postSua(Request $request){
+ $query = $request ->id;
+ $thanhpham = thanhpham::find($query);
+ if($request ->hasFile('file')){
+ $hinhanh = $request ->file('file');
+ $name = $hinhanh ->getClientOriginalName();
+ $destinationPath = 'img/';
+ if (!file_exists($destinationPath)) {
+ mkdir($destinationPath, 0755, true);
+ }
+ $hinhanh->move($destinationPath, $name);
+ }
+ else if($request ->input('tenduan')!="" && $request -
>input('diachi')!=""&& $request -
>input('tenkh')!="" && $request -
>input('nhanxet')!="" && $request ->input('noidung')!=""){
+ $this -> validate($request,[
+ 'tenduan' =>'required|min:2|max:50',
103
+ 'diachi' =>'required|min:2|max:100',
+ 'tenkh' =>'required|min:2|max:50',
+ 'nhanxet' =>'required|min:2',
+ 'noidung' =>'required|min:9',
+ 'tomtat' =>'required|min:2|max:300',
+ ],
+ [
+ '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
ự',
+ 'tenkh.required'=>'Bạn chưa nhập tên khách hàng',
+ 'tenkh.min'=>'Tên khách hàng phải có độ dài lớn hơn 1
ký tự',
+ 'tenkh.max'=>'Tên khách hàng có độ dài 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',
104
+ '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ự',
+ ]);
+ $thanhpham -> TenTP = $request -> tenduan;
+ $thanhpham -> DiaChi = $request -> diachi;
+ $thanhpham -> TenKH = $request -> tenkh;
+ $thanhpham -> NhanXet = $request -> nhanxet;
+ $thanhpham -> TomTat =$request -> tomtat;
+ $thanhpham -> NoiDung = $request -> noidung;
+ if($request -> anhtieude !="" && $request -
> anhtieude != $thanhpham -> AnhTP){
+ $image_path = "img/".$thanhpham -> AnhTP;
+
+ if (file_exists($image_path)) {
+
+ @unlink($image_path);
+ }
+ $thanhpham -> AnhTP =$request -> anhtieude;
+ }
+ if($request -> anhkh !="" && $request -
> anhkh != $thanhpham -> AnhKH){
+ $image_path = "img/".$thanhpham -> AnhKH;
105
+
+ if (file_exists($image_path)) {
+
+ @unlink($image_path);
+ }
+ $thanhpham -> AnhKH =$request -> anhkh;
+ }
+ $thanhpham ->save();
+ return view('admin.thanhpham.suaduan',['thanhpham'=>$
thanhpham]) -> with('thongbao','Sửa thành công');
+
+ }
+ else{
+ 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){
+ $query = $request ->id;
+ $thanhpham = thanhpham::find($query);
+ if(isset($thanhpham)){
+ return view('admin.thanhpham.noidungduan',['thanhpham' =
> $thanhpham]);
+ }
+ else{
+ return view('admin.erorr.notfound');
106
+ }
+ }
+ }
+ InfoCtController:
+ <?php
+
+ namespace App\Http\Controllers;
+
+ use Illuminate\Http\Request;
+ use App\infoct;
+ use SebastianBergmann\Environment\Console;
+
+ class InfoCtController extends Controller
+ {
+ //
+ public function getSua(){
+ $info = infoct::all() ->first();
+ return view('admin.thongtinct.thongtinct',['info'=>$info]);
+ }
+ public function postSua(Request $request){
+ $query = $request ->id;
+ $info = infoct::find($query);
+ if($request ->hasFile('file')){
+ $hinhanh = $request ->file('file');
+ $name = $hinhanh ->getClientOriginalName();
107
+ $destinationPath = 'img/';
+ if (!file_exists($destinationPath)) {
+ mkdir($destinationPath, 0755, true);
+ }
+ $hinhanh->move($destinationPath, $name);
+ }
+ else if($request ->input('tenct')!="" && $request -
>input('diachi')!=""&& $request ->input('gioithieu')!=""
+ && $request ->input('sdt')!="" && $request -
>input('fb')!="" && $request ->input('email')!=""){
+ $this -> validate($request,[
+ 'tenct' =>'required|min:2|max:50|',
+ 'diachi' =>'required|min:2|max:100|',
+ 'sdt' =>'required|numeric|digits_between:3,10',
+ 'fb' =>'required|min:2|max:100|',
+ 'email' =>'required|email|',
+ 'gioithieu' =>'required|min:2|',
+ ],
+ [
+ '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ự',
108
+ '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ố',
+ 'sdt.digits_between'=>'Số điện thoại phải lớn hơn 2 số
và nhỏ hơn 11 số',
+ 'fb.required'=>'Bạn chưa nhập thông tin facebook',
+ 'fb.min'=>'Thông tin facebook phải có độ dài lớn hơn 1
ký tự',
+ 'fb.max'=>'Thông tin facebook phải có độ dài nhỏ hơn
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ự',
+ ]);
+ $info -> TenCT = $request -> tenct;
+ $info -> DiaChi = $request -> diachi;
+ $info -> SDT = $request -> sdt;
+ $info-> FB = $request -> fb;
+ $info -> Email = $request -> email;
+ $info -> GioiThieu = $request -> gioithieu;
+ if($request -> anhct !="" && $request -> anhct != $info -
> HinhAnh){
+ $image_path = "img/".$info -> HinhAnh;
109
+
+ if (file_exists($image_path)) {
+
+ @unlink($image_path);
+ }
+ $info -> HinhAnh =$request -> anhct;
+ }
+ $info ->save();
+ return view('admin.thongtinct.thongtinct',['info'=>$info])
-> with('thongbao','Sửa thành công');
+
+ }
+ else{
+ return view('admin.thongtinct.thongtinct',['info'=>$info])
-> with('err','Bạn không được bỏ trống phần giới thiệu');
+ }
+ }
+ }
+
+ SanPhamController:
+ <?php
+
+ namespace App\Http\Controllers;
+
+ use Illuminate\Http\Request;
110
+ use App\sanpham;
+ use App\loaisanpham;
+ use App\hinhsanpham;
+ use App\nhanxet;
+ class SanPhamController extends Controller
+ {
+ //
+ public function getDanhSach() {
+ $sanpham = sanpham::all();
+ return view('admin.sanpham.danhsachsanpham',['sanphams'
=> $sanpham]);
+ }
+ public function getThem(){
+ $loaisanphams =loaisanpham::all();
+ return view('admin.sanpham.themsanpham',['loaisanphams'
=> $loaisanphams]);
+ }
+ public function postThem(Request $request){
+ if($request ->hasFile('file')){
+ $hinhanh = $request ->file('file');
+ $name = $hinhanh ->getClientOriginalName();
+ $destinationPath = 'img/';
+ if (!file_exists($destinationPath)) {
+ mkdir($destinationPath, 0755, true);
+ }
+ $hinhanh->move($destinationPath, $name);
111
+ }
+ else if($request ->input('hinhanh')!="" && $request -
>input('noidung')!="" && $request ->input('tomtat')!=""){
+ $this -> validate($request,[
+ 'tensp' =>'required|min:2|max:50|unique:sanpham,TenS
P',
+ 'tomtat' =>'required|min:9',
+ 'noidung' =>'required|min:9',
+ 'nhasx' =>'required|min:2|max:50',
+
+ ],
+ [
+ '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',
+ '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',
112
+ '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ự',
+ ]);
+ $sanpham = new sanpham;
+ $sanpham -> TenSP = $request -> tensp;
+ $sanpham -> TomTat = $request -> tomtat;
+ $sanpham -> MoTa =$request -> noidung;
+ $sanpham -> NhaSX =$request -> nhasx;
+ if ( $request->has('noibat')) {
+ $sanpham ->NoiBat = 1;
+ }
+ else{
+ $sanpham ->NoiBat = 0;
+ }
+ $sanpham -> AnhTD = $request -> hinhanh;
+ $sanpham ->save();
+ $pivot= sanpham::find($sanpham ->ID);
+ foreach($request ->loaisp as $lsp){
+ $pivot ->loaisanpham()->attach($lsp);
+ }
+ return redirect('/admin/san-pham/them') -
>with('thongbao','Thêm thành công');
+
+ }
113
+ else{
+ 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){
+ $query = $request ->id;
+ $sanpham = sanpham::find($query);
+ if(isset($sanpham)){
+ $image_path = "img/".$sanpham -> AnhTD;
+
+ if (file_exists($image_path)) {
+
+ @unlink($image_path);
+ }
+ $sanpham ->delete();
+ return redirect('/admin/san-pham/danh-sach') -
>with('thongbao','Xóa thành công');
+ }
+ else{
+ return view('admin.erorr.notfound');
+ }
+ }
+ public function postXoaCmt(Request $request){
+ $query = $request ->id;
+ $cmt = nhanxet::find($query);
114
+ if(isset($cmt)){
+ $idsanpham =$cmt->IDSanPham;
+ $cmt ->delete();
+ return redirect('/admin/san-pham/sua/'.$idsanpham) -
>with('thongbao','Xóa thành công');
+ }
+ else{
+ return view('admin.erorr.notfound');
+ }
+ }
+ public function getSua(Request $request){
+ $query = $request ->id;
+ $sanpham = sanpham::find($query);
+ if(isset($sanpham)){
+ $loaisanphams =loaisanpham::all();
+ $comments = $sanpham ->nhanxet()->get();
+ $loaidcchons = $sanpham ->loaisanpham()-
>select('TenLoai')->get();
+ return view('admin.sanpham.suasanpham',['sanpham'=>$san
pham,'loaisanphams'=>$loaisanphams,'loaidcchons'=>$loaidcch
ons,'comments'=>$comments]);
+ }
+ else{
+ return view('admin.erorr.notfound');
+ }
+ }
115
+ public function postSua(Request $request){
+ $query = $request ->id;
+ $sanpham = sanpham::find($query);
+ $comments = $sanpham ->nhanxet()->get();
+ if($request ->hasFile('file')){
+ $hinhanh = $request ->file('file');
+ $name = $hinhanh ->getClientOriginalName();
+ $destinationPath = 'img/';
+ if (!file_exists($destinationPath)) {
+ mkdir($destinationPath, 0755, true);
+ }
+ $hinhanh->move($destinationPath, $name);
+ }
+ else if($request ->input('noidung')!="" &&$reque...st ->hinhanh2;
+ $hinhsp -> save();
+ }
+ if($request ->idanh3=="" && $request -
>hinhanh3 !=""&& $request ->hinhanh3 !="xoa"){
+ $hinhsp = new hinhsanpham;
+ $hinhsp ->IDSanPham = $query;
+ $hinhsp ->HinhAnh =$request ->hinhanh3;
+ $hinhsp -> save();
+ }
122
+ if($request ->idanh4=="" && $request -
>hinhanh4 !=""&& $request ->hinhanh4 !="xoa"){
+ $hinhsp = new hinhsanpham;
+ $hinhsp ->IDSanPham = $query;
+ $hinhsp ->HinhAnh =$request ->hinhanh4;
+ $hinhsp -> save();
+ }
+ if($request ->idanh5=="" && $request -
>hinhanh5 !=""&& $request ->hinhanh5 !="xoa"){
+ $hinhsp = new hinhsanpham;
+ $hinhsp ->IDSanPham = $query;
+ $hinhsp ->HinhAnh =$request ->hinhanh5;
+ $hinhsp -> save();
+ }
+ //Xoa
+ if($request ->idanh1!="" && $request -
>hinhanh1 =="xoa"){
+ $hinhsp = hinhsanpham::find($request ->idanh1);
+ $image_path = "img/".$hinhsp -> HinhAnh;
+
+ if (file_exists($image_path)) {
+
+ @unlink($image_path);
+ }
+ $hinhsp -> delete();
+ }
123
+ if($request ->idanh2!="" && $request -
>hinhanh2 =="xoa"){
+ $hinhsp = hinhsanpham::find($request ->idanh2);
+ $image_path = "img/".$hinhsp -> HinhAnh;
+
+ if (file_exists($image_path)) {
+
+ @unlink($image_path);
+ }
+ $hinhsp -> delete();
+ }
+ if($request ->idanh3!="" && $request -
>hinhanh3 =="xoa"){
+ $hinhsp = hinhsanpham::find($request ->idanh3);
+ $image_path = "img/".$hinhsp -> HinhAnh;
+
+ if (file_exists($image_path)) {
+
+ @unlink($image_path);
+ }
+ $hinhsp -> delete();
+ }
+ if($request ->idanh4!="" && $request -
>hinhanh4 =="xoa"){
+ $hinhsp = hinhsanpham::find($request ->idanh4);
+ $image_path = "img/".$hinhsp -> HinhAnh;
124
+
+ if (file_exists($image_path)) {
+
+ @unlink($image_path);
+ }
+ $hinhsp -> delete();
+ }
+ if($request ->idanh5!="" && $request -
>hinhanh5 =="xoa"){
+ $hinhsp = hinhsanpham::find($request ->idanh5);
+ $image_path = "img/".$hinhsp -> HinhAnh;
+
+ if (file_exists($image_path)) {
+
+ @unlink($image_path);
+ }
+ $hinhsp -> delete();
+ }
+ //Sua
+ if($request ->idanh1!="" && $request -
>hinhanh1 !="xoa"&& $request ->hinhanh1 !=""){
+ $hinhsp = hinhsanpham::find($request ->idanh1);
+ if($request->hinhanh1 != $hinhsp ->HinhAnh){
+ $image_path = "img/".$hinhsp -> HinhAnh;
+ if (file_exists($image_path)) {
+
125
+ @unlink($image_path);
+ }
+ }
+ $hinhsp ->HinhAnh =$request ->hinhanh1;
+ $hinhsp -> save();
+ }
+ if($request ->idanh2!="" && $request -
>hinhanh2 !="xoa"&& $request ->hinhanh2 !=""){
+ $hinhsp = hinhsanpham::find($request ->idanh2);
+ if($request->hinhanh2 != $hinhsp ->HinhAnh){
+ $image_path = "img/".$hinhsp -> HinhAnh;
+ if (file_exists($image_path)) {
+
+ @unlink($image_path);
+ }
+ }
+ $hinhsp ->HinhAnh =$request ->hinhanh2;
+ $hinhsp -> save();
+ }
+ if($request ->idanh3!="" && $request -
>hinhanh3 !="xoa"&& $request ->hinhanh3 !=""){
+ $hinhsp = hinhsanpham::find($request ->idanh3);
+ if($request->hinhanh3 != $hinhsp ->HinhAnh){
+ $image_path = "img/".$hinhsp -> HinhAnh;
+ if (file_exists($image_path)) {
+
126
+ @unlink($image_path);
+ }
+ }
+ $hinhsp ->HinhAnh =$request ->hinhanh3;
+ $hinhsp -> save();
+ }
+ if($request ->idanh4!="" && $request -
>hinhanh4 !="xoa"&& $request ->hinhanh4 !=""){
+ $hinhsp = hinhsanpham::find($request ->idanh4);
+ if($request->hinhanh4 != $hinhsp ->HinhAnh){
+ $image_path = "img/".$hinhsp -> HinhAnh;
+ if (file_exists($image_path)) {
+
+ @unlink($image_path);
+ }
+ }
+ $hinhsp ->HinhAnh =$request ->hinhanh4;
+ $hinhsp -> save();
+ }
+ if($request ->idanh5!="" && $request -
>hinhanh5 !="xoa"&& $request ->hinhanh5 !=""){
+ $hinhsp = hinhsanpham::find($request ->idanh5);
+ if($request->hinhanh5 != $hinhsp ->HinhAnh){
+ $image_path = "img/".$hinhsp -> HinhAnh;
+ if (file_exists($image_path)) {
+
127
+ @unlink($image_path);
+ }
+ }
+ $hinhsp ->HinhAnh =$request ->hinhanh5;
+ $hinhsp -> save();
+ }
+ $hinhanhs= $sanpham -> hinhsanpham() -
>select('ID','HinhAnh')->get();
+ return view('admin.sanpham.hinhanhsanpham',['sanpham' =
> $sanpham,'hinhanhs' => $hinhanhs]) -
>with('thongbao','Cập nhập thành công');
+ }
+ }
+
+ TheLoaiController:
+ <?php
+
+ namespace App\Http\Controllers;
+
+ use Illuminate\Http\Request;
+ use App\loaisanpham;
+ use SebastianBergmann\Environment\Console;
+
+ class TheLoaiController extends Controller
+ {
128
+ //
+ public function getDanhSach(){
+ $loaisp = loaisanpham::all();
+ return view('admin.loaisanpham.danhsachloai',['theloais' =>
$loaisp]);
+ }
+ public function getThem(){
+ return view('admin.loaisanpham.themloai');
+ }
+ public function postThem(Request $request){
+ if($request ->hasFile('file')){
+ $hinhanh = $request ->file('file');
+ $name = $hinhanh ->getClientOriginalName();
+ $destinationPath = 'img/';
+ if (!file_exists($destinationPath)) {
+ mkdir($destinationPath, 0755, true);
+ }
+ $hinhanh->move($destinationPath, $name);
+ }
+ else if($request ->input('hinhanh')!=""){
+ $this -> validate($request,[
+ 'tenloai' =>'required|min:2|max:50|unique:loaisanpham,
TenLoai',
+ 'mota' =>'required|min:2|max:200'
+ ],
+ [
129
+ '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ự'
+ ]);
+ $loaisp = new loaisanpham;
+ $loaisp -> TenLoai = $request -> tenloai;
+ $loaisp -> MoTa = $request -> mota;
+ $loaisp -> HinhAnh =$request -> hinhanh;
+ $loaisp ->save();
+ return redirect('/admin/loai-san-pham/them') -
> with('thongbao','Thêm thành công');
+
+ }
+ else{
+ 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){
130
+ $query = $request ->id;
+ $loaisp = loaisanpham::find($query);
+ if(isset($loaisp)){
+ return view('admin.loaisanpham.sualoai',['loaisp'=>$loaisp])
;
+ }
+ else{
+ return view('admin.erorr.notfound');
+ }
+ }
+ public function postSua(Request $request){
+ $query = $request ->id;
+ $loaisp = loaisanpham::find($query);
+ if($request ->hasFile('file')){
+ $hinhanh = $request ->file('file');
+ $name = $hinhanh ->getClientOriginalName();
+ $destinationPath = 'img/';
+ if (!file_exists($destinationPath)) {
+ mkdir($destinationPath, 0755, true);
+ }
+ $hinhanh->move($destinationPath, $name);
+ }
+ else if($request ->input('tenloai')!="" && $request -
>input('mota')!=""){
+ if($request ->input('tenloai')== $loaisp -> TenLoai){
+ $this -> validate($request,[
131
+ 'tenloai' =>'required|min:2|max:50|',
+ 'mota' =>'required|min:2|max:200'
+ ],
+ [
+ '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ự'
+ ]);
+ }else{
+ $this -> validate($request,[
+ 'tenloai' =>'required|min:2|max:50|unique:loaisanpha
m,TenLoai',
+ 'mota' =>'required|min:2|max:200'
+ ],
+ [
+ '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ự',
132
+ '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
0 ký tự'
+ ]);
+ }
+ $loaisp -> TenLoai = $request -> tenloai;
+ $loaisp -> MoTa = $request -> mota;
+ if($request -> hinhanh !="" && $request -
> hinhanh != $loaisp -> HinhAnh){
+ $image_path = "img/".$loaisp -> HinhAnh;
+
+ if (file_exists($image_path)) {
+
+ @unlink($image_path);
+ }
+ $loaisp -> HinhAnh =$request -> hinhanh;
+ }
+ $loaisp ->save();
+ return view('admin.loaisanpham.sualoai',['loaisp'=>$loais
p]) -> with('thongbao','Sửa thành công');
+
+ }
+ }
133
+ public function postXoa(Request $request){
+ $query = $request ->id;
+ $loaisp = loaisanpham::find($query);
+ if(isset($loaisp)){
+ $image_path = "img/".$loaisp -> HinhAnh;
+
+ if (file_exists($image_path)) {
+
+ @unlink($image_path);
+ }
+ $loaisp ->delete();
+ return redirect('/admin/loai-san-pham/danh-sach') -
>with('thongbao','Xóa thành công');
+ }
+ else{
+ return view('admin.erorr.notfound');
+ }
+ }
+ }
+
+ UserController:
+ <?php
+
+ namespace App\Http\Controllers;
+
134
+ use Illuminate\Http\Request;
+ use Illuminate\Support\Facades\Auth;
+ use App\tai_khoan;
+ class UserController extends Controller
+ {
+ //
+ public function getSua(Request $request){
+ $query = $request ->id;
+ $user = tai_khoan::find($query);
+ if(isset($user)){
+ return view('admin.user.suauser',['user'=>$user]);
+ }
+ else{
+ return view('admin.erorr.notfound');
+ }
+ }
+ public function postSua(Request $request){
+ $query = $request ->id;
+ $user = tai_khoan::find($query);
+ $this -> validate($request,[
+ 'tendn' =>'required|min:4|max:12',
+ 'tenuser' =>'required|min:2|max:50',
+
+ ],
+ [
+ 'tendn.required'=>'Bạn chưa nhập tên đăng nhập',
135
+ '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ự',
+ 'tenuser.required'=>'Bạn chưa nhập tên người dùng',
+ 'tenuser.min'=>'Tên người dùng phải có độ dài lớn hơn 1
ký tự',
+ 'tenuser.max'=>'Tên người dùng phải có độ dài nhỏ hơn 5
0 ký tự',
+ ]);
+ $user ->tendn =$request->tendn;
+ $user ->tenuser =$request->tenuser;
+ if($request->has('doimk')){
+ $this -> validate($request,[
+ 'mk' =>'required|min:4|max:12',
+ 'nhaplaimk' =>'required|same:mk',
+ ],
+ [
+ 'mk.required'=>'Bạn chưa nhập mật khẩu',
+ 'mk.min'=>'Mật khẩu phải có độ dài lớn hơn 3 ký tự',
+ 'mk.max'=>'Mật khẩu phải có độ dài nhỏ hơn 13 ký tự',
+ 'nhaplaimk.required'=>'Bạn chưa nhập nhập lại mật kh
ẩu',
+ 'nhaplaimk.same'=>'Nhập lại mật khẩu không khớp với
mật khẩu',
+ ]);
136
+ $user ->password =bcrypt($request->mk);
+ }
+ $user ->save();
+ return view('admin.user.suauser',['user'=>$user])-
>with('thongbao','Cập nhập thành công');
+ }
+ public function getDangNhap(){
+ return view('admin.user.login');
+ }
+ public function postDangNhap(Request $request){
+
+ $this -> validate($request,[
+ 'tendn' =>'required|min:4|max:12',
+ 'matkhau' =>'required|min:4|max:12',
+
+ ],
+ [
+ '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ự'
,
137
+ 'matkhau.max'=>'Mật khẩu phải có độ dài nhỏ hơn 13 ký
tự',
+ ]);
+ if(Auth::attempt(['tendn'=>$request-
>tendn,'password'=>$request->matkhau])){
+ return redirect("admin/loai-san-pham/danh-sach");
+ }else{
+ return view('admin.user.login')-
>with('err','Sai tên tài khoản hoặc mật khẩu');
+ };
+
+ }
+ public function getDangXuat(){
+ Auth::logout();
+ return view('admin.user.login');
+ }
+ }
+
+ HomeController:
+ <?php
+
+ namespace App\Http\Controllers;
+ use Illuminate\Http\RedirectResponse;
+ use App\baogia;
+ use Illuminate\Http\Request;
138
+ use App\sanpham;
+ use App\infoct;
+ use App\loaisanpham;
+ use App\thanhpham;
+ use DB;
+
+ class HomeController extends Controller
+ {
+ //
+ public function getHome(){
+ $rdsanphams = sanpham::all()->toArray();
+ $intro = infoct::all();
+ $loaisanphams= loaisanpham::all();
+ $sanphamnoibats= sanpham::where('NoiBat',1)->get();
+ $thanhphams= thanhpham::all()->sortByDesc('ID');
+ shuffle($rdsanphams);
+ return view('pages.home.home',['rdsanphams'=>$rdsanpham
s,'intro'=>$intro,'loaisanphams'=>$loaisanphams,'sanphamnoibat
s'=>$sanphamnoibats,'thanhphams'=>$thanhphams]);
+ }
+ public function postSearchAjax(Request $request){
+ if($request->get('query'))
+ {
+ $query = $request->get('query');
+ $data = DB::table('sanpham')
+ ->where('TenSP', 'LIKE', "%{$query}%")
139
+ ->get();
+ $output = '';
+ foreach($data as $row)
+ {
+ $output .= '
+ ID .'">'.$row-
>TenSP.'
+ ';
+ }
+ $output .= '';
+ echo $output;
+ }
+ }
+ public function postBaoGia(Request $request){
+ $baogia = new baogia;
+ $baogia -> HoTen = $request->tenkh;
+ $baogia -> DiaChi = $request->diachi;
+ $baogia -> SDT =$request->sdt;
+ if($request->ghichu !=""){
+ $baogia -> GhiChu = $request->ghichu;
+ }
+ $baogia -> save();
+ return redirect('/home')-
>with('thongbao', 'Đăng Ký Nhận Báo Giá Thành Công');
+ }
+ }
140
+
+ ShowSanPhamController:
+ <?php
+
+ namespace App\Http\Controllers;
+
+ use Illuminate\Http\Request;
+ use DB;
+ use App\sanpham;
+ use App\nhanxet;
+ use App\loaisanpham;
+ use Illuminate\Support\Carbon;
+ class ShowSanPhamController extends Controller
+ {
+ //
+ public function getDanhSach(Request $request){
+ $selected = $request->id;
+ $kproducts =DB::table('loaisanpham') ->get();
+ $sproducts =DB::table('sanpham') -
> join('loaisanpham_sanpham','sanpham.ID','=','loaisanpham_san
pham.sanpham_id') -
> select('sanpham.ID','sanpham.TenSP','sanpham.AnhTD','loaisa
npham_sanpham.loaisanpham_id') -
>orderBy('sanpham.ID', 'desc')-> get() ->toArray() ;
+ for($i = 0; $i < count($sproducts); $i++){
141
+ $sproducts[$i]->loaisanpham_id = 'filter-'.$sproducts[$i]-
>loaisanpham_id;
+ }
+ for($i = 1; $i < count($sproducts); $i++){
+ if($sproducts[$i]->ID == $sproducts[$i-1]->ID){
+ $sproducts[$i]->loaisanpham_id = $sproducts[$i]-
>loaisanpham_id .' '. $sproducts[$i-1]->loaisanpham_id;
+ array_splice($sproducts,$i-1,1);
+ --$i;
+ }
+ }
+ return view('pages.sanpham.danhsachsanpham')-
> with(['kproducts' => $kproducts,'sproducts' => $sproducts,'sele
cted' =>$selected]);
+
+ }
+ public function getChiTiet(Request $request){
+ $query = $request->id;
+ $sanpham= sanpham::find($query);
+ if(isset($sanpham)){
+ $hinhanhs = $sanpham->hinhsanpham()->get();
+ $comment = $sanpham->nhanxet()->orderBy('ID','desc')-
>get();
+ $cungloais = DB::table('loaisanpham_sanpham') -
>select('loaisanpham_id')->where('sanpham_id',$query)->get()-
>toArray();
142
+ $spcungloais=array();
+ foreach($cungloais as $loai){
+ $loais =loaisanpham::find($loai->loaisanpham_id)-
>sanpham()->get()->toArray();
+ $spcungloais= array_merge($spcungloais,$loais);
+ }
+ return view('pages.sanpham.chitietsanpham',['sanpham'=>$s
anpham,'nhanxet'=>$comment,'hinhanhs'=>$hinhanhs,'spcungloa
is'=>$spcungloais]);
+ }
+ else{
+ return view('admin.erorr.notfound');
+ }
+ }
+ public function postNhanXet(Request $request){
+ $query = $request->id;
+ $nhanxet = new nhanxet;
+ $nhanxet ->IDSanPham = $query;
+ $nhanxet ->HoTen= $request ->name;
+ $nhanxet ->NoiDung= $request->cmt;
+ $nhanxet ->save();
+ return redirect("/san-pham/chi-tiet/".$query."#comment");
+ }
+ }
+
143
+ ShowDuAnController:
+ <?php
+
+ namespace App\Http\Controllers;
+ use App\thanhpham;
+ use Illuminate\Http\Request;
+ use Illuminate\Database\Eloquent\Collection;
+
+ class ShowDuAnController extends Controller
+ {
+ //
+ public function getDuAn(){
+ $duans = thanhpham::where('ID','>',0)-
>orderBy('ID','desc') ->paginate(6) ;
+ return view('pages.duan.danhsachduan',['duans'=>$duans]);
+ }
+ public function getChiTiet(Request $request){
+ $query = $request->id;
+ $duan= thanhpham::find($query);
+ if(isset($duan)){
+ $duans=thanhpham::all()->toArray();
+ shuffle($duans);
+ return view('pages.duan.chitietduan',['duan'=>$duan,'duans'
=>$duans]);
+ }
+ else{
144
+ return view('admin.erorr.notfound');
+ }
+ }
+ }
+
− Sử dụng Laravel Blade template để đổ và xử lý dữ liệu ngoài View:
− @foreach($thanhphams as $nhanxet)
− @if($loop->iteration <=4)
−
− <img src="{{ Asset('img/'. $nhanxet-
>AnhKH) }}" class="testimonial-img" alt="">
− {{$nhanxet->TenKH}}
− {{$nhanxet->DiaChi}}
−
− {{$nhanxet->NhanXet}}
−
−
− @else
− @break
− @endif
− @endforeach
5.5 Một số đoạn code nổi bật
− CODE Autocomplete kết quả tìm kiếm sử dụng Ajax:
145
−
− $(document).ready(function(){
− $("#timkiem").keyup(function(){
− var query = $(this).val();
− if(query !=""){
− var _token = $('input[name="_token"]').val();
− $.ajax({
− url:"{{ route('timkiem') }}",
− method:"POST",
− data:{query:query, _token:_token},
− success:function(data){
− $('#kq').fadeIn();
− $('#kq').html(data);
− }
− });
− }
− });
− $(document).on('click', function(){
− $('#timkiem').val("");
− $('#kq').fadeOut();
− });
−
− CODE load dữ liệu cho bộ lọc:
− $selected = $request->id;
− $kproducts =DB::table('loaisanpham') ->get();
146
− $sproducts =DB::table('sanpham') -
> join('loaisanpham_sanpham','sanpham.ID','=','loaisanpham_sanpham.
sanpham_id') -
> select('sanpham.ID','sanpham.TenSP','sanpham.AnhTD','loaisanpham
_sanpham.loaisanpham_id') ->orderBy('sanpham.ID', 'desc')-> get() -
>toArray() ;
− for($i = 0; $i < count($sproducts); $i++){
− $sproducts[$i]->loaisanpham_id = 'filter-'.$sproducts[$i]-
>loaisanpham_id;
− }
− for($i = 1; $i < count($sproducts); $i++){
− if($sproducts[$i]->ID == $sproducts[$i-1]->ID){
− $sproducts[$i]->loaisanpham_id = $sproducts[$i]-
>loaisanpham_id .' '. $sproducts[$i-1]->loaisanpham_id;
− array_splice($sproducts,$i-1,1);
− --$i;
− }
− }
− CODE phân trang danh sách dự án:
− public function getDuAn(){
− $duans = thanhpham::where('ID','>',0)->orderBy('ID','desc') -
>paginate(6) ;
− return view('pages.duan.danhsachduan',['duans'=>$duans]);
− }
147
− CODE xác thực đăng nhập:
−
− if(Auth::attempt(['tendn'=>$request->tendn,'password'=>$request-
>matkhau])){
− return redirect("admin/loai-san-pham/danh-sach");
− }else{
− return view('admin.user.login')-
>with('err','Sai tên tài khoản hoặc mật khẩu');
− };
−
− CODE xử lý dữ liệu từ Ajax gọi đến trong chức năng tìm kiếm:
− if($request->get('query'))
− {
− $query = $request->get('query');
− $data = DB::table('sanpham')
− ->where('TenSP', 'LIKE', "%{$query}%")
− ->get();
− $output = '';
− foreach($data as $row)
− {
− $output .= '
− ID .'">'.$row-
>TenSP.'
− ';
− }
148
− $output .= '';
− echo $output;
− }
− CODE thông báo số yêu cầu từ khách hàng chưa xem:
− $this->middleware(function($request,$next){
− if(Auth::check()){
− $baogia = baogia::where('DaXem',0)->get();
− view()->share('baogia',$baogia);
− }
− return $next($request);
− });
− CODE tạo multi-slide:
−
− $('.owl-top').owlCarousel({
− loop:true,
− margin:20,
− autoplay:true,
− autoplayTimeout:5000,
− autoplayHoverPause:true,
− responsive:{
− 0:{
− items:1
− },
− 400:{
149
− items:2
− },
− 800:{
− items:3
− },
− 1200:{
− items:4
− }
− }
− });
−
− CODE tạo bộ lọc với dữ liệu được load lên từ Database thông qua
Controller:
− $(window).on('load', function () {
− var portfolioIsotope = $('.portfolio-container').isotope({
− itemSelector: '.portfolio-item'
− });
− portfolioIsotope.isotope({ filter: $('#portfolio-
flters li.first').attr('data-filter') });
− $('#portfolio-flters li').on( 'click', function() {
− if($(this).hasClass('all')){
− $("#portfolio-flters li").removeClass('filter-active');
− $(this).addClass('filter-active');
− portfolioIsotope.isotope({ filter: $(this).data('filter') })
− }
150
− else if($(this).hasClass('elem')){
− $("#portfolio-flters li.all").removeClass('filter-active');
− var selected = $("#portfolio-flters li.elem")
− var inclusives = [];
− if($(this).hasClass('filter-active')){
− $(this).removeClass('filter-active');
− selected.each( function() {
− if ($(this).hasClass('filter-active')) {
− inclusives.push( $(this).attr('data-filter') );
− }
− });
− var filterValue = inclusives.join("");
− if(filterValue !=""){
− portfolioIsotope.isotope({ filter: filterValue })
− }
− else{
− portfolioIsotope.isotope({ filter: '.nothing' })
− }
− }
− else{
− $(this).addClass('filter-active');
− selected.each( function() {
− if ($(this).hasClass('filter-active')) {
− inclusives.push( $(this).attr('data-filter') );
− }
− });
151
− var filterValue = inclusives.join("");
− portfolioIsotope.isotope({ filter: filterValue })
− }
− }
− });
− });
− CODE tạo thanh điều hướng nổi khi scroll:
− $(window).scroll(function() {
− if ($(this).scrollTop() > 50) {
− $('header').addClass('header-scrolled');
− } else {
− $('header').removeClass('header-scrolled');
− }
− });
− CODE tạo hiệu hứng hoạt hình khi scroll đến một mục tin:
− function isScrolledIntoView(elem) {
− var docViewTop = $(window).scrollTop();
− var docViewBottom = docViewTop + $(window).height();
− var elemTop = $(elem).offset().top- $(window).height()/2;
− var elemBottom = elemTop + $(elem).height();
− return elemBottom = docViewTo
p;
− }
− $(window).scroll(function() {
152
− $("#hlservices .owl-hl").each(function() {
− if (isScrolledIntoView(this) === true) {
− $(this).css("opacity",1);
− $(this).addClass("fadeInRight");
− }
− });
− });
− $(window).scroll(function() {
− $("#services .wown").each(function() {
− if (isScrolledIntoView(this) === true) {
− $(this).css("opacity",1);
− $(this).addClass("bounceInUp");
− }
− });
− });
− CODE cho button Back-to-top:
− $(window).scroll(function() {
− if ($(this).scrollTop() > 100) {
− $('.back-to-top').fadeIn('slow');
− } else {
− $('.back-to-top').fadeOut('slow');
− }
− });
− $('.back-to-top').click(function(){
− $('html, body').animate({scrollTop : 0},"slow");
153
− return false;
− });
− $('#header .logo .text-light').click(function(){
− $('html, body').animate({scrollTop : 0},"slow");
− return false;
− });
− CODE biến đổi thanh điều hướng sang dạng mục điều hướng khi
website chạy trên các thiết bị có màn hình nhỏ:
− if ($('.main-nav').length) {
− var $mobile_nav = $('.main-nav').clone().prop({
− class: 'mobile-nav d-lg-none'
− });
− $('body').append($mobile_nav);
− $('body').prepend('<button type="button" class="mobile-nav-
toggle d-lg-none">');
− $('body').append('');
−
− $(document).on('click', '.mobile-nav-toggle', function(e) {
− $('body').toggleClass('mobile-nav-active');
− $('.mobile-nav-toggle i').toggleClass('fa-times fa-bars');
− $('.mobile-nav-overly').toggle();
− });
− $(document).on('click', '.mobile-nav .drop-down > a', function(e) {
− e.preventDefault();
− $(this).next().slideToggle(300);
154
− $(this).parent().toggleClass('active');
− });
−
− $(document).click(function(e) {
− var container = $(".mobile-nav, .mobile-nav-toggle");
− if (!container.is(e.target) && container.has(e.target).length === 0) {
− if ($('body').hasClass('mobile-nav-active')) {
− $('body').removeClass('mobile-nav-active');
− $('.mobile-nav-toggle i').toggleClass('fa-times fa-bars');
− $('.mobile-nav-overly').fadeOut();
− }
− }
− });
− } else if ($(".mobile-nav, .mobile-nav-toggle").length) {
− $(".mobile-nav, .mobile-nav-toggle").hide();
− }
155
KẾT LUẬN
1. Mức độ hoàn thành
− Chọn đề tài, phân tích đề tài, tìm hiểu thực tế:
+ Đã gặp giáo viên và trao đổi, nhận đề tài.
+ Phân tích về đề tài ở chương 1 của tài liệu này.
+ Đã khảo sát thực tế các trang web ở chương 2 mục 7 của tài
liệu này.
− Thiết kế giao diện trang web:
+ Đã có trang chủ với các chức năng: Xem bài đăng, Tìm
kiếm sản phẩm, Gửi yêu cầu nhận báo giá.
+ Đã có giao diện các chi tiết bài đăng trong đó bài đăng chi
tiết về sản phẩm có chức năng nhận xét.
+ Đã có giao diện các mục danh sách bài đăng trong đó bài
đăng về danh sách sản phẩm chức năng lọc sản phẩm.
+ Đã có giao diện trang thông báo Not Found.
+ Đã có giao diện trang Đăng nhập/Đăng xuất.
+ Đã có giao diện trang Admin sau khi Đăng nhập.
+ Đã có các giao diện quản lý thông tin bài đăng trên trang
Admin.
+ Đã có giao diện trang Admin quản lý tài khoản và nhận danh
sách yêu cầu báo giá.
+ Đã có thể tương thích trên nhiều thiết bị khác nhau.
− Tạo và thiết kế cơ sở dữ liệu:
+ Đã có lược đồ cơ sở dữ liệu và database.
+ Đã tạo lược đồ usecase và chi tiết các usecase.
156
− Phần code:
+ Hoàn thành đăng tin, xử lý hình ảnh trong đăng tin.
+ Hoàn thành xem bài đăng, hiệu ứng hoạt hình, multi-slide
trong bài đăng và phân trang cho mục danh sách.
+ Hoàn thành hiển thị chi tiết bài đăng.
+ Đăng nhập thành công với authentication.
+ Hoàn thành Chức năng tìm kiếm sử dụng Ajax, chức năng
lọc dữ liệu.
+ Hoàn thành chức năng gửi yêu cầu nhận báo giá, chức năng
nhận xét.
+ Hoàn thành quản lí bài đăng, quản lý tài khoản, thông báo
số yêu cầu từ khách hàng chưa đọc, hiển thị danh sách các
yêu cầu.
− Cho dữ liệu vào Database:
+ Đã thêm dữ liệu vào database.
+ Đã chạy thử ra phần giao diện ở trang chủ và trang đăng tin.
− Mức độ hoàn thành:100%
2. Các khó khăn gặp phải
− Sử dụng công nghệ cho ứng dụng còn chưa thành thạo.
− Phải dành nhiều thời gian tìm hiểu về công nghệ.
3. Ưu, Nhược điểm của website
− Ưu điểm:
+ Có tính năng nhận thông báo yêu cầu từ khách hàng.
+ Đăng tin, sữa tin một cách dễ dàng dành cho Admin.
+ Xem tin dễ dàng khi vừa truy cập trang web.
157
+ Giao diện bắt mắt, đơn giản tạo cảm giác thoải mái cho
người xem.
+ Có tính năng gợi ý tìm kiếm sản phẩm cho người dùng.
+ Có khả năng lọc sản phẩm thuộc nhiều loại cùng một lúc.
+ Gửi yêu cầu nhận báo giá đến công ty một cách nhanh
chóng.
+ Tích hợp google map trong phần liên hệ với công ty.
− Nhược điểm:
+ Nội dung cho website còn chưa được nhiều.
+ Chưa có hộp chat trực tuyến giữa khách hàng với công ty.
4. Ý tưởng phát triển
− Xây hộp chat trực tuyến giữa khách hàng với công ty.
− Phát triển thêm nhiều nội dung cho website.
158
TÀI LIỆU THAM KHẢO
Tài liệu tiếng việt
Tài liệu từ internet
1. Văn Giang. Bootstrap là gì? Vì sao nên sử dụng Bootstrap?, ngày 2
tháng 5 năm 2020,
https://tech.bizflycloud.vn/bootstrap-la-gi-vi-sao-nen-su-dung-
bootstrap-20181123141649382
2. Nguyễn Thị Thu Hà. Tìm hiểu cơ bản về HTML và CSS, ngày 2 tháng
5 năm 2020,
https://viblo.asia/p/tim-hieu-ve-html-va-css-co-ban-phan-1-
7ymwGXV0R4p1
3. Nguyễn Hiền. PHP là gì? Tổng quan về ngôn ngữ PHP, ngày 2 tháng
5 năm 2020,
https://toidayhoc.com/lap-trinh/php-la-gi-tong-quan-ve-ngon-ngu-
php/
4. Đào Quang Huy. Giới thiệu về Laravel, ngày 2 tháng 5 năm 2020,
https://viblo.asia/p/gioi-thieu-ve-laravel-924lJrnzlPM
5. Bá Huỳnh. TOP 5 hình thức marketing online hiệu quả nhất năm
2019, ngày 2 tháng 5 năm 2020,
https://crmviet.vn/cac-hinh-thuc-marketing-online-pho-bien-nhat-
nam-2018/
6. Nguyễn Nhật. JQuery là gì? Vì sao nên sử dụng JQuery?, ngày 2
tháng năm 2020,
https://topdev.vn/blog/jquery-la-gi/
7. Thành Phú. JavaScript là gì? Vài trò của JavaScript trên website, ngày
2 tháng 5 năm 2020,
159
https://quantrimang.com/javascript-la-gi-155978
8. Phạm Thạch. CSS là gì? Vai trò của nó trên website, ngày 2 tháng 5
năm 2020,
https://thachpham.com/web-development/html-css/css-la-gi-va-vai-
tro.html
9. Lê Thảo. Ajax là gì? Cách thức hoạt động và lợi ích mang lại, ngày 2
tháng 5 năm 2020,
https://topdev.vn/blog/ajax-la-gi-cach-thuc-hoat-dong-va-loi-ich-
ma-no-mang-lai/
10. Nguyễn Việt. Ngôn ngữ HTML là gì? Vai trò của HTML trong lập
trình web?, ngày 2 tháng 5 năm 2020,
https://blog.webico.vn/ngon-ngu-html-la-gi-vai-tro-cua-html-trong-
lap-trinh-web/
11. VNETWORK. Các số liệu thống kê Internet Việt Nam 2019, ngày 2
tháng 5 năm 2020,
https://vnetwork.vn/news/cac-so-lieu-thong-ke-internet-viet-nam-
2019
160
Các file đính kèm theo tài liệu này:
- de_tai_thiet_ke_va_lap_trinh_website.pdf