1. Trang chủ
  2. » Luận Văn - Báo Cáo

Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường

78 393 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 78
Dung lượng 2,23 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường

Trang 1

Cô giáo Th.S Nguyễn Thị Mai Phương đã tận tình hướng dẫn, giúp đỡ emtrong quá trình làm báo cáo thực tập Cô luôn nhắc nhở, chỉ bảo, động viên mỗikhi em gặp khó khăn.

Em xin gửi lời cảm ơn tới gia đình, bạn bè đã động viên, giúp đỡ em trongthời gian học tập và làm đề tài thực tập này

Do thời gian thực tập có hạn, kiến thức và kinh nghiệm của em còn hạnchế Vì vậy trong báo cáo không thể tránh khỏi những khuyết điểm và thiếu sót

Em rất mong nhận được sự chỉ bảo của thầy cô, sự góp ý của bạn bè để đề tàiđược hoàn thiện hơn, có khả năng ứng dụng trong thực tế

Em xin chân thành cảm ơn !

Thái Nguyên, ngày 29 tháng 08 năm 2012

Sinh viên thực hiện

Trang 2

MỤC LỤC

LỜI CẢM ƠN 1

MỤC LỤC 2

LỜI MỞ ĐẦU 2

CHƯƠNG 1 : CỞ SỞ LÝ THUYẾT 3

1.1 Tìm hiểu về PHP 4

1.1.1.Giới thiệu PHP 4

1.1.2 Biến, hằng số, và kiểu dữ liệu trong PHP 6

1.1.3 Các toán tử 9

1.1.4 Các câu lệnh điều khiển 11

1.1.5 Hàm trong PHP 15

1.1.6 Biến mảng trong PHP 16

1.1.7 Lập trình hướng đối tượng (OOP) 19

1.2 Tìm hiểu về MySQL 22

1.2.1 Giới thiệu về MySQL 22

1.2.2 Các hàm cơ bản làm việc với cơ sở dữ liệu MySQL 22

1.3 Tìm hiểu về Joomla 29

1.3.1 Giới thiệu về Joomla 29

1.3.2 Giao diện và các thành phần cơ bản của Joomla 33

1.3.3 Ứng dụng của Joomla 38

CHƯƠNG 2: KHẢO SÁT, PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG 40

2.1 Khảo sát hiện trạng 40

2.1.1 sự hình thành và phát triển 40

2.1.2 Lĩnh vực hoạt động kinh doanh 40

2.2 Khảo sát quy trình tác nghiệp 41

2.3 Xác định các tác nhân và ca sử dụng 42

2.4 Phân tích hệ thống 43

2.4.1 Biểu đồ USER CASE 43

2.4.2 Đặc tả chi tiết từng ca sử dụng 44

2.4.3 Sơ đồ lớp thực thể 67

2.5 Chi tiết các bảng dữ liệu 69

CHƯƠNG 3: XÂY DỰNG WEBSITE 72

3.1 Trang chủ 72

3.2 Tin công nghệ 72

3.3 Tin khuyến mãi 73

3.4 Tin công ty 74

3.5 Sản phẩm 74

3.6 Chi tiêt tin tức 75

3.7 Chi tiết sản phẩm 76

3.8 Thêm bài viết 76

3.9 Thêm sản phẩm 77

KẾT LUẬN 77

Trang 3

LỜI MỞ ĐẦU

Trong sự phát triển không ngừng của xã hội thì nhu cầu của con người vềcuộc sống ngày càng cao.Từ ý nghĩa thực tế đó mà đã nảy sinh ra nhiều loại hìnhdịch vụ để phần nào đáp ứng được những nhu cầu thiết yếu của con người Cácdịch vụ đó đa dạng về nhiều mặt với nhiều cách đáp ứng khác nhau Và một loạihình dịch vụ khá phổ biến hiện nay đó là giới thiệu sản phẩm qua mạng

Hiện nay các công ty tin học hàng đầu thế giới không ngừng đầu tư cảithiện các giải pháp cũng như các sản phẩm nhằm cho phép tiến hành thương mạihóa trên Internet Ở Viêt Nam cũng có rất nhiều doanh nghiệp đang tiến hànhthương mại hóa trên internet, nhưng do khó khăn về cơ sở hạ tầng viễn thông vẫnchưa phát triển mạnh, các dịch vụ thanh toán điện tử qua ngân hàng chưa phổbiến nên chỉ dừng lại ở mức độ giới thiệu sản phẩm và tiếp nhận đơn đặt hàngthông qua trang web

Là một sinh viên ngành công nghệ thông tin, sau một thời gian thực tập, dưới sựhướng dẫn tận tình của cô Nguyễn thị Mai Phương em đã thu được một số kết quả Sauđây em xin báo cáo kết quả đã thu thập được trong thời gian vừa qua

Trang 4

 Cộng đồng hỗ trợ, chia sẽ kinh nghiệm của PHP cũng rất dồi dào Với rấtnhiều diễn đàn, blog trong và ngoài nước nói về PHP đã khiến cho quá trìnhtiếp cận của người tìm hiểu PHP được rút ngắn nhanh chóng.

Thư viện phong phú:

Trang 5

 Ngoài sự hỗ trợ của cộng đồng, thư viện script PHP cũng rất phong phú và

đa dạng Từ những cái rất nhỏ như chỉ là 1 đoạn code, 1 hàm (PHP.net…) chotới những cái lớn hơn như Framework (Zend, CakePHP, CogeIgniter,

Symfony…) ,ứng dụng hoàn chỉnh (Joomla, Wordpress, PhpBB…)

 Với thư viện code phong phú, việc học tập và ứng dụng PHP trở nên rất dễdàng và nhanh chóng Đây cũng chính là đặc điểm khiến PHP trở nên khá nổi bật và cũng là nguyên nhân vì sao ngày càng có nhiều người sử dụng PHP để phát triển web

Hỗ trợ kết nối nhiều hệ cơ sở dữ liệu:

 Nhu cầu xây dựng web có sử dụng cơ sở dữ liệu là một nhu cầu tất yếu vàPHP cũng đáp ứng rất tốt nhu cầu này Với việc tích hợp sẵn nhiều DatabaseClient trong PHP đã làm cho ứng dụng PHP dễ dàng kết nối tới các hệ cơ sở

