Giáo Trình Phát Triển Ứng Dụng Web Dành Cho Sinh Viên

Khám phá giáo trình phát triển ứng dụng web, cung cấp kiến thức và kỹ năng cần thiết để xây dựng ứng dụng hiệu quả và chuyên nghiệp.

Chuyên ngành

Công Nghệ Thông Tin

Người đăng

Ẩn danh

Thể loại

Giáo Trình

2019

225
2
0

Phí lưu trữ

55 Point

Mục lục chi tiết

1. CHƯƠNG 1: MỞ ĐẦU

1.1. Giới thiệu cơ bản

1.2. Website động là gì?

1.3. Tại sao cần dùng PHP?

1.4. Cách làm việc của PHP. Bạn cần những gì để xây dựng một Website viết bằng PHP & MySQL

1.5. Ứng dụng máy chủ Web Server WAMP làm môi trường để xây dựng Website viết bằng PHP & MySQL

1.6. Các đặc điểm nổi trội của WAMP. Download bản cài đặt WAMP

1.7. Các bước cài đặt WAMP

1.8. Hoàn tất việc cài đặt và chạy thử

1.9. Câu hỏi ôn tập chương 1

2. CHƯƠNG 2: NGÔN NGỮ LẬP TRÌNH PHP

2.1. Nhúng PHP vào trang HTML

2.2. Nhúng mã PHP trong HTML

2.3. Ghi chú trong PHP. Khái niệm về cú pháp PHP

2.4. Khái niệm và cú pháp khai báo

2.5. Tầm hoạt động của biến

2.6. Các biến đã được định nghĩa trước. Chuyển đổi kiểu dữ liệu của biến

2.7. Các kiểu dữ liệu trong PHP

2.8. Kiểu số thực (floats, doubles hay real numbers)

2.9. Hằng trong PHP

2.10. Toán tử trong PHP

2.11. Các phép toán số học

2.12. Các phép toán về chuỗi

2.13. Phép toán gán kết hợp

2.14. Phép toán so sánh

2.15. Kiểu Date-Time

2.16. Cấu trúc điều khiển trong PHP

2.17. Cấu trúc if…elseif…else

2.18. Cấu trúc switch

2.19. Vòng lặp for

2.20. Vòng lặp while

2.21. Vòng lặp do…while. Thoát khỏi cấu trúc điều khiển

2.22. Tương tác với Server bằng Form

2.23. Lấy dữ liệu từ form khi click nút submit với phương thức post

2.24. Lấy dữ liệu từ form khi click nút submit với phương thức get

2.25. Đối tượng session và cookie

2.25.1. Đối tượng session

2.25.2. Đối tượng cookie

2.26. Tận dụng mã nguồn có sẵn bằng cách include file

2.27. Một số ví dụ minh họa

2.28. Câu hỏi ôn tập chương 2

3. CHƯƠNG 3: CƠ SỞ DỮ LIỆU MySQL

3.1. Giới thiệu cơ sở dữ liệu MySQL

3.2. Kiểu dữ liệu trong MySQL

3.2.1. Kiểu dữ liệu Numeric

3.2.2. Kiểu dữ liệu Date and Time

3.2.3. Kiểu dữ liệu String

3.3. Các phát biểu SQL. Sử dụng phpMyAdmin để quản trị MySQL

3.3.1. Tổng quan về phpMyAdmin

3.3.2. Cài đặt phpMyAdmin

3.3.3. Khởi động phpMyAdmin

3.3.4. Phân quyền và nhóm người sử dụng

3.4. Làm việc với Cơ sở dữ liệu

3.4.1. Làm việc với bảng (Table)

3.5. Câu hỏi ôn tập chương 3

4. CHƯƠNG 4: KẾT HỢP PHP VÀ MySQL

4.1. Kết nối cơ sở dữ liệu. Truy vấn và hiển thị dữ liệu trong các bảng

4.2. Hiển thị dạng lưới (table)

4.3. Hiển thị dạng lưới định dạng. Hiển thị dạng lưới có phân trang

4.4. Hiển thị dưới dạng list đơn giản

4.5. Hiển thị list dạng cột

4.6. Hiển thị list dạng cột có link

4.7. Hiển thị list chi tiết có phân trang

