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.. Hình 1: Các thành phần của
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 sâu sắc đế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 để em có thể hoàn thành tốt đồ án: " Nodejs và giải
pháp order online cho quán đồ ăn nhanh Zigg Fast Food "
Em xin bày tỏ lòng biết ơn đến ban lãnh đạo cửa hành đồ ăn vặt Zigg Fast Food, đã tạo điều kiện giúp đỡ 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 trong 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
Phạm Bá Việt
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
Phạm Bá Việt
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
DANH MỤC TỪ VIẾT TẮT 8
CHƯƠNG 1 CƠ SỞ LÝ THUYẾT 9
1.1 Giới thiệu về Nodejs 9
Nodejs là gì? 9
Đặc điểm của Nodejs 9
Các thành phần quan trọng trong Nodejs 11
Kiến trúc của Nodejs 11
Nodejs được sử dụng ở đâu 12
1.2 Giới thiệu về Module trong Nodejs 13
Module trong Nodejs? 13
Global Scope trong Nodejs 14
1.3 Hệ thống quản lý gói NPM 14
Định dạng của một gói 14
Tìm một gói 16
Một số lệnh trong NPM 16
1.4 Xây dựng ứng dụng MVC với Express trong Nodejs 19
EventEmitter 19
HTTP – Server 19
Web Server 20
Web Framework Express 20
Đối tượng request và respone trong Nodejs 22
Mô hình MVC trong Express 22
Trang 44
1.5 Lưu trữ dữ liệu trên MySQL với Sequelize 25
MySQL 25
Sequelize 25
1.6 Sơ lược về Socket và Socket.io 29
Android, Nodejs và Socket IO 30
Xây dựng client Android 30
CHƯƠNG 2 PHÂN TÍCH VÀ XÂY DỰNG GIẢI PHÁP ORDER ONLINE 32 2.1 Phân tích yêu cầu và lựa chọn giải pháp công nghệ 32
Phân tích yêu cầu 32
Giải pháp công nghệ 32
2.2 Phân tích hệ thống “Giải pháp order online” 33
Quy trình xử lý của hệ thống 33
Các tác nhân và Use Case của hệ thống 34
Thiết kế các yêu cầu chức năng 39
Biểu đồ lớp 65
Thiết kế CSDL 65
CHƯƠNG 3 HỆ THỐNG ORDER ONLINE ZIGG FASTFOOD 66
3.1 Sơ đồ hoạt động của hệ thống 66
3.2 Giao diện phần quản lý 68
3.3 Giao diện phần khách hàng 71
Giao diện web 71
Giao diện trên ứng dụng mobile 78
3.4 Giao diện phần nhân viên giao hàng 83
KẾT LUẬN 86
TÀI LIỆU THAM KHẢO 87
Trang 55
MỞ ĐẦU
Zigg Fast Food là thương hiệu đồ ăn vặt nổi tiếng tại Hà Nội với hệ thống gồm
3 cửa hàng phân bố tại các khu vực trung tâm nội thành Để phục vụ nhu cầu ăn uống của các khách hàng một cách tiện lợi nhất, cửa hàng đã thành lập hệ thống bán hàng giao tận nơi
Tuy nhiên, cửa hàng gặp phải một khó khăn và bất tiện trong quá trình đặt hàng của khác hàng qua các phương tiện, công cụ thiếu chuyên nghiệp và khó quản lý như: gọi điện thoại, facebook, nhắn tin…
Để giải quyết khó khăn này, em đã quyết định cần phải xây dựng một hệ thống order online cho cửa hàng Sau quá trình tìm hiểu và nghiên cứu thực tế em đã quyết định lựa chọn Nodejs để xây dựng một hệ thống máy chủ cho nhà hàng trong công việc xử lý order online Và đây cũng chính là lý do mà em chọn đề tài:
“Nodejs và giải pháp order online cho quán đồ ăn nhanh Zigg Fast Food”
Bài báo cáo được trình bày gồm 3 phần cơ bản sau:
Chương 1 CƠ SỞ LÝ THUYẾT: Nêu lên các khái niện cơ bản về Nodejs, cách
thức triển khai và hoạt động của máy chủ Nodejs, các kiến thức liên quan: Android, MySql…
Chương 2 PHÂN TÍCH VÀ XÂY DỰNG GIẢI PHÁP ORDER ONLINE: Phân
tích các vấn đề của giải pháp và xây dựng hệ thống giải quyết các vấn đề
Chương 3 HỆ THỐNG GIẢI PHÁP ORDER ONLINE ZIGG FAST FOOD
Trang 66
DANH MỤC HÌNH ẢNH
Hình 1: Các thành phần của Nodejs 11
Hình 2: Cấu trúc một ứng dụng web 20
Hình 3: Mô hình MVC trong Nodejs 23
Hình 4: Cấu trúc thư mục dự án Nodejs MVC 24
Hình 5: Sơ đồ sử lý của hệ thống 33
Hình 6: Biểu đồ Use Case tổng quát 34
Hình 7: Biểu đồ Use Case “Quản lý thực đơn” 35
Hình 8: Biểu đồ Use Case “Quản lý nhân viên” 35
Hình 9: Biểu đồ Use Case “Quản lý đặt hàng” 36
Hình 10: Biểu đồ Use Case “Xác thực người dùng” 36
Hình 11: Biểu đồ trình tự UC01: Đăng nhập 40
Hình 12: Biểu đồ trình tự UC02: Đăng ký 42
Hình 13: Biểu đồ trình tự UC03: Xem danh sách món ăn 43
Hình 14: Biểu đồ trình tự UC04: Thêm mới món ăn 45
Hình 15: Biểu đồ trình tự UC05: Cập nhật thông tin món ăn 46
Hình 16: Biểu đồ trình tự UC06: Xóa món ăn 48
Hình 17: Biểu đồ trình tự UC07: Xem danh sách nhân viên 49
Hình 18: Biểu đồ trình tự UC08: Thêm mới nhân viên 50
Hình 19: Biểu đồ trình tự UC09: Cập nhật thông tin thành viên 52
Hình 20: Biểu đồ trình tự UC10: Xóa nhân viên 53
Hình 21: Biểu đồ trình tự UC11: Xem danh sách đơn hàng 54
Hình 22: Biểu đồ trình tự UC12: Xác nhận đơn đặt hàng 56
Hình 23: Biểu đồ trình tự UC13: Chọn nhân viên giao hàng cho đơn đặt hàng 57
Hình 24: Biểu đồ trình tự UC14: Xemchi tiết đơn đặt hàng 58
Hình 25: Biểu đồ trình tự UC15: Cập nhật trạng thái đơn hàng 60
Hình 26: Biểu đồ trình tự UC16: Xem danh sách đơn đặt hàng chờ giao 61
Hình 27: Biểu đồ trình tự UC17: Tạo yêu cầu đặt hàng 63
Hình 28: Biểu đồ trình tự UC18: Xem danh sách các đơn đặt hàng đã đặt 64
Hình 29: Biểu đồ chi tiết các lớp 65
Trang 77
Hình 30: Thiết kế CSDL 65
Hình 31: Sơ đồ hoạt động đặt hàng tại trang web 66
Hình 32: Sơ đồ hoạt động xác nhận đơn đặt hàng 66
Hình 33: Sơ đồ hoạt động xác nhận giao hàng cho khách 67
Hình 34: Sơ đồ hoạt động đặt hàng trên ứng dụng mobile 67
Hình 35: Giao diện quản lý đồ ăn 68
Hình 36: Giao diện trang đơn hàng 69
Hình 37: Giao diện trang chi tiết đơn hàng 69
Hình 38: Giao diện trang quản lý nhân viên 70
Hình 39: Giao diện trang menu 71
Hình 40: Giao diện trang chủ 72
Hình 41: Giao diện trang thông tin 73
Hình 42: Giao diện trang liên hệ 74
Hình 43: Giao diện trang giỏ hàng 75
Hình 44: Giao diện trang đơn hàng 76
Hình 45: Giao diện trang chi tiết đơn hàng 77
Hình 46: Giao diện đăng nhập 78
Hình 47: Giao diện màn hình menu 79
Hình 48: Giao diện màn hình chi tiết đơn hàng 80
Hình 49: Giao diện các đơn đặt hàng đã đặt 81
Hình 50: Giao diện màn hình thông tin 82
Hình 51: Giao diện màn hình danh sách đơn hàng chờ giao 83
Hình 52: Giao diện thao tác đơn hàng 84
Hình 53: Giao diện màn hình chi tiết đơn hàng của khách hàng 85
Trang 8EJS Engine JavaScript Một Template Engine sử dụng
cùng với NodeJS 11
Trang 9Node.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
NodeJs là một mã nguồn mở, đa nền tảng cho phát triển các ứng dụng phía Server 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 Nodejs
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 Server 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 Server nhận được phản hồi từ các API gọi trước đó
- Node cho phép bạn 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à bạn sẽ phải học nhiều
Trang 1010
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 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ì NodeJS 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 Server trả lại các phản hồi với một cách không khóa và tạo cho Server 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 Nodejs 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 bạn 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 1111
Các thành phần quan trọng trong Nodejs
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 phần tiếp theo
Hình 1: Các thành phần của Nodejs
Kiến trúc của Nodejs
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 server
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:
Trang 12có 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
Nodejs đượ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
Trang 1313
- Các ứng dụng dựa vào JSON APIs
- Các ứng dụng Single Page Application
1.2 Giới thiệu về Module trong Nodejs
Module trong Nodejs?
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ụ,httplà 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, bạn đơ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, bạn mở giao diện dòng lệnh CMD và gõ lệnh sau:
Trang 1414
bên trong của Module Nhưng, bạn 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 Nodejs
Node.js là môi trường cho phép lập trình sử dụng JavaScript ở phía server 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 Client Ví dụ, chúng ta nên hạn chế sử dụng biến global Tuy nhiên, nếu muốn sử dụng, bạn 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:
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ỉ http://search.nodejs.org
- 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óinpmlà 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
Trang 15main: "mainModuleName", // tên module chính
modules: { // danh sách các module đi kèm
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ườngdependencies, ví dụ:
"description" : "Package nay duoc phat trien boi Pho Code",
"homepage" : "http://nodejs.com",
"author" : viet220994@gmail.com
Trường directorieslưu danh sách thư mục của gói, ví dụ:
Trang 1616
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 install <tên gói>
Nếu bạn 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 bạn có thể dùng lệnhsearchcủanpmđể tìm nữa, ví dụ giả sử chúng
ta tìm các gói có liên quan đến từ khóamp3thì 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 NodeJS =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:
Trang 1717
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
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ệnhnpm listsẽ 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 181.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 1919
1.4 Xây dựng ứng dụng MVC với Express trong Nodejs
EventEmitter
EventEmitterlà 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
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ớpPulser 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 bạn 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ệnpulsebằ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
Trang 2020
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 Client 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
Một ứng dụng web thường được chia thành 4 lớp như sau:
- 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à
Trang 2121
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
- 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 client
- 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
Trang 2222
- 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 Nodejs
Ứng dụng Express sử dụng một hàm callback có các tham số là các đối tượngrequestvàresponse
- Đố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ị
Trang 2323
Hình 3: Mô hình MVC trong Nodejs
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ủ)
- “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ận 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
Trang 241.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, bạn 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 Nodejs MVC tương tự như sau:
Hình 4: Cấu trúc thư mục dự án Nodejs 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 NodeJS, 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
Trang 25MySQL là một hệ quản trị cơ sở dữ liệu SQL rất mạnh và miễn phí Nếu bạn
đã cài MySQL trong máy rồi thì bạn chỉ cần tạo một CSDL có tên tùy ý (không tạo bảng) Nếu chưa thì bạn 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 bạn có thể tải thêm phần mềm MySQL Workbench về, đây là phần mềm cho phép bạn 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ì bạn 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, bạn 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 server của MySQL
để tạo CSDL Ở đây mình dùng MySQL Workbench cho nhanh Khi mở MySQL Workbench lên, bạn sẽ phải tạo những cái gọi làConnections, nếu bạn 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 server 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à bạn 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ợ bạn 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
Trang 2626
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
1.5.2.2 Tạo connection pool
Sequelize sẽ tạo 1 connection pool khi được khởi tạo vì vậy bạn 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 bạn không muốn sử dụng hoặc chỉ sử dụng 1 trong 2 attributes thì có thể tham khảo ở phần config sau đây):
var Project = sequelize.define('project', {
title: Sequelize.STRING,
description: Sequelize.TEXT
})
Ngoài ra bạn có thể thêm các option cho các attributes:
var Task = sequelize.define('task', {
})
Trang 271.5.2.4 Query trong Sequelize
Để select một vài attribute, bạn có thể sử dụng attributes optin:
Trang 28// SELECT * FROM post WHERE char_length(status) = 6;
Các toán tử bạn 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 bạn muốn excute một raw query, khi đó bạn có thể sử dụng sequelize.query
sequelize.query( "SELECT * FROM `users`" );
1.5.2.5 Relations và Associations
Các loại relation gồm: One-To-One associations, One-To-Many associations, Belongs-To-Many associations
One-To-One associations
Trang 2929
BelongsTo:
var Player = this.sequelize.define('player', {/* attributes */})
Player.belongsTo(Team);
Has one:
var User = sequelize.define('user', {/* */})
var Project = sequelize.define('project', {/* */})
// One-way associations
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ề Socket và Socket.io
Trước tiên, Socket là 1 công nghệ Đừng nhầm lẫn giữa Socket.IO và Socket Socket.IO không phải là mô hình Socket duy nhất hiện nay, và cũng không phải là
mô hình web socket duy nhất hiện nay Socket là cách bạn tổ chức mô hình server để một trong 2 bên luôn trong tình trạng sẵn sàng trả lời bên kia và ngược lại
client-Để đảm bảo việc này, kết nối giữa Client và Server phải ở trạng thái “keep-alive” và phải luôn xảy ra quá trình đồng bộ giữa Client-Server Socket sẽ mang lại khả năng trả lời tức thì từ một trong 2 bên khi bên kia đưa ra một sự kiện, thay vì phải thực thi lại một loạt các thủ tục kết nối phức tạp như trước, và ứng dụng của bạn sẽ trở thành ứng dụng thời gian thực ví dụ: Yahoo Messenger, Skype v.v… đều là các ứng dụng được xây dựng theo mô hình Socket
Trong lập trình web trước đây, việc xây dựng client-server theo mô hình socket phải thông qua các phần mềm thứ Vì mô hình socket không phù hợp với các ngôn ngữ lập trình Server như: PHP, ASP.NET, JSP v.v… Các ngôn ngữ này luôn làm việc
Trang 30- Thứ hai: Node.js chạy non-blocking việc hệ thống không phải tạm ngừng để
xử lý xong một request sẽ giúp cho server trả lời client gần như ngay tức thì
- Thứ ba: lập trình socket yêu cầu bạn phải xây dựng được mô hình lắng nghe
- trả lời từ cả 2 bên Nói khác đi, vai trò của client và server phải tương đương nhau, mà client thì chạy bằng javascript, nên nếu server cũng chạy bằng javascript nữa, thì việc lập trình sẽ dễ dàng và thân thiện hơn
Chính vì những đặc điểm này, socket.io ra đời Tuy nhiên, khi bạn thực sự am hiểu về Node.js, http request header, bạn hoàn toàn có thể viết một socket cho riêng mình
Android, Nodejs và Socket IO
Khi xây dựng ứng dụng Android, chúng ta thường phải thực hiện các giao tiếp với server như đăng kí, đăng nhập, gửi tin nhắn.NodeJsvàSocketIOlà một công cụ cực kì đơn giản và hữu ich để xây dựng server Khi xây dựng các ứng dụng ChatApp hay Push Notification thìNodeJsluôn là lựa chọn hàng đầu
Xây dựng client Android
Đầu tiên, phải thêm thư viện SocketIO vào filebuild.grable
dependencies {
compile 'com.github.nkzawa:socket.io-client:0.3.0'
}
Trang 3131
Tiếp theo thêm quyền truy cập Internet vào fileAndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
Trong file MainActivity.java, khai báo biến mSocket
private Socket mSocket;
Kết nối với server và gửi sự kiện lên server bằng hàm sau:
mSocket.connect();
mSocket.emit("tên sự kiện", [data]);
Để nhận sự kiện từ server gửi lên client sử dụng hàm sau:
mSocket.on("tên sự kiện", <tên hàm sử lý>);
private Emitter.Listener onLogin = new Emitter.Listener() {
@Override
public void call(Object args) {
JSONObject data = args[0];
}
};
Trang 3232
CHƯƠNG 2 PHÂN TÍCH VÀ XÂY DỰNG GIẢI PHÁP ORDER ONLINE 2.1 Phân tích yêu cầu và lựa chọn giải pháp công nghệ
Phân tích yêu cầu
Để giải quyết được vấn đề về order online, cần giải quyết được các yêu cầu cơ bản sau:
- Xây dựng 1 server cho phép cửa hàng quản lý các yêu cầu đặt hàng online của khách hàng
- Xây dựng kênh đặt hàng online của khách hàng thông qua trang web và ứng dụng smartphone
- Xây dựng ứng dụng cho phép shipper quản lý các đơn hàng cần giao, cũng như cho phép quản lý cửa hàng quản lý được các đơn hàng cần giao khách hàng
Giải pháp công nghệ
Để xây dựng một server đáp ứng yêu cầu quản lý được các yêu cầu đặt hàng online của khách hàng một cách nhanh chóng và tiết kiệm, em đã quyết định lựa chọn server xây dựng bằng Nodejs, server Nodejs cho phép sử lý các yêu cầu một cách nhanh chóng và đặc biệt là tương tác thời gian thực
Xây dựng kênh đặt hàng của khách hàng thông qua trang web, và ứng dụng đặt hàng order online trên smartphone android tương tác thời gian thực với server
Xây dựng ứng dụng cho phép shipper quản lý các đơn hàng cần giao, cũng như cho phép quản lý cửa hàng quản lý được các đơn hàng cần giao của khách hàng thông qua ứng dụng android tương tác thời gian thực với server
Trang 33- Server lấy thông tin đơn hàng từ client hiển thị lên trang quản lý, ở đây quản
lý cửa hàng sẽ tiến hành xác nhận, tinh chỉnh và chọn nhân viên giao hàng
- Thông tin về đơn hàng của khách hàng được gửi về app android của nhân viên giao hàng
- Nhân viên nhận hàng và tiến hành giao hàng cho khách hàng, sau khi giao hàng thành công sẽ xác nhận thông qua ứng dụng lên server
Trang 34Nhân viên Nhân viên giao hàng của cửa hàng
Khách hàng Khách hàng có nhu cầu đặt đồ ăn
2.2.2.2 Biểu đồ Use Case hệ thống
Hình 6: Biểu đồ Use Case tổng quát
Trang 3535
Hình 7: Biểu đồ Use Case “Quản lý thực đơn”
Hình 8: Biểu đồ Use Case “Quản lý nhân viên”
Trang 3636
Hình 9: Biểu đồ Use Case “Quản lý đặt hàng”
Hình 10: Biểu đồ Use Case “Xác thực người dùng”
Trang 37UC04: Thêm mới món ăn Thêm mới món ăn vào CSDL
UC05: Cập nhật thông tin món ăn Cập nhật các thông tin về món ăn
UC07: Xem danh sách nhân viên Hiển thị danh sách nhân viên
UC08: Thêm mới nhân viên Thêm mới nhân viên vapf CSDL
UC09: Cập nhật thông tin nhân viên Cập nhật thông tin của nhân viên
UC10: Xóa nhân viên Xóa nhân viên khỏi CSDL
UC11: Xem danh sách đơn hàng Hiện danh sách các đơn đặt hàng
UC12: Xác nhận đơn đặt hàng Xác nhận đơn đặt hàng của khách hàng UC13: Chọn nhân viên giao hàng cho
đơn đặt hàng Gán đơn đặt hàng cho nhân viên giao hàng UC14: Xem chi tiết đơn đặt hàng Xem chi tiết đơn đặt hàng
UC15: Cập nhật trạng thái đơn hàng Cập nhật trạng thái đơn hàng
UC16: Xem danh sách đơn đặt hàng
UC17: Tạo yêu cầu đặt hàng Tạo yêu cầu đơn đặt hàng
UC18: Xem danh sách các đơn hàng
đã đặt
Khách hang xem danh sách các đơn đặt hàng đã đặt của mình
Trang 38Khách hàng
UC09: Cập nhật thông tin nhân viên x
UC13: Chọn nhân viên giao hàng cho đơn đặt
UC16: Xem danh sách đơn đặt hàng chờ giao x
Trang 3939
Thiết kế các yêu cầu chức năng
2.2.3.1 Module 01
UC01: Đăng nhập
Mô tả Use Case
Mô tả Cho phép tác nhân đăng nhập vào hệ thống
hàng/ Nhân viên Kích hoạt
Actor bấm vào nút đăng nhập
Điều kiện chuyển Đăng nhập thành công
Hoạt động
Luồng chính: Đăng nhập thành công
1 Actor nhập tài khoản và mật
khẩu và click vào button [Đăng
nhập] trên trang đăng nhập,
hoặc trên màn hình đăng nhập
của ứng dụng android
2 Kiểm tra tài khoản / mật khẩu là chính xác, sau đó chuyển tới trang, màn hình default với role tương ứng Thông báo của hệ thống
MS01 “Đăng nhập thành công !”
Message thông báo khi quá trình đăng nhập thành công
Trang 4040
MS02 “Đăng nhập thất bại do sai tên đăng nhập hoặc mật khẩu ! ”
Message thông báo khi admin nhập sai tài khoản/mật khẩu
Biểu đồ trình tự UC01: Đăng nhập
Hình 11: Biểu đồ trình tự UC01: Đăng nhập
UC02: Đăng ký
Mô tả Use Case
Mô tả Cho phép actor đăng ký tài khoản hệ thống
Tác nhân Khách hàng Kích hoạt Actor bấm vào nút
đăng ký
Điều kiện tiên quyết
Điều kiện chuyển Đăng ký thành công