Node.js sử dụng các phần phát sinh các sự kiện event- driven, mô hình non-blocking I/O để tạo ra các ứng dụng nhẹ và hiệu quả cho các ứng dụng về dữ liệu thời gian thực chạy trên các thi
Trang 11
LỜI CẢM ƠN
Để đồ án này đạt kết quả tốt đẹp, em đã nhận được sự hỗ trợ, giúp đỡ của nhiều
cơ quan, tổ chức, cá nhân Với tình cảm sâu sắc, chân thành, cho phép em được bày
tỏ lòng biết ơn đến tất cả các cá nhân và cơ quan đã tạo điều kiện giúp đỡ trong quá trình học tập và nghiên cứu đề tài
Lời đầu tiên em xin gửi lời cảm ơn đến thầy Trần Hải Thanh - giảng viên bộ môn Khoa Học Máy Tính, người đã tạo điều kiện cho em nghiên cứu đề tài này và
tận tình hướng dẫn em để có thể hoàn thành tốt đồ án XÂY DỰNG HỆ THỐNG QUẢN LÝ CHO RẠP CHIẾU PHIM CGV – HÀ NỘI
Em xin bày tỏ lòng biết ơn đến ban giám đốc công ty 2NF và anh Nguyễn Bảo Ngọc đã tạo điều kiện giúp đỡ và hỗ trợ em trong suốt quá trình nghiên cứu đề tài Với điều kiện thời gian cũng như kinh nghiệm còn hạn chế của một sinh viên,
đồ án này không thể tránh được những thiếu sót em rất mong nhận được sự chỉ bảo, đóng góp ý kiến của các thầy cô để em có điều kiện bổ sung, nâng cao kiến thức của mình, để phục vụ tốt hơn công tác thực tế sau này
Em xin chân thành cảm ơn!
Thái Nguyên, ngày tháng 05 năm 2017
Sinh viên thực hiện
NÔNG TRUNG KIÊN
Trang 22
LỜI CAM ĐOAN
Em xin cam đoan đồ án này là quá trình nghiên cứu độc lập của riêng em Các
số liệu sử dụng phân tích trong đồ án có nguồn gốc rõ ràng, đã công bố theo đúng quy định Các kết quả nghiên cứu trong đồ án do em tự tìm hiểu, phân tích một cách trung thực, khách quan và phù hợp với thực tế Các kết quả này chưa từng được công
bố trong bất kỳ nghiên cứu nào khác
Thái Nguyên, ngày tháng 05 năm 2017
Sinh viên thực hiện
NÔNG TRUNG KIÊN
Trang 33
MỤC LỤC
LỜI CẢM ƠN 1
LỜI CAM ĐOAN 2
MỤC LỤC 3
MỞ ĐẦU 5
DANH MỤC HÌNH ẢNH 6
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 8
1.1 Giới thiệu về Node.js 8
Node.js là gì? 8
Đặc điểm của Node.js 8
Các thành phần quan trọng trong Node.js 10
Kiến trúc của Node.js 10
Node.js được sử dụng ở đâu 11
1.2 Giới thiệu về Module trong Node.js 12
Module trong Node.js? 12
Global Scope trong Node.js 12
1.3 Hệ thống quản lý gói NPM 13
Định dạng của một gói 13
Tìm một gói 14
Một số lệnh trong NPM 15
1.4 Xây dựng ứng dụng MVC với Express trong Node.js 17
EventEmitter 17
HTTP – Server 18
Web Server 18
Web Framework Express 19
Đối tượng request và respone trong Node.js 20
Mô hình MVC trong Express 21
1.5 Lưu trữ dữ liệu trên MySQL với Sequelize 23
MySQL 23
Sequelize 24
1.6 Sơ lược về Android, Socket và Socket.IO 29
Android 29
Node.js và Socket.IO 33
CHƯƠNG 2: PHÂN TÍCH VÀ XÂY DỰNG GIẢI PHÁP 36
2.1 Phân tích yêu cầu và lựa chọn giải pháp công nghệ 36
Phân tích yêu cầu 36
Giải pháp công nghệ 36
2.2 Phân tích hệ thống “Quản lý phim cho rạp CGV” 36
Quy trình xử lý của hệ thống 36
Các tác nhân và Use Case của hệ thống 37
Thiết kế các yêu cầu chức năng 42
Biểu đồ lớp 51
Thiết kế cơ sở dữ liệu 52
Trang 44
CHƯƠNG 3: HỆ THỐNG QUẢN LÝ PHIM CHO RẠP CHIẾU PHIM CGV
53
3.1 Biểu đồ hoạt động 53
3.2 Giao diện phần quản lý 54
3.3 Giao diện phần khách hàng 59
KẾT LUẬN 64
TÀI LIỆU THAM KHẢO 65
Trang 55
MỞ ĐẦU
CJ CGV trực thuộc CJ Group - một trong những tập đoàn kinh tế đa ngành
lớn nhất của Hàn Quốc và tập đoàn có mặt ở 21 quốc gia trên toàn cầu CJ CGV là
một trong top 5 cụm rạp chiếu phim lớn nhất toàn cầu và là nhà phát hành, cụm rạp chiếu phim lớn nhất Việt Nam với mục tiêu là trở thành hình mẫu công ty điển hình
đóng góp cho sự phát triển của ngành công nghiệp điện ảnh Việt Nam CJ CGV có
sự quan tâm đến đối tượng khán giả ở các khu vực không có điều kiện tiếp cận nhiều với điện ảnh, bằng cách tạo cơ hội để họ có thể thưởng thức những bộ phim chất
lượng cao thông qua các chương trình vì cộng đồng như Trăng cười và Điện ảnh
cho mọi người
Nhận thấy tiềm năng rất lớn của CJ CGV trong đời sống xã hội cũng như tính phổ biến của lĩnh vực công nghệ thông tin trong lĩnh vực quản lí rạp chiếu phim, công
ty đã giao cho em đề tài này nhằm yêu cầu xây dựng lại hệ thống quản lý rạp cũng như chứng tỏ khả năng áp dụng kiến thức chuyên ngành vào thực tế để em có thể hoàn thành quá trình học tập và nhận bằng tốt nghiệp sau khi hoàn thành đề án này
Sau quá trình tìm hiểu và nghiên cứu thực tế, em đã quyết định lựa chọn Node.js để xây dựng một hệ thống máy chủ, Socket.IO để xử lí đồng bộ thời gian thực và Android để xây dựng ứng dụng cho người dùng Và đây cũng chính là lý do
mà em chọn đề tài: “XÂY DỰNG HỆ THỐNG QUẢN LÝ CHO RẠP CHIẾU PHIM CGV – HÀ NỘI”
Em sẽ trình bày đề tài của mình dưới những nội dung sau:
CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
CHƯƠNG 2: PHÂN TÍCH VÀ XÂY DỰNG GIẢI PHÁP
CHƯƠNG 3: HỆ THỐNG QUẢN LÝ PHIM CHO RẠP CHIẾU PHIM CGV
Trang 66
DANH MỤC HÌNH ẢNH
Hình 1: Các thành phần của Node.js 10
Hình 2: Cấu trúc một ứng dụng web 19
Hình 3: Mô hình MVC trong Node.js 21
Hình 4: Cấu trúc thư mục dự án Node.js MVC 23
Hình 5: Sơ đồ hệ thống 36
Hình 6: Biểu đồ Use Case tổng quát 38
Hình 7: Biểu đồ Use Case “Quản lý đặt vé” 38
Hình 8: Biểu đồ Use Case “Quản lý người dùng” 39
Hình 9: Biểu đồ Use Case “Quản lý giá vé” 39
Hình 10: Biểu đồ Use Case “Quản lý lịch chiếu” 39
Hình 11: Biểu đồ Use Case “Quản lý in vé” 40
Hình 12: Biểu đồ Use Case “Quản lý phim” 40
Hình 13: Biểu đồ Use Case “Thống kê vé bán được theo phim” 40
Hình 14: Biểu đồ Use Case “Xác thực tài khoản” 41
Hình 15: Sơ đồ các lớp 51
Hình 16: Cơ sở dữ liệu 52
Hình 17: Sơ đồ hoạt động đặt vé 53
Hình 18: Giao diện quản lý đặt vé 54
Hình 19: Giao diện chọn ghế 54
Hình 20: Giao diện quản lý phim 55
Hình 21: Giao diện quản lý giá vé 55
Hình 22: Giao diện quản lý khách hàng 56
Hình 23: Giao diện tạo lịch chiếu 56
Hình 24: Giao diện danh sách lịch chiếu 57
Hình 25: Giao diện thống kê vé đã bán 57
Hình 26: Giao diện in vé 58
Hình 27: Giao diện trang chủ 59
Hình 28: Giao diện bảng điều hướng 60
Trang 77
Hình 29: Giao diện đăng nhập 60
Hình 30: Giao diện đăng ký tài khoản 61
Hình 31: Giao diện danh sách phim 61
Hình 32: Giao diện chi tiết phim 62
Hình 33: Giao diện lịch chiếu của phim 62
Hình 34: Giao diện chọn ghế 63
Hình 35: Giao diện xác nhận đặt vé 63
Trang 8Node.js là một nền tảng dựa vào Chrome Javascript runtime để xây dựng các ứng dụng nhanh, có độ lớn Node.js sử dụng các phần phát sinh các sự kiện (event- driven), mô hình non-blocking I/O để tạo ra các ứng dụng nhẹ và hiệu quả cho các ứng dụng về dữ liệu thời gian thực chạy trên các thiết bị phân tán
Node.js là một mã nguồn mở, đa nền tảng cho phát triển các ứng dụng phía Máy chủ và các ứng dụng liên quan đến mạng Ứng dụng Node.js được viết bằng Javascript
và có thể chạy trong môi trường Node.js trên hệ điều hành Window, Linux
Node.js cũng cung cấp cho chúng ta các module Javascript đa dạng, có thể đơn giản hóa sự phát triển của các ứng dụng web sử dụng Node.js với các phần mở rộng
Đặc điểm của Node.js
Dưới đây là vài đặc điểm quan trọng biến Node.js trở thành sự lựa chọn hàng đầu trong phát triển phần mềm:
- Không đồng bộ và Phát sinh sự kiện (Event Driven): Tất các các APIs của thư viện Node.js đều không đồng bộ, nghĩa là không blocking (khóa) Nó rất cần thiết vì Node.js không bao giờ đợi một API trả về dự liệu Máy chủ chuyển sang một API sau khi gọi nó và có cơ chế thông báo về Sự kiện của Node.js giúp Máy chủ nhận được phản hồi từ các API gọi trước đó
- Node cho phép chúng ta thực hiện các giao thức mạng ở cấp độ thấp một cách dễ dàng Chẳng hạn như Node có module HTTP cho phép xây dựng một webserver chỉ với vài dòng code, tuy nhiên vì thế mà chúng ta sẽ phải học nhiều thứ hơn như học về các header của một gói tin HTTP, không như PHP vốn chỉ là một module mở rộng của một webserver có sẵn (như Apache
Trang 99
hay NginX…) – tức là PHP dễ dùng hơn Node nhưng lại không cho phép coder thực hiện các công việc ở cấp độ thấp Tuy nhiên vì Node.js là một framework mã nguồn mở, do đó trên mạng cũng có một số thư viện hỗ trợ viết webserver nhanh hơn và dễ hơn cho coder
- Các tiến trình đơn giản nhưng hiệu năng cao: Node.js sử dụng một mô hình luồng đơn (single thread) với các sự kiện lặp Các cơ chế sự kiện giúp Máy chủ trả lại các phản hồi với một cách không khóa và tạo cho Máy chủ hiệu quả cao ngược lại với các cách truyền thống tạo ra một số lượng luồng hữu hạn để quản lý request Node.js sử dụng các chương trình đơn luồng và các chương trình này cung cấp các dịch vụ cho số lượng request nhiều hơn so với các Server truyền thống như Apache HTTP Server
- Không đệm: Ứng dụng Node.js không lưu trữ các dữ liệu buffer
- Có giấy phép: Node.js được phát hành dựa vào MIT License
- Có trình CLI (giao diện dòng lệnh)
- Chạy theo mô hình REPL(Read Eval Print Loop) : hiểu nôm na là: Đọc - Đánh giá - In - Lặp nó biểu diễn môi trường máy tính như màn hình console trong Linux shell nơi chúng ta có thể gõ các dòng lệnh và hệ thống sẽ trả về các kết quả Node.js cũng có môi trường REPL Nó để thực hiện các tác vụ mong muốn
Trang 1010
Các thành phần quan trọng trong Node.js
Lược đồ dưới đây mô tả các thành phần quan trọng của Node.js mà chúng ta sẽ thảo luận ở các chương tiếp theo
Hình 1: Các thành phần của Node.js
Kiến trúc của Node.js
Node sử dụng kiển trúc lập trình hướng sự kiện không đồng bộ, và đây là một tính năng làm cho các ứng dụng Node có thể chạy với hiệu suất cao Chẳng hạn như đối với các ứng dụng bình thường như một chương trình viết bằng C++ thì khi chúng
ta viết chương trình để đọc dữ liệu, chương trình sẽ phải dừng lại ở đoạn code đọc dữ liệu để chờ cho đến khi có dữ liệu để đọc, nếu muốn chương trình tiếp tục vừa chạy các công việc khác vừa đọc dữ liệu thì phải dùng đến đa luồng (multi-threading), tuy nhiên việc dùng đa luồng rất phức tạp và có thể làm chậm máy chủ
Node chỉ sử dụng một luồng duy nhất, các câu lệnh nhập xuất không cần phải chờ bằng cách sử dụng Event Loop, cứ mỗi lần có sự kiện xảy ra thì chuyển dữ liệu của sự kiện đó đến các hàm xử lý tương ứng, và trong khi các hàm xử lý đang chạy thì vòng lặp sự kiện vẫn tiếp tục nhận sự kiện và chuyển đến các hàm xử lý tương ứng khác
Ví dụ giả sử chúng ta có dòng code lấy dữ liệu từ cơ sở dữ liệu như sau:
result = query('SELECT * from db');
// xử lý result
Trang 1111
Đối với các chương trình bình thường thì khi chạy đến dòng code trên, luồng chạy chương trình đó sẽ phải dừng lại để đợi quá trình xử lý từ cơ sở dữ liệu thực hiện xong và trả về rồi mới tiếp tục được, trong quá trình đợi đó sẽ có nhiều yêu cầu khác xảy ra và hiệu suất phần mềm sẽ giảm do lãng phí tài nguyên, để giải quyết tình trạng đó thì chúng ta có thể dùng cơ chế đa luồng để xử lý, tuy nhiên đa luồng
có một nhược điểm làm tiêu tốn nhiều bộ nhớ và CPU
Thay vì dùng đa luồng thì Node sử dụng cơ chế Event Loop để giải quyết việc này, nói một cách đơn giản thì Node sẽ đưa các câu lệnh chờ trên vào một luồng khác
là Event Loop để xử lý riêng, trong khi luồng chính vẫn sẽ chạy các công việc của riêng nó, và khi nào luồng chính “rảnh” rồi thì luồng Event Loop sẽ chuyển các công việc đã thực hiện xong trở về lại luồng chính Và chính vì Node chỉ sử dụng 2 luồng nên tài nguyên hệ thống sẽ không bị chiếm nhiều như khi dùng cơ chế đa luồng, ngoài
ra việc code sử dụng Event Loop đơn giản hơn nhiều, ví dụ:
query('SELECT * from db', function(err, result) {
if (err) throw err;
// xử lý result
});
Trong đoạn code trên, kết quả trả về từ hàm query() thay vì được gán vào một biến thì sẽ được truyền vào một hàm khác là function(err, result){ }, và hàm này sẽ được chuyển vào luồng Event Loop và chờ cho đến khi luồng chính “rảnh” thì mới được chuyển qua
Node.js được sử dụng ở đâu
Dưới đây là các lĩnh vực mà Node.js được sử dụng như là một sự lựa chọn hoàn hảo:
- Các ứng dụng về I/O
- Các ứng dựng về luồng dữ liệu
- Các ứng dụng về dữ liệu hướng đến thời gian thực
- Các ứng dụng dựa vào JSON APIs
- Các ứng dụng Single Page Application
Trang 1212
1.2 Giới thiệu về Module trong Node.js
Module trong Node.js?
Node.js sử dụng kiến trúc Module để đơn giản hóa việc tạo ra các ứng dụng phức tạp Module là giống như các thư viện trong C, C#, Java, … Mỗi module chứa một tập các hàm chức năng có liên quan đến một "đối tượng" của Module Ví
dụ, http là Module chứa các hàm cụ thể liên quan đến thiết lập HTTP Node.js cung cấp một vài các Module core kèm theo để hỗ trợ chúng ta truy cập file trên hệ thống, tạo các máy chủ HTTP, TCP/UDP, và các hàm tiện ích nhỏ hữu dụng khác
Trước khi sử dụng Module, chúng ta đơn giản chỉ cần khai báo với hàm require(), như sau:
var http = require(“http”);
require() là hàm trả về tham chiếu tới một Module cụ thể Trong trường hợp của đoạn mã trên, chúng ta đang khai báo một tham chiếu tới http Module và lưu nó vào biến http
Trong đoạn mã trên, chúng truyền một tham số là tên của Module Điều này báo cho Node sẽ tìm một Module tên là http trong thư mục node_modules của ứng dụng Nếu nó không thấy, Node sẽ tiếp tục tìm Module đó ở thư mục global cài đặt node Lệnh kiểm tra thư mục global cài đặt node_modules, chúng ta mở giao diện dòng lệnh CMD và gõ lệnh sau:
npm root –g
Quay trở lại vấn đề, chúng ta có thể chỉ rõ file bằng việc truyền vào tham số là
đường dẫn tương đối /path/to/my/module.js hoặc tuyệt đối /path/to/my/module.js
Tóm lại, Module là các đoạn mã được đóng gói lại với nhau Mã trong một Module thường là private – nghĩa là các hàm, biến được định nghĩa và truy cập bởi bên trong của Module Nhưng, chúng ta có thể chìa ra các api là các hàm và/hoặc biến để sử dụng bên ngoài Module
Global Scope trong Node.js
Node.js là môi trường cho phép lập trình sử dụng JavaScript ở phía máy chủ và chạy trên Google's V8 JavaScript engine Như vậy, chúng ta nên thực hiện các đoạn
mã như khi sử dụng lập trình ở phía Khách hàng Ví dụ, chúng ta nên hạn chế sử dụng
Trang 13Một lần nữa, biến global nên được hạn chế đến mức tối đa Vì thế, hãy cần thận
và nhớ sử dụng từ khóa var để khai báo biến
1.3 Hệ thống quản lý gói NPM
Npm (Node Package Manager) là một phần mềm quản lý và phân phối gói dành cho Node, nếu chúng ta có sử dụng các hệ điều hành Linux thì npm giống mấy thứ như apt-get, rpm, yum, MacPorts v.v vậy Mục đích của npm là phân phối các gói Node trên mạng Internet cho tất cả người dùng chỉ với vài dòng lệnh, chúng ta có thể tìm các gói, tải về và cài đặt rất nhanh chóng
Npm cung cấp hai chức năng sau:
- Tạo các online repository cho node.js mà có thể tìm kiếm được tại địa chỉ
Thông thường một filepackage.jsoncó nội dung như sau:
{
name: "packageName", // tên gói
version: "1.0", // số phiên bản
main: "mainModuleName", // tên module chính
modules: { // danh sách các module đi kèm
Trang 14Một gói cũng có thể sử dụng các gói khác, các gói này được ghi trong trườngdependencies, ví dụ:
"description" : "Package nay duoc phat trien boi Optimus",
"homepage" : "http://node.js.com",
"author" : kienctn15@gmail.com
Trường directorieslưu danh sách thư mục của gói, ví dụ:
directories : { lib: './lib', bin: './bin' }
Trường scriptslưu danh sách các lệnh của gói, ví dụinstall, activate, uninstall, update Ví dụ chúng ta xem danh sách các lệnh của gói npm bằng lệnh sau:
Trang 15node3p An Amazon MP3 downloader for Node.js =ncb000gt
Chúng ta tìm được 2 gói làmediatags và node3p, nếu muốn càimediatagsthì chỉ cần dùng lệnhinstall:
Dòng trên sẽ mở website để xem hướng dẫn về gói npm
1.3.3.2 Xem gói tin
Lệnh view sẽ in nội dung của file package.json, nếu nội dung quá dài thì chúng
ta có thể yêu cầu chỉ hiển thị một trường cụ thể nào đó trong file này Ví dụ:
npm view google-openid dependencies
Trang 16Nếu muốn ứng dụng nào cũng có thể đọc được thì chúng ta cài gói đó vào thư mục cài đặt Node bằng cách thêm tùy chọn -g vào sau lệnh install:
npm install -g openid
1.3.3.4 Liệt kê các gói đã được cài đặt
Lệnhnpmlistsẽ liệt kê danh sách các gói đã được cài đặt trong thư mục hiện tại của terminal, danh sách được hiển thị theo dạng cây, bao gồm cả các module con
Trang 171.3.3.5 Cập nhật phiên bản mới cho các gói
Để xem danh sách các gói đã cũ (hay trên mạng đã có phiên bản mới) chúng ta dùng lệnh outdated:
>npm outdated
less@1.3.3 node_modules/less current=1.3.1
gdata-js@2.0.1 node_modules/gdata-js current=0.0.4
consolidate@0.7.0 node_modules/consolidate current=0.5.0
Lệnh outdated hiển thị danh sách các gói đã cũ bao gồm số phiên bản đang cài
và số phiên bản mới nhất Để cập nhật một gói thì chúng ta dùng lệnh update, ví dụ:
Trang 1818
Phương thứcemit()là phương thức của lớpEventEmitternhưng chúng ta đã cho kế thừa trong lớpPulsernên có thể gọi từ lớp Pulser Phương thứcemit()sẽ làm công việc phát sinh một sự kiện để các đối tượng khác có thể lắng nghe và “bắt” sự kiện này, tham số đầu vào của phương thứcemit()gồm có 1 chuỗi là tên sự kiện dùng
để phân biệt các sự kiện, sau đó là danh sách các tham số, ở đây chúng ta không đưa vào tham số nào, nhưng giả sử nếu muốn chúng ta có thể truyền bất cứ thứ gì cũng được, ví dụemit('pulse', 1, 'hello world', 2.7465)
Tiếp theo chúng ta tạo một đối tượng lớpPulser(), sau đó chúng ta cho đối tượng này “lắng nghe” sự kiện pulsebằng phương thứcon(),phương thức này nhận vào tên sự kiện và hàm sẽ xử lý sự kiện đó, ở đây sự kiện phát đi không mang theo tham số nào, nhưng giả sử như nếu có thì nếu muốn bắt các tham số đó chúng ta chỉ cần khai báo trong hàm xử lý là được
HTTP – Server
Đối tượng HTTP Server là đối tượng chính trong một ứng dụng Node, mục đích chính của đối tượng này là lắng nghe và giao tiếp với các kết nối HTTP Mặc dù sau này hầu hết (hoặc chắc chắn) chúng ta sẽ sử dụng một web framework khác là Express
để phát triển ứng dụng vì framework này đã đơn giản hóa mọi thứ, chúng ta chỉ cần quan tâm đến việc phát triển các tính năng chứ không cần quan tâm đến mấy thứ cấp dưới như giao thức, gói tin…v.v nhưng vì Express cũng được xây dựng dựa trên đối tượng HTTP
Web Server
Web Server là một ứng dụng phần mềm có thể xử lý các HTTP request được gửi bởi HTTP Client (ví dụ: trình duyệt web) và trả về một trang web trong phản hồi tới Khách hàng Web Server thường gửi các tài liệu html bên cạnh các ảnh cũng như style sheet và các đoạn Javascript
Trang 1919
Một ứng dụng web thường được chia thành 4 lớp như sau:
Hình 2: Cấu trúc một ứng dụng web
- Client - Lớp này bao gồm các trình duyệt web và các ứng dụng có thể tạo ra
các HTTP request đến Web Server
- Server - Lớp này bao gồm các Web Server có thể can thiệp các request được
tạo bởi Client và trả về các phản hồi (response)
- Business - Lớp này bao gồm ứng dụng trên Máy chủ có thể được tận dụng
bởi các Web Server để thực hiện các tiến trình xử lý cần thiết Lớp này tương tác với lớp Data qua các chương trình bên ngoài
- Data - Lớp này bao gồm các Database và bất kì các nguồn dữ liệu nào
Web Framework Express
Express là một framework nhỏ và tiện ích để xây dựng các ứng dụng web, cung cấp một lượng lớn của tính năng mạnh mẽ để phát triển các ứng dụng web và mobile
Nó rất dễ dàng để phát triển các ứng dụng nhanh dựa trên Node.js cho các ứng dụng Web Dưới đây là các tính năng cơ bản của Express framework
- Cho phép thiết lập các lớp trung gian để trả về các HTTP request
- Định nghĩ bảng routing có thể được sử dụng với các hành động khác nhau dựa trên phương thức HTTP và URL
Trang 2020
- Cho phép trả về các trang HTML dựa vào các tham số truyền vào đến template
Các module được phân loại thành các chức năng chính sau đây:
- Router: có chức năng điều hướng các yêu cầu HTTP đến các hàm xử lý
tương ứng Đây cũng là tính năng có trong các web framework phổ biến
khác như Ruby on Rails, Django, Sinatra…
- Static file servers: có các hàm trả về các file tài nguyên cho khách hàng
- Framework: hỗ trợ phát triển ứng dụng, hầu hết các framework này đều
được phát triển dựa trên các framework phổ biến khác như Django, Rails, WebMachine, CakePHP… trong đó Express là web framework phổ biến nhất của Node
- Middleware: các module loại này hoạt động giữa phần nhận gói tin HTTP
và phần chuyển gói tin đó đến các hàm xử lý
Để cài đặt Express framework sử dụng npm như sau:
$ npm install express –save
Lệnh trên lưu phần cài đặt trong thư mục node_modules và tạo thư mục express bên trong thư mục đó Dưới đây là các thành phần module quan trọng được cài đặt cùng với express:
- body-parser - Đây là một lớp trung gian node.js để xử lí JSON, dự liệu thô,
text và mã hóa URL
- cookie-parser - Chuyển đổi header của Cookie và phân bố đến các
req.cookies
- multer - Đây là một thành phần trung gian trong node.js để xử lí phần
multipart/form-data
Đối tượng request và respone trong Node.js
Ứng dụng Express sử dụng một hàm callback có các tham số là các đối tượng request và response
Trang 2121
- Đối tượng Request - Đối tượng này biểu diễn một HTTP request và có các thuộc tính cho các request như các chuỗi truy vấn, tham số, body, HTTP header và những phần khác
- Đối tượng Response - Đối tượng này biểu diễn HTTP response được ứng dụng Express gửi đi khi nó nhận về một HTTP request
Mô hình MVC trong Express
C là Controller: Nhận lệnh từ người dùng, gửi lệnh đến cho Model để cập nhập
dữ liệu, truyền lệnh đến View để cập nhập giao diện hiển thị
Hình 3: Mô hình MVC trong Node.js
Quy trình xử lý chung của web thường như sau:
- Người dùng gọi yêu cầu xử lý tại một trang bất kỳ(giả sử trang chủ)
Trang 2222
- “Controller” nhận yêu cầu này và đưa lệnh xử lý yêu cầu đó Các lệnh thực thi với phần “View” thì cập nhập hoặc phục vụ yêu cầu trang web, với
“Model” thì để trình diễn logic Ta giả sử lệnh yêu cầu có yếu tố logic
- “Model” thực thi phần logic được lấy từ cơ sở dữ liệu và gửi trả lại phản hồi dựa trên hướng dẫn của “Controller”
- “Controller” truyền dữ liệu ra phần “View”, cập nhật giao diện hiển thị cho người dùng
Bản thân Express không được xây dựng theo mô hình MVC, nhưng module express-generator dùng để tạo một project Express thì lại tạo cho chúng ta một ứng dụng gần như là giống với MVC bởi vì các project này tồn tại 2 thứ:
Thư mục views chứa các file template (file có phần mở rộng là ejs), các file này được dùng để hiển thị dữ liệu, tức là tương tự với phần Views trong MVC
Thư mục routes được dùng để chuyển hướng các URL đến các hàm xử lý tương ứng, tức là tương tự với Controller trong MVC
Vậy thì để ứng dụng của chúng ta vận hành theo đúng mô hình MVC thì thành phần còn thiếu là Model Model có chức năng lưu trữ dữ liệu, thay đổi/cập nhật dữ liệu, hỗ trợ truy vấn dữ liệu Và dĩ nhiên là code lưu trữ model cũng nên được lưu trong một thư mục riêng tách rời với views và routes
1.4.6.2 Cách xây dựng mô hình MVC trong Express
Đầu tiên tạo 1 folder project
Tiếp theo, chúng ta gõ lện cd vào thư mục chứa project
Chúng ta install express cấu trúc MVC
express sessions css less hogan app
Chúng ta sẽ được một dự án Node.js MVC tương tự như sau:
Trang 2323
Hình 4: Cấu trúc thư mục dự án Node.js MVC
1.4.6.3 View trong Express
Trong mô hình MVC, phần View để có thể hiển thị dữ liệu động cho một trang nào đó, thì chúng ta cần phải có các template dựng sẵn
Đối với lập trình web application trên Node.js, chúng ta có thể sử dụng một
số TemplateEngine sau:
- EJS: Là một JavaScript Template library vô cùng dễ sử dụng, cú pháp đơn giản, rõ ràng
- Mustache: Là một Logic-less templates cũng khá nổi tiếng với những ai hay code java script để bind dữ liệu từ chuỗi JSON Template này sử dụng trên rất nhiều ngôn ngữ, phiên bản sử dụng cho Node.js các chúng ta có thể tìm tại trang sau: https://github.com/raycmorgan/Mu
- Để khỏi bỡ ngỡ với quá nhiều engine, chúng ta sẽ cùng nhau đi từ những phần nhỏ của nó Hôm nay chúng ta sẽ bắt đầu từ engine EJS
1.5 Lưu trữ dữ liệu trên MySQL với Sequelize
MySQL
MySQL là một hệ quản trị cơ sở dữ liệu SQL rất mạnh và miễn phí Nếu chúng
ta đã cài MySQL trong máy rồi thì chúng ta chỉ cần tạo một CSDL có tên
lànotes (không tạo bảng) rồi có thể bỏ qua phần này và kéo xuống phần tạo model
Trang 2424
phía dưới Nếu chưa thì chúng ta lên trang chủ của MySQL và tải bản Community về
tại địa chỉ http://dev.mysql.com /downloads/ MySQL là một hệ quản trị cơ sở dữ liệu,
phần lõi chịu trách nhiệm lưu trữ, đọc/ghi dữ liệu… tất cả đều được thực hiện qua dòng lệnh, do đó nếu muốn chúng ta có thể tải thêm phần mềm MySQL Workbench
về, đây là phần mềm cho phép chúng ta làm việc với MySQL thông qua giao diện GUI, nghĩa là thay vì dùng dòng lệnh thì chúng ta chỉ cần thực hiện các thao tác click chuột đơn giản
Quá trình cài đặt MySQL rất đơn giản, chúng ta chỉ cần lưu ý một số thứ như tên tải khoản truy cập, thường là root, mật khẩu, chế độ cài (Developement, Deploy…)…
Sau khi đã cài đặt xong, chúng ta có thẻ bắt đầu truy cập máy chủ của MySQL
để tạo CSDL Ở đây mình dùng MySQL Workbench cho nhanh Khi mở MySQL Workbench lên, chúng ta sẽ phải tạo những cái gọi làConnections, nếu chúng ta chưa từng làm việc với Connection thì có thể hình dung đây giống như là các nút để chúng
ta thực hiện kết nối tới máy chủ vậy Để tạo một connection thì chúng ta click vào nút dấu + phía trên bên trái màn hình, sau đó điền các thông tin như tên connection, host là 127.0.0.1, port là 3306, username là tên đăng nhập mà chúng ta tạo khi cài MySQL, vậy là xong
Sequelize
Sequelize là một ORM(Object Relation Mapping)dành cho Node.js và io.js Nó
hỗ trợ chúng ta truy cập một cách dễ dàng đến PostgreSQL, MySQL, MariaDB, SQLite và MSSQL cùng với các tính năng như là relations, transaction, replication
1.5.2.1 Cài đặt Sequelize
Để cài đặt module Sequelize cho dự án chỉ cần gọi dòng lệnh:
npm install save sequelize
Để module Squelize có thể tương tác với hệ quản trị cơ sở dữ liệu MySQL ta chạy dòng lệnh:
npm install –save mysql
Trang 2525
1.5.2.2 Tạo connection pool
Sequelize sẽ tạo 1 connection pool khi được khởi tạo vì vậy chúng ta chỉ nên tạo duy nhất 1 instance trên 1 database:
var sequelize = new Sequelize('database', 'username', 'password', {
1.5.2.3 Các model trong Sequelize
Để tạo 1 ánh xạ giữa 1 model và 1 table ta sử dụng phương thức define Sequelize sẽ tự động tạo các attributes là createdAt và updatedAt (nếu không muốn
sử dụng hoặc chỉ sử dụng 1 trong 2 attributes thì ta có thể tham khảo ở phần config sau đây):
var Project = sequelize.define('project', {
title: Sequelize.STRING,
description: Sequelize.TEXT
})
Ngoài ra chúng ta có thể thêm các option cho các attributes:
var Task = sequelize.define('task', {
Trang 261.5.2.4 Query trong Sequelize
Để select một vài attribute, chúng ta có thể sử dụng attributes option:
Model.findAll({
attributes: ['foo', 'bar']
});
Mệnh đề Where
Trang 2828
Các toán tử chúng ta có thể sử dụng cùng với Where:
$and: {a: 5} // AND (a = 5)
$or: [{a: 5}, {a: 6}] // (a = 5 OR a = 6)
$not: true, // IS NOT TRUE
$between: [6, 10], // BETWEEN 6 AND 10
$notBetween: [11, 15], // NOT BETWEEN 11 AND 15
$in: [1, 2], // IN [1, 2]
$notIn: [1, 2], // NOT IN [1, 2]
$like: '%hat', // LIKE '%hat'
$notLike: '%hat' // NOT LIKE '%hat'
$iLike: '%hat' // ILIKE '%hat' (case insensitive) (PG only)
$notILike: '%hat' // NOT ILIKE '%hat' (PG only)
$like: { $any: ['cat', 'hat']}// LIKE ANY ARRAY['cat', 'hat']
Raw Query: Đôi khi chúng ta muốn excute một raw query, khi đó chúng ta có thể sử dụng sequelize.query
sequelize.query("SELECT * FROM `users`");
var Player = this.sequelize.define('player', {/* attributes */})
, Team = this.sequelize.define('team', {/* attributes */});
Player.belongsTo(Team);
Has one:
var User = sequelize.define('user', {/* */})
var Project = sequelize.define('project', {/* */})
// One-way associations
Trang 2929
Project.hasOne(User)
One-To-Many associations
var User = sequelize.define('user', {/* */})
var Project = sequelize.define('project', {/* */})
Project.hasMany(User, {as: 'Workers'})
Belongs-To-Many associations
Project.belongsToMany(User, {through: 'UserProject'});
User.belongsToMany(Project, {through: 'UserProject'});
1.6 Sơ lược về Android, Socket và Socket.IO
Android
Android là một hệ điều hành dựa trên nền tảng Linux được thiết kế dành cho các thiết bị di động có màn hình cảm ứng như điện thoại thông minh và máy tính bảng Ban đầu, Android được phát triển bởi Tổng công ty Android, với sự hỗ trợ tài chính từ Google và sau này được chính Google mua lại vào năm 2005 Android ra mắt vào năm 2007 cùng với tuyên bố thành lập Liên minh thiết bị cầm tay mở: một hiệp hội gồm các công ty phần cứng, phần mềm, và viễn thông với mục tiêu đẩy mạnh các tiêu chuẩn mở cho các thiết bị di động Chiếc điện thoại đầu tiên chạy Android được bán vào tháng 10 năm 2008
Android có mã nguồn mở và Google phát hành mã nguồn theo Giấy phép Apache Chính mã nguồn mở cùng với một giấy phép không có nhiều ràng buộc đã cho phép các nhà phát triển thiết bị, mạng di động và các lập trình viên nhiệt huyết được điều chỉnh và phân phối Android một cách tự do Ngoài ra, Android còn có một cộng đồng lập trình viên đông đảo chuyên viết các ứng dụng để mở rộng chức năng của thiết bị, bằng một loại ngôn ngữ lập trình Java có sửa đổi
Cấu tạo của Android:
Lớp Linux Kernel trong Android
Linux Kernel là lớp thấp nhất Nó cung cấp các chức năng cơ bản như quản lý tiến trình, quản lý bộ nhớ, quản lý thiết bị như: Camera, bàn phím, màn hình, …
Trang 3030
Ngoài ra, nó còn quản lý mạng, driver của các thiết bị, điều này gỡ bỏ sự khó khăn
về giao tiếp với các thiết bị ngoại vi
Libraries trong Android
Phía trên Linux Kernel là tập hợp các bộ thư viện mã nguồn mở WebKit, bộ thư viện nổi tiếng libc, cơ sở dữ liệu SQLite hữu ích cho việc lưu trữ và chia sẻ dữ liệu,
bộ thư viện thể phát, ghi âm về âm thanh, hoặc video Thư viện SSL chịu trách nhiệm cho bảo mật Internet
Android Libraries
Phần này gồm các thư viện dựa trên Java Nó bao gồm các Framework Library giúp xây dựng, vẽ đồ họa và truy cập cơ sở dữ liệu trở nên dễ dàng hơn Dưới đây là một số Android Library cốt lõi có sẵn cho lập trình viên Android: −
android.app − Cung cấp truy cập tới mô hình ứng dụng và nó là nền móng cho tất cả ứng dụng Android
android.content − Việc truy cập nội dung, các thông điệp giữa các ứng dụng
và các thành phần ứng dụng trở nên dễ dàng hơn
android.database − Được sử dụng để truy cập dữ liệu được công bố bởi Provider và bao gồm các lớp quản lý cơ sở dữ liệu SQLite
android.opengl − Một Java Interface cho OpenGL ES 3D thông qua API
android.os − Cung cấp cho các ứng dụng sự truy cập tới các dịch vụ chuẩn của hệ điều hành như thông báo, dịch vụ hệ thống và giao tiếp nội tiến trình
android.text − Được sử dụng để phục hồi và thao tác text trên một thiết bị hiển thị
android.view − Các khối kiến trúc nền tảng của ứng dụng UI
android.widget − Một tập hợp các UI được xây dựng trước như button, label, list view, layout manager, radio button, …
android.webkit − Một tập hợp các lớp cho phép khả năng để trình duyệt trên web được xây dựng bên trong các ứng dụng
Android Runtime
Trang 3131
Đây là thành phần thứ 3 trong cấu trúc, thuộc về lớp 2 tính từ dưới lên Phần này cung cấp một thành phần quan trọng gọi là Dalvik Virtual Machine là một máy
ảo Java đặc biệt, được thiết kế tối ưu cho Android
Máy ảo Dalvik VM sử dụng các tính năng cốt lõi của Linux như quản lý bộ nhớ,
đa luồng, mà thực chất là bên trong ngôn ngữ Java Máy ảo Dalvik cho phép tất cả các ứng dụng Android chạy trong tiến trình riêng của nó
Android Runtime cũng cung cấp bộ thư viện cốt lõi, cho phép các lập trình viên Android sử dụng để viết các ứng dụng Android
Application Framework
Lớp Application Framework cung cấp nhiều dịch vụ cấp cao hơn cho các ứng dụng trong các lớp Java Các lập trình viên cũng được phép sử dụng các dịch vụ này trong các ứng dụng của họ
Application Framework bao gồm các dịch vụ chính sau:
Activity Manager − Điều khiển các khía cạnh của vòng đời ứng dụng và Activity Stack
Content Providers − Cho phép các ứng dụng công bố và chia sẻ dữ liệu với các ứng dụng khác
Resource Manager − Cung cấp sự truy cập tới các resource được nhúng (không phải code) như chuỗi, thiết lập màu, UI layout
Notifications Manager − Cho phép các ứng dụng hiển thị thông báo tới người dùng
View System − Một tập hợp các view được sử dụng để tạo UI cho ứng dụng
Applications
Chúng ta sẽ thấy tất cả các ứng dụng Android ở lớp trên cùng Ứng dụng chúng ta viết sẽ được cài đặt vào lớp này Ví dụ của những ứng dụng này là
Contacts Books, Browser, Games, …
Có 4 kiểu thành phần trong ứng dụng của Android bao gồm:
Activities
Services
Content providers
Broadcast receivers
Trang 3232
Mỗi thành phần này được sử dụng cho mỗi mục đích khác nhau và có một vòng đời khác nhau, sau đây ta sẽ đi vào tìm hiểu chi tiết từng thành phần của ứng dụng Android
Activities
Một Activity được xem như một điểm tiếp xúc với người dùng Nó là một màn hình đơn với giao diện trên đó Ví dụ các bạn cài và chạy lên ứng dụng này thì màn hình chạy lên các bạn sẽ thấy giao diện hiện thị cho chúng ta xem, đó là một Activity Activty giúp người dùng tương tác với hệ thống, thực hiện các chức năng cần thiết trên đó, chuyển đổi qua lại giữa các màn hình giao diện/ chức năng
Services
Service có chức năng giúp ứng dụng vẫn chạy được, nhưng không cần hiện thị trên giao diện (gọi là chạy ngầm bên dưới ) Ví dụ các bạn dùng các ứng nghe nhạc, mặc dù các bạn tắt ứng dụng rồi nhưng vẫn nghe được nhạc ( đó là vì nó đang chạy dưới nền /background ) Chúng ta có thể liên kết/ kết nối giữa một Activity với một service, ví dụ: khi download một file từ trên mạng, việc download thực hiện ở service, sau đó sẽ trả kết quả phần trăm download lên activity để hiện thị cho người dùng biết
Broadcast receivers
Broadcast receiver được sử dụng trong nhiều trường hợp, ví dụ: chúng ta có thể chuyển dữ liệu từ service lên activity (ngoài sử dụng binding) chúng ta có thể sử dụng broadcast để gửi dữ liệu Hoặc trong các ứng dụng như hẹn giờ, khi đến giờ hẹn, ứng dụng sẽ sử dụng broadcast báo thức, tạo ra notification trên màn hình để báo cho người dùng biết
Content providers
Content provider quản lý các cách để ứng dụng có thể lưu trữ dữ liệu trên hệ thống Chúng ta sẽ biết cụ thể về thành phần này khi xây dựng các ứng dụng cần lưu trữ vào SQLite Ví dụ các ứng dụng từ điển, các bạn sẽ thấy dữ liệu, từ vựng chúng
ta tra hiện thị, thì dữ liệu hiện thị đó được lưu trữ trong Slite và Content provider gọi
để lấy ra cho người dùng xem Ngoài ra thành phần này còn thực hiện các chức năng, thêm, sửa, xóa dữ liệu…
Ngoài ra còn có thêm Intent và Notification cùng nhiều loại khác