4.8. Tìm kiếm dữ liệu

4.9. Tìm kiếm nâng cao

4.10. Thêm mới dữ liệu

4.11. Cập nhật và xóa dữ liệu

4.12. Một số ví dụ minh họa

4.13. Câu hỏi ôn tập chương 4

5. CHƯƠNG 5: HỆ QUẢN TRỊ NỘI DUNG MÃ NGUỒN MỞ JOOMLA

5.1. Tổng quan về hệ quản trị nội dung mã nguồn mở (CMS)

5.2. Giới thiệu về Joomla

5.3. Khái niệm Joomla

5.4. Vài nét về lịch sử phát triển Joomla

5.5. Các dòng phiên bản của Joomla

5.6. Kiến trúc của Joomla

5.7. Đối với người sử dụng cuối

5.8. Ứng dụng của Joomla

5.9. Một số khái niệm trong Joomla

5.9.1. Front-end và Back-end

5.9.2. Các thành phần mở rộng (Extension)

5.10. Quản lý nội dung Site

5.11. Cài đặt Joomla

5.11.1. Các bước cài đặt

5.11.2. Mở ứng dụng Website trên trình duyệt. Đăng nhập vào trang quản trị ứng dụng Website

5.12. Quản trị Joomla

5.12.1. Cấu hình tổng thể (Global Configuration)

5.12.2. Quản lý người dùng

5.12.3. Việt hóa Joomla bằng cách cài đặt gói ngôn ngữ tiếng Việt

5.12.4. Thay đổi Template cho Website. Tạo nội dung cho Website (Section, Category, Content Item)

5.12.5. Cài đặt Component, Module, Plugin

5.12.6. Một số thao tác với Main Menu

5.13. Bảo mật trong Joomla

5.13.1. Khái niệm về bảo mật

5.13.2. Tại sao phải bảo mật?

5.13.3. Các phương pháp bảo mật

5.14. Câu hỏi ôn tập chương 5

TÀI LIỆU THAM KHẢO

LỜI NÓI ĐẦU

Tóm tắt

I. Hướng Dẫn Phát Triển Ứng Dụng Web Hiệu Quả

Phát triển ứng dụng web hiệu quả là một trong những yếu tố quan trọng trong thời đại công nghệ số. Việc xây dựng một ứng dụng web không chỉ đơn thuần là lập trình mà còn bao gồm việc tối ưu hóa hiệu suất, bảo mật và trải nghiệm người dùng. Để đạt được điều này, cần có một quy trình phát triển rõ ràng và các công nghệ phù hợp.

1.1. Tổng Quan Về Phát Triển Ứng Dụng Web

Phát triển ứng dụng web bao gồm nhiều giai đoạn từ lên ý tưởng, thiết kế giao diện đến lập trình và triển khai. Các công nghệ như HTML, CSS, JavaScript và PHP thường được sử dụng để xây dựng ứng dụng web động.

1.2. Tại Sao Cần Phát Triển Ứng Dụng Web Động

Ứng dụng web động cho phép người dùng tương tác và nhận thông tin theo thời gian thực. Điều này giúp cải thiện trải nghiệm người dùng và tăng cường khả năng quản lý nội dung.

II. Các Thách Thức Trong Phát Triển Ứng Dụng Web

Trong quá trình phát triển ứng dụng web, có nhiều thách thức cần phải vượt qua. Những thách thức này bao gồm hiệu suất, bảo mật và khả năng mở rộng. Việc không chú ý đến những vấn đề này có thể dẫn đến sự thất bại trong việc thu hút và giữ chân người dùng.

2.1. Vấn Đề Về Hiệu Suất Ứng Dụng Web

Hiệu suất của ứng dụng web ảnh hưởng trực tiếp đến trải nghiệm người dùng. Các yếu tố như tốc độ tải trang và khả năng xử lý yêu cầu cần được tối ưu hóa để đảm bảo ứng dụng hoạt động mượt mà.

2.2. Bảo Mật Trong Phát Triển Ứng Dụng Web

Bảo mật là một trong những yếu tố quan trọng nhất trong phát triển ứng dụng web. Các lỗ hổng bảo mật có thể dẫn đến việc mất dữ liệu và ảnh hưởng đến uy tín của doanh nghiệp.