dữ liệu thông dụng

 Việc cập nhật và nâng cấp các Database Client đơn giản chỉ là việc thaythế các Extension của PHP để phù hợp với hệ cơ sở dữ liệu mà PHP sẽ làmviệc

 Một số hệ cơ sở dữ liệu thông dụng mà PHP có thể làm việc là: MySQL,

MS SQL, Oracle, Cassandra…

Lập trình hướng đối tượng:

 Ngày nay, khái niệm lập trình hướng đối tượng (OOP) đã không còn xa lạvới lập trình viên Với khả năng và lợi ích của mô hình lập trình này nênnhiều ngôn ngữ đã triển khai để hỗ trợ OOP

 Từ phiên bản PHP 5, PHP đã có khả năng hỗ trợ hầu hết các đặc điểm nổibật của lập trình hướng đối tượng như là Inheritance, Abstraction,Encapsulation, Polymorphism, Interface, Autoload…

 Với việc ngày càng có nhiều Framework và ứng dụng PHP viết bằng môhình OOP nên lập trình viên tiếp cận và mở rộng các ứng dụng này trở nên dễdàng và nhanh chóng

Tính bảo mật:

Trang 6

 Bản thân PHP là mã nguồn mỡ và cộng đồng phát triển rất tích cực nên cóthể nói PHP khá là an toàn.

 PHP cũng cung cấp nhiều cơ chế cho phép ta triển khai tính bảo mật choứng dụng của mình như session, các hàm filter dữ liệu, kỹ thuật ép kiểu, thưviện PDO (PHP Data Object) để tương tác với cơ sở dữ liệu an toàn hơn

 Kết hợp với các kỹ thuật bảo mật ở các tầng khác thì ứng dụng PHP sẽ trởnên chắc chắn hơn và đảm bảo hoạt động cho website

Khả năng mở rộng cho PHP:

năng mở rộng cho ứng dụng PHP có thể nói là không có giới hạn

 Với thư viện phong phú và khả năng mở rộng lớn, ứng dụng PHP có thểtương tác với hầu hết các loại ứng dụng phổ biến như xử lý hình ảnh, nén dữliệu, mã hóa, thao tác file PDF, Office, Email, Streaming…

 Ta hoàn toàn có thể tự xây dựng cho mình các Extension để tối ưu, bổsung các chức năng cho PHP cũng như tối ưu luôn Core của PHP để phục vụcho các mục đích mở rộng website của mình

1.1.2 Biến, hằng số, và kiểu dữ liệu trong PHP

Ví dụ: 2 // đây là kiểu integer

1.0// đây là kiểu double

“2” // đây là kiểu string

“2 hous” // đây là kiểu string

Trang 7

 các hằng số đã được định nghĩa trong PHP:

Để hỗ trợ người lập trình, PHP cung cấp sẵn các hằng số như: các biếnmôi trường, các biến của web server apache… người lập trình có thể sử dụnghàm phpinfo() để xem các giá trị này

– Hằng số nguyên: đây là những giá trị có kiểu integer Ví dụ: 10

– Hằng số thực: đây là những giá trị có kiểu double Ví dụ: 10.00

– Hằng kí tự: đây là một xâu kí tự được đặt trong dấu ngoặc đơn hoặckép

Ví dụ: “ngôn ngữ lập trình PHP”

c Biến và giá trị logic

 Cũng giống với C/C++, PHP không có khái niệm TRUE và FALSE

Các giá trị TRUE được hiểu là những giá trị bằng 1, và giá trị FALSE lànhững giá trị bằng 0 hoặc xâu rỗng

Trang 8

 Khi sử dụng biến chúng ta không cần khai báo kiểu.

Ví dụ: $a = 1; //$a là một biến kiểu integer

$a = 1.2 // bây giờ $a là biến kiểu double

 Nếu như thực hiện phép toán giữa biến có kiểu số và kiểu string PHP sẽcoi chuỗi là một dãy như sau:

$str = “222 B Baker Street”;

Ta thấy biến $str có kiểu string, và nếu cộng số 3 với giá trị này thì:

$x = 3 + $str; // $x = 225Khi đó $x nhận được giá tri 225 vì PHP đã cộng 3 với 3 số đầu nhưng nếu

ta in giá trị của $str thì:

Echo($str); // print:” 222 B Baker Street”

Chú ý rằng các phép toán và chuỗi chỉ đúng khi kí tự đầu là số

 Ta cũng có thể thay đổi kiểu giá trị của một biến bằng cách ép kiểu

Ví dụ: $a = 11.2;

$a = (int)$a;

 Các hàm làm việc với biến:

Gettype(): hàm này trả lại kiểu của một biến nào đó Giá trị trả về cóthể là: ”integer”, “double”, “string”,…

Settype(): hàm này ép kiểu cho một biến nào đó Nếu thành công giátrị trả về la 1, ngược lại là 0

Isset() và unset(): hàm isset() kiểm tra một biến đã được gán giá trị haychưa, hàm unset() sẽ giải phóng bộ nhớ cho một biến nào đó

Empty(): cũng giống hàm isset(), hàm empty() sẽ trả về giá trị 1(true)nếu một biến là rỗng và ngược lại 0 (false) Đối với biến có kiểu số, giá trị bằng 0được coi là rỗng

Ví dụ:

Trang 9

Echo empty($new); //true

Ta có thể viết các phép toán ngắn gon như bảng sau:

Kiểm tra $h có nhỏ hơn $ikhông

Kiểm tra $h có lớn hơn $i

Trang 10

Kiểm tra $h có nhỏ hơn hoặcbằng $i không

Kiểm tra $h có khác $i khôngKiểm tra $h có khác $i khôngCác phép so sánh thường dùng kiểm tra điều kiện trong các câu lệnh điềukhiển mà ta sẽ học ở bài sau

1010

1000

1110

0011

0101

 Các phép toán với biến kiểu string

Ta sử dụng dấu “.” để ghép 2 biến kiểu string với nhau

