Professional Documents
Culture Documents
Project+ +eticket+1.0+ +Ghi+Chu+Ben+Le+Du+An
Project+ +eticket+1.0+ +Ghi+Chu+Ben+Le+Du+An
Project+ +eticket+1.0+ +Ghi+Chu+Ben+Le+Du+An
PROJECT
ETICKET
Phiên bản : 1.0
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 1
Project : ETicket 1.0
BẢN QUYỀN
Tác giả dự án, ông Phan Minh Tài, Trung tâm CNTT – Ngân hàng Đầu tư và Phát
triển Việt Nam, giữ toàn quyền đối với dự án.
ETicket được cung cấp miễn phí cho cộng đồng và dự án chỉ được sử dụng như là
một công cụ nghiên cứu kiến trúc ứng dụng và kỹ thuật lập trình, phục vụ mục đích
học tập và nâng cao kỹ năng phát triển ứng dụng.
Các dự án liên quan đến thương mại điện tử được triển khai dựa trên mã nguồn
ETicket đều phải xin ý kiến của tác giả và chỉ được triển khai khi có văn bản cho
phép, cùng với một khoản phí nhất định dựa trên thỏa thuận triển khai.
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 2
Project : ETicket 1.0
Blog : http://taipm.blogspot.com/
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 3
Project : ETicket 1.0
GIỚI THIỆU DỰ ÁN
ETicket là dự án mã nguồn mở, được xây dựng nhằm mô phỏng (tương đối gần) một
hệ thống cung ứng “Vé Tàu Xe Điện Tử” qua mạng Internet. Trên phương diện kỹ
thuật, dự án này được xây dựng dựa trên nền tảng một số công nghệ mới nhất của
Microsoft, bao gồm :
- AJAX / LINQ
Bên cạnh đó, dự án cũng được thừa hưởng một số những mô hình thiết kế chuẩn như :
3 – Tier Architecture, Design Patterns cùng các kỹ thuật tiên tiến khác trong kỹ thuật
lập trình web : JQuery, CSS, JavaScript, Ajax, …
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 4
Project : ETicket 1.0
Lưu ý :
Để phục vụ cho quá trình tìm kiếm dữ liệu, hầu hết các bảng đều có
trường Tag để lưu các từ khóa nổi bật cho từng record. Bản thân trường
Tag sẽ được tự động cập nhật theo một công thức có sẵn (dựa trên cấu
trúc thông tin của đối tượng), ngoài ra, trường Tag cũng có thể được bổ
sung bằng cách thủ công do chính người sử dụng thay đổi.
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 5
Project : ETicket 1.0
ETicket là một hệ thống tương đối phức tạp, khối lượng dữ liệu lớn, do đó chúng ta
cần phải khai thác triệt để dữ liệu để cập nhật và xử lý phù hợp, nhằm giảm bớt công
sức cho đội ngũ nhân viên nhập liệu đầu vào.
- Bước 1 : Mỗi khi có một công ty đăng ký tham gia hệ thống ETicket, họ sẽ
phải cung cấp các dữ liệu liên quan : Director, Company, Car, CarSchedule.
Đây là các dữ liệu nguyên thủy được cung cấp tại các nhà xe/bến xe – gọi
chung là nhà cung cấp dịch vụ.
Lưu ý : Hầu hết các xe đều có một lịch trình cố định, cách ngày. Chẳng hạn, xe
77M1 – 7152 (Dũng Thủy – Bến xe Bồng Sơn) cứ ngày chẳn thì chạy Bồng
Sơn – Sài Gòn, ngày lẻ chạy Sài Gòn – Bồng Sơn, ngày 13 âm lịch thì nghỉ. Do
đó, chúng ta cần phải xây dựng một cơ chế nhận dạng “mẫu lịch trình” để sinh
dữ liệu cho CarSchedule một cách phù hợp, đồng thời cũng cho phép người sử
dụng chỉnh sửa khi cần thiết.
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 6
Project : ETicket 1.0
Record 01 :
TaxNumbers : 030
3.
Thuộc tính
- Private : Ký tự đầu (_), chữ cái đầu tiên của từ tiếp theo là chữ thường, chữ cái
các từ tiếp theo là chữ hoa. Ví dụ : private string _firstName;
- Public : Chữ cái đầu tiên của từ tiếp theo là chữ hoa, chữ cái các từ tiếp theo là
chữ hoa. Ví dụ : public string FirstName;
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 7
Project : ETicket 1.0
Models
BusinessObjects
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 8
Project : ETicket 1.0
ETicket.dbml
ViewObjects
TicketView.cs
IServices.cs
IEnumerable<Bill> GetCustomersByTags(List<string> tags);
IUserRepository.cs
Insert
Delete
Edit
GetEntity(Guid id);
GetEntities();
IOfficeRepository.cs
Insert
Delete
Edit
GetEntity(Guid id);
GetEntities();
IBillRepository.cs
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 9
Project : ETicket 1.0
Insert
Delete
Edit
GetEntity(Guid id);
GetEntities();
ITicketRepository.cs
Insert
Delete
Edit
GetEntity(Guid id);
GetEntities();
ICarScheduleRepository.cs
Insert
Delete
Edit
GetEntity(Guid id);
GetEntities();
ICarRepository.cs
Insert
Delete
Edit
GetEntity(Guid id);
GetEntities();
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 10
Project : ETicket 1.0
ICompanyRepository.cs
Insert
Delete
Edit
GetEntity(Guid id);
GetEntities();
ICustomerRepository.cs
Insert
Delete
Edit
GetEntity(Guid id);
GetEntities();
Services.cs
UserRepository.cs
OfficeRepository.cs
BillRepository.cs
TicketRepository.cs
CarScheduleRepository.cs
CarRepository.cs
CompanyRepository.cs
CustomerRepository.cs
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 11
Project : ETicket 1.0
- Trên nguyên tắc, mỗi một BusinessObject đều cần một Controller tương ứng,
controller này thường sẽ chịu trách nhiệm chính với các method cơ bản :
Create, Detail, Edit, Delete.
- Các ứng dụng ASP.NET MVC trong thực tế đều cung cấp một danh sách các
đối tượng mở rộng nhằm hỗ trợ tốt hơn quá trình xây dựng dựng các lớp giao
diện phức tạp. Các đối tượng này gọi chung là ViewObjects, được chứa trong
thư mục ViewObjects, có thể (hoặc không) thừa kế các đối tượng thuộc
BusinessObjects.
- Ngoài ra, hầu hết các ứng dụng đều mang một số tính năng đặc thù như :
Search, Email, … đây là các tính năng độc lập (tương đối) không phục thuộc
nhiều vào các BusinessObjects hay ViewObjects, do đó chúng ta có thể cân
nhắc xây dựng các Controller riêng để đảm nhận các công việc này.
TicketController
TicketController, ngoại trừ cung cấp một số tính năng cơ bản liên quan đến CRUD,
còn được bổ sung một số action sau :
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 12
Project : ETicket 1.0
- AddToCart(Guid ticketId)
Chịu trách nhiệm đưa Ticket.id = ticketId vào Cart để chuẩn bị thanh toán.
AddToCart sẽ tác động lên Cart.ascx, đây là một điều khiển dùng chung được
xây dựng để trình bày danh sách các ticket đã được chọn.
Trên cơ sở những yêu cầu riêng về tính năng đặc thù của hệ thống ETicket, dưới đây
là danh sách một số controller mở rộng :
! SearchController
! PaymentController
SearchController
SearchController có trách nhiệm thực thi mọi yêu cầu tìm kiếm từ khách hàng,
nó bao gồm việc ghi nhận dữ liệu và hành động đầu vào, sau đó thực thi các
quyết định cần thiết theo thuật toán, thu nhận kết quả trả về và quyết định cách
thức hiển thị dữ liệu phù hợp (một cách thông minh nhất) cho khách hàng.
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 13
Project : ETicket 1.0
Mô tả : Biến strKeyWord nhận dữ liệu đầu vào là giá trị của ô textbox trong
hộp tìm kiếm. Phương thức Search được thực hiện ngay tức khắc sau khi
khách hàng nhấn nút tìm kiếm.
Thuật toán
! Mặc định, hệ thống sẽ tìm kiếm trong phạm vi vé xe và nhà xe, bằng
cách duyệt danh sách từ khóa của từng đối tượng khi đang được lưu
trong hệ thống. Kết quả tìm kiếm sẽ được phân loại và trả về trong một
View phù hợp.
! Từ khóa đầu vào sẽ được băm nhỏ thành từng từ hoặc cụm từ nguyên tố
(mang đủ nghĩa) và sẽ được so sánh với danh sách từ khóa có trong cơ sở
dữ liệu.
PaymentController
SellController
SellController cung cấp đầy đủ các hoạt động trong một quy trình bán vé, bao gồm
các phương thức :
! SelectTicket()
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 14
Project : ETicket 1.0
Đối với các ứng dụng theo mô hình ASP.NET MVC, mỗi một BusinessObjects
thường sẽ chịu sự điều khiển của một Controller tương ứng, tôi gọi đây là
ObjectController.
Hầu hết các ObjectController đều cung cấp các tính năng cơ bản (mặc định) :
Index, Create, Delelte, Details, Edit.
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 15
Project : ETicket 1.0
Trước tiên, chúng ta xem qua mô hình CSDL cho hai bảng phụ thuộc (1 – n)
như hình dưới đây :
Trên thực tế, mỗi một xe (Car) phải nằm (một cách duy nhất) tại một công ty
(Company). Do đó, trong giao diện Create View (của Car), ta phải cho phép
người nhập liệu chỉ chọn một trong số các công ty đã có trong CSDL của hệ
thống. Do vậy, phần CompanyId của Car sẽ phải phụ thuộc (duy nhất, chỉ chọn
một) vào bảng Company.
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 16
Project : ETicket 1.0
Shares
Kịch bản
Bất cứ ai có thể truy cập Internet được bằng máy tính hoặc điện thoại đều có
thể sử dụng hệ thống www.vetauxe.vn để tìm kiếm những thông tin mới nhất
về hệ thống Vé Tàu Xe của hầu hết các hãng cung cấp dịch vụ vận tải hành
khách tại Việt Nam. Hệ thống VETAUXE cho phép :
Bước 1 : Khách hàng, đăng nhập vào địa chỉ www.vetauxe.vn, gõ vào ô tìm
kiếm từ khóa cần tìm (có gợi ý kèm theo), chẳng hạn :
- Để tìm kiếm tất cả các chuyến xe (và vé khả dụng) từ TP.HCM về Quy
Nhơn, khách hàng có thể sử dụng từ khóa : TP.HCM – Quy Nhơn.
- Để tìm kiếm thông tin về một hãng xe cụ thể, chẳng hạn để tìm kiếm thông
tin liên quan về xe Phương Trang, hoặc Mai Linh, khách hàng có thể sử
dụng từ khóa : Phương Trang, Mai Linh, …
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 17
Project : ETicket 1.0
- …
Bước 2 : Ngay sau khi gõ Enter (hoặc nhấn nút Tìm kiếm), khách hàng sẽ được
đưa đến trang kết quả tìm kiếm, trang này :
- Nếu người sử dụng tìm chọn kiểu tìm kiếm Vé xe, thì trang kết quả tìm
được sẽ trả về thông tin là danh mục vé chưa được đặt, …
- Nếu khách hàng chọn kiểu tìm kiếm là Nhà xe, thì trang kết quả sẽ trả về tất
cả các thông tin liên quan đến nhà xe đó, …
- …
Bước 3 : Khách hàng có thể xem thông tin liên quan dựa trên kết quả tìm kiếm,
nếu thông tin trả về là vé tàu xe, khách hàng có thể chọn mua để đưa vé xe vào
hộp vé, sau đó thực hiện các thao tác khác nếu có nhu cầu mua thực sự và
thanh toán.
Tiến trình mua/bán (vé) chỉ hoàn tất khi nhà cung cấp dịch vụ đã nhận được
tiền và khách hàng nhận được vé.
Kịch bản
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 18
Project : ETicket 1.0
Ý tưởng
Trang chủ cần phải thông thoáng, màu sắc thanh, nhẹ, có thể xem trang chủ của
BaamBoo, Google hoặc WolframAlpha là một gợi ý. Ở đây tôi thích giao diện của
WolframAlpha.
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 19
Project : ETicket 1.0
- Để có thể xây dựng được trang chủ như trang của WolframAlpha, chúng ta
cần phải phân tích bố cục của trang một cách thận trọng.
- Phần Menu, nằm trên cùng, tốt nhất nên đặt nó trong một thẻ <div> có tên
“divMenu”.
- Phần còn lại, phía dưới, ta định nghĩa nó trong thẻ <div id = “divMain” …>
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 20
Project : ETicket 1.0
- Mặc định, khi một ứng dụng ASP.NET MVC khởi động, trang
Home/Index.aspx sẽ được gọi. Do đó, ngoại trừ master page ra, trang
Home/Index.aspx chính là trang chủ. Ta sẽ bắt đầu thiết kế từ trang này.
- Thẻ Input Text và Input Submit sẽ được canh giữa vào khung viền đỏ.
Đoạn mã dưới đây mô tả cách thức tương tác giữa các điều khiển Html với các action
controller. Bạn đọc mới làm quen với ASP.NET MVC có thể sẽ cần đến kỹ thuật này.
<div id = "divSearchBox">
Học hỏi kinh nghiệm từ SocBay.com, trang kết quả tìm kiếm Ticket vẫn chứa một
khung thoại tìm kiếm. Khi đó mọi thao tác tìm kiếm, hiển thị kết quả, cập nhật vào
TicketBox cần phải sử dụng kỹ thuật Ajax để refresh từng phần của trang.
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 21
Project : ETicket 1.0
Trang Search.aspx chịu trách nhiệm trình bày kết quả tìm kiếm Ticket, về cơ bản sẽ
có cấu trúc tương tự như trang kết quả Mp3 của SocBay.com.
Ô tìm kiếm
(SearchBox)
<div id = “divSearchBox”>
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 22
Project : ETicket 1.0
Chiều cao : Trình bày 20 kết quả đầu tiên Chiều cao : Mở rộng theo danh
sách vé đã chọn
Phân trang
Điều khiển : Thanh toán
Điều khiển : Xem chi tiết, Chọn mua (cho mỗi vé)
<div id = “divTicketBox”>
<div id = “divSearchResultBox”>
Ô quảng cáo, …
<div id = “divAdvBox”>
- Để sử dụng kỹ thuật Ajax trong các ứng dụng ASP.NET MVC, việc trước
tiên là cần khai báo bộ script cần sử dụng cho Master Page. Thao tác này
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 23
Project : ETicket 1.0
cũng được lặp lại khi chúng ta muốn sử dụng một số thư viện kiểu
javascript liên quan.
- Đoạn mã dưới đây khai báo các script cần thiết cho kỹ thuật Ajax trong các
ứng dụng ASP.NET MVC
<head runat="server">
<title><asp:ContentPlaceHolder ID="TitleContent" runat="server"
/></title>
<script src="../../Scripts/MicrosoftAjax.js"
type="text/javascript"></script>
<script src="../../Scripts/MicrosoftMvcAjax.js"
type="text/javascript"></script>
<script src="../../Scripts/jquery-1.2.6.min.js"
type="text/javascript"></script>
<link href="../../Content/Site.css" rel="stylesheet"
type="text/css" />
</head>
Code : Search.aspx
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent"
runat="server">
<h2>Search</h2>
<div id = "divSearchBox">
<% using (Ajax.BeginForm("Search", new AjaxOptions() {
UpdateTargetId = "divSearchResult" })) { %>
<input type = "text" id = "txtKeyWord" name = "strKeyWord"
/>
<input type = "submit" id = "btnSearch" />
<br />
<hr />
Ví dụ : Sài Gòn - Hà Nội, Huế - Đà Nẵng, ...
<% } %>
<hr />
</div>
<br /> <br /> <br />
<div id = "divSearchResult">
<% Html.RenderPartial("SearchResult"); %>
</div>
</asp:Content>
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 24
Project : ETicket 1.0
Code : SearchController.cs
public ActionResult Search(string strKeyWord)
{
string[] strSplit = { "-" };
List<string> lstKeyWord = new List<string>();
lstKeyWord = strKeyWord.Split(strSplit,
StringSplitOptions.None).ToList();
if (Request.IsAjaxRequest())
{
return PartialView("SearchResult", lstTicket);
}
else
{
return View("Search", lstTicket);
}
}
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 25
Project : ETicket 1.0
SearchResult.ascx được sử dụng để trình bày kết quả tìm kiếm (Ticket) cho khách
hàng. Mỗi một Ticket tìm được cần được định dạng một cách phù hợp, làm nổi bật
kết quả tìm kiếm.
Do mỗi khi tìm kiếm, kết quả trả về thường sẽ khá nhiều, do đó chúng ta cần định
dạng và giới hạn kết quả trả về. Ở đây tôi sử dụng class của CSS để định dạng kết
quả. Lưu ý, để định dạng ID ta sử dụng ký tự “#”, để định dạng Class ta sử dụng “.”.
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 26
Project : ETicket 1.0
MỘT SỐ VẤN ĐỀ CẦN LƯU Ý CHO CÁC ỨNG DỤNG ĐA NGƯỜI DÙNG
Khi xây dựng và triển khai các ứng dụng web cho đa người dùng, chúng ta cần phải
chú ý đặc biệt đến danh mục các tài nguyên được dùng chung. Trong ví dụ này, một
trong những tài nguyên dùng chung rõ nét nhất là Cart.cs, đây là một đối tượng
nghiệp vụ mở rộng, có nhiệm vụ lưu trữ danh mục vé đã được khách hàng chọn, khi
đó, mỗi khách hàng sẽ có một và chỉ một Cart trong một phiên làm việc.
Cart là đối tượng mở rộng, chỉ tồn tại trong một phiên làm việc, của duy nhất một
người sử dụng. Nó bắt đầu khởi tạo khi người sử dụng chọn mua vé đầu tiên, và kết
thúc khi người sử dụng chọn nút thanh toán hoặc kết thúc phiên làm việc (rời khỏi
website).
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 27
Project : ETicket 1.0
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 28
Project : ETicket 1.0
Trong CSS có hai định nghĩa rất quan trọng là ID và Class xuất phát từ (X)HTML. Cho đến bây giờ
vẫn còn một số bạn mới tìm hiểu CSS thường vẫn chưa hiểu rõ sự khác biệt của 2 thẻ HTML này.
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 29
Project : ETicket 1.0
Trước tiên ta hãy xem qua cách sử dụng hai thẻ ID và Class trong một đoạn (X)HTML.
<div id="container">
container là tên được gán cho ID và nó chứa toàn bộ các thành phần của một
trang web
</div>
<div class="module">
module là tên được gán cho Class và nó sẽ được sử dụng lặp lại nhiều lần
trên một trang web
</div>
Qua hai đoạn (X)HTML chúng ta có thể dễ dàng nhận thấy ID được sử dụng cho các thành phần
mang tính tuyệt đối và duy nhất trong toàn bộ trang web, và nó thường được gán cho heading,
container, leftcol, rightcol, content-warpper, footer ...
Còn với Class sẽ được gán cho các thành phần sẽ lặp lại nhiều lần như Module, Module H3,
Content title, readon, ul li ... bởi khi gán Class cho nhiều thành phần của trang web thì bạn chỉ việc
khai báo style trên file CSS cho các thành phần này một lần duy nhất.
Chúng ta hãy xem cách khai báo thuộc tính cho ID và Class trong file CSS ở ví dụ sau:
#container{
width: 80%;
margin: auto;
padding: 20px;
border: 1px solid #666;
background: #ffffff;
}
.module{
font-size: small;
color: #008080;
font-weight: bold;
}
Đến bây giờ ta đã có thể nắm bắt được về cơ bản của các thành phần trong một website, cách thể
hiện chúng bằng ngôn ngữ HTML và điều khiển chúng theo ý muốn bằng CSS. Trong toàn bộ các
bài viết này xin các bạn hãy đọc kỹ, hiểu và thử trực tiếp ngay trên một trang (X)HTML mà bạn tạo
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 30
Project : ETicket 1.0
ra. Chỉ khi nắm chắc những yếu tố cơ bản thì chúng ta có thể dễ dàng hơn trong các thử nghiệm
sau.
! Phần Header : Bao gồm các thành phần chính như Menu, Logo, Slogan, …
! Phần Main : Bao gồm nội dung chính của trang. Trong phần Main, tùy yêu cầu
của website mà các trang có thể chia ra một hay nhiều cột, hoặc là bố trí nhiều
phần khác với các bố cục khác nhau.
! Phần Footer : Là phần cuối cùng bên dưới các trang, nhằm cung cấp các thông
tin về công ty, bản quyền, …
Đoạn mã
input[type="text"]
{
width: 300px;
border: 1px solid #CCC;
}
quy định tất cả các thẻ input[type= “text”] sẽ có độ rộng quy ước là 300px. Tuy
nhiên, vẫn có một số trường hợp ngoại lệ, chẳng hạn, ô nhập dữ liệu dạng
input[type="text"] bên trọng hộp SearchBox sẽ có độ rộng lớn hơn, chẳng hạn
500px, khi đó ta cần khai báo thêm đoạn mã sau trong file CSS.
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 31
Project : ETicket 1.0
#divSearchBox input[type="text"]
{
width: 500px;
border: 1px solid #CCC;
}
Nguyên tắc :
Phần nào ăn theo nội dung của phần khác, ta chỉ cần thêm thuộc tính clear:both cho
mã CSS của phần đó là xong.
7.
© 2009, Phan Minh Tài – TT CNTT – Ngân hàng Đầu tư và Phát triển Việt Nam Trang 32