III. Phương Pháp Tối Ưu Hóa Hiệu Suất Ứng Dụng Web

Để tối ưu hóa hiệu suất ứng dụng web, có nhiều phương pháp có thể áp dụng. Việc sử dụng các công nghệ hiện đại và tối ưu hóa mã nguồn là rất cần thiết để cải thiện tốc độ và hiệu suất tổng thể.

3.1. Sử Dụng Công Nghệ Web Hiện Đại

Các công nghệ như HTML5, CSS3 và JavaScript ES6 giúp cải thiện hiệu suất và khả năng tương tác của ứng dụng web. Việc áp dụng các framework như React hoặc Angular cũng mang lại nhiều lợi ích.

3.2. Tối Ưu Hóa Mã Nguồn

Tối ưu hóa mã nguồn giúp giảm thiểu thời gian tải trang. Việc sử dụng các công cụ như minify và bundle giúp giảm kích thước tệp và tăng tốc độ tải.

IV. Quy Trình Phát Triển Ứng Dụng Web Hiệu Quả

Quy trình phát triển ứng dụng web bao gồm nhiều bước từ lập kế hoạch, thiết kế, phát triển đến kiểm thử và triển khai. Mỗi bước đều cần được thực hiện một cách cẩn thận để đảm bảo chất lượng sản phẩm cuối cùng.

4.1. Lập Kế Hoạch Phát Triển

Lập kế hoạch phát triển là bước đầu tiên và quan trọng nhất. Cần xác định rõ mục tiêu, đối tượng người dùng và các tính năng cần thiết cho ứng dụng.

4.2. Thiết Kế Giao Diện Người Dùng

Thiết kế giao diện người dùng cần phải thân thiện và dễ sử dụng. Việc sử dụng các nguyên tắc thiết kế UX/UI sẽ giúp cải thiện trải nghiệm người dùng.

V. Ứng Dụng Thực Tiễn Của Phát Triển Ứng Dụng Web

Phát triển ứng dụng web không chỉ dừng lại ở lý thuyết mà còn có nhiều ứng dụng thực tiễn trong đời sống. Các doanh nghiệp hiện nay đều cần có một ứng dụng web để phục vụ khách hàng và quản lý nội dung.

5.1. Ứng Dụng Trong Doanh Nghiệp

Nhiều doanh nghiệp sử dụng ứng dụng web để quản lý thông tin, bán hàng trực tuyến và tương tác với khách hàng. Điều này giúp tăng cường hiệu quả kinh doanh.

5.2. Ứng Dụng Trong Giáo Dục

Trong giáo dục, ứng dụng web được sử dụng để tạo ra các nền tảng học tập trực tuyến, giúp học sinh và sinh viên tiếp cận kiến thức một cách dễ dàng.

VI. Kết Luận Về Tương Lai Của Phát Triển Ứng Dụng Web

Tương lai của phát triển ứng dụng web rất hứa hẹn với sự phát triển không ngừng của công nghệ. Các xu hướng như trí tuệ nhân tạo và học máy sẽ tiếp tục định hình cách thức phát triển ứng dụng web.

6.1. Xu Hướng Công Nghệ Mới

Các công nghệ mới như AI và machine learning sẽ được tích hợp vào ứng dụng web, giúp cải thiện trải nghiệm người dùng và tối ưu hóa quy trình làm việc.

6.2. Tương Lai Của Giao Diện Người Dùng

Giao diện người dùng sẽ ngày càng trở nên thông minh và tương tác hơn, mang lại trải nghiệm tốt hơn cho người dùng.

25/07/2025

Trích đoạn nội dung tài liệu

chương 1 1. Hãy kể ra một số công nghệ thường được dùng để thiết kế Website động. Để tạo một ứng dụng Website bằng PHP & MySQL bạn cần những công cụ gì? 18 Chương 2: Ngôn ngữ lập trình PHP CHƯƠNG 2: NGÔN NGỮ LẬP TRÌNH PHP 2. Nhúng PHP vào trang HTML 2.