Để có thể chèn một biến vào trong toán hạng có kiểu string thì tên biếnphải để trong dấu đóng mở ngoặc nhọn

Echo(“${last}’s bycycles”);

 Các phép toán thao tác mức bit

Các phép toán thao tác mức bit tác động lên từng bit của toán hạng

Trang 11

& Kết quả | Kết quả ^ Kết quả

1|11|01|10|0

1110

1^11^00^10^0

0110

 Các phép toán tăng giảm:

– phép tăng: phép tăng (toán tử tăng) tăng giá trị của toán hạng lên mộtđơn vị

– phép giảm: tương tự phép tăng, khác là giá trị bị giảm đi một đơn vị.– phép toán điều kiện ?: phép toán điều kiện cùng với toán hạng tạo nênbiểu thức điều kiện

ta kí hiệu e1, e2,e3 là 3 toán hạng

Biểu thức có dạng: e1 ? e2 : e3

Nếu e1 !=0 thì giá trị của biểu thức điều kiện là e2

Nếu e1 ==0 thì giá trị của biểu thức điều kiện là e3

1.1.4 Các câu lệnh điều khiển

a Lệnh if_else: đây là lệnh rẽ nhánh có điều kiện

– Nếu biểu thức khác 0 thì câu lệnh được thực hiên

– Nếu biểu thức bằng 0 thì câu lệnh không được thực hiên

if ( biểu thức )

Trang 12

câu lệnh 1;

else

câu lệnh 2;

ý nghĩa:

– Nếu biểu thức khác 0 thì câu lệnh 1 được thực hiên

– Nếu biểu thức bằng 0 thì câu lệnh 2 được thực hiên

Trang 13

 Nếu biểu thức n = ni (I = 1,…, n) thì câu lệnh sau case ni được thực hiệncho đến khi gặp break hoặc dấu ngoặc “}”

 Nếu biểu thức n = ni (I = 1,…, n) mà có nhánh default thì các câu lệnh saudefault được thực hiện

Nếu biểu thức 2 khác 0 thì thực hiện câu lệnh và sang bước 3

Nếu biểu thức 2 bằng 0 thì kết thúc vòng for

Bước 3: tính biểu thức 3 và quay lại bước 2

 Biểu thức 1, biểu thức 2, biểu thức 3 là các thành phaanfmooix thành phần

có thể gồm nhiều biểu thức khi đó mỗi biểu thức được viết cách nhau mộtdấu phẩy (“,”)

 Các biểu thức được tính lần lượt từ trái qua phải

 Biểu thức trong biểu thức 2 quyết định thực hiện thân của for

 Có thể vắng mặt bất cứ thành phần nào Nếu vắng mặt biểu thức 2 thì câulệnh luôn được thực hiện mặc dù vắng mặt nhưng vẫn luôn phải có dấu chấmphẩy (“,”)

 Nếu vắng mặt biểu thức 1 và biểu thức 3 thì:

For (;biểu thức 2;) câu lệnh;

Tương đương với:

While(biểu thức 2) câu lệnh;

d Câu lệnh WHILE

Trang 14

Bước 2: thực hiện câu lệnh.

Quay lại bước 1

Chú ý:

 Biểu thức có thể bao gồm nhiều biểu thức khi đó biểu thức được viết cáchnhau một dấu phẩy, và được tính lần lượt từ trái qua phải biểu thức cuối cùngquyết định thực hiện câu lệnh

 không được phếp vắng mặt biểu thức

 Để tạo chu trình vô tận thì

While (1)

If (biểu thức) break;

…}

Trang 15

Lệnh do… while là lệnh tạo chu trình có điều kiện, trong đó điều kiệnthực hiện chu trình được kiểm tra ở cuối chu trình.

Hoạt động:

Bước 1: thực hiện câu lệnh

Bước 2: tính biểu thức biểu_thức

 Nếu biểu thức biểu_thức khác 0 thì quay lại bước 1

 Nếu biểu thức biểu_thức bằng 0 thì kết thúc vòng lặp

bộ thân của lệnh tạo chu trình

h Khai báo tiền sử lý include và require

Để sử dụng các đoạn mã ở bên ngoài, chúng ta có thể sử dụng khai báotiền sử lý include và require Cho phép chúng ta xây dựng các hàm, các hằng số,

và bất kỳ đoạn mã nào sau đó có thể chèn vào các đoạn script

Trang 16

 Định nghĩa hàm không nhất thiết phải nằm ngoài thân mọi hàm, trong hàm

có thể có hàm khác Nhưng việc sử dụng một hàm không khác nhau giữa xâydựng hàm trong thân một hàm và ngoài mọi hàm

 Tên hàm tùy đặt và khác tên hàm chuẩn

 Hàm có thể có giá trị trả về hoặc không

 Các câu lệnh được quyền gọi bất kỳ hàm nào đã được khai báo và đã đượcđịnh nghĩa

 Return : - Trả một giá trị về cho nơi gọi hàm

- Là nơi báo kết thúc hàm

b Gọi hàm

 Hàm phải được xây dựng trước khi gọi

 Khi gọi hàm, nếu có giá trị trả về thường được đặt trong biểu thức

c Biến toàn cục và biến cục bộ

Thông thường PHP côi các biến được sử dụng trong thân của hàm là biếncục bộ nghĩa là biến trong thân hàm không làm thay đổi giá trị của biến ở ngoàihàm đó Muốn làm thay đổi giá trị của biến ngoài ta cần khai báo global trướcbiến đó trong thân hàm

1.1.6 Biến mảng trong PHP

a Mảng một chiều

Mảng là một biến bao gồm nhiều phần tử có cùng tên nhưng khác nhau vềchỉ số (các chỉ số này tăng dần từ 0 đến n) với ngôn ngữ lập trinh C, các phần tửcủa mảng có cùng kiểu dữ liệu, nhưng với PHP thì mềm dẻo hơn Các phần tửcủa mảng không nhất thiết phải cùng kiểu

 Khai báo mảng một chiều

Ta có thể khai báo mảng bằng cách gán tên mảng với dấu đóng mở ngoặcvuông không có chỉ số

Trang 17

$mang = array(“cr”,”de”,”us”);

