GIỚI THIỆU ĐỀ TÀI
Đặt vấn đề
Du lịch không chỉ là sở thích mà còn là cách hiệu quả giúp con người giải tỏa căng thẳng sau những ngày làm việc mệt mỏi Bên cạnh đó, du lịch mang đến cơ hội khám phá văn hóa mới và xây dựng những mối quan hệ ý nghĩa.
Du lịch tự túc, du lịch bụi hay phượt đang trở thành xu hướng phổ biến trong giới trẻ hiện nay, khi họ thể hiện đam mê và nhiệt huyết trong việc khám phá Thay vì lựa chọn các tour du lịch có sẵn, giới trẻ thường ưu tiên tự tổ chức chuyến đi để trải nghiệm và khám phá thiên nhiên, đồng thời tạo ra và quản lý hành trình theo ý thích của mình Các cộng đồng và đội nhóm du lịch cũng phát triển mạnh mẽ, thể hiện sự năng động và sôi nổi trong phong trào này.
Du lịch tự túc yêu cầu người tham gia tự lên kế hoạch, chọn phương tiện và điểm đến Tổ chức chuyến đi không hề đơn giản, đòi hỏi kinh nghiệm để xây dựng lịch trình, quản lý thành viên và chi phí, cũng như tìm kiếm các địa điểm ăn uống và điểm dừng lý tưởng.
Hiện nay, du lịch tự túc tại Việt Nam thường được thực hiện qua việc một nhóm bạn tổ chức đi phượt nhưng thiếu thành viên Họ lập kế hoạch chi tiết về lịch trình, chi phí và thông tin liên lạc, sau đó đăng tải lên các trang web, diễn đàn, và mạng xã hội để tìm thêm người tham gia Khi đủ số lượng, nhóm sẽ tạo group trên Facebook hoặc diễn đàn để thảo luận Bước tiếp theo là gặp mặt trực tiếp để chuẩn bị cho chuyến đi Trong suốt hành trình, họ có thể kiểm tra lộ trình đã lưu trên điện thoại để đảm bảo đi đúng hướng.
7 chuyến đi, họ thường đăng ảnh trên các diển đàn, viết bài đánh giá, lưu ảnh trong máy
Quá trình tổ chức chuyến phượt hiện tại còn nhiều thủ công, gây khó khăn trong việc lên kế hoạch, đăng ký tham gia và quản lý thành viên Việc lập kế hoạch bằng văn bản khiến cho các thành viên khó nắm bắt và ghi nhớ thông tin đầy đủ.
Ta hãy xem một lịch trình ví dụ:
Lịch trình bao gồm chuỗi hoạt động và mốc thời gian cụ thể, kèm theo thông tin về chi phí, người tổ chức, vật dụng cần thiết và quy định chuyến đi Với lượng thông tin chi tiết như vậy, người đọc sẽ gặp khó khăn trong việc ghi nhớ tất cả.
Việc đăng ký tham gia các chuyến đi hiện nay vẫn còn thủ công, với các phương thức như nhắn tin trên Facebook và diễn đàn, gây khó khăn cho người tổ chức trong việc quản lý thành viên Họ phải theo dõi từng bình luận và tin nhắn, đồng thời ghi lại danh sách người tham gia Đối với người tham gia, việc tìm kiếm chuyến đi yêu thích cũng không dễ dàng, khi họ phải lùng sục thông tin trên nhiều kênh như group Facebook, diễn đàn, hay tìm kiếm trên Google Điều này có thể dẫn đến việc họ bỏ lỡ các chuyến đi hấp dẫn do thông tin bị trôi xuống bởi các bài đăng mới.
10 liên tục được đăng Như vậy, việc tìm kiếm rất khó khăn khi thông tin chuyến phượt không được tổ chức, lưu trữ rõ ràng ở một kênh chính thống
Từ những thực trạng, những vấn đề như thế, em đã lên ý tưởng về một hệ thống hỗ trợ xây dựng, tổ chức chuyến phượt
Sau khi khảo sát, chúng tôi nhận thấy rằng tại Việt Nam đã có một số giải pháp cho các vấn đề du lịch tự túc, nhưng chúng còn thiếu sót, không phổ biến và chưa hoàn thiện Trong khi đó, trên thế giới đã xuất hiện nhiều ứng dụng hỗ trợ du lịch tự túc, chủ yếu phục vụ cho người phương Tây, mà không phù hợp với đặc điểm du lịch tại Việt Nam Nhận thấy đây là một cơ hội, nhóm chúng tôi quyết định phát triển một hệ thống mới, mang tính đặc trưng cho người du lịch tự túc, với nhiều tính năng kết hợp, được gọi là Ứng dụng mạng xã hội du lịch.
Mô tả đề tài
Ứng dụng mạng xã hội du lịch là công cụ hoàn hảo giúp người dùng lập kế hoạch và tổ chức chuyến đi của mình, đồng thời kết nối với những người bạn có cùng sở thích Hệ thống được thiết kế dựa trên nhu cầu của người dùng, cung cấp các bước cần thiết để xây dựng chuyến đi, bao gồm tính năng tạo chuyến đi và xây dựng lịch trình chi tiết cho mỗi hành trình.
5 Mời bạn bè tham gia
Viết review, trải nghiệm về chuyến đi:
1 Đăng bài chia sẻ trải nghiệm, cảm xúc cá nhân
Phạm vi và mục tiêu đề tài
Xây dựng mạng xã hội du lịch bao gồm những chức năng trên
Xây dựng hệ thống sử dụng những công nghệ phù hợp nhất đáp ứng khả năng mở rộng và tương tác cao
Xây dựng ứng dụng có giao diện trực quan, phù hợp mọi đối tượng người dùng
Phạm vi địa lý: Ứng dụng sử dụng cho các chuyến phượt tại Việt Nam
Phạm vi người dùng: người dùng có máy tính và điện thoại thông minh, có nhu cầu đi du lịch và tổ chức đi du lịch
CÁC HỆ THỐNG LIÊN QUAN
Các hệ thống trong nước
* Mô tả chung: Đây là tập hợp các group dành cho người thích phượt trao đổi, thảo luận Group này do tổ chức “Ờ! Phượt đi” quản lý
Người dùng tham gia nhóm này để chia sẻ hình ảnh từ những chuyến phượt, tổ chức các chuyến đi, tìm kiếm bạn đồng hành, xin tư vấn và chia sẻ kinh nghiệm du lịch.
Các chuyến phượt được chia sẻ bởi tổ chức hoặc cá nhân trong nhóm Facebook này diễn ra rất sôi nổi Tất cả các hoạt động đều được quy về việc đăng bài, và các bài viết trong nhóm có thể được phân loại rõ ràng.
Chia sẻ hình ảnh phượt Đăng kế hoạch chuyến phượt chi tiết Đăng kế hoạch chuyến phượt cơ bản
Chia sẻ kinh nghiệm, dạng blog
Xin giúp đỡ cho người xuyên Việt Ưu điểm: Đáp ứng được nhu cầu kết nối, trao đổi trong cộng đồng du lịch bụi
Tính năng thông báo của Facebook giúp người dùng cập nhật thông tin nhanh chóng và dễ dàng tham gia, vì Facebook rất phổ biến và hầu như ai cũng sở hữu một tài khoản Giao diện thân thiện và đơn giản cho phép người dùng chỉ cần đăng bài ở một nơi duy nhất.
Một trong những khuyết điểm của nền tảng là các bài đăng không được phân loại rõ ràng, bao gồm nhiều loại như quy định, kinh nghiệm, hỏi đáp, chia sẻ và tìm bạn đồng hành Điều này khiến người dùng phải tìm kiếm thông tin về chuyến phượt qua nhiều bài đăng khác nhau Hơn nữa, tính năng lưu trữ cũng không được hỗ trợ, dẫn đến việc các bài viết chia sẻ kinh nghiệm hay không được giữ lại lâu dài.
Các hệ thống ngoài nước
Mô tả: “The Social app for backpacker”
Backpackr là ứng dụng di động lý tưởng cho những người yêu thích phượt, giúp tổ chức chuyến đi, tìm kiếm bạn đồng hành và kết nối với cộng đồng phượt toàn cầu Ứng dụng cung cấp nhiều tính năng hữu ích như tìm kiếm địa điểm và ghi lại hành trình, thu hút một lượng người dùng đông đảo trên khắp thế giới.
14 nói đây là ứng dụng di động nổi tiếng nhất trên thế giới dành cho dân phượt
Các tính năng của Backpackr:
Tìm kiếm bạn bè Đăng kế hoạch đi phượt, câu hỏi, bình luận trên những bài đăng khác
Tìm kiếm từ khóa hoặc hashtags liên quan đến kế hoạch đi du lịch
Tìm kiếm những bài đăng gần địa điểm của mình đang ở hoặc tìm kiếm theo quốc gia
Tìm kiếm dịch vụ tại địa điểm hiện tại như nhà hàng, khách sạn, quán nước hay sự kiện, và đặt hàng trước khi đến Hệ thống gợi ý những người đi cùng dựa trên sở thích, nơi ở, thời gian di chuyển và địa điểm Ưu điểm của ứng dụng là lượng người dùng lớn và nhiều chức năng hữu ích.
Giao diện trực quan, dễ sử dụng
Khuyết điểm: Chỉ có ứng dụng, không có web để người dùng sử dụng
CÁC CÔNG NGHỆ SỬ DỤNG
NodeJS
Node.js là một mã nguồn mở, một môi trường cho các máy chủ và ứng dụng mạng
Node.js sử dụng động cơ Google V8 JavaScript để thực thi mã, với phần lớn các mô-đun cơ bản được phát triển bằng JavaScript Các ứng dụng Node.js cũng được viết chủ yếu bằng ngôn ngữ này.
Node.js cung cấp một thư viện tích hợp cho phép các ứng dụng hoạt động như một máy chủ web mà không cần sử dụng phần mềm bên ngoài như Nginx, Apache HTTP Server hoặc IIS.
Mọi hàm trong Node.js là không đồng bộ (asynchronous) Do đó, các tác vụ đều được xử lý và thực thi ở chế độ nền (background processing)
3.1.2 Đặc điểm nổi bật của NodeJS Đặc điểm nổi bật của Node.js là nó nhận và xử lý nhiều kết nối chỉ với một single-thread Điều này giúp hệ thống tốn ít RAM nhất và chạy nhanh nhất khi không phải tạo thread mới cho mỗi truy vấn giống PHP Ngoài ra, tận d
16 ụng ưu điểm non-blocking I/O của Javascript mà Node.js tận dụng tối đa tài nguyên của server mà không tạo ra độ trễ như PHP
Unix shell tools leverage the power of Unix to optimize Node.js operations This means that Node.js can efficiently handle thousands of processes simultaneously, resulting in a streamlined output and maximizing overall performance.
Luồng dữ liệu (Streaming Data) là quá trình mà các web thông thường gửi yêu cầu HTTP và nhận phản hồi Khi cần xử lý một luồng dữ liệu lớn, Node.js sẽ tạo ra các Proxy để phân vùng các luồng dữ liệu, đảm bảo hiệu suất tối đa cho các luồng khác Với sự phát triển của các ứng dụng di động và HTML5, Node.js trở thành công cụ hiệu quả cho việc xây dựng các ứng dụng thời gian thực như ứng dụng chat và dịch vụ mạng xã hội.
3.1.3 Lý do sử dụng NodeJS
NodeJS được viết bằng ngôn ngữ Javascript nên việc xử lý JSON dễ dàng hơn
NodeJS hỗ trợ giao thứ TCP vì vậy chúng ta dễ dàng xây dựng bất kỳ một phương thức custom nào Ứng dụng thời gian thực.(Real-Time)
Node.js xử lý mọi yêu cầu trên cùng một tiến trình, giúp việc xây dựng bộ nhớ đệm trở nên đơn giản hơn bao giờ hết Chỉ cần lưu trữ nó vào một biến global, mọi yêu cầu đều có thể truy cập bộ nhớ đệm đó Nhờ vậy, việc caching không còn là vấn đề phức tạp, và bạn có thể lưu trữ cũng như chia sẻ trạng thái của một client với các client khác ngay trong ngôn ngữ mà không cần sử dụng bộ nhớ ngoài.
Framework Expressjs
Express.js là một framework nhỏ nhưng linh hoạt, được xây dựng trên nền tảng Node.js Nó hỗ trợ phát triển ứng dụng theo mô hình MVC, một mô hình phổ biến trong lập trình web hiện nay.
Express.js offers a multitude of packages that facilitate the definition of middleware, enhancing code organization and reusability It simplifies the process of defining routes and handling request methods to the server Additionally, it provides robust support for creating RESTful APIs.
Express enhances web application functionality through essential features such as basic routing, middleware, template engines, and static file serving, all while ensuring that the robust I/O performance of Node.js remains unaffected.
Express offers a generator that creates a specific folder structure for your application After installing the npm package express-generator and running the generator command, a clearly organized application folder will be created This structure aids in managing images, static front-end JavaScript, stylesheet files, and HTML template files efficiently.
Middleware essentially consists of functions that have full access to both the request and response objects It applies certain filtering directives before passing control to the actual business logic or the next level of middleware.
Template engine cho phép lập trình viên nhúng biến backend vào file
HTML is returned in a standard format when requested from a template file By default, express-generator utilizes the Pug template engine, which was originally known as Jade.
Express, là minimal framework, sẽ không bắt buộc database integaration Khi sử dụng một một công nghệ lưu trữ dữ liệu cụ thể, dù là MySQL,
MongoDB, PostgreSQL, Redis, và ElasticSearch đều gặp vấn đề khi cài đặt gói npm làm driver cơ sở dữ liệu Các driver bên thứ ba này không tương thích với cấu trúc thống nhất theo chỉ thị CRUD, gây khó khăn trong việc thay đổi cơ sở dữ liệu và tiềm ẩn nhiều lỗi.
Hình 3.3 Cấu trúc của Expressjs
Tệp app.js bao gồm thông tin cấu hình, khai báo và các định nghĩa cần thiết để ứng dụng hoạt động hiệu quả Trong khi đó, tệp package.json chứa danh sách các gói (package) cần thiết cho ứng dụng.
Folder routes: chứa các route có trong ứng dụng
Folder view: chứa view/template cho ứng dụng
Folder public: chứa các file css, js, images, cho ứng dụng
3.2.3 Lý do vì sao chọn Express.js làm Framework: Đối với đề tài, server cần sử lý lượng request rất lớn từ cả web và ứng dụng Ngoài ra, phần ứng dụng cần đến tính cập nhật nhanh, liên tục trong chức năng cập nhật bản đồ, xem vị trí thành viên, gởi nhận dữ liệu ghi lại hành trình
Mặc dù Express.js là một framework mới, nhưng các tính năng của nó rất phù hợp cho việc xây dựng hệ thống trung tâm Nó cũng cho phép cài đặt thêm các gói như socket.io, Sequelize và JWT, giúp tối ưu hóa hỗ trợ cho lập trình viên.
*Các gói hổ trợ package khác:
Sequelize is an Object-Relational Mapping (ORM) tool designed for Node.js and io.js, facilitating easy access to databases such as PostgreSQL, MySQL, MariaDB, SQLite, and MSSQL It offers features like relationships, transactions, and replication To create a mapping between a model and a table, the define method is used.
Sequelize sẽ tự động tạo các attributes là createdAt và updatedAt
Các loại quan hệ trong cơ sở dữ liệu bao gồm: quan hệ One-To-One, quan hệ One-To-Many và quan hệ Belongs-To-Many, giúp lập trình viên tiết kiệm thời gian bằng cách loại bỏ nhu cầu viết lại các câu lệnh SQL truyền thống.
Ngoài ra những tính năng trên còn có rất nhiều tính năng khác như:
Tham khảo: http://docs.sequelizejs.com/
JSON Web Mã (JWT) là một chuẩn mở (RFC 7519) cho phép truyền tải thông tin an toàn giữa các bên dưới dạng đối tượng JSON Thông tin trong JWT có thể được xác minh và đáng tin cậy nhờ vào chữ ký số được kèm theo JWT có thể được ký bằng thuật toán bí mật hoặc bằng cặp khóa công khai - riêng tư, giúp đảm bảo tính toàn vẹn và bảo mật cho dữ liệu truyền tải.
21 thuật toán HMAC) hoặc một public / private key sử dụng mã hoá RSA (Nguồn: viblo.asia)
JSON Web Token (JWT) là một phương thức hiệu quả và an toàn để trao đổi thông tin giữa các ứng dụng, vì JWT được ký bằng cặp khóa công khai và riêng tư, làm cho việc mạo danh trở nên khó khăn Chữ ký của JWT được tính toán dựa trên nội dung của header và payload, giúp xác thực rằng nội dung là nguyên bản và không bị chỉnh sửa Tuy nhiên, do cấu trúc đơn giản của JWT, nó có thể dễ dàng bị giải mã, vì vậy không nên sử dụng JWT để chuyển giao các thông tin nhạy cảm.
Header của token bao gồm hai phần chính: loại token, mặc định là JWT, cho biết đây là một Token JWT, và thuật toán mã hóa được sử dụng, có thể là HMAC SHA256 (HS256) hoặc RSA.
Payload chứa các claims Claims là một các biểu thức về một thực thể (chẳng hạn user) và một số metadata phụ trợ Có 3 loại claims thường gặp trong
Payload: reserved, public và private claims
Chữ ký Signature trong JWT là một chuỗi được mã hóa bởi header, payload cùng với một chuỗi bí mật theo nguyên tắc
Tham khảo: https://jwt.io/
PHÁT BIỂU YÊU CẦU
Quản lý chuyến đi
4.1.1 Tạo chuyến đi Để tạo một chuyến đi mới người dùng cần phải điền thông tin chuyến đi bao gồm: tên chuyến đi, ngày bắt đầu, ngày kết thúc, địa điểm bắt đầu, địa điểm kết thúc, số lượng thành viên dự kiến, chi phí, phương tiện di chuyển Những thông tin khác như lịch trình, ghi chú có thể bổ sung sau
4.1.2 Tham gia chuyến đi Để tham gia chuyến đi có 2 cách: một là nhận được lời mời từ admin hoặc gửi yêu cầu tham gia được admin chấp nhận
Các thành viên có thể thảo luận trực tiếp trong nhóm
4.1.4 Xem danh sách chuyến đi
Người dùng có thể xem các danh sách chuyến đi chuẩn bị diễn ra để tham gia
Người dùng có thể tìm kiếm các chuyến đi bằng địa danh, thành phố…
Các tính năng khác
Người dùng có thể đăng bài chia sẻ những khoảnh khắc đi phượt, kinh nghiệm phượt, cảm xúc cá nhân…
4.2.2 Group theo địa điểm Để người dùng cùng nhau chia sẻ những hình ảnh đẹp, những kinh nghiệm phượt, những quán ăn ngon …
Người dùng có thể kết bạn với nhau để tiện theo dõi, liên lạc
Người dùng có thể nhắn tin với bạn bè
Người dùng có khả năng lưu trữ các bài viết để dễ dàng xem lại sau này, chẳng hạn như lưu giữ thông tin về những quán ăn ngon tại một địa điểm cụ thể.
PHÂN TÍCH YÊU CẦU
Phân tích yêu cầu
STT Tên Use case Mô tả
1 Tạo chuyến đi Cho phép người dùng bất kì tạo mới một chuyến đi
2 Thay đổi lịch trình Cho phép người dùng chỉnh sửa lịch trình
3 Tham gia chuyến đi Người dùng có thể xin gia nhập chuyến đi được tổ chức bởi người dùng khác
4 Kết bạn Các người dùng kết bạn với nhau tiện theo dõi, liên lạc
5 Tìm kiếm chuyến đi Người dùng có thể tìm kiếm chuyến đi bằng các địa điểm
6 Lưu lại bài viết Người dùng có thể lưu lại các bài viết hay để tiện xem lại
7 Đăng bài Người dùng có thể đăng bài chia sẻ kinh nghiệm, cảm xúc cá nhân
8 Inbox Người dùng có thể chat với bạn bè
9 Ghi chú Cho phép người dùng tạo ghi chú cho chuyến đi
12 Thảo luận Cho phép các thành viên thảo luận nhóm bằng hình thức chat trực tuyến
Thiết kế cơ sở dữ liệu
5.2.2 Mô tả các bảng dữ liệu
STT Tên Kiểu Ràng buộc Ý nghĩa
Mỗi user có một id riêng
2 name string Tên người dùng
5 friends array Mảng lưu trữ id bạn bè
6 notifications array Mảng lưu trữ thông báo
7 posts array Mảng lưu trữ id bài post
8 saveposts array Mảng lưu trữ id các bài post đã save
9 tours array Mảng các tour tham gia
STT Tên Kiểu Ràng buộc Ý nghĩa
Mỗi bài viết có một id
2 caption string Caption bài viết
3 content string Content bài viết
6 type string Phân loại type để truy vấn
7 likes array Mảng lưu id những người like
8 comments array Mảng lưu comment
9 user object Vị trí của bài post
10 uploader object Người đăng bài
STT Tên Kiểu Ràng buộc Ý nghĩa
Mỗi tour có một id
2 tenchuyendi string Tên chuyến đi
4 diembatdau string Điểm bắt đầu
5 diemketthuc string Điểm kết thúc
6 thoigianbatdau string Thời gian bắt đầu
7 thoigianketthuc string Thời gian kết thúc
10 soluongthanhvien Số lượng thành viên
13 members array Mảng lưu trữ thành viên
Giao diện
5.3.6 Quản lý tour đã tạo
5.3.7 Thông tin chi tiêt tour
5.3.13 Các bài viết đã lưu