Nhúng mã PHP trong HTML Một file PHP thường bao gồm các thẻ Html, giống như một file Html, và thêm một số mã kịch bản PHP. * Thẻ PHP Có 4 loại khác nhau của thẻ PHP bạn có thể sử dụng khi thiết kế trang PHP. Muốn sử dụng thẻ nào bạn phải cấu hình trong tập tin php.ini nằm trong thư mục có đường dẫn là C:\Windows. - Kiểu định dạng XML: Thẻ này có thể sử dụng với văn bản định dạng XML, nếu bạn lập trình PHP có ý định sử dụng với XML trong Web site, bạn cần phải khai báo thẻ PHP trong trang PHP như: <?php Mã PHP ?> Để sử dụng cặp thẻ <?php và ?>, bạn cần phải cấu hình phát biểu short_open_tag=Off trong file php.

Cấu hình này là mặc định trong file php.ini khi cài đặt Server WAMP.1: Chúng ta sẽ hiển thị một dòng văn bản “Welcome to PHP” trên trình duyệt bằng một file PHP (first.php là file được định dạng theo kiểu XML) đơn giản sau: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Welcome to PHP Server Script</title> </head> <body> <?php echo "Welcome to PHP"; ?> </body> </html> - Đặt tập tin first.php vào máy chủ Web (C:\wamp\www) - Mở trình duyệt, gõ vào địa chỉ sau: http://localhost/first.php, kết quả hiển thị như hình 2.1: 19 Chương 2: Ngôn ngữ lập trình PHP Hình 2.1: Hiển thị dòng văn bản bằng cặp thẻ <?php … ?> Chú ý: i) Có thể sử dụng dấu nháy đơn, hoặc dấu nháy kép trong dòng lệnh echo "Welcome to PHP" đều được. ii) PHP là ngôn ngữ không phân biệt chữ hoa và chữ thường, nên sử dụng mã lệnh ECHO(), echo(), hoặc Echo(),… đều được. iii) Mỗi dòng lệnh trong PHP đều phải được kết thúc bởi dấu chấm phẩy (;) iv) Có thể sử dụng hàm echo() để gửi mã lệnh HTML đến trình duyệt Web. Ví dụ: echo ‘<b>Hello world</b>’ - Kiểu Short: Thẻ này được sử dụng với văn bản không theo định dạng XML, khai báo như sau: <? Mã PHP ?> Để sử dụng cặp thẻ <? và ?>, bạn cần phải cấu hình phát biểu short_open_tag=On trong file php.2: Chúng ta sẽ hiển thị một dòng văn bản “Welcome to PHP” trên trình duyệt bằng một file PHP (second.php là file không được định dạng theo kiểu XML) đơn giản sau: <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <TITLE>Welcome to PHP Server Script</TITLE> </HEAD> <BODY> <? echo "Welcome to PHP"; ?> </BODY> </HTML> - Đặt tập tin first.php vào máy chủ Web (C:\wamp\www) - Mở trình duyệt, gõ vào địa chỉ sau: http://localhost/first.php, kết quả hiển thị như hình 2.2: Hiển thị dòng văn bản bằng cặp thẻ <? … ?> - Kiểu Script: Trong trường hợp bạn sử dụng PHP như một script tương tự như khai báo JavaScript hay VBScript, bạn có thể khai báo như sau: <script language=’PHP’> 20 Chương 2: Ngôn ngữ lập trình PHP Echo “PHP Script”; </script> - Kiểu ASP: Trong trường hợp bạn khai báo thẻ PHP như một phần trong trang ASP, thẻ này được sử dụng khi bạn cho phép chúng bằng cách cấu hình (asp_tags) trong tập tin php.ini, cú pháp của thẻ như sau <% Echo “PHP Script”; %> Mặt khác, nếu bạn cho phép viết mã nguồn trong trang PHP tương tự như cách viết script trong ASP, bạn có thể cấu hình lại phát biểu asp_tags (giá trị mặc định của phát biểu này Off) như sau: Allow ASP-style <%%> tags asp_tags = On 2.