Để chỉ số không bắt đầu từ 0 ta có thể khai báo lại như sau

$mang = array(1 => “cr”, “de”, “us”);

Toán tử => có thể được sử dụng trước bất kỳ một phần tử nào trong mảng

Ví dụ: $mang = array(“cr”, 7 => “de”,”uk”);

Khi đó phần tử có giá trị “cr” có chỉ số là 0, còn phần tử có giá trị”de”,

“us” lần lượt là 7 và 8 khác với ngôn ngữ lập trình C, chỉ số của mảng một chiềukhông chỉ là các số nguyên mà còn là xâu kí tự

 Làm việc với các phần tử của mảng

Trang 18

Chúng ta có thể khai báo mảng 2 chiều như sau:

$mang = array (“urops” => array (“de”, “uk”), “north america” => array(“ca”, “cr”, “us”));

Echo ($mang[“europs”][1]);

Ta có cấu trúc của mảng trên như sau:

Cũng giống như mảng một chiều ta sẽ dùng vòng lặp for, while, do…while để duyệt qua các phần tử của mảng

c Các hàm sắp xếp mảng

PHP cung cấp cho chúng ta các hàm để sắp xếp mảng với mỗi loại mảng

sẽ có một hàm tương ứng Với mảng có chỉ số là kiểu nguyên chúng ta có hàmsort() sẽ sắp xếp các phần tử của mảng giảm dần

Trang 19

Với mảng có chỉ số kiểu string thì dunggf hàm asort() và rsort() thì các chỉ

số có kiểu string sẽ chuyển thành các chỉ số kiểu nguyên

Đẻ sắp xếp mảng tăng dần hay giảm dần theo chỉ số, chúng ta có hàmksort() – tăng dần và krsort() – giảm dần

1.1.7 Lập trình hướng đối tượng (OOP)

// định nghĩa các thuộc tính và phương thức// xây dựng các phương thức cho lớp

// kết thúc một lớp}

Var $sqlhost = “localhost”;

Var $sqluser = “root”;

Var $sqlpass = “password”;

Trang 20

Var $sqldb = “session”;

…// Định nghĩa các phương thức ở đây} // kết thúc định nghĩa lớp

?>

Tiếp theo chúng ta sẽ định nghĩa các phương thức cho lớp trên

Phương thức cần xây dựng đầu tiên là session(), sau đó đến các phươngthức khác

Trang 21

}}

Require(“classes/session.php”); //include class

$mysesh = new session($seshid);

<a href=”nextpage.php?seshid=<? Print $user ?>”>next page</a>

<FORM ACTION=”nextpage.php” METHOD=”post”>

<input type=”hidden” name=”seshid” value=”<? Print $seshid?>”>

Trang 22

</body>

</html>

1.2 Tìm hiểu về MySQL.

1.2.1 Giới thiệu về MySQL

PHP hỗ trợ một số lượng lớn các hàm làm việc với cơ sở dữ liệu như:Oracle, Sybase, PostgreSQL, MySQL,… thông qua chuẩn ODBC, bằng cách sửdụng các hàm API mà PHP có thể làm việc được với nhiều hệ quản trị cơ sở dữliệu như vậy Nếu hệ quản trị cơ sở dữ liệu không hỗ trợ ODBC, và hơn nữaODBC có đặc điểm chỉ hỗ trợ ở dạng chuẩn thì PHP có thể làm việc với ODBC ởtầng trên Nếu không muốn sử dụng ODBC, ta có thể sử dụng các hàm API

Trong phần này chúng ta chỉ sử dụng các hàm API để làm việc với hệquản trị cơ sở dữ liệu MySQL

1.2.2 Các hàm cơ bản làm việc với cơ sở dữ liệu MySQL

a các hàm kết nối đến MySQL SERVER

PHP cung cấp 2 hàm để kết nối với cơ sở dữ liệu MySQL: mysql_connect

– hostname: tên máy chủ cơ sở dữ liệu, nơi trang web sẽ chứa cơ sở

dữ liệu giá trị ngầm định là “localhost”

– post : dịa chỉ cổng, nơi bộ máy cơ sở dữ liệu lắng nghe yêu cầu giátrị ngầm ddingj là “:3306”

Trang 23

– path_to_socket : cũng giống như :post nhưng chỉ cho hệ điều hànhUNIX Giá trị ngầm định là “:/tmp/mysql.sock”.

– Username: tên của người sử dụng được phép kết nối vào bộ máy cơ

Sự kết nối này sẽ đóng lại khi gọi hàm mysql_close() hoặc kết thúc đoạnPHP Script

 mysql_pconnect(): hàm này tạo ra một liên kết bền vững với máy chủMySQL

Cú pháp:

Int mysql_pconnect (string [hostname [:post] [:/path_to_socket]],string[username], string [password]);

Tham số và giá trị trả về của hàm này cũng giống hàm mysql_connect()

Sự khác biệt giữa 2 hàm này là liên kết tới máy chủ MySQL không bị đóng lại kể

cả khi kết thúc kịch bản PHP hay gọi hàm mysql_close() Mục đích của hàm này

là luôn luôn duy trì liên kết tới máy chủ MySQL do luôn có sự yêu cầu tới máychủ, tránh cho máy chủ phải tìm kiếm mã số nhận dạng mới từ đó giảm thời giantruy cập

Chú ý: hàm này chỉ thực hiện được khi PHP được định cấu hình như làmột module của web server

 mysql_close(): hàm này hủy bỏ sự kết nối tới máy chủ MySQL

Cú pháp:

Int mysql_close(int [link_identifier]);

Trang 24

Tham số link_ identifier là mã số nhận dạng tạo ra bởi hàmmysql_connect() Hàm trả về là true nếu thành công, ngược lại là false.

– string name: tên của cơ sở dữ liệu cần tạo

– link_identifier: mã số nhận dạng được cấp bởi hàm mysql_connect()

Ta hoàn toàn có thể gửi câu lệnh SQL để tạo cơ sở dữ liệu thông qua hàmmysql_query()

 mysql_drop_db():hàm xóa cơ sở dữ liệu

Cú pháp:

