Đề tài Thiết kế trang web quản lý phòng của khách sạn

Session là đối tượng được web server tự động tạo khi một trang web đầu tiên trong ứng dụng được người dùng gọi. Session rất tiện lợi cho người phát triển ứng dụng web trong việc lưu lại thông tin của các người dùng. Đối tượng session sẽ tồn tại cho đến khi session bị hủy hoặc hết hiệu lực(time out). Khi muốn lưu item trong đối tượng session thì phải yêu cầu người dùng cho phép lưu cookies(enable cookies) trong trình duyệt web.

doc20 trang | Chia sẻ: maiphuongdc | Lượt xem: 1655 | Lượt tải: 4download
Bạn đang xem nội dung tài liệu Đề tài Thiết kế trang web quản lý phòng của khách sạn, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Báo cáo thực tập chuyên ngành Đề tài: Thiết kế trang web quản lý phòng của khách sạn Công cụ sử dụng: ASP Hệ quản trị cơ sở dữ liệu: MSAccess Môi trường: Window2000(IIS) I. Báo cáo về tìm hiểu công nghệ: Ngày nay có thể nói công nghệ tạo trang web bằng kỹ thuật tạo web động là phổ biến hơn cả. Vậy tại sao lại như vậy, ta ó thể hiểu vì một số nguyên nhân sau: +Tài liệu có thể nói là tất cả những gì chứa đựng thông tin mà con người hiểu được.Trang tài liệu Internet nguyên thủy sử dụng ngôn ngữ định dạng HTML (Hyper Text Markup Language- Ngôn ngữ định dạng đánh dấu siêu văn bản). Ngôn ngữ này do Tim Berners-Lee sáng tạo để định dạng tài liệu trao đổi thông tin giữa các đồng nghiệp. Ngày nay HTML đã trở nên phổ biến và có mặt ở mọi nơi trên Internet . Các công cụ chính mà HTML sử dụng là các thẻ để quy định cách hiển thị dữ liệu , hình ảnh của tài liệu. Mặc dù HTML có thể tạo ra trang tài liệu với rất nhiều thông tin phong phú.Tuy nhiên, trang HTML thường được biết đến như là tài liệu tĩnh (static document hay static page). Nếu người dùng soạn thảo(tác giả) không hiệu chỉnh thì nội dung tài liệu không thay đổi. Dữ liệu do trang HTML thể hiện thường phải cập nhật bằng tay một cach thủ công.Vì vậy các ứng dụng và người dùng mong muốn có cơ chế tạo tài liệu động ( dynamic page) . Có thể mô hình hóa trang HTML tĩnh như sau: + Để khắc phục những nhược điểm đó, các trang tài liệu động có khả năng biến đổi nội dung và định dạng trang dựa vào chương trình xử lý và cơ sở dữ liệu. Hàng loạt công nghệ web ra đời nhằm hướng đến nhu cầu thực tế này. Web động có thể hiểu một cách đơn giản là trang web ở trên đó người dùng (người duyệt web) có thể tương tác, thay đổi các thông số, các thông tin được hiển thị v.v. tùy ý. Nó làm đươc như vậy là nhờ có sự liên kết với một hệ cơ sở dữ liệu . Mô hình nó như sau: Trong mô hình trên thì phía Web server đã có một sự liên kết vào một hệ CSDL ,và chính điều này đã làm cho trang Web có thể được cập nhật bởi Web browser. Ngày nay, trang web động ngày càng trở nên phổ biến và được phát triển mạnh mẽ ở khắp mọi nơi trên thế giới. Có rất nhiều công cụ tạo các script cơ bản nhằm giúp cho trình CGI đọc , diễn dịch và thực thi trực tiếp các lệnh script này- hoạt động tương tự trình thông dịch(interpreter) . Đó là các ngôn ngữ như : Javascript, JSP, PHP Perl Script, JScript, VBScript, ASP... II. Báo cáo về chương trình: A.ASP I.Giới thiệu về ASP: 1. Khái niệm về ASP: ASP (Active Server Pages) là một môi trường lập trình cung cấp cho việc kết hợp HTML, ngôn ngữ kịch bản (Scripting) như VBScript, Javacript, và các thành phần được viết trong các ngôn ngữ nhằm tạo ra một ứng dụng Internet mạnh mẽ và hoàn chỉnh. ASP là một ngôn ngữ kịch bản dùng để xây dựng các ứng dụng trên môi trường internet. Như tên gọi của nó, ASP giúp người xây dựng ứng dụng web tạo ra các trang web có nội dung linh hoạt. Với các người dùng khác nhau khi truy cập vào những trang web này có thể sẽ nhận được các kết quả khác nhau. Nhờ những đối tượng có sẵn(Built_in Object) và khả năng hổ trợ các ngôn ngữ script như VBScript và Jscript, ASP giúp người xây dựng ứng dụng dễ dàng và nhanh chóng tạo ra các trang web chất lượng. Những tính năng trên giúp người phát triển ứng dụng nhanh chóng tiếp cận ngôn ngữ mới, điều này là một ưu điểm không nhỏ của ASP. Microsoft Active Server Pages (ASP) là một môi trường sever-side scripting cho phép ta tạo ra và chạy các ứng dụng Web động, tương tác với client một cách hiệu quả. ASP hoạt động dựa vào các script do người lập trình tạo sẵn.Khi ta cho script chạy trên server thay vì chạy ở client thì Web server của ta sẽ làm mọi công việc cần thiết để tạo ra một trang Hypertext Markup Language (HTML) trả về cho Browser hiển thị, như vậy ta không phải bận tâm rằng các Web browser có thể xử lý trang Web hay không vì server đã làm mọi việc.Active Server Pages chạy trên các môi trường sau đây: - Microsoft Internet Information Server version 3.0 trở lên trên Windows NT Server 4.0 hoặc 5.0 - Microsoft Peer Web Sevices version 3.0 trên Windows NT Workstation. - Microsoft Personal Web Server trên Windows 95. 2.Cấu trúc một trang ASP: Trang ASP đơn giản là một trang văn bản với phần mở rộng là.asp, gồm có 3 phần : • Văn bản (Text) • HTML tag (HTML : Hypertext Markup Language) • Các đoạn script asp Khi thêm 1 đoạn script vào HTML , ASP dùng dấu phân cách (delimiters) để phân biệt giữa đoạn HTML và đoạn ASP. để kết thúc đoạn script. Có thể xem trang ASP như một trang HTML có bổ sung các ASP Script Command Xem ví dụ dưới đây: Bạn bắt đầu với trang ASP này ngày : 3.Hoạt động của một trang ASP: Khi một trang ASP được yêu cầu bởi web browser, web server sẽ duyệt tuần tự trang ASP này và chỉ dịch các script ASP. Tùy theo người xây dựng trang web này quy định mà kết quả do web server dịch sẽ trả về lần lượt cho trình duyệt của người dùng hay là chỉ trả về khi dịch xong tất cả các script. Kết quả trả về này mặc định là một trang theo cấu trúc của ngôn ngữ HTML 4.Mô hình ứng dụng web qua công nghệ ASP: Thao tác giữa client và server trong một ứng dụng web có thể được thể hiện khái quát như sau: ODBC OLEDB Mô hình ứng dụng Web thể hiện qua công nghệ ASP Web Server HTTP ADO ASP DB Server DBMS SQL Server Client Trình duyệt WEB II. Các đối tượng của ASP: 1. Application Object Đối tượng Application dùng chia sẻ thông tin cho mọi người dùng. Bởi vì thông tin trong đối tượng application được dùng chung cho mọi người dùng nên nó cần một phương thức để bảo đảm tính thống nhất của dữ liệu. Cú pháp : Application.Method • Những vấn đề cần quan tâm khi sử dụng đối tượng application: • Contents: Chứa tất cả những item mà chúng ta thiết lập trong đối tượng application mà không dùng tag . Cú Pháp : Application.Contents( Key ) Key : tên của property cần nhận về Ví dụ: Bạn có thể dùng vòng lặp để nhận tất cả item trong application <% Dim AppItem For Each AppItem in Application.Contents Response.write(ApplicationItem & " : " & Application.Contents(AppItem) & "") Next %> • Lock: phương thức lock ngăn chặn các client khác thay đổi giá trị của biến dùng chung trong đối tượng applicaton. Nếu phương thức UnLock không được gọi thì server tự động thực hiện lệnh này khi xử lý xong các script hoặc time out. Cú pháp: Application.Lock • UnLock: phương thức UnLock cho phép client thay đổi giá trị của các biến lưu trong đối tượng application đã bị lock trước kia. Cú pháp: Application.UnLock <% Application.Lock Application("NumVisits") = Application("NumVisits") + 1 Application.Unlock %> • Application_OnStart: sự kiện này xảy ra khi trước khi session đầu tiên được tạo, nghĩa là nó xảy ra trước sự kiện Sesion_OnStart. Trong sự kiện này chỉ tồn tại đối tượng application và session. • Application_OnEnd: sự kiện Application_OnEnd xuất hiện khi thoát ứng dụng. Nó xảy ra sau sự kiện Session_OnEnd. Trong sự kiện này chỉ tồn tại đối tượng application và session. Cả phương thức Application_OnStart và Application_OnEnd phải được đặt trong tập tin Global.asa Cú pháp : Sub Session_OnEnd . . . End Sub Sub Session_OnStart . . . End Sub 2.Session Session là đối tượng được web server tự động tạo khi một trang web đầu tiên trong ứng dụng được người dùng gọi. Session rất tiện lợi cho người phát triển ứng dụng web trong việc lưu lại thông tin của các người dùng. Đối tượng session sẽ tồn tại cho đến khi session bị hủy hoặc hết hiệu lực(time out). Khi muốn lưu item trong đối tượng session thì phải yêu cầu người dùng cho phép lưu cookies(enable cookies) trong trình duyệt web. Cú pháp : Session.collection | property | method Những vấn đề cần quan tâm khi sử dụng đối tượng session: • Contents: Chứa tất cả những item mà chúng ta thiết lập cho đối tượng session mà không dùng tag . Cú Pháp : Session.Contents( Key ) Key : tên của property cần nhận về Ví dụ: Bạn có thể dùng vòng lặp để nhận tất cả item trong Session <% Dim sessionItem For Each sessionItem in Session.Contents Response.write(sessionItem & " : " & Session.Contents(sessionItem) & "") Next %> • SessionID: Là một con số kiểu long được phát sinh bởi web server khi session được tạo. Mỗi người dùng sẽ có một sessionID không giống nhau. Khi web server bị stop và start trở lại thì những sessionID do web server phát sinh lần sau có thể sẽ trùng với lần trước đó. Do đó chúng ta không thể dùng ID để tạo khóa chính cho một ứng dụng cơ sở dữ liệu. Cú pháp: Session.SessionID • Timeout: Thời gian mà đối tượng Session còn tồn tại. Giá trị này được tính bằng phút . Nếu người dùng không refresh hoặc yêu cầu một trang web của ứng dụng trong khoảng thời gian lớn hơn thời gian timeout thì session sẽ kết thúc. Giá trị mặc định là 20 phút Cú pháp: Session.Timeout [ = nMinutes] • Abandon: Dùng để hủy đối tượng Session và giải phóng tài nguyên. Web server sẽ tự thực hiện phương thức này khi session hết hiệu lực(time out). Khi abandon được gọi, những đối tượng chứa trong session hiện hành sẽ được sắp trong một hàng đợi chờ xóa. Server sẽ xử lý tất cả các script và sau đó xóa các dối tượng trong hàng đợi này. Cú pháp: Session.Abandon Ví dụ: <% Se sesion.Abandon Session("MyName") = "Mary" Reponse.Write(Session("MyName")) %> Ở trang này thì biến Myname vẫn còn tồn tại và sẽ bị hủy khi các lệnh script thực hiện xong. • Session_OnStart: sự kiện này xảy ra khi server tạo một Session. Server sử lý script này khi thực thi yêu cầu một trang. Sesion_OnStart là nơi thuận lợi cho bạn thiết lập các biến bởi vì nó sẽ được gọi trước khi một trang được thực thi. Các đối tượng built_ in tồn tại trong sự kiện này là: Application, ObjectContext, Request, Response, Server và Session • Session_OnEnd: sự kiện này xảy ra khi session bị hủy bởi lệnh Abandom hoặc timeout. Trong sự kiện này chỉ có các đối tượng built_in: Application, Server, Session của ASP là tồn tại. Cả phương thức Session_OnStart và Session_OnEnd phải được đặt trong tập tin Global.asa Cú pháp : Sub Session_OnEnd . . . End Sub Sub Session_OnStart . . . End Sub 3. ObjectContext Object Đối tượng này được sử dụng cho các thao tác transaction. ObjectContext được điều khiển bởi phần mềm quản lý giao tác Microsoft Transaction Server (MTS). Khi một trang ASP chứa chỉ thị @TRANSACTION, trang này sẽ được thực hiện trong một transaction và chỉ chấm dứt xử lý khi tất cả các giao tác thực hiện xong. Cú pháp: ObjectContext.Method Method: • SetComplete: Nếu tất cả thành phần có trong transaction gọi phương thức này thì transaction sẽ được kết thúc. Phương thức SetComplete bỏ qua bất kỳ lệnh SetAbort đã được gọi trước đo Cú pháp: ObjectContext.SetComplete • SetAbort: Phương thức này khai báo tất cả các thao tác được thực hiện trong transaction sẽ không được hoàn thành và tàinguyên có thể sẽ không được cập nhật. Cú pháp: ObjectContext.SetAbort • OnTransactionCommit: sự kiện này xảy ra sau khi tất cả các script giao tác kết thúc. web server(IIS) sẻ xử lý hàm OnTransactionCommit nếu nó tồn tại. • OnTransactionAbort: Tương tự như sự kiện OnTransactionCommit 3.Request Object Đối tượng Request nhận tất cả giá trị mà trình duyệt của của client gởi đến server thông qua một yêu cầu HTTP (HTTP request) Cú pháp: Request[.collection|property|method](variable) Những vấn đề cần quan tâm khi sử dụng đối tượng Request: • ClientCertificate: collection này được lưu trong trường client certificate và gởi kèm trong một HTTP request. Nếu web browser dùng nghi thức SSL3.0 để kết nối với server và server yêu cầu certificate thì browser mới gởi trường này, ngược lại ClientCertificate trả về giá trị EMPTY. Nếu muốn dùng collection này chúng ta phải cấu hình web server yêu cầu client certificate. Cú pháp: Request.ClientCertificate( Key[SubField] ) • Cookies: là một collection được lưu trên máy của client như một tập tin nhỏ. Cookies được trình duyệt của client gởi kèm trong HTTP request. Cú pháp: Request.Cookies(cookie)[(key)|.attribute] Giải thích đối số: - cookie: Chỉ định cookie để nhận giá trị - key: Tham số tùy chọn dùng để nhận các item có trong cookie - attribute: Chỉ định thông tin về bản thân cookie. Tham số thuocä tính này có thể là Name hay HasKeys Chúng ta có thể truy cập đến các item con(subkeys) của cookie (cookie dictionary)thông qua tên của item. Nếu truy cập cookie mà không chỉ định item thì tất cả các item sẽ được trả về trong một chuỗi. Ví dụ MyCookie có 2 khóa, First và second, khi gọi request.Cookies chúng ta sẽ nhận được kết quả là First=firstkeyvalue&Second=secondkeyvalue Nếu hai cookie trùng tên được trình duyệt của client gởi cho server thì câu lệnh Request.Cookies sẽ trả vè cookie có cấu trúc sâu hơn. Ví dụ, nếu hai cookie trùng tên nhưng có đường dẫn là /www/ và /www/home/, client có thể gởi cả hai cookie này cho server nhưng lệnh Request.Cookies sẽ chỉ trả về cookie thứ 2. Để biết được cookie có item không ta dùng lệnh script là: kết quả trả về là một số boolean. Ví dụ sau ghi ra tất cả các item có trong cookie có tên là MyCookie. <% If Request.Cookies(“MyCookie”).Haskeys Then For Each key In Request.Cookies Response.Write item &”=” Response.Write Request.Cookies(“MyCookie”)(key) & “” Next End If %> • Form: collection này nhận giá trị của những thành phần trong form được gởi bằng phương thức POST thông qua một HTTP request. Cú pháp: Request.Form(element)[(index)|.Count] - Element: Tên của một thành phần trong form - index: Tham số tùy chọn cho phép chúng ta truy cập một trong số các giá trị của một parameter. Nó có thể từ 1 đến Request.Form(parameter).Count Form collection được chỉ mục theo tên của các parameter trong request. Chúng ta có thể biết có bao nhiêu parameter trong form collection bằng cách gọi Request.Form().Count. Ví dụ: trang HTML như sau: Your first name: What is your favorite ice cream flavor: Vanilla Strawberry Chocolate Rocky Road Trang submit.asp có nội dung như sau: Welcome: Your favorite flavor is • QueryString: Collection này nhận tất cả các giá trị trong chuỗi query. HTTP query string được chỉ định bởi những giá trị theo sau dấu “?” trong câu lệnh request. Chúng ta có thể sử dụng collection querrystring tương tự như collection form. Cú pháp: Request.QueryString(Tên biến)[(chỉ mục)].Count • ServerVariables: chứa tất cả các thông tin về biến môi trường. 4.Response Object: Khác với đối tượng Request, Response gởi tất cả thông tin xử vừa xử lý cho các client yêu cầu. Chúng ta có thể xử dụng đối tượng này để giao tiếp với người dùng. Cú pháp: Response.collection|property|method Những vấn đề cần quan tâm khi sử dụng đối tượng Request: • Cookies: collection này dùng để thiết lập giá trị cho biến cookies. Nếu cookies không tồn tại thì web server sẽ tạo một cookies mới trên máy client. Ngược lại, giá trị của cookies là giá trị mới thiết lập. Một lưu ý khi sử dụng cookies là giá trị cookies phải là những thông tin được gởi về đầu tiên cho trình duyệt của client. Cú pháp: Response.Cookies(cookie)[(key)|.attribute] = value - Cookie: tên của cookies muốn tạo. - Key: là tham số tùy chọn. Nếu giá trị này được thiết lấp thì cookies này được xem là cookies từ điển. - Attribute: Bao gồm những thông tin liên quan đến cookies: - Domain: thuộc tính chỉ ghi, cho biết domain tạo cookies này. - Expires: thuộc tính chỉ ghi, qui định ngày cookies hết hạn. Nếu không qui định thuộc tính này thì cookies sẽ hết hạn khi session kết thúc. - Haskeys: thuộc tính chỉ đọc, cho biết cookies có chứa item hay không. - Path: thuộc tính chỉ ghi, nếu giá trị này được chỉ định thì client chỉ gởi cookies cho server có đường dẫn này. - Secure: thuộc tính chỉ ghi, qui định giá trị này khi muốn cookies được bảo mật. • Buffer: là một biến kiểu boolean. Nếu thuộc tính này là true thì web server chỉ trả kết quả cho client khi tất cả các script được xử lý hoặc phương thức Flush hay End được gọi. Giá trị mặc định là False. Cú pháp: Response.Buffer = [True, false] • CacheControl: qui định proxy server có được lưu kết quả do trang ASP này phát sinh hay không. Giá trị mặc định là không(private). • ContentType: qui định dạng dữ liệu do web server trả về cho client. Giá trị mặc định là text/HTML. Cú pháp: Response.ContentType [= ContentType ] Ví dụ: • Expires: chỉ định thời gian Cookies trang lưu trên trình duyệt của client. Cú pháp: Response.Expires =[minuter] • IssClientConnected: kiểm tra client còn kết nối với server. Cú pháp: Response.IsClientConnected • BinaryWrite: phương thức này tiện lợi cho việc truyền những thông tin kiểu nhị phân cho client. Cú pháp: Response.write data Data: dữ liệu muốn truyền cho client. • Clear: xóa tất cả dữ liệu chứa trong vùng đệm. Muốn dùng phương thức này phải chỉ định giá trị Response.Buffer = TRUE. Cú pháp: Response.clear • End: Khi gọi phương thức này, server dừng xử lý các script và trả về cho client các kết quả đã thực hiện được. Muốn dùng phương thức này phải chỉ định giá trị Response.Buffer = TRUE. Cú pháp: Response.End • Flush: gởi tất cả dữ liệu trong vùng đệm cho client. Muốn dùng phương thức này phải chỉ định giá trị Response.Buffer = TRUE. Cú pháp: Response.Flush • Redirect: chuyển hướng trình duyệt của client đến một địa chỉ URL khác Cú pháp: Response.Redirect URL • Write: ghi thông tin cho client. Cú pháp: Response.write data 5.Server object: Đối tượng Server cung cấp các phương thức và thuộc tính dùng cho truy cập server. Cú pháp: Server.property|method Những vấn đề cần quan tâm khi sử dụng đối tượng server: • ScriptTimeout: thuộc tính trị qui định thời gian lớn nhất mà các lệnh script còn được thực hiện. Giá trị mặc định là 90 giây. Giá trị timeout sè không hiệu lực khi server thực hiện các script. Cú pháp: Server.ScriptTimeout NumSeconds NumSeconds: Thời gian tối đa mà script hết hiệu lực. • CreateObject: Phương thức CreateObject tạo một instance của một server component. Những đối tượng được tạo bởi phương thức này sẽ server giải phóng khi server thực hiện xong các script. Phương thức này không dùng để tạo các đối tượng built_in của ASP. Cú pháp: Server.CreateObject(progID) progID : kiểu đối tượng muốn tạo. • HTMLEncode: Phương thức này được dùng để mã hóa một chuỗi. Cú pháp: Server.HTMLEncode (string) Ví dụ: ") %> Chuỗi sau khi thực hiện đoạn script trên: The paragraph tag: <P> • MapPath: phương thức này cho biết thông tin về đường dẫn vật lý của một thư mục ảo trên web server. Cú pháp: Server.MapPath (Path) III.Cơ chế kết nối cơ sở dữ liệu: <% Dim objConnection Set objConnection = Server.CreateObject(“ADODB.Connection”) ObjConnection.Open “Publication”, ”sa”, “” Dim objRecordSet Set objRecordSet = Server.CreateObject(“ADODB.RecordSet”) ObjRecordSet.Open “Select pub_name From Publishers”, objConnection %> Đối tượng kiểu Connection: tạo kết nối ADO tới Database. Đối tượng kiểu RecordSet: cho phép thao tác trên table (select,update ...) của Connection được thiết lập. <% objRecordSet.MoveNext Loop ObjRecordSet.close ObjConnection.close Set objRecordSet = nothing Set objConnection = nothing %> Chú ý: khi thêm, cập nhật dữ liệu ngoài việc dùng SQL, có thể thêm theo cách : With objRecordSet do .AddNew .Field(”Authors”) = “Homes” . Field(”Title”) = “Iliad” .Update End With Có thể kết nối trực tiếp không qua DSN của ODBC như sau : <% Set objConnection = Server.CreateObject(“ADODB.Connection”) StrCnn = “driver = {SQL Server}; Server = smas; uid = sa; pwd= ; database= pubs” objConnection.Open strCnn %> B.Thiết kế chương trình: I.Thiết kế cơ sở dữ liệu: Cơ sở dữ liệu gồm 3 bảng: + Bảng giá: Được thiết kế như sau: +Bảng Khách: +Bảng Phòng: II. Thiết kế chương trình: 1.Trang index.htm: Đây là trang chủ, với chức năng link đến các trang khác nhằm quản lý phòng của khách sạn. 2.Trang datphong.asp: Trang này dùng cho khách hàng đặt phòng. Khi khách hàng nhập đủ các yêu cầu và quy định của trang thì những thông tin về khách hàng cũng như phòng mà khách hàng đó đã thuê sẽ được lưu vào CSDL. Và sau mỗi lần thuê phòng thì số lần thuê của phòng đó sẽ được tăng lên. 3.Trang traphong.asp: Khi khách hàng trả phòng thì toàn bộ thông tin về khách hàng đó sẽ được xóa hết trong CSDL. Hệ thống sẽ tự hiển thị số ngày và tổng số tiền mà khách hàng đó phải trả trên trang web. Và phòng khách hàng đó thuê sẽ được CSDL cập nhật là không còn trống. 4.Trang tansuat.asp: Thống kê tấn suất của phòng trong một tháng, một quý , một năm của một phòng và trung bình của toàn khách sạn. 5. Trang thongtinchung.asp: Hiển thị trạng thái của một phòng là còn trống hay không, nếu không thì hiển thị thông tin của khách hàng đó. 6. Trang timkiem.asp: Mục đích tìm kiếm xem có khách hàng cần tìm thuê phòng trong khách sạn của mình hay không. 7. Trang denhantra.asp: Trang này giúp người quản lý biết được tại một thời điểm nào đó, thì có nhứng phòng nào phải đến hẹn trả phòng.

Các file đính kèm theo tài liệu này:

  • docweb qly phong KS-20.DOC