Ghi chú trong PHP Ghi chú (Comments) trong lập trình PHP cũng tương tự như trong lập trình Perl, C, C++ và CGI, để Comment một đoạn chương trình (nhiều dòng), bạn có thể khai báo như sau: /* Author: Nguyen Nguyen Ngoc Last modifyed: May 12 2008 This is PHP script */ Lưu ý: Comment không cho phép khai báo Comment con bên trong. Ngoài ra, nếu bạn chỉ muốn Comment một dòng, bạn có thể sử dụng kiểu Comment của C hay Java như sau: //echo “SaigonInfotech”; Tuy nhiên, bạn cũng có thể Comment một dòng, theo kiểu Comment như trong lập trình Perl. Khái niệm về cú pháp PHP Cú pháp PHP chính là cú pháp trong ngôn ngữ C, các bạn làm quen với ngôn ngữ C thì có lợi thế trong lập trình PHP. Để lập trình bằng ngôn ngữ PHP cần chú ý những điểm sau: - Cuối câu lệnh có dấu chấm phẩy ; - Biến trong PHP có tiền tố là $ (ví dụ: $name) - Mỗi phương thức đều bắt đầu { và đóng bằng dấu } - Khi khai báo biến thì không có kiểu dữ liệu.

- Nên có giá trị khởi đầu cho biến khai báo. - Phải có ghi chú (comment) cho mỗi feature mới. - Sử dụng dấu // hoặc # để giải thích cho mỗi câu ghi chú. - Sử dụng /* và */ cho mỗi đoạn ghi chú.

- Khai báo biến có phân biệt chữ hoa hay thường (tức là $a sẽ khác $A). Biến là gì? 21 Chương 2: Ngôn ngữ lập trình PHP 2. Khái niệm và cú pháp khai báo Biến được xem như một thành phần dùng để lưu trữ tạm thời các giá trị. Các giá trị này có thể là số, văn bản hoặc các dạng dữ liệu phức tạp khác.

Biến tồn tại như “linh hồn” của nhiều ngôn ngữ lập trình và nắm vững về nó là chìa khóa cho việc sử dụng PHP. Theo tài liệu của PHP, có tám dạng biến trong ngôn ngữ này: Bốn kiểu dữ liệu đơn là Boolean (true và false), số nguyên, chấm phẩy động (thập phân) và chuỗi (văn bản). Hai kiểu dữ liệu đa trị là mảng và đối tượng. Cuối cùng là kiểu dữ liệu tài nguyên (được sử dụng khi tương tác với cơ sở dữ liệu) và NULL (một biến đặc biệt không có giá trị).

Cho dù kiểu dữ liệu bạn tạo ra là gì thì các biến trong PHP cũng tuân theo các quy tắc nhất định: Bất chấp kiểu dữ liệu, các biến trong PHP luôn tuân theo các quy tắc nhất định sau: - Tên biến phải bắt đầu với một dấu đô la ($), ví dụ: $name. - Tên biến có thể chứa các chuỗi, con số và dấu gạch dưới, ví dụ: $my_report1. - Ký tự đầu tiên sau dấu $ không thể là số (phải là chữ cái hoặc dấu gạch dưới). - Các tên biến trong PHP có phân biệt chữ hoa và chữ thường.

Ví dụ: $name và $Name là 2 biến hoàn toàn khác nhau. - Các biến có thể được gán giá trị bằng cách sử dụng dấu bằng (=). Xuất phát từ những điều ở trên, khai báo biến trong PHP như sau: $variablename [=initial value]; Một số ví dụ về biến: <? $a=100; //biến a ở đây có giá trị là 100 $a="PHP is easy" //biến a ở đây có giá trị "PHP is easy" biena=123; //có lỗi vì bắt đầu 1 biến phải có dấu $ $123a="PHP" //có lỗi vì phần tên bắt đầu của biến là dạng số.3: Sẽ gán chuỗi “Hello World” cho biến $txt <HTML> <HEAD> <TITLE>Welcome to PHP Server Script</TITLE> </HEAD> <BODY> <? $txt="Hello World"; echo $txt; ?> </BODY> </HTML> Kết quả chạy trên trình duyệt 22 Chương 2: Ngôn ngữ lập trình PHP Hình 2.3: Khởi tạo và gán giá trị cho biến kiểu chuỗi Chú ý: Để nối hai hay nhiều biến lại với nhau, sử dụng dấu chấm (.4: Sử dụng dấu chấm để nối 2 biến $txt1 và $txt2. <HTML> <HEAD> <TITLE>Welcome to PHP Server Script</TITLE> </HEAD> <BODY> <? $txt1="Hello World"; $txt2="1234"; echo $txt1.