Int mysql_drop_db(string name, int [link_identifier]);

Trong đó:

– string name: tên cơ sở dữ liệu cần xóa

– link_identifier: mã số nhận dạng được cấp bởi hàm mysql_connect()

Ta hoàn toàn có thể gửi câu lệnh SQL để xóa cơ sở dữ liệu thông qua hàmmysql_query()

 mysql_select_db():hàm cho cơ sở dữ liệu hoạt động

Trang 25

– link_identifier: mã nhận dạng được cấp bởi mysql_connect().

Câu lệnh này sẽ gắn tên cơ sở dữ liệu với mã nhận dạng, sau này khi làmviệc với link_identifier sẽ bao gồm cả cơ sở dữ liệu được chọn

C Các hàm thao tác trên cơ sở dữ liệu

 mysql_query(): hàm gửi câu lệnh SQL tới máy chủ MySQL

Cú pháp:

Int mysql_query(string query,[int link_identifier]);

Trong đó:

– string query :câu lệnh SQL cần gửi tới máy chủ MySQL

– link_identifier: mã số nhận dạng, nó phải được thực hiện trong hàmmysql_select_db()

 mysql_db_query(): hàm gửi câu lệnh SQL tới máy chủ MySQL

Trang 26

Trong đó:

– link_identifier: mã số nhận dạng được cấp bởi hàm mysql_connect().– Hàm này trả về giá trị id được sinh ra trong cộtAUTO_INCREMENT bởi câu truy vấn trước đó Điều này chỉ có tác dụngtrên link_identifier được chỉ ra trong hàm, nếu gọi hàm trên mà không chỉđịnh tham số link_identifier thì lien kết được mở cuối cùng sẽ được chỉđịnh

Hàm mysql_insert_id() trả về giá trị 0 nếu câu truy vấn trước đó khôngsinh ra một giá trị AUTO_INCREMENT Nếu ta muốn giữ lại giá trị cho lần sau,thì phải gọi hàm này ngay sau câu truy vấn sinh ra giá trị

 mysql_fetch_row():

Hàm trả về một mảng là giá trị của một bản ghi hiện tại với chỉ số là thứ

tự của các trường (chỉ số bắt đầu từ 0) Sau đó hàm sẽ trỏ tới bản ghi tiếp theocho tới khi gặp bản ghi cuối cùng hàm trả về giá trị false Để truy xuất tới các giátrị của cột ta viết : tên_mảng[số thứ t]

Cú pháp:

Array mysql_fetch_row(int result_identifier);

Trong đó : result_identifier là mã số trả về của hàm mysql_query() hoặcmysql_db_query()

 mysql_fetch_array():

Hàm trả về một mảng là giá trị của một bản ghi hiện tại, sau đó hàm sẽ trỏtới bản ghi tiếp theo cho tới khi gặp bản ghi cuối cùng hàm trả về giá trị false

Cú pháp:

Array mysql_fetch_array(int result_identifier,[int result_type]);

Trong đó: result_identifier là mã số trả về của hàm mysql_query() hoặcmysql_db_query()

Để truy xuất đến các thành phần của cột:

Trang 27

Tên_biến_mảng[“tên trường”];

Result_type là một hằng số có thể nhận các giá trị sau:

– MYSQL_NUM: chỉ trả lại một mảng chứa các chỉ số là số (giốngnhư hàm mysql_fetch_row())

– MYSQL_ASSOC: chỉ trả lại một mảng liên kết

– MYSQL_BOTH : trả lại mảng chứa đựng các chỉ số gồm cả các con

số và chỉ số liên kết

Hàm này là sự mở rộng của hàm mysql_fetch_row() Nó cho phép truycập trường dữ liệu của mảng kết quả không chỉ thông qua các chỉ số là các số màchúng có thể là tên của các trường dữ liệu

 mysql_fetch_object(): hàm trả về nột đối tượng là giá trị của một bản ghihiện thời sau đó hàm sẽ trỏ tới bản ghi tiếp theo cho tới khi gặp bản ghi cuốicùng hàm trả về giá trị false Để truy xuất tới các giá trị của cột ta viếttên_object->tên_cột

Cú pháp:

Object mysql_fetch_object(int result_identifier);

Trong đó: result_identifier là mã số trả về của hàm mysql_query() hoặcmysql_db_query()

 mysql_fetch_assoc(int result_identifier): lấy về một dòng kết quả như làmột mảng liên kết

Cú pháp: array mysql_fetch_row(int result_identifier)

Trong đó: result_identifier là mã số trả về của hàm mysql_query() hoặcmysql_db_query()

Hàm trả về một mảng tương ứng với một bản ghi được lấy về và trả lạiFALSE, nếu không có bản ghi nào Hàm này tương đương với hàm Arraymysql_fetch_array() với tham số result_type là : MYSQL_ASSOC

 mysql_data_seek()

Trang 28

Di chuyển con trỏ bên trong “tập kết quả” (có được sau khi câu truy vấnSELECT được thực hiện)

Cú pháp: bool mysql_data_seek(int result_identifier, int row_number);

Trong đó: result_identifier là mã số trả về của hàm mysql_query(),mysql_db_query(), mysql_list_tables(), mysql_list_dbs()

Row_number là chỉ số của bản ghi mà cần đặt con trỏ vào

Hàm trả về true nếu thành công, false nếu lỗi

Hàm này sẽ di chuyển con trỏ bên trong “tập kết quả” (được chỉ rõ bởitham số result_identifier) đến dòng có mã bằng tham đối row_number

Các dòng trong tập kết quả được bắt đầu bằng 0

 mysql_num_rows(): trả lại số dòng trong result_identifier (nơi chứa kếtquả của câu lệnh SQL đã được thực hiện)

Cú pháp: mysql_num_rows(result_identifier);

Trong đó: result_identifier là mã số trả về của hàm mysql_query(),mysql_db_query(), mysql_list_tables(), mysql_list_dbs()

 mysql_affected_row()

Cú pháp: int link_ affected_row(int [link_identifier]);

Trong đó: int link_identifier là mã số nhận dạng, nó phải được thực hiện tronghàm mysql_select_db() trước đó

