Tải bản đầy đủ (.pdf) (65 trang)

XÂY DỰNG hệ THỐNG QUẢN lý CHO rạp CHIẾU PHIM CGV – hà nội

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.29 MB, 65 trang )

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

1


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

2


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
3



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

4


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

5


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
6


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

7


CHƯƠNG 1: CƠ SỞ LÝ THUYẾT
1.1. Giới thiệu về Node.js
Node.js là gì?
Node.js là một nền tảng phía máy chủ được xây dựng dựa trên Javascript Engine
(V8 Engine). Node.js được phát triển bởi Ryan Dahl năm 2009 và phiên bản cuối
cùng là v0.10.36. Định nghĩa Node.js bởi tài liệu chính thức như sau:

Node.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 (eventdriven), 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
8


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.

-

Có các hàm quản lý tiến trình.

-

Có các đối tượng hỗ trợ làm việc với dữ liệu nhị phân.

-

Hỗ trợ TCP và UDP.

-

Hỗ trợ phân giải DNS.

-

Hỗ trợ HTTP và HTTPS.

-

Có thể truy cập file và thư mục.

9


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

10


Đố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
11


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
12


biến global. Tuy nhiên, nếu muốn sử dụng, chúng ta có thể dễ dàng tạo một biến
global bằng việc định nghĩa tên biến không có từ khóa var, như sau:
globalVariable = 1;
globalFunction = function () { ... };

Mộ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ỉ

-


Cung cấp các tiện ích để cài đặt gói Node.js, quản lí version và quản lí phụ

-

thuộc của các gói trong Node.js.
Bản thân npm cũng là một gói của Node và được viết theo quy tắc chuẩn của
CommonJS
Định dạng của một gói
Gói npm là một thư mục trong đó chứa một file có tên là package.json, file này
lưu các thông tin mô tả về gói. Các thông tin này được ghi theo định dạng chuẩn
CommonJS Package 1.0. Để tìm hiểu về file package.json của gói npm thì có thể gõ
lệnh sau: npm

help json

Thông thường một file package.json có 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

13


"mod1" : "lib/mod1",
"mod2" : "lib/mod2"
}
}

Tên module chính trong trường main chỉ định module sẽ được chạy đầu tiên khi
chúng ta gọi hàm require('packageName'). Một gói cũng có thể chứa nhiều module
khác và được liệt kê trong trường modules
Mộ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ường dependencies, ví dụ:
"dependencies" : {
"foo" : "1.0.0 - 2.x.x",
"bar" : ">=1.0.2 < 2.1.2"
}

Ngoài ra còn có trường description (mô tả) và trường keyword (từ khóa) có tác
dụng hỗ trợ người khác tìm gói của chúng ta trên hệ thống npm dễ dàng hơn.
Trường homepage ghi địa chỉ website của người phát triển gói (hoặc bất cứ địa chỉ
nào mà người đó muốn), trường author ghi thông tin của người phát triển, ví dụ:

"description" : "Package nay duoc phat trien boi Optimus",
"homepage" : "",
"author" :

Trường directories lưu danh sách thư mục của gói, ví dụ:
directories : { lib: './lib', bin: './bin' }
Trường scripts lư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:
npm help scripts

Lệnh trên sẽ mở website tài liệu của gói npm.
Tìm một gói
Mặc định khi cài thì các gói sẽ được tải về từ địa chỉ . Để cài
thì chúng ta chỉ cần gõ lệnh:
npm install <tên gói>

14


Nếu chúng ta không biết tên gói thì có thể tìm trên 2 website là npmjs.or
g hoặc search.npmjs.org.
Ngoài ra chúng ta có thể dùng lệnh search của npm để tìm nữa, ví dụ giả sử
chúng ta tìm các gói có liên quan đến từ khóa mp3 thì gõ lệnh sau:
npm search mp3
mediatags Tools extracting for media meta-data tags =coolaj16 uttil m4a aac
mp3 id3 jpeg exiv xmp
node3p 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ài mediatags thì
chỉ cần dùng lệnh install:

npm install mediatags