$txt2; ?> </BODY> </HTML> Kết quả chạy trên trình duyệt Hình 2.4: Sử dụng dấu chấm để nối 2 chuỗi 2. Tầm hoạt động của biến Xét về tầm hoạt động của biến thì ta có 3 loại: - Biến cục bộ: Biến bạn khai báo trong một hàm thì sẽ chỉ có giá trị bên trong hàm đó. - Biến toàn cục: Các biến bạn khai báo và sử dụng ở bên ngoài tất cả các hàm thì sẽ bị ẩn một cách mặc định trong các hàm. Tuy nhiên vẫn có thể sử dụng các biến toàn cục trong hàm bằng cách sau: <HTML> <HEAD> <TITLE>::Welcome to PHP</TITLE> </HEAD> 23 Chương 2: Ngôn ngữ lập trình PHP <BODY> <?php $s="This is a global variable"; function echoOut() { // Cách 1 global $s; echo $s; // Cách 2 echo $_GLOBALS['s']; } ?> </BODY> </HTML> 2.

Các biến đã được định nghĩa trước PHP cung cấp cho chúng ta khá nhiều biến đưa thông tin về môi trường làm việc. Đa số đều là các mảng “siêu” toàn cục (có thể dùng mọi lúc, mọi nơi). - $_GLOBALS: Mảng này chứa tất cả các biến toàn cục đang tồn tại. - $_SERVER: Mảng này chứa thông tin về ngữ cảnh mà đoạn mã đang chạy, như là tên server, tên file đang chạy, thông tin về kết nối,… - $_GET & $_POST: Hai mảng này chứa thông tin được gửi đến server qua các form HTML tương ứng (tương ứng với phương thức GET và POST).

- $_SESSION & $_COOKIE: 2 mảng này chứa các thông tin về phiên làm việc của cookie của client. - $_REQUEST: Chứa thông tin của $_GET, $_POST và $_SESSION. - $_ENV: Chứa các biến môi trường mà engine PHP đang chạy. Chuyển đổi kiểu dữ liệu của biến Có 2 cách cơ bản để chuyển từ kiểu dữ liệu này sang kiểu dữ liệu khác trong PHP.

a) Chuyển đổi toàn vẹn (Implicit Type Conversions) Đó là cách phổ biến nhất trong việc chuyển kiểu dữ liệu mà bạn thấy, thật ra, đó là do PHP tự động làm cho bạn. Nghĩa là thay vì tự bạn yêu cầu một kiểu dữ liệu xác định, PHP tự quyết định xem đó là kiểu dữ liệu gì cho chúng ta.  Đó là các chuyển đổi sau: - Các phép tính có toán tử: Nếu PHP nhận thấy một phép toán giữa số nguyên và số phức, thì kết quả nó trả về là số phức. Nếu một chuỗi cộng với một số bất kỳ, PHP sẽ cố chuyển chuỗi đó sang dạng số trước khi làm phép cộng với số đã cho.

<?php echo "5"+2; //Kết qủa là 7 ?> - Các biểu thức boolean: Được dùng khi PHP thấy một biểu thức phải phát sinh ra kết quả boolean. Khi đó, nó sẽ được tự chuyển sang boolean trước khi tiếp tục. b) Chuyển đổi không toàn vẹn (Explicit Type Conversions) Trong trường hợp này, PHP không chuyển đổi một cách thông thường, bạn phải quyết định xem kiểu dữ liệu nào bạn muốn có. Hãy xem xét ví dụ này: 24 Chương 2: Ngôn ngữ lập trình PHP <?php $doubleNumber=10.5; echo ("We have a doubleNumber:"."<br>"); //Kết quả là 10.5 $intNumber=(int)$doubleNumber; echo ("Now, it is integer:".$intNumber); //Kết quả là 10 ?> Rõ ràng, cách chuyển đổi kiểu dữ liệu này không giữ nguyên tính toàn vẹn của dữ liệu của chúng ta (từ 10.5, chúng ta chỉ còn 10 khi chuyển từ dạng số phức sang dạng số nguyên).

Nội dung được bảo vệ bản quyền — Tải xuống đầy đủ