Hàm trả về số dòng đã bị tác động bởi một câu truy vấn SQL : INSERT,UPDATE, DELETE trước đó theo tham số link_ identifier Nếu link_ identifierkhông được chỉ định thì mã kết nối trước đó sẽ được chỉ định

 mysql_result() : lấy dữ liệu từ result_identifier

Cú pháp: mixed mysql_result(int result_identifier, int row, mixed [field]);

Trong đó: result_identifier la mã số trả về của hàm mysql_query(),mysql_db_query(), mysql_list_tables(), mysql_list_dbs()

Trang 29

Row là bản ghi mà ta sẽ lấy dữ liệu

Field là trường trong dòng row mà ta sẽ lấy dữ liệu

Các tham số result_identifier và row phải có, còn tham số field là tùychọn hàm sẽ trả lại các nội dung của dòng row và cột field rừ tập kết quả đượcchỉ định bởi biến result_identifier Nếu đối số field không được chỉ định rõ thìtrường tiếp theo sẽ được trả về

 mysql_free_result() : hàm giải phóng bộ nhớ được lien kết vớiresult_identifier

Cú pháp: mysql_free_result(int result_identifier);

Trong đó: result_identifier là mã số trả về của hàm mysql_query(),

mysql_db_query(), mysql_list_tables(), mysql_list_dbs()

Hàm này chỉ được dùng nếu như ta đánh giá thấy kịch bản sử dụng quánhiều bộ nhớ khi đang chạy gọi hàm này trên một trình xử lý kết quả sẽ giảiphóng toàn bộ dữ liệu liên kết trong bộ nhớ

1.3 Tìm hiểu về Joomla

1.3.1 Giới thiệu về Joomla

a Joomla là gì?