Sau khi cài gói nếu muốn xem tài liệu về gói đó thì chúng ta có thể dùng
lệnh view:
npm view zombie

Một số lệnh trong NPM
1.3.3.1. Xem hướng dẫn sử dụng
Lệnh help trong npm cho biết tất cả mọi thứ về gói/lệnh/module cụ thể, ví dụ:
npm help npm

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
{ express: '>= 0.0.1', openid: '>= 0.1.1 <= 0.1.1' }

Lệnh trên sẽ in nội dung trường dependencies trong file package.json của
gói google-openid.
1.3.3.3. Cài một gói
Đơn giản là chỉ cần dùng lệnh npm install với tên gói là được:

15


npm install openid
node_modules/openid
...


Lưu ý là các gói sẽ được tải về trong thư mục node_modules trong thư mục hiện
tại của terminal, tức là đoạn lệnh trên sẽ tải gói openid về thư node_modules. Các gói
được cài như vậy sẽ chỉ có thể đọc được từ các ứng dụng nằm cùng thư mục hoặc các
ứng dụng nằm trong thư mục con.
Nế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ệnh npm list sẽ 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
có trong từng gói. Ví dụ:
>npm list
├─┬
│ ├─┬
│ │ ├──
│ │ ├──
│ │ ├──
│ │ ├──
│ │ ├──
│ │ ├──
│ │ ├──
│ │ └──
│ └─┬
│ └──
├─┬
│ └─┬
│ ├──
│ ├──
│ ├─┬

│ │ └─┬
│ │ ├──
│ │ ├──
│ │ ├──

16


│ │ ├──
│ │ ├──
│ │ └──
│ ├──
│ ├─┬
...

1.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
node_modules/less current=1.3.1
node_modules/gdata-js current=0.0.4
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ụ:
>npm update express
./node_modules/express/node_modules/connect
./node_modules/express/node_modules/mime
./node_modules/express/node_modules/qs
./node_modules/express


1.3.3.6. Xóa một gói
Nếu chúng ta đang dùng thử một gói mà thấy nó không cần thiết thì có thể xóa
đi bằng lệnh uninstall,ví dụ:
>npm uninstall openid
unbuild

1.4. Xây dựng ứng dụng MVC với Express trong Node.js
EventEmitter
EventEmitter là một lớp trong Node, lớp này có chức năng chính là phát sinh sự
kiện, vì Node chạy theo hướng lập trình sự kiện nên lớp này là một trong số những
lớp cốt lõi của Node, cũng vì thế nên dù EventEmitter không liên quan gì tới web
nhưng đóng một vai trò rất quan trọng.

17


Phương thức emit() là phương thức của lớp EventEmitter nhưng chúng ta đã
cho kế thừa trong lớp Pulser nên có thể gọi từ lớp Pulser. Phương thức emit() 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ức emit() 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ớp Pulser(), sau đó chúng ta cho đối
tượng này “lắng nghe” sự kiện pulse bằng phương thức on(), 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.

18


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.

19


-

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.
20


-

Đố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

1.4.6.1. MVC là gì?
M là Model: cấu trúc dữ liệu theo cách tin cậy và chuẩn bị dữ liệu theo lệnh của
controller
V là View: Hiển thị dữ liệu cho người dùng theo cách dễ hiểu dựa trên hành
động của người dùng.
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ủ).
21


-

“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:

22


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ố Template Engine 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: />
-

Để 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
23


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ỉ /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

24



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', {
host: 'localhost',
dialect: 'mysql'|'mariadb'|'sqlite'|'postgres'|'mssql',

pool: {
max: 5,
min: 0,
idle: 10000
},
storage: 'path/to/database.sqlite' // Chỉ dùng khi MS là SQLite
});

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', {
title: Sequelize.STRING,

description: Sequelize.TEXT,
deadline: Sequelize.DATE
})

Một số kiểu dữ liệu phổ biến của Sequelize
Sequelize.STRING

// VARCHAR(255)

Sequelize.STRING(1234)

// VARCHAR(1234)

Sequelize.STRING.BINARY

// VARCHAR BINARY

Sequelize.TEXT

// TEXT

25


×