- Chương 03 - Xây dựng ứng dụng minh họa “Website môi giới bất động sản Katana” o Giới thiệu ứng dụng: ▪ Bài toán đặt ra ▪ Hướng giải quyết ▪ Tổng quan công nghệ sử dụng trong đồ án o Ph
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
KHOA CÔNG NGHỆ PHẦN MỀM
BÁO CÁO ĐỒ ÁN 1
TÌM HIỂU NESTJS VÀ XÂY DỰNG ỨNG DỤNG MINH HỌA
Thành phố Hồ Chí Minh, tháng 06 năm 2023
Trang 21
NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN
Tp.HCM, ngày tháng năm 2023 Giảng Viên Hướng Dẫn
ThS Nguyễn Tấn Toàn
Trang 32
Trang 43
LỜI CẢM ƠN
Trước hết, em xin gửi lời cảm ơn đến Trường Đại học Công nghệ thông tin – ĐHQGTPHCM và các thầy cô là giảng viên của khoa Công nghệ phần mềm đã tạo điều kiện để em hoàn thành đồ án 1 – Chủ đề Tìm hiểu về NestJS và xây dựng ứng dụng minh họa
Em xin gửi lời cảm ơn chân thành và sâu sắc đến thầy Nguyễn Tấn Toàn là giảng viên hướng dẫn trực tiếp và trang bị cho em có những kiến thức căn bản vững chắc để thực hiện đồ án này
Trong khoảng thời gian thực hiện đồ án, em đã học hỏi thêm được nhiều kiến thức, kinh nghiệm, biết được thêm về nhiều công nghệ mới Em đã vận dụng những kiến thức nền tảng đã tích lũy đồng thời kết hợp với việc học hỏi và nghiên cứu những kiến thức mới Từ đó, em vận dụng tối đa những gì đã học hỏi được
để hoàn thành báo cáo đồ án này
Tuy nhiên, trong quá trình thực hiện, em không tránh khỏi những thiếu sót Chính
vì vậy, em rất mong nhận được góp ý từ phía thầy, cô nhằm hoàn thiện những kiến thức, kĩ năng và là hành trang để em thực hiện tiếp các đề tài khác trong tương lai
Xin chân thành cảm ơn thầy!
Tp.HCM, ngày tháng … năm 2023
Sinh viên thực hiện
Trần Bảo Ân
Trang 54
Trang 65
MỤC LỤC
Chương 01 Mở đầu 9
I Thông tin người thực hiện 9
II Lý do chọn đề tài và mục tiêu 9
III Phạm vi nghiên cứu 10
IV Đối tượng nghiên cứu 10
V Kết quả hướng tới 10
Chương 02 NestJS 12
I Giới thiệu chung về NestJS 12
I Khái niệm quan trọng 13
1 Decorators 13
1 Pipes 14
2 Providers bất đồng bộ (Asynchronous Providers) 14
3 Modules động (Dynamic modules) 15
4 Vòng đời sự kiện (Lifecycle events) 16
5 Microservices với NestJS 18
6 CLI 20
II Lý do nên chọn NestJS 20
Chương 03 - Xây dựng Website môi giới bất động sản Katana 22
I Giới thiệu chung về Website môi giới bất động sản Katana 22
1 Phát biểu bài toán và hướng giải quyết 22
Trang 76
1 Công cụ, công nghệ sử dụng 24
2 Danh sách yêu cầu 25
3 Mã nguồn 27
I Phân tích, thiết kế 28
1 Phân tích, thiết kế ứng dụng 28
2 Phân tích, thiết kế cơ sở dữ liệu 29
3 Đặc tả 31
II Triển khai 53
III Kiểm thử 63
Chương 04: Kết luận 64
1 Kết quả đạt được 64
4 Hướng phát triển 64
TÀI LIỆU THAM KHẢO 66
Trang 87
TÓM TẮT (Abstract)
Đồ án “Tìm hiểu về NestJS và xây dựng ứng dụng minh họa” tập trung vào khảo sát thực trạng doanh nghiệp nghiên cứu ứng dụng công nghệ để từ đó xây dựng Website môi giới bất động sản Katana Đề tài tập trung vào lĩnh vưc bất động sản, cụ thể là giới thiệu, quảng bá các dự án bất động sản, hỗ trợ khách hàng tiềm năng đến gần với doanh nghiệp hơn Đề tài áp dụng kiến trúc monolithic cho phía Backend và NextJS cho phía Frontend với khả năng mở rộng, nâng cấp cao
Đề tài được bắt đầu từ việc tìm hiểu thực trạng, đưa ra các vấn đề còn tồn đọng và cần cải thiện Xác định phạm vi, bài toán, mục tiêu của đề tài Từ đó đưa ra các chức năng cần có của ứng dụng Ngoài việc xử lý các nghiệp vụ cho ứng dụng, em cũng đã tìm hiểu, so sánh và lựa chọn các công nghệ mới và phù hợp giúp nâng cao trải nghiệm người dùng, tối ưu chi phí phát triển, triển khai, bảo trì và nâng cấp
Vì ứng dụng mang tính thực tiễn cao, việc yêu cầu thay đổi thường xuyên và thời gian phát triển ngắn, quá trình phát triển sản phẩm đã vận dụng mô hình Agile làm phương pháp luận chính cho qui trình phát triển phần mềm Qui trình phát triển được ghi nhận bằng công cụ Github project Kết quả thu được ở giai đoạn phân tích, thiết kế được
mô hình hóa bằng UML thông qua công cụ PlantUML và giao diện được thiết kế bằng Figma Ở giai đoạn thực hiện, client và server được phát triển song song sử dụng thư viện ReactJS cho client và NestJS cho server, sử dụng Visual Studio Code làm IDE chính Đề tài còn tập trung vào kiểm thử để đảm bảo chất lượng phần mềm với qui trình kiểm thử gồm unit test phía Backend viết bằng … và Frontend sử dụng Jest kết hợp với React Testing Library; manual testing for Backend using Postman Trong giai đoạn vận hành, server đã được triển khai lên máy chủ Heroku, hoàn toàn có thể truy cập dữ liệu thông qua api từ bất cứ thiết bị nào gửi yêu cầu có chứa trường xác thực dữ liệu hợp lệ
Trang 98
Phần cuối cùng của đồ án là trình bày kết quả đã thực hiện lên cuốn báo cáo, đưa ra kết luận và hướng phát triển cho ứng dụng trong tương lai
Nội dung đồ án được trình bày trong … chương, như sau:
- Chương 01 - Giới thiệu tổng quan: Xác định mục tiêu, nội dung nghiên cứu, phạm
vi đề tài và thông tin người thực hiện
- Chương 02 - NestJS: Giới thiệu về NestJS framework, cách thức hoạt động, ưu điểm và các trường hợp nên sử dụng NestJS
- Chương 03 - Xây dựng ứng dụng minh họa “Website môi giới bất động sản Katana”
o Giới thiệu ứng dụng:
▪ Bài toán đặt ra
▪ Hướng giải quyết
▪ Tổng quan công nghệ sử dụng trong đồ án
o Phân tích yêu cầu: mô hình hóa bài toán thành các sơ đồ và đặc tả
o Thiết kế: đưa ra bản thiết kế kiến trúc ứng dụng, thiết kế database, thiết kế giao diện
o Triển khai và kiểm thử: Công cụ, công nghệ sử dụng trong đề tài, các bước triển khai Kiểm thử đơn vị
- Chương 04 - Kết luận: Những kết quả đã đạt được sau khi kết thúc đồ án, khó khăn, hạn chế và định hướng phát triển trong tương lai
Trang 109
Chương 01 Mở đầu
Thông tin người thực hiện
Họ tên: Trần Bảo Ân
là vô cùng cấp thiết Nó mang lại hàng loại lợi ích tuyệt vời, giúp cho nghiệp vụ trở nên
dễ dàng và nhanh chóng hơn bao giờ hết Do đó, việc xây dựng ứng dụng website sẽ hỗ trợ doanh nghiệp tăng trưởng vượt bậc
Hiện nay, có rất nhiều ngôn ngữ, công nghệ, thư viện, framework hỗ trợ phát triển ứng dụng web một cách thuận tiện và nhanh chóng mà vẫn đảm bảo tính chính xác, tính bảo mật, tính tiện dụng và nhu cầu nâng cấp, mở rộng sau này Một trong những framework hiện đại được sử dụng phổ biến nhất trong giai đoạn hiện tại để xây dựng backend là NestJS
Javascript là ngôn ngữ lập trình bậc cao có cộng đồng người sử dụng đông đảo hàng đầu hiện nay Với nhiều lợi ích to lớn về mặt triển khai, như cú pháp đơn giản, thực thi phía người dùng nên tăng trải nghiệm người dùng, “viết một lần, thực thi ở khắp nơi” … Javascript luôn là sự lựa chọn hàng đầu của các nhà phát triển Tuy nhiên, để cấu hình một ứng dụng thuần Javascript mà không có sự hỗ trợ từ bất kì thư viện và framework nào thì mất rất nhiều thời gian, công sức và không cần thiết Do đó, NestJS ra đời nhằm
Trang 113 Đối tượng nghiên cứu
Nghiên cứu chi tiết về cách thức hoạt động, ưu – khuyết điểm của các công cụ mà NestJS cung cấp, hiểu ý nghĩa và chức năng của mô hình MVC được vận dụng trong NestJS Nghiên cứu các yêu cầu liên quan trong lĩnh vực bất động sản để có kiến thức nền tảng
về nghiệp vụ, hỗ trợ xây dựng ứng dụng minh họa
4 Kết quả hướng tới
Với đề tài này, em hướng đến các mục tiêu sau:
• Ở vai trò cá nhân, em mong muốn mở rộng kiến thức trong lĩnh vực xây dựng ứng dụng web sử dụng NestJS framework thông qua quá trình tìm hiểu công nghệ Ứng dụng kiến thức tìm hiểu về NestJS vào xây dựng ứng dụng cho doanh nghiệp môi giới bất động sản Cá nhân em đã tự thu thập cho mình những kĩ năng liên quan trong quá trình thưc hiện đồ án bao gồm: phương pháp tiếp cận và nghiên cứu một framework mới, quản lý thời gian, thực hiện các khâu phát triển phần mềm chuyên nghiệp và rất nhiều công cụ, công nghệ hiện đại bao gồm NestJS, kiến trúc MVC Bên cạnh kiến thức về công nghệ, thông qua ứng dụng minh họa,
em còn tiếp thu được các kiến thức liên quan đến lĩnh vực bất động sản
Trang 1211
• Đối với các lập trình viên dùng đồ án nghiên cứu này làm tài liệu tham khảo: thông qua tài liệu nghiên cứu và ứng dụng nhóm đã xây dựng, các lập trình viên khác có thể dễ dàng định hướng cần phải tìm hiểu sâu các phần nào khi sử dụng NestJS để xây dựng Backend cho website
Trang 1312
Chương 02 NestJS
1 Giới thiệu chung về NestJS
NodeJS là một Javascript runtime, ra đời năm 2009, được xây dựng trên “V8 Javascript Engine” NodeJS được viết bằng C++, thực hiện việc biên dịch mã nguồn Javascript thành bytecode vì thế NodeJS đã làm cho ứng dụng không chỉ chạy được trên trình duyệt mà còn chạy được trên máy cá nhân như một ứng dụng độc lập Một đặc điểm của NodeJS giúp NodeJS thân thiện với người dùng là hướng sự kiện (Event-driven) và không chặn nhập xuất (non-blocking I/O) Nghĩa là, các yêu cầu
xử lý có thể gửi song song mà không cần đợi phản hồi Non-blocking I/O loại bỏ nhu cầu đa luồng vì server có thể xử lý nhiều yêu cầu cùng lúc Tuy nhiên, để xây dựng ứng dụng bằng NodeJS sẽ mất rất nhiều thời gian công sức để cấu hình, vì thế nhiều framework ra đời để hỗ trợ cho các lập trình viên với mục tiêu để họ tập trung vào phát triển mã nguồn Framework là một cấu trúc phát triển ứng dụng, cung cấp cho các lập trình viên cách tiếp cận tiêu chuẩn hóa trong việc xây dựng và triển khai các ứng dụng Một framework thường bao gồm các thành phần, thư viện và các quy ước thiết kế được sắp xếp một cách hợp lý để giúp giải quyết các vấn đề phổ biến trong phát triển ứng dụng
NestJS là một framework mã nguồn mở cung cấp cho các nhà phát triển một kiến trúc ứng dụng linh hoạt, hiệu quả các ứng dụng NodeJS server-side 1 Nó được xây dựng trên nền tảng của Express.js và có thể được sử dụng để phát triển các ứng dụng máy chủ hiệu quả và có khả năng mở rộng NestJS phát triển ứng dụng theo hướng kết hợp cả Object Oriented Programming (hướng đối tượng)2, Functional
1 Ứng dụng NodeJS server-side là ứng dụng chạy trên môi trường máy chủ hơn là chạy cố định ở một thiết bị người dùng cụ thể Máy chủ ở đây được viết bằng NodeJS
2 Object Oriented Programming – OOP là một kỹ thuật lập trình mô hình hóa các thành phần thành đối tượng và lớp OOP tập trung vào đối tượng thao tác và đặc tính cấu thành nên đối tượng hơn là logic để có thể thao tác chúng
Trang 1413
Programming (hướng cấu trúc)3 và Functional Reactive Programming (hướng phản ứng chức năng)4 NestJS cho phép các nhà phát triển xây dựng các ứng dụng theo cách module hóa, giúp tăng tính tổ chức và dễ bảo trì của mã nguồn Nó cũng hỗ trợ việc sử dụng dependency injection, decorator và module, giúp người dùng dễ dàng học và sử dụng NestJS NestJS đã đóng gói nhiều cấu hình ẩn bên trong và cung cấp nhiều câu lệnh CLI để lập trình nhanh chóng và dễ dàng tạo ra API mà không mất quá nhiều thời gian để tạo cơ sở mã nguồn (codebase)
2 Khái niệm quan trọng
Ngoài các khái niệm cơ bản mà các framework khác của NodeJS cung cấp như Controllers, Providers, Modules, NestJS cung cấp các khái niệm đặc thù hoặc các khái niệm cũ nhưng được hiểu khác đi trong phạm vi của NestJS framework
1 Decorators
Decorator là một đặc trưng của NestJS cho phép lập trình viên kế thừa, thay đổi, mở rộng hành vi của một lớp, một phương thức hoặc thuộc tính Người lập trình sử dụng decorator bằng cách sử dụng kí tự “@” trước các decorator làm dấu hiệu Decorator có thể là lớp, phương thức hoặc thuộc tính, được sử dụng trong nhiều mục đích như routing, dependency injection, middleware, guards, interceptors, …Ví dụ một số decorator như @Controller, @Provider, @Get, @Post, @Patch, @Put, @Param, … NestJS còn cho phép người dùng linh động hơn bằng cách cung cấp phương thức tùy chỉnh decorator (custom decorator)
3 Functional Programming – FP là một mô hình lập trình dựa trên hàm toán học, tránh việc thay đổi giá trị của dữ liệu, làm cho các hàm trở nên chuyên biệt, mỗi hàm chỉ thực hiện một chức năng, không dồn quá nhiều logic vào một hàm từ đó giúp cho việc kiểm soát mã nguồn trở nên dễ dàng hơn
4 Functional Reactive Programming – FRP là mô hình lập trình kết hợp giữa hướng chức năng và hướng phản ứng để xây dựng ứng dụng Nó hỗ trợ thay đổi trạng thái của ứng dụng ứng dụng một cách linh hoạt dựa vào sự kiện, hành vi mà sự kiện, hành vi đó thay đổi liên tục và rời rạc
Trang 1514
1 Pipes
Pipes là một annotated class, với 2 mục đích chính:
• Chuyển đổi kiểu dữ liệu (Transformation): chuyển kiểu dữ liệu thành kiểu người lập trình mong muốn
• Kiểm tra dữ liệu (Validation): xác thực dữ liệu đầu vào và báo lỗi khi cần thiết Có 9 loại pipes:
2 Providers bất đồng bộ (Asynchronous Providers)
Providers bất đồng bộ là một kiểu provider xử lý theo kiểu bất đồng bộ Nghĩa là thay
vì trả về một giá trị, phương thức sử dụng bất đồng bộ sẽ trả về một Promise mà Promise này sẽ trả về một giá trị trong tương lai Cụ thể, ta sử dụng cú pháp async/await và useFactory NestJS sẽ chờ giải quyết Promise trước khi khởi tạo bất
kì lớp nào phụ thuộc vào injects
Trang 1615
3 Modules động (Dynamic modules)
Modules trong NestJS là một tập các components như providers, controllers, services… được đóng gói, có decorator là @Module() Mục đích của Modules là đóng gói các hàm thành một đơn vị và quản lý dependency từ đó lập trình viên có thể biết được components thuộc về modules nào, giúp cho việc tổ chức, quản lý components trở nên dễ dàng hơn
Module động hay Dynamic modules cho phép người lập trình cấu hình và tạo các module động tại thời điểm runtime Ưu điểm của module động là chỉ tải các module dựa vào input từ người dùng hoặc các điều kiện runtime khác nên làm cho ứng dụng linh động và tối ưu được hiệu suất
Để sử dụng modules động, ta dùng “forRootAsync” Ví dụ:
Trang 174 Vòng đời sự kiện (Lifecycle events)
Trong NestJS, vòng đời của mỗi sự kiện được chia thành 3 giai đoạn: khởi tạo, chạy
và kết thúc
Trang 1817
NestJS cung cấp các hooks tương ứng với từng giai đoạn trong vòng đời của sự kiện như
onModuleInit(): được gọi khi các dependency của module được resolve
onApplicationBootstrap(): được gọi khi tất cả các module được khởi tạo nhưng trước khi lắng nghe các kết nối
onModuleDestroy(): được gọi sau khi có các cờ báo hiệu giai đoạn kết thúc
Trang 1918
beforeApplicationShutdown(): được gọi sau tất cả các onModuleDestroy() hoàn thành, các kết được đóng
onApplicationShutdown(): được gọi sau khi tất cả các kết nối được đóng
5 Microservices với NestJS
a Giới thiệu chung
Các ứng dụng thiết kế theo hướng monolithic gặp phải các vấn đề khi mở rộng và nâng cấp hoặc đơn giản là các nghiệp vụ của doanh nghiệp trở nên phức tạp Vì thế, kiến trúc microservice ra đời để giải quyết bài toán của kiến trúc monolithic Nói một cách khái quát, microservice chia các xử lý logic thành các thành phần nhỏ độc lập, được gọi là các dịch vụ (service) Mỗi service có thể phát triển, quản
lý và bảo trì độc lập
Trong NestJS, các microservice sử dụng nhiều tầng vận chuyển khác nhau như HTTP, websocket, TCP, NAT Microservice trong NestJS sử dụng TCP làm giao thức mặc định
NestJS còn cung cấp nhiều thư viện giúp cho việc tạo và quản lý microservices trở nên dễ dàng hơn rất nhiều như Kafka, Redis, NATS, RabbitMQ…
b Kafka với NestJS
Kafka về tổng quan được thiết kế để xử lý các luồng dữ liệu với khả năng xử lý dữ liệu tốc độ cao và độ trễ thấp Kafka được thiết kế theo hướng sự kiện (Event -driven) Kafka được sử dụng trong trường hợp một service gửi các sự kiện đến các service khác để xử lý mà không cần chờ kết quả trả về Trong mô hình hoạt động của Kafka, một service đóng vai trò là bên cung cấp (producer) ghi các sự
Trang 2019
kiện vào một bản ghi và bên tiêu thụ (consumer) sẽ đọc sự kiện từ bản ghi và xử
lý Các producer không cần đợi kết quả xử lý từ consumer
Để sử dụng Kafka với Nest, ta dùng “@nestjs/microservices” module
Đặc điểm của Kafka với NestJS:
• Cấu hình đơn giản: cung cấp công cụ đơn giản hóa việc cấu hình cài đặt Kafka client
• Built-in serialization: kafka hỗ trợ các định dạng tuần tự hóa thông báo khác nhau, bao gồm JSON, Avro và Protobuf
• Hỗ trợ multiple topics: NestJS Kafka cho phép subscribe nhiều topic từ một consumer
• Xử lý lỗi: Kafka module cung cấp các tính năng xử lý lỗi giúp lập trình viên tránh một số lỗi thường gặp thông qua lớp “KafkaRetriableException”
Trang 2120
6 CLI
Một trong những ưu điểm vượt trội của NestJS framework, NestJS CLI (Command Line Interface) là bộ lệnh hỗ trợ nhà phát triển tạo, quản lý và dựng ứng dụng NestJS nhanh chóng và dễ dàng hơn rất nhiều Bộ câu lệnh CLI cung cấp các câu lệnh để xây dựng và đóng gói các công việc như tạo modules, services, controllers
Các chức năng chính của bộ lệnh là:
• Tạo dự án: tập các câu lệnh dùng để tạo khung codebase cho dự án
• Tạo mã nguồn: tập các câu lệnh tạo thành phần quen thuộc như controllers, services, modules, pipes…
• Dependency Injection: tự động inject các giá trị phụ thuộc cho các component
• Cấu hình: tập các câu lệnh hỗ trợ cấu hình ứng dụng
• Build và chạy ứng dụng: tập các lệnh để bật/tắt máy chủ
3 Lý do nên chọn NestJS
Phát triển ứng dụng với tốc độ nhanh: NestJS đã cung cấp codebase và tập câu lệnh CLI cực kì mạnh mẽ giúp tổ chức mã nguồn một cách có ứng dụng và nhanh chóng Các nhà phát triển có thể tập trung vào việc phát triển mã nguồn mà không mất nhiều thời gian cho việc cấu hình và cài đặt
Cung cấp kiến trúc ứng dụng theo hướng module hóa: NestJS được thiết kế với kiến trúc mô-đun giúp dễ dàng xây dựng các ứng dụng có thể mở rộng và bảo trì Lập trình viên có thể dễ dàng tách ứng dụng của mình thành các module khác nhau, có thể được sử dụng lại và kiểm tra độc lập
Hỗ trợ cả Restful API và GraphQL: Từ một cơ sở mã NestJS duy nhất, ứng dụng của có thể được điều chỉnh để phù hợp với REST hoặc GraphQL một cách dễ dàng tùy
Trang 2221
thuộc vào cách tiếp cận nào phù hợp Theo mặc định, cách tiếp cận tiêu chuẩn là REST, nhưng có thể dễ dàng chuyển sang GraphQL và có hai cách để triển khai GraphQL bằng cách sử dụng NestJS
Hỗ trợ cả Typescript và Javascript: NestJS hỗ trợ mạnh mẽ TypeScript Mặc định ngôn ngữ mà NestJS sử dụng là Typescript tuy nhiên, NestJS còn có thể triển khai bằng Javascript
Hỗ trợ mạnh mẽ kiến trúc microservice: NestJS cung cấp bộ công cụ hỗ trợ xây dựng ứng dụng theo hướng microservice với khả năng mở rộng và chịu lỗi cao
Trang 2322
Chương 03 - Xây dựng Website môi giới bất động sản Katana
1 Giới thiệu chung về Website môi giới bất động sản Katana
1.1 Phát biểu bài toán và hướng giải quyết
Các thành phố lớn của Việt Nam hiện nay có mật độ dân số khá cao Trong đó, mật độ dân số năm 2022 sẽ là 4292 người/km2 tại TP.HCM và 2398 người/km2 tại Hà Nội Nhiều cư dân là người nước ngoài, sinh viên hoặc những người không phải là người bản xứ, nhưng những người cần tìm nhà ở—căn hộ hoặc nhà cho thuê—để sinh sống và làm việc gặp khó khăn do thiếu thông tin về nhà ở Họ có thể liên hệ với các cơ quan với mục đích nhanh chóng tìm được một nơi có thể chấp nhận được Tuy nhiên, quá trình lao động của con người tốn nhiều thời gian mà chưa thực sự hiệu quả Điều đó có nghĩa
là khách hàng nói chung khó tìm được một địa điểm phù hợp trong thời gian hạn hẹp
Ngoài ra, chủ nhà cần quảng cáo cho người thuê nhà phải nỗ lực rất nhiều vì
họ dựa vào các kỹ thuật thủ công như tờ rơi và môi giới thông thường lãng phí và góp phần làm xói mòn sức hấp dẫn của đô thị Nhận thấy cả cung và cầu đều không đủ cầu nhưng cần phải có cầu nối Một chi tiết quan trọng hơn
là các doanh nghiệp kinh doanh bất động sản thường được quản lý thủ công Đó là tài liệu như hợp đồng được quản lý và lưu trữ thủ công gây ra nhiều vấn
đề Doanh nghiệp phải tốn nhiều công sức và tiền bạc hơn để đặt hàng và lưu kho vì đặc thù của bất động sản là mọi giấy tờ đều quan trọng
Trước khi điều đó xảy ra, em muốn tạo ra một ứng dụng giới thiệu, môi giới bất động sản trực tuyến giúp người thuê nhà dễ dàng xác định các mặt hàng
họ cần, sử dụng nhanh chóng và tiết kiệm thời gian và các nhà cung cấp xác định vị trí người mua nhanh chóng, sau đó thương mại thành công Chương
Trang 24hỗ trợ việc quản lý các công ty và khách hàng mua và bán tài sản
Ở vai trò khách hàng, người dùng không cần đăng nhập vào ứng dụng Các nhóm khách hàng được chia thành hai loại dựa trên nhu cầu của họ: nhu cầu mua và nhu cầu bán Khách hàng có quyền xem chi tiết các bài viết về bất động sản, bao gồm thông tin về khu vực, vị trí cụ thể kèm theo bản đồ, giá cả, loại đất, diện tích, mô tả, hình ảnh và video ví dụ Quan trọng hơn, bằng cách
sử dụng các bộ lọc về vị trí, giá cả và khu vực, khách hàng có thể dễ dàng chọn được ngôi nhà lý tưởng cho mình Khách hàng mua hàng có thể gửi dữ liệu cá nhân của họ Các nhóm khách hàng được chia thành hai loại dựa trên nhu cầu của họ: nhu cầu mua và nhu cầu bán Khách hàng có quyền xem chi tiết các bài viết về bất động sản, bao gồm thông tin về khu vực, vị trí cụ thể kèm theo bản đồ, giá cả, loại đất, diện tích, mô tả, hình ảnh và video ví dụ Quan trọng hơn, bằng cách sử dụng các bộ lọc về vị trí, giá cả và khu vực, khách hàng có thể dễ dàng chọn được ngôi nhà lý tưởng cho mình Khách hàng mua hàng có thể gửi dữ liệu cá nhân của họ
Nếu người dùng là quản trị viên, bạn cần đăng nhập để truy cập ứng dụng Do chính sách kinh doanh, hiện tại chỉ có quản trị viên ứng dụng và giám đốc được phép truy cập ứng dụng thông qua tài khoản quản trị viên đang hoạt động Ứng dụng cho phép quản lý khách hàng và thống kê thông tin khách hàng dựa trên các yếu tố như yêu cầu, khu vực,… Thông qua công cụ lọc, người quản trị có thể dễ dàng tìm kiếm thông tin khách hàng bằng nhiều tham
Trang 2524
số Đối với quản trị viên, hãy xuất số liệu thống kê dưới dạng tệp Excel Do tính đa dạng của các bài đăng trên website bao gồm tin mua bán nhà đất, tin nóng, tin giới thiệu, tin tư vấn pháp luật… nên ứng dụng còn hỗ trợ người quản trị quản lý các tin đăng trên website Cuối cùng, việc quản lý người dùng, theo dõi tất cả các bất động sản được gửi đến ứng dụng, tiếp nhận và xử lý thông tin người dùng sẽ đơn giản hơn cho quản trị viên Ứng dụng được xây dựng nhằm đáp ứng yêu cầu người quản trị thường xuyên tương tác với ứng dụng để cập nhật tin tức
1.2 Công cụ, công nghệ sử dụng
Một web được đánh giá cao khi tốc độ xử lý dữ liệu nhanh, bảo mật thông tin khách hàng tốt Và nhóm nhận thấy rằng, ExpressJS có khả năng thực hiện rất tốt các công việc nêu trên, mà NestJS là framework xây dựng trên nền tảng ExpressJS Bởi vì:
• Khả năng bảo mật của ExpressJS được đánh giá là rất tốt vì được NodeJS hỗ trợ framework vô cùng mạnh mẽ Hơn thế nữa, cấu trúc của ExpressJS được cho rằng là rất chặt chẽ Thêm vào đó, nhóm sử dụng các công nghệ bảo mật rất được thịnh hành và tin dùng ngày nay như
mã hoá bằng Bcrypt, JWT…
• Cộng đồng sử dụng NestJS khá đông đảo nên dễ dàng tìm kiếm sự hỗ trợ và thường xuyên được cập nhật, nâng cấp
• Ứng dụng NestJS rất dễ để bảo trì cũng như là nâng cấp về sau
Về phía giao diện, với một website, trải nghiệm người dùng và giao diện mang tính thẩm mỹ cao được xem như là các tiêu chí hàng đầu thu hút khách hàng
Trang 26• Một trang web bán hàng online được xem là một ứng dụng với độ phức tạp vừa phải và có tính mở rộng cao và ReactJS là thư viện tuyệt vời trong khả năng mở rộng mà NextJS là framework hỗ trợ ReactJS
• Với NextJS, lập trình viên không phải bận tâm quá nhiều cho việc xây dựng codebase mà có thể tập trung vào phát triển mã nguồn Thêm vào đó, routing trong ứng dụng có thể được hoàn thành đơn giản với sự hỗ
trợ của package trong NextJS
Cơ sở dữ liệu: PostgresQL PostgresQL là cơ sở dữ liệu quan hệ, phù hợp với đồ án bởi:
- PostgresQL hỗ trợ nhiều loại dữ liệu cả dữ liệu có cấu trúc lẫn dữ liệu không cấu
trúc bao gồm: Integer, Numeric, String, Boolean, Data/Time, Range, UUID …
1.3 Danh sách yêu cầu
1.3.1 Yêu cầu chức năng
admin
Trang 2726
Trang 2827
1.3.2 Yêu cầu phi chức năng
Yêu cầu giao diện (GUI): thân thiện, tối giản, dễ sử dụng, hiện đại, tổ chức theo cây để dễ truy cập, hỗ trợ chủ đề giao diện tối/sáng, tương tác cao…
Vận hành:
• Hệ thống chạy được trên tất cả trình truyệt
• Chạy được trên máy tính xách tay, máy tính bàn, thiết bị di động
Hiệu suất:
• Hệ thống hoạt động liên tục 24/7
• Mọi tương tác giữa người dùng và hệ thống không vượt quá 1 giây
• Có khả năng chịu tải 30 TPS
• Có phân quyền người dùng
• Các phòng ban/khoa khác nhau chỉ xem được thông tin của phòng ban đó
• Giảng viên chỉ xem được thông tin của mình và thông tin của lớp do mình chịu trách nhiệm
• Hủy quyền của tài khoản khi cán bộ/giảng viên dừng công tác
Văn hóa, chính trị:
1.3.3 Hệ thống phải tuân thủ luật về quyền riêng tư của người dùng
1.3.4 Hệ thống đảm bảo tuân thủ luật liên quan đến giáo dục theo luật pháp hiện hành ở Việt Nam
1.4 Mã nguồn
- Github:
o Front-end:
Trang 3029
Web người dùng
2.2 Phân tích, thiết kế cơ sở dữ liệu
2.2.1 Sơ đồ ERD
Trang 3130
2.2.2 Mô tả chi tiết
Cơ sở dữ liệu cần lưu thông tin đăng nhập, đăng ký của quản trị viên phục vụ cho việc xác thực và phân quyền Mỗi quản trị viên cần đăng nhập để truy cập hệ thống
Cần một bảng chứa thông tin dự án như giá, vị trí khu vực, địa chỉ chính xác, tình trạng
xử lý, loại đất,… để người dùng có thể xem thông tin dự án bất động sản và quản trị viên có thể cập nhật thông tin về dự án đó
Cần một bảng chứa thông tin bài viết Bài viết bao gồm quảng cáo và bài viết chuyên môn như tư vấn pháp lý, thông tin doanh nghiệp,… Để phục vụ cho việc tăng trải nghiệm người dùng, chúng ta có thêm chức năng đăng tải và quản lý tin tức thuộc nhiều thể loại
Trang 322.3 Đặc tả
2.3.1 Đăng nhập với vai trò quản trị viên
Tên Use-case Đăng nhập
Mô tả Admin đăng nhập vào hệ thống với tài khoản đã được cung
cấp để sử dụng các chức năng của hệ thống
Sự kiện kích hoạt Admin bấm nút “Đăng nhập”
Điều kiện trước Admin đã được cung cấp tài khoản (tên đăng nhập, mật
khẩu) Thiết bị có kết nối Internet Điều kiện sau Admin nhận thông báo đăng nhập thành công
Luồng chính 1 Hệ thống hiển thị trang chào mừng đăng nhập
2 Admin bấm nút đăng nhập
3 Hệ thống hiển thị trang đăng nhập
4 Admin nhập tên đăng nhập và mật khẩu, bấm nút đăng nhập
5 Hệ thống xác thực thông tin và so sánh với cơ sở dữ liệu
6 Hệ thống chuyển hướng sang trang Home
Trang 3332
Luồng thay thế 4.a Hệ thống kiểm tra thông tin đăng nhập không đúng
trong 3 lần, admin được nhập lại
Luồng ngoại lệ 4.b Hệ thống kiểm tra xác thực thông tin đăng nhập sai quá
3 lần Khóa đăng nhập và master admin cấp lại tài khoản
2.3.2 Đăng xuất
Tên Use-case Đăng xuất
Sự kiện kích hoạt Admin bấm nút “Đăng xuất”
Điều kiện trước Admin đã đăng nhập thành công vào hệ thống
Thiết bị có kết nối Internet Điều kiện sau Admin nhận thông báo đăng xuất thành công
Luồng chính 1 Hệ thống hiển thị trang đăng xuất
2 Admin bấm nút đăng xuất
3 Hệ thống hủy token và hiển thị trang đăng nhập Luồng thay thế
Luồng ngoại lệ
2.3.3 Quản lý – xóa vĩnh viễn tài khoản quản trị viên
Tên Use-case Quản lý – xóa vĩnh viễn tài khoản quản trị viên
Mô tả Master admin có thể xóa tài khoản của một admin Tài
khoản sẽ bị loại khỏi hệ thống, không thể tái sử dụng
Sự kiện kích hoạt Master admin chọn chức năng sửa đổi trạng thái tài khoản Điều kiện trước Master admin đăng nhập thành công vào hệ thống