Joomla là một hệ quản trị nội dung mã nguồn mở (Tếng Anh : Open

Source Content Management Systems Joomla được viết bằng ngôn ngữ PHP và

kết nối tới cơ sở dữ liệu MySQL , cho phép người sử dụng có thể dễ dàng xuấtbản các nội dung của họ lên Internet hoặc Intranet

b Lịch sử phát triển Joomla

Joomla! là "sản phẩm anh em" với Mambo giữa tập đoàn Miro của Úc(hãng đang nắm giữ Mambo), với phần đông những người phát triển nòng cốt

Ban đầu công ty Miro của Úc (tiếng Anh: Miro Software Solutions) đã

phát triển Mambo theo dạng ứng dụng mã nguồn đóng Đến tháng 4 năm 2001,

Trang 30

công ty đã thông qua một chính sách bản quyền kép, nghĩa là phát hành Mambotheo cả giấy phép GPL.

Mọi thứ vẫn tiến triển bình thường cho đến trước khi xảy ra tranh chấp vềmặt pháp lý vào năm 2003 Vụ việc dẫn tới ý tưởng Mambo cần phải được bảo

vệ bởi một tổ chức phi lợi nhuận Nhưng những nhà phát triển không hài lòng về

cơ cấu của Quỹ tài trợ Mambo Andrew Eddie, người lãnh đạo nhóm phát triển,trong một lá thư gửi cộng đồng[4], đã chia sẻ những lo lắng của mình về Quỹ tàitrợ Mambo và mối quan hệ của nó tới cộng đồng Ông viết: " Chúng tôi chorằng tương lai của Mambo nên được quản lý, điều chỉnh bởi những yêu cầu củangười sử dụng và khả năng của những nhà phát triển Trong khi đó, Quỹ tài trợMambo lại được thiết kế nhằm trao quyền điều khiển cho Miro, một thiết kế ngăncản sự hợp tác giữa Quỹ tài trợ và cộng đồng " Bởi vậy vào ngày 17 tháng 8năm 2005, toàn bộ đội phát triển nòng cốt của Mambo đã rời khỏi dự án trongkhi đang làm việc với phiên bản 4.5.3

Nhờ sự trợ giúp của Trung tâm Luật Tự do Phần mềm (Software Freedom

Law Center - SFLC), 20 thành viên nòng cốt cũ của Mambo đã thành lập một tổ

chức phi lợi nhuận khác lấy tên là Open Source Matters, để hỗ trợ về mặt tổchức, pháp lý và kinh phí cho dự án mã nguồn mở còn chưa được đặt tên của họ.Cùng lúc đó, nhóm phát triển cũng lập một website lấy tên OpenSourceMatters

để phân phối thông tin tới những người sử dụng, những người phát triển, nhữngngười thiết kế và cộng đồng Joomla nói chung Người đứng đầu dự án chính làAndrew Eddie, còn được biết đến với tên gọi "Sếp trưởng"

Ngay ngày hôm sau, 1000 người đã gia nhập diễn đàn Open SourceMatters, hầu hết các bài viết cho diễn đàn đều khuyến khích và đồng tình vớihành động của Nhóm Phát triển Tin trên đã nhanh chóng được đăng tải trên các

tạp chí newsforge.com, eweek.com và ZDnet.com.

Trong một thông báo của Eddie 2 tuần sau đó, các nhóm đã được tổ chứclại và cộng đồng Joomla! tiếp tục tăng trưởng Tới ngày 1 tháng 9 năm 2005 tên

Trang 31

mới của dự án đã được thông báo cho khoảng 3000 người theo dõi đội Phát triển

và đến ngày 16 tháng 9 thì họ cho ra đời Joomla! 1.0

c Các phiên bản của Joomla

Hiện Joomla! có 2 dòng phiên bản chính:

Các phiên bản tiếp theo có dạng 1.0.x

Điểm mạnh của Joomla! 1.0.x: Có một số lượng rất lớn các thành phần mở

rộng (module/component); thành phần nhúng (mambot); giao diện (template).

Dòng phiên bản 1.5.x

Phiên bản Joomla! 1.5[6] là phiên bản cải tiến từ Joomla! 1.0.x (phần mãđược viết lại hoàn toàn, tuy nhiên vẫn giữ cách hành xử như cũ) được coi như

Trang 32

Mambo 4.6 Joomla! 1.5 tiếp tục duy trì một giao diện người sử dụng đơn giản

(nhìn và cảm nhận - look and feel).

Cả Joomla! 1.5 và Mambo 4.6 đều hỗ trợ đa ngôn ngữ Joomla! thì sửdụng file định dạng ".ini" để lưu các thông tin chuyển đổi ngôn ngữ, còn Mambothì sử dụng file định dạng ".gettext" Joomla 1.5 hỗ trợ tất cả các ngôn ngữ có tập

ký tự được biểu diễn bằng bảng mã UTF-8

Joomla! 1.5 cũng bao gồm các đặc tính mới như các mô hình chứng thực(LDAP, Gmail ), hỗ trợ mô hình khách-chủ[7] xml-rpc Nó cũng hỗ trợ các trìnhđiều khiển cơ sở dữ liệu dành cho MySQL 4.1+ (trên nền PHP 5) và tăng cường

hỗ trợ cho MySQL 5, cũng như hỗ trợ các loại cơ sở dữ liệu khác

Điểm mạnh của Joomla! 1.5: Phần quản trị Website có sử dụng công nghệWeb 2.0, một số tính năng được cải tiến hơn so với Joomla 1.0.x

d Đặc điểm của Joomla

Joomla! có các đặc tính cơ bản là: bộ đệm trang (page caching) để tăng tốc độ hiển thị, lập chỉ mục, đọc tin RSS (RSS feeds), trang dùng để in, bản tin

nhanh, blog, diễn đàn, bình chọn, lịch biểu, tìm kiếm trong site và hỗ trợ đangôn ngữ

 Joomla! được sử dụng ở khắp mọi nơi trên thế giới, từ những website cánhân cho tới những hệ thống website doanh nghiệp có tính phức tạp cao, cungcấp nhiều dịch vụ và ứng dụng Joomla! có thể dễ dàng cài đặt, dễ dàng quản

lý và có độ tin cậy cao

 Joomla! có mã nguồn mở do đó việc sử dụng Joomla! là hoàn toàn miễnphí cho tất cả mọi người trên thế giới

e Kiến trúc của Joomla

Trang 33

Hình 1.1 kiến trúc của JoomlaJoomla! 1.5 gồm có 3 tầng hệ thống:

 Tầng dưới cùng là mức nền tảng, chứa các thư viện và các plugin (cònđược biết với tên gọi mambot)

Tầng thứ hai là mức ứng dụng và chứa lớp JApplication Hiện tại tầng này gồm 3 lớp con: JInstallation, JAdministrator và JSite.

Tầng thứ ba là mức mở rộng Tại tầng này có các thành phần (component),

mô đun (module) và giao diện (template) được thực thi và thể hiện.

1.3.2 Giao diện và các thành phần cơ bản của Joomla

Đầu tiên ta đăng nhập vào trang quản lý của website Ở đây có nhiều thẻ khác nhau, đầu tiên chúng ta đi tìm hiểu thẻ đầu tiên là thẻ "Site"

Trong thẻ Site này chúng ta tìm hiểu mục đầu tiên là Control Panel

Trang 34

Hình 1.2 Control PanelTrong phần này chúng ta sẽ quản lý tổng quan về website như :

 Thêm bài viết mới : Add New Article

 Quản lý bài viết : Article Manager

 Quản lý nhóm tin : Section Manager

Và ngôn ngữ của website

Chúng ta tìm hiểu sang mục thứ 2 đó là User manager, ở phần này chúng

ta có thể tạo mới user bằng nút " new " và kích hoạt hoặc bỏ kích hoạt bằng nút

"Enabled" và phân quyền cho user tại mục Group

Tiếp theo chúng ta tìm hiểu đến mục Media Manager, tại mục này chophép lưu trứ toàn bộ hình ảnh hoặc là tài liệu cho website

Trang 35

Hình 1.4 Global ConfigurationTrong phần này gồm có 3 mục đó là Site, System và Server.

Tại mục site, gồm có Site Settings, tại đây ta có thể lựa chọn tắt hoặc mởwebsite trong khoảng thời gian nào đó.Và để lại tin nhắn khi tắt site

Tại Metadata Settings ta có thể nhập các từ khóa để công cụ tìm kiếm có

thể tìm kiếm thấy website

Tiếp đến là phần Seo Settings, phần này tạo đường dẫn đẹp cho website, talưu ý tính năng này chỉ áp dụng cho website chạy host Linux

Tại mục System, ta tìm hiểu mục Media Settings, tại mục này sẽ là nhữngđịnh dạng file mà chúng ta có thể upload lên website, ta có thể thêm 1 số địnhdạng khác, và dung lượng tối đa có thể upload file lên website, ta cũng có thểchỉnh sửa Tại phần Cache Settings, phần này sẽ làm cho website nhanh thêm30% và có thể bật tắt nó.Tại mục Server chúng ta tìm hiểu phần Mails Settings,tại phần này vì một số host ko hỗ trợ và để an toàn ta chọn SMTP Server tạiMailer

Chúng ta tìm hiểu sang thẻ tiếp theo là thẻ Menu

Trang 36

Hình 1.5 MenuTại mục menu manager ta có thể thêm (new), sửa hay xóa menu, và tạimục Menu items ta có thể tạo mới, hoặc sửa, xóa menu con ở trong đó.Khi thêm mới 1 menu con.ta chọn loại hình cho menu đó, như hiển thị bài viếthoặc 1 danh sách các bài viết (Articles), menu để liên hệ (Contacts), menu lấy tin

tự động (rss) từ các trang web các (News Feeds)

Tiếp theo ta sẽ tìm hiểu thẻ "Content"

Hình 1.6 ContentChúng ta tìm hiểu phần Front Page Manager, phần này sẽ hiển thị nhữngnội dung chính trên website, tức là những nội dung thuộc phần Trang chủ củawebsite

Ta tìm hiểu mục Section manager, đây là phần quản lý các nhóm tin, haygọi là các chủ đề, còn phần Category manager là phần quản lý các chủ đề con,

Trang 37

các chủ đề con này sẽ nằm trong các chủ đề.Và khi tạo mới các bài viết, ta chọnchủ đề và chủ đề con thích hợp.

Tiếp nữa ta tìm hiểu sang thẻ "Components"

Hình 1.7 Components

Ta có thể thấy trong mã nguồn mở joomla đã có những component có sẵncho website của chúng ta Ta có thể tìm hiểu kỹ hơn và dễ dàng hơn khi sử dụnggiao diện tiếng việt

Tiếp theo ta sẽ tìm hiểu thẻ "Extensions"

Hình 1.8 Extensions

Trang 38

Đầu tiên là mục Install/Uninstall, tại mục này ta hoàn toàn có thể cài đặt,tháo gỡ mọi Component, Modules hay Plugin.

Để cài đặt ta chọn ở nút "Chọn tập tin" và dẫn tới file .zip mà làComponent hay Modules ta muốn cài.Còn để tháo gỡ ta chọn sang các mục nhưComponent,Template tick chọn item muốn gỡ bỏ và chọn Uninstall

Mục tiếp theo là Module Manager ,tại mục này ta có thể tạo mới 1module, sửa, xóa Mục kế là Plugin Manager ,đây là những thành phần chạyngầm trong hệ thống mà có thể hỗ trợ cho Component,Modules

Sau đó là mục Template Manager, tại đây ta có thể lựa chọn thay đổi giaodiện cho trang web của mình Và cuối cùng là mục Language Manager, tại mụcnày ta có thể lựa chọn ngôn ngữ cho website của mình

1.3.3 Ứng dụng của Joomla

Joomla được ứng dụng vào:

 Các cổng thông tin điện tử hoặc các website doanh nghiệp

 Thương mại điện tử trực tuyến

 Báo điện tử, tạp chí điện tử

 Website của các doanh nghiệp vừa và nhỏ

 Website của các cơ quan, tổ chức phi chính phủ

 Website các trường học

Trang 39

CHƯƠNG 2: KHẢO SÁT, PHÂN TÍCH VÀ THIẾT KẾ HỆ THỐNG

2.1 Khảo sát hiện trạng

2.1.1 sự hình thành và phát triển

Tên công ty: CÔNG TY MÁY TÍNH VIỆT CƯỜNG

Tên viết tắt: VIỆT CƯỜNG COMPUTER

Trụ sở: số 238, đường 353, phường Tân Thành, quận Dương Kinh, thành phố HảiPhòng

Người đại diện: ông Vũ Viết Hùng – Chức vụ: Giám đốc

Điện thoại: 0312695366 – FAX: 0312336688

Website: www.vietcuong.vn

Email: itcuong.hp@gmail.com

Mã số thuế: 2343546346

Số tài khoản: 456 4365 4564565 tại ngân hàng Viettinbank Đồ Sơn

Giấy phép kinh doanh số: 34H43656

Do sở kế hoạch và đầu tư thành phố Hải Phòng cấp ngày 26 tháng 9 năm 2006Vốn điều lệ: 23.000.000.000 VNĐ(hai mươi ba tỷ đồng)

Tổng số cổ phần: 23.000

2.1.2 Lĩnh vực hoạt động kinh doanh

Thông tin và truyền thông

 Hoạt động dịch vụ công nghệ thông tin và dịch vụ khác liên quan đến máy

Ngày đăng: 04/05/2016, 14:49

HÌNH ẢNH LIÊN QUAN

Hình 1.2. Control Panel Trong phần này chúng ta sẽ quản lý tổng quan về website như : - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 1.2. Control Panel Trong phần này chúng ta sẽ quản lý tổng quan về website như : (Trang 33)
Hình 1.4. Global Configuration Trong phần này gồm có 3 mục đó là Site, System và Server. - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 1.4. Global Configuration Trong phần này gồm có 3 mục đó là Site, System và Server (Trang 34)
Hình 1.5. Menu - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 1.5. Menu (Trang 35)
Hình 1.6. Content - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 1.6. Content (Trang 35)
Hình 1.8. Extensions - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 1.8. Extensions (Trang 36)
Hình 1.7. Components - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 1.7. Components (Trang 36)
Hình 2.2 Biểu đồ User case của Admin 2.4.2. Đặc tả chi tiết từng ca sử dụng. - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 2.2 Biểu đồ User case của Admin 2.4.2. Đặc tả chi tiết từng ca sử dụng (Trang 42)
Hình 2.3 Biểu đồ trình tự của người duyệt web xem chi tiết tin tức Biểu đồ cộng tác - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 2.3 Biểu đồ trình tự của người duyệt web xem chi tiết tin tức Biểu đồ cộng tác (Trang 43)
Hình 2.4. Biểu đồ cộng tác của người duyệt web xem chi tiết tin tức - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 2.4. Biểu đồ cộng tác của người duyệt web xem chi tiết tin tức (Trang 43)
Hình 2.5. Biểu đồ trình tự của người duyệt web tìm kiếm thông tin Biểu đồ cộng tác - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 2.5. Biểu đồ trình tự của người duyệt web tìm kiếm thông tin Biểu đồ cộng tác (Trang 44)
Hình 2.6. Biểu đồ cộng tác của người duyệt web tìm kiếm thông tin - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 2.6. Biểu đồ cộng tác của người duyệt web tìm kiếm thông tin (Trang 45)
Hình 2.7. Biểu đồ trình tự của người duyệt web gửi câu hỏi Biểu đồ cộng tác - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 2.7. Biểu đồ trình tự của người duyệt web gửi câu hỏi Biểu đồ cộng tác (Trang 46)
Hình 2.8. Biểu đồ cộng tác của người duyệt web gửi câu hỏi b. Ca sử dụng UC người quản trị web - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 2.8. Biểu đồ cộng tác của người duyệt web gửi câu hỏi b. Ca sử dụng UC người quản trị web (Trang 47)
Hình 2.9. Biểu đồ trình tự người quản lý đăng nhập Biểu đồ cộng tác - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 2.9. Biểu đồ trình tự người quản lý đăng nhập Biểu đồ cộng tác (Trang 48)
Hình 2.10. Biểu đồ cộng tác người quản lý đăng nhập - Xây dựng website giới thiệu tin tức và sản phẩm của công ty máy tính việt cường
Hình 2.10. Biểu đồ cộng tác người quản lý đăng nhập (Trang 48)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w