Preview text:
  lOMoARcPSD| 10435767    
HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG CƠ SỞ TẠI THÀNH  PHỐ HỒ CHÍ MINH 
KHOA CÔNG NGHỆ THÔNG TIN 2   
BÁO CÁO ĐỀ TÀI MÔN PHÁT TRIỂN PHẦN MỀM   HƯỚNG DỊCH VỤ 
Đề tài : XÂY DỰNG ỨNG DỤNG MARKETPLACE BÁN TRANH NFT 
Chuyên ngành: CÔNG NGHỆ PHẦN MỀM        lOMoARcPSD| 10435767
BẢNG PHÂN CHIA CÔNG VIỆC  STT  Họ và tên - MSSV  Công việc 
Phát triển ứng dụng trên nền tảng mobile (React Native):   
- Phát triển UI với các màn hình:   
+ Đăng nhập, đăng ký, quên mật khẩu. 
+ Trang chủ (danh sách collection và tìm kiếm). 
+ Chi tiết collection và danh sách NFT của  collection tương ứng). 
+ Chi tiết NFT, biểu đồ thống kê giá, thống kê 
lịch sử mua bán của NFT. 
+ Profile với các chức năng như đổi 
password, withdraw, deposit (USD), 
transfer (USD or GOR). Thêm collection. 
Xem lại các collection của mình và danh 
sách các NFT tương ứng với collection. 
+ Và các UI khác như UI modal, thêm xoá sửa.  Phạm Văn Thuận -  + 
Có sử dụng các kỹ thuật tối ưu như lazy 1    N19DCCN204  loading, splitting code.   
- Xử lý các logic liên quan đến business: 
+ Xử lý đăng nhập, đăng ký và quên mật khẩu.   
+ Xử lý thêm, sửa collection và NFT. 
+ Xử lý mua NFT, listing NFT và de-listing  NFT. 
+ Xử lý withdraw, deposit, thay đổi mật khẩu. 
+ Lấy danh sách collection, NFT với pagination.   
+ Lấy thông tin chi tiết của collection, NFT. 
+ Lấy thông tin user và lưu accessToken để 
call API với các private request (request  cần định danh). 
- Xử lý upload image (collection và NFT) lên 
firebase storage -> BE chỉ lưu url của image do  firebase trả về.  2  Tạ Quang Linh 
- Xây dựng hệ thống backend: 
+ Viết các API về collection: thêm, sửa, xoá, 
get 1, get all, get by category, get by user,  xác nhận giao dịch    + 
Viết API về pricing: công thức tính giá 
cho NFT dựa theo số lượng giao dịch 
+ Viết hash function cho password, transaction 
- Viết API documentation bằng Swagger UI  - Xây dựng business logic: 
+ Xây dựng business logic cơ bản như: address, wallet, 
nft, collection, token balance, fiat      lOMoARcPSD| 10435767
balance, chuyển đổi tiền 
+ Xây dựng cơ chế tính giá token: mô phỏng 1 số 
cơ chế tính giá bằng cách đếm số lượng giao dịch  trong 1 khoảng thời gian  + 
Xây dựng quy định về cách xác định 
transaction và cách sử dụng - Thiết kế database: 
+ Thiết kế 4 database collection gồm: wallet, nft,  transaction, collection 
- Xây dựng hệ thống backend:  + 
Xây dựng service backend core: database 
client, các asset type, transaction type, error code, status Lê Hoài Nhân  3  code…  N19DCCN126 
+ Sử dụng JWT để xác minh tài khoản và các private  API 
+ Viết các API về assets: nạp tiền, rút tiền, chuyển 
tiền, chuyển NFT, đổi tiền từ GOR sang USD và  ngược lại   
+ Viết API về pricing: tính tỉ lệ quy đổi GOR sang  USD  + 
Viết API và các function về transaction, 
history: Tạo transaction sau mỗi lượt giao dịch, thống kê, 
lịch sử giao dịch của NFT, collection - Triển khai hệ  thống lên cloud: 
+ Triển khai hệ thống trên render.com: giới hạn 5  request/s   
+ Trỏ tới github, auto deploy latest commit  4  Nguyễn Trọng Tín  + Thiết kế nghiệp vụ  + 
Định nghĩa các entity trong hệ thống: wallet, 
nft, collection, transaction +  Thiết kế kiến  trúc hệ thống web   
+ Thiết kế và triển khai giao diện web:   
+ Trang đăng nhập, đăng ký, đổi mật khẩu    + Trang Chủ    + Trang Collection    + Trang NFT    + Trang Profile    + Form tạo Collection    + Form Mint NFT    + Form nạp tiền    + Form đổi tiền    + Form chuyển tiền   
+ Xác thực tài khoản với JWT 
+ Phân quyền tài khoản, chủ sở hữu tài sản trong hệ  thống web      lOMoARcPSD| 10435767  
+ Lưu ảnh từ web lên Firebase   
+ Call API đổ dữ liệu vào các trang có trong web   
+ Xử lý logic nghiệp vụ Web Frontend 
- Xây dựng hệ thống backend: 
+ Viết API về NFT: thêm sửa, xoá, mua bán, list sàn,  delist, thay đổi giá   
+ Viết API đăng nhập, đăng ký, quên mật khẩu, đổi  5  Lê Quang Phục  mật khẩu  -  Xây    dựng    database: 
 + Tạo database trên mongodb gồm: wallet, nft,  transaction, collection  - 
Viết báo cáo, vẽ sơ đồ, schema database        lOMoARcPSD| 10435767
CHƯƠNG 1 : MÔ TẢ HỆ THỐNG 
1. Mô tả business logic 
Mô phỏng một số tính năng, cơ chế của blockchain, NFT, Defi…phù hợp với mục  đích môn học. 
- Address: chu i cóỗ độ dài 42 ký tự hexa (hệ thập lục phân), bao gồm các chữ số từ 
0-9 và các chữ cái từ a-z (ví dụ 0x51bae3a470825c24e3c7aecb31574f8bd5d69e35)  và là duy nhất. 
- NFT (non-fungible token): là một dạng tài sản không thể bị thay thế, đặc trưng bởi 
một address. Mỗi NFT là duy nhất, khác với fungible token. Ví dụ: một tờ 1 dollar là 
một fungible token, bởi vì có rất nhiều tờ dollar, chúng có giá trị ngang nhau (1 đô 
ngang 1 đô) tại mọi hoàn cảnh, thời điểm và có thể thay thế nhau. Còn một căn nhà 
là 1 NFT, bởi vì mỗi căn nhà là duy nhất, được xác định bởi địa chỉ của nó. Giá trị 
của mỗi căn nhà phải dựa vào một hệ quy chiếu cụ thể, không thể so sánh giá trị trực 
tiếp của hai căn nhà mà phải thông qua một hệ quy chiếu tiền tệ nào đó (USD). 
- Wallet: là một địa chỉ ví ẩn danh, đặc trưng bởi một address. Mỗi địa chỉ ví đi kèm 
với một private key và private key không thể thay đổi trong mọi hoàn cảnh, chỉ được 
cung cấp một lần, dùng để định danh wallet đó. Địa chỉ ví là công khai nhưng không 
công khai chủ sở hữu. Ngoài ra còn có một số trường khác như nickname, password, 
token balance, fiat balance… 
- GOR Token (Token balance): là tiền tệ mô phỏng của sàn. Tỷ giá của GOR token 
so với USD biến động theo thời gian, dựa và số lượng giao dịch NFT trên sàn. Mọi 
hoạt động mua bán NFT trên sàn đều sử dụng GOR để giao dịch. Giá của một NFT 
được tính theo GOR. Giá của một GOR token được tính theo USD. 
- USD (Fiat balance): là mô phỏng của USD ngoài đời thật, được sử dụng để nạp, rút 
tiền trên sàn, chuyển đổi từ USD sang GOR để thực hiện các giao dịch trên sàn. 
- Collection: là một bộ sưu tập chứa nhiều NFT theo từng chủ đề. Mỗi Collection đều 
là duy nhất đặc trưng bởi một address. Mỗi NFT chỉ thuộc một collection. 
- Tính giá token (cách tính này chỉ là mô phỏng, mục đích phục vụ việc học tập, không 
áp dụng vào thực tế): Đếm số lượng giao dịch mua bán trên sàn trong khoảng thời 
gian 1h trở lại tính từ thời điểm tính giá. Lấy số lượng giao dịch đó làm biến số, tính 
giá dựa theo công thức: y = 2 + log.  2. Sơ đồ usecase  a. Wallet      lOMoARcPSD| 10435767   b. Statistics    c. Collection      lOMoARcPSD| 10435767       lOMoARcPSD| 10435767 3. Sơ đồ diagram   
4. Kiến trúc REST API   
- Rest API là một ứng dụng được dùng để chuyển đổi cấu trúc của dữ liệu có những 
phương thức giúp kết nối với các thư viện và ứng dụng khác nhau. Rest Api Thường 
không được xem là công nghệ, mà nó là giải pháp giúp tạo ra những ứng dụng web 
services chuyên dụng để thay thế cho nhiều kiểu khác như: SOAP, WSDL,... 
- API là từ viết tắt của cụm từ Application Programming Interface, đây là tập hợp 
những quy tắc và cơ chế mà theo đó thì: Một ứng dụng hoặc một thành phần nào đó 
sẽ tương tác với một ứng dụng hoặc một số thành phần khác. API có thể sẽ được trả 
về dữ liệu mà người dùng cần cho chính ứng dụng của bạn với những kiểu 
dữ liệu được dùng phổ biến như JSON hoặc XML. 
- Rest là từ viết tắt của Representational State Transfer: Nó là một trong những dạng 
chuyển đổi cấu trúc, với kiểu kiến trúc thường được viết API. Rest thường sử dụng 
dụng phương thức HTTP đơn giản để có thể tạo ra giao tiếp giữa các máy.Bởi vì thế, 
thay vì phải sử dụng một URL cho việc xử lý một số thông tin của người dùng thì 
Rest sẽ yêu cầu HTTP như: GET, POST, DELETE,... đến với bất kỳ một URL để 
được xử lý dữ liệu.      lOMoARcPSD| 10435767
5. Kiến trúc Microservices   
- Microservices là một kiến trúc phát triển phần mềm trong đó ứng dụng được chia thành 
các thành phần nhỏ độc lập nhau, được gọi là microservices. Mỗi microservice đảm 
nhận một chức năng cụ thể của ứng dụng và hoạt động như một dịch vụ độc lập có 
thể được triển khai, quản lý và mở rộng độc lập. 
Một số đặc điểm chính của kiến trúc Microservices bao gồm: 
○ Độc lập: Mỗi microservice hoạt động độc lập và có thể được phát triển, triển 
khai và mở rộng độc lập với các microservices khác. Điều này giúp tăng tính 
linh hoạt và khả năng phát triển theo phần mềm. 
○ Giới hạn phạm vi: Mỗi microservice chịu trách nhiệm chỉ cho một chức năng 
cụ thể. Việc chia nhỏ ứng dụng thành các phần nhỏ giúp giảm độ phức tạp và 
tăng tính rõ ràng và dễ quản lý của hệ thống. 
○ Giao tiếp qua API: Microservices giao tiếp với nhau thông qua các giao diện 
lập trình ứng dụng (API), thường là giao thức HTTP hoặc giao thức truyền 
thông khác. Điều này cho phép mỗi microservice giao tiếp và trao đổi dữ liệu 
với nhau một cách tiêu chuẩn và linh hoạt. 
○ Độc lập triển khai và mở rộng: Mỗi microservice có thể được triển khai độc 
lập, cho phép đội phát triển tập trung vào phần cụ thể mà họ quản lý. Ngoài ra, 
việc mở rộng chỉ có thể được áp dụng cho các microservice cần nhiều tài 
nguyên hơn, giúp tối ưu hiệu suất của hệ thống. 
○ Tích hợp dễ dàng: Microservices cho phép tích hợp các công nghệ và dịch vụ 
khác nhau. Với kiến trúc này, bạn có thể sử dụng các công nghệ và ngôn ngữ 
lập trình phù hợp cho từng microservice cụ thể, giúp tận dụng tối đa sức mạnh  của các công nghệ đó. 
○ Quản lý dễ dàng: Do mỗi microservice hoạt động độc lập, việc quản lý và bảo 
trì trở nên dễ dàng hơn. Bạn có thể triển khai, cập nhật và khắc phục sự cố cho 
từng microservice mà không ảnh hưởng đến các phần khác của hệ thống. 
Kiến trúc Microservices thường được sử dụng trong các ứng dụng phần mềm lớn, 
phức tạp và có yêu cầu cao về linh hoạt, mở rộng và khả năng phát triển. Nó giúp 
tách biệt các thành phần của ứng dụng, tăng tính ổn định, tối ưu hiệu suất và cho 
phép các đội phát triển làm việc độc lập trên từng phần của hệ thống.      lOMoARcPSD| 10435767 6. Kiến trúc Flux   
Kiến trúc Flux là một mô hình quản lý trạng thái ứng dụng được sử dụng trong việc 
phát triển ứng dụng web đơn trang (single-page applications). Nó được Facebook 
giới thiệu để giải quyết vấn đề quản lý trạng thái phức tạp trong các ứng dụng có giao 
diện người dùng phức tạp. 
Flux gồm có các thành phần chính sau: 
● View: Đại diện cho giao diện người dùng và hiển thị dữ liệu. Trong kiến trúc 
Flux, View không có trạng thái và chỉ được sử dụng để hiển thị dữ liệu từ 
Store và gửi các hành động (actions) đến Dispatcher. 
● Action: Các hành động (actions) là các sự kiện hoặc yêu cầu từ người dùng 
hoặc hệ thống. Action có thể được gửi từ View đến Dispatcher để thông báo 
về các thay đổi trạng thái cần thực hiện. 
● Dispatcher: Dispatcher là trung tâm điều phối trong kiến trúc Flux. Nó nhận 
các hành động (actions) từ View và chuyển tiếp chúng đến Store phù hợp. 
Dispatcher đảm bảo rằng các hành động được xử lý theo thứ tự và không có  xung đột xảy ra. 
● Store: Store là nơi lưu trữ trạng thái ứng dụng và logic xử lý dữ liệu. Nó nhận 
các hành động từ Dispatcher và cập nhật trạng thái của mình. Store cung cấp 
dữ liệu cho View để hiển thị và thông báo về sự thay đổi trạng thái. 
● View Controller: View Controller là thành phần tùy chọn trong kiến trúc Flux. 
Nó có thể được sử dụng để quản lý việc hiển thị và tương tác với View. View 
Controller có thể gửi các hành động (actions) đến Dispatcher và cập nhật trạng  thái của Store.        lOMoARcPSD| 10435767
CHƯƠNG 2 : CÔNG NGHỆ ÁP DỤNG 1. Front-end  a. ReactJs 
ReactJs là m t th vi n JavaScript ph bi n độ ư ệ ổ ế ược s d ng đ xây d ngử ụ ể 
ự giao di n ngệ ười dùng cho các ng d ng web. Nó cho phép phát tri n các thànhứ ụ 
ể ph n UI đ c l p và tái s d ng, giúp tăng tính hi u qu và d b o trì c a d án.ầ ộ ậ ử ụ ệ ả 
ễ ả ủ ự ReactJs là một thư viện JavaScript phổ biến được sử dụng để xây dựng giao 
diện người dùng cho các ứng dụng web. Nó cho phép phát triển các thành phần UI 
độc lập và tái sử dụng, giúp tăng tính hiệu quả và dễ bảo trì của dự án.    b. Redux Toolkit 
Redux Toolkit là m t th vi n Redux độ ư ệ ược t i u hóa theo ki n trúc Fluxố ư 
ế đ gi m thi u đ ph c t p và tăng tính hi u qu c a vi c qu n lý tr ng tháiể ả ể ộ ứ ạ ệ ả ủ 
ệ ả ạ trong ng d ng. Nó cung c p m t cách ti p c n d dàng và có c u trúc đứ ụ ấ ộ ế ậ ễ 
ấ ể qu nả lý tr ng thái c a ng d ng m t cách rõ ràng và đ n gi n h n.ạ ủ ứ ụ ộ ơ ả ơ   
Dự án sử dụng công nghệ ReactJs và Redux Toolkit sẽ có khả năng mở rộng tốt, giảm 
thiểu độ phức tạp của quản lý trạng thái và cung cấp cho người dùng một trải nghiệm 
tốt nhất. Dự án có thể được sử dụng để phát triển các ứng dụng web, bao gồm các 
ứng dụng di động và desktop, với khả năng tương thích với nhiều trình duyệt và thiết  bị khác nhau.  c. Material UI 
Material UI là m t th vi n giao di n ngộ ư ệ ệ ười dùng cho ReactJS, được xây 
d ng trên n n t ng thi t k c a Google - Material Design. Th vi n này cungự ề ả ế ế ủ ư ệ 
c p cho các nhà phát tri n các thành ph n UI đ p và d s d ng, giúp tăng tínhấ ể ầ ẹ ễ ử 
ụ hi u qu và ti t ki m th i gian trong vi c phát tri n các ng d ng web.ệ ả  ế  ệ  ờ  ệ  ể  ứ  ụ      lOMoARcPSD| 10435767  
Material UI cung cấp rất nhiều thành phần UI, bao gồm các nút, thanh trượt, bảng, 
biểu đồ, hộp thoại, định dạng văn bản và nhiều hơn nữa. Tất cả các thành phần này 
đều được thiết kế để tương thích tốt với nhau, giúp tạo ra một giao diện người dùng 
thống nhất, dễ dàng bảo trì và nâng cấp. 
Một trong những lợi ích của việc sử dụng Material UI cho dự án ReactJS là tiết kiệm 
thời gian và công sức trong phát triển. Thay vì phải tạo các thành phần UI từ đầu, các 
nhà phát triển có thể sử dụng các thành phần được cung cấp bởi Material UI và tùy 
chỉnh chúng để phù hợp với nhu cầu của dự án. Điều này giúp giảm đáng kể thời gian 
phát triển và đảm bảo tính đồng nhất của giao diện người dùng. 
Ngoài ra, Material UI còn cung cấp các tính năng tùy chỉnh và linh hoạt, cho phép 
các nhà phát triển tùy chỉnh các thành phần UI để đáp ứng nhu cầu cụ thể của dự án. 
Với Material UI, dự án ReactJS sẽ được xây dựng nhanh chóng, hiệu quả và với giao 
diện người dùng đẹp và dễ sử dụng.  2. Mobile  a. React Native 
React Native là một framework được tạo bởi Facebook, cho phép các lập trình viên 
sử dụng JavaScript để làm mobile apps trên cả Android và iOS với có trải nghiệm và 
hiệu năng như native. React Native vượt trội ở chỗ chỉ cần viết một lần là có thể build 
ứng dụng cho cả iOS lẫn Android. 
- React Native sử dụng babel để transpile code UI từ jsx thành code của native 
(Android - Java/ IOS - Objective-C). Trái lại với các code logic với javascript 
thì được thực thi bởi run-time engine (Android - V8/ IOS JavaScriptCore). 
- Mặc dù React Native có thể sử dụng để phát triển cross-platform nhưng bên 
cạnh đó, ta cũng cần quan tâm đến sự tương thích (thư viện, cấu hình, …) khi  phát triển.    b. React Query      lOMoARcPSD| 10435767
React Query là m t th vi n qu n lý tr ng thái và caching d li u cho ngộ ư ệ ả ạ ữ 
ệ ứ d ng React. Nó cung c p các công c và API đ làm vi c v i d li u tụ ấ ụ ể ệ ớ ữ ệ ừ các 
ngu n khác nhau nh RESTful API, GraphQL ho c WebSockets.ồ ư ặ 
React Query giúp bạn quản lý việc tải dữ liệu từ máy chủ, lưu trữ dữ liệu tạm thời 
trong bộ nhớ cache, và cung cấp các phương thức để thực hiện các thao tác như tạo 
mới, cập nhật và xóa dữ liệu. Nó cũng hỗ trợ việc quản lý trạng thái của các yêu cầu, 
bao gồm quản lý trạng thái tải, thành công và lỗi. 
Một số tính năng chính của React Query bao gồm: 
- Caching: React Query tự động lưu trữ dữ liệu tạm thời trong bộ nhớ cache. 
Điều này giúp giảm số lượng yêu cầu mạng và cải thiện hiệu suất ứng dụng. 
- Tự động tải dữ liệu: React Query cung cấp các hooks như useQuery và 
useMutation để tự động tải dữ liệu từ máy chủ và cập nhật trạng thái. 
- Tự động xử lý lỗi: React Query hỗ trợ xử lý lỗi tự động bằng cách tự động gọi 
lại yêu cầu hoặc thực hiện các hành động khác dựa trên kết quả trả về từ máy  chủ. 
- Refreshing và Invalidating: React Query cung cấp các phương thức để làm 
mới dữ liệu hoặc làm hết hiệu lực dữ liệu trong cache. 
- Tương tác với forms: React Query hỗ trợ tương tác với các form và gửi dữ 
liệu được nhập từ người dùng.    c. Expo CLI 
Expo CLI là m t công c phát tri n ng d ng di đ ng đa n n t ng cho Reactộ ụ ể ứ ụ ộ ề ả 
Native. Nó cung c p m t giao di n dòng l nh đ xây d ng, ch y và qu n lý cácấ ộ ệ ệ ể ự  ạ ả d án Expo.ự 
Expo là một nền tảng phát triển ứng dụng di động, cho phép bạn xây dựng ứng dụng 
di động sử dụng JavaScript và React Native mà không cần phải viết mã Native code. 
Nó giúp giảm bớt sự phức tạp trong việc phát triển ứng dụng di động và cung cấp các 
công cụ hữu ích để xây dựng và triển khai ứng dụng. 
Expo CLI cung cấp các lệnh để tạo, chạy và phát triển các dự án Expo. Bạn có thể sử 
dụng Expo CLI để khởi tạo một dự án mới, chạy ứng dụng trong môi trường phát 
triển (development environment), xây dựng ứng dụng để triển khai, và nhiều hoạt  động khác. 
Một số lệnh phổ biến trong Expo CLI bao gồm:      lOMoARcPSD| 10435767
expo init: Khởi tạo một dự án mới Expo. expo start: Chạy ứng dụng trong 
môi trường phát triển và cung cấp giao diện web để kiểm tra ứng dụng trên 
thiết bị di động hoặc máy tính. expo build: Xây dựng ứng dụng Expo để 
triển khai lên các nền tảng di động (Android, iOS). expo publish: Triển khai 
ứng dụng lên Expo để chia sẻ với người dùng khác. 
Expo CLI cung cấp cách tiếp cận đơn giản và nhanh chóng để phát triển ứng dụng di 
động sử dụng React Native. Nó hỗ trợ nhiều tính năng như tạo giao diện người dùng, 
truy cập vào các API thiết bị, quản lý trạng thái ứng dụng và nhiều hơn nữa.    3. Back-end  a. NodeJs 
Node.js là m t môi trộ ường ch y mã JavaScript phía máy ch , đạ ủ ược xây d ng trênự 
n n t ng JavaScript Engine (V8) c a Google Chrome. Nó cho phép b n vi t mãề ả ủ ạ ế   
JavaScript đ xây d ng ng d ng phía máy ch (server-side applications) và côngể ự  ứ   ụ  ủ 
c dòng l nh (command-line tools) thay vì ch ch y trên trình duy t.ụ  ệ  ỉ  ạ 
ệ Dưới đây là một số đặc điểm quan trọng của Node.js: 
- Bất đồng bộ và không đồng bộ: Node.js được xây dựng dựa trên mô hình bất 
đồng bộ (asynchronous) và không đồng bộ (non-blocking), điều này cho phép 
xử lý đồng thời nhiều yêu cầu mà không chờ đợi hoàn thành của yêu cầu trước 
đó. Điều này giúp Node.js có hiệu suất cao và phản hồi nhanh. 
- Xây dựng hệ thống mạnh mẽ: Node.js có một loạt các thư viện và module hỗ 
trợ để xây dựng các hệ thống phức tạp như máy chủ web, ứng dụng mạng, ứng 
dụng thời gian thực và nhiều hơn nữa. 
- Ecosystem phong phú: Node.js có một cộng đồng phát triển đông đảo, với 
hàng ngàn thư viện và module được xây dựng sẵn. Bạn có thể sử dụng npm 
(Node Package Manager) để quản lý và tìm kiếm các gói thư viện cần thiết  cho dự án của mình. 
- Mã nguồn mở: Node.js là một dự án mã nguồn mở, điều này có nghĩa là bạn 
có thể truy cập mã nguồn và tham gia đóng góp vào việc phát triển Node.js. 
- Phát triển đa nền tảng: Node.js có thể chạy trên nhiều nền tảng như Windows, 
macOS và Linux, cho phép bạn phát triển và triển khai ứng dụng trên các môi  trường khác nhau.      lOMoARcPSD| 10435767   b. Express.js 
Express.js là m t framework phát tri n ng d ng web phía máy ch (server-side)ộ ể ứ ụ 
ủ d a trên Node.js. Nó cung c p các công c và tính năng giúp đ n gi n hóa quáự ấ ụ ơ 
ả trình xây d ng các ng d ng web ph c t p.ự ứ ụ ứ ạ Dưới đây là một số điểm nổi bật  của Express.js: 
- Minimalist: Express.js được thiết kế để có cấu trúc tối giản và linh hoạt, giúp 
người phát triển tạo ra các ứng dụng web một cách dễ dàng và nhanh chóng. 
- Routing: Express.js cung cấp hệ thống định tuyến (routing) mạnh mẽ, cho 
phép bạn định nghĩa các tuyến đường (routes) và xử lý các yêu cầu HTTP 
tương ứng. Bạn có thể xác định các tuyến đường, phương thức HTTP, và xử 
lý các yêu cầu như GET, POST, PUT, DELETE, v.v. 
- Middleware: Express.js sử dụng mô hình middleware để xử lý các yêu cầu 
HTTP. Middleware cho phép bạn thực hiện các tác vụ như xác thực, xử lý lỗi, 
ghi nhật ký, và nhiều hơn nữa. Express.js đi kèm với một số middleware tích 
hợp sẵn, và bạn cũng có thể tạo và sử dụng middleware tùy chỉnh. 
- Template engine: Express.js không đi kèm với một template engine cụ thể, 
nhưng nó cho phép bạn tích hợp và sử dụng các template engine phổ biến như 
Pug, EJS, Handlebars, và nhiều loại template engine khác. 
- Phân cấp và xử lý lỗi: Express.js cho phép bạn xây dựng ứng dụng theo mô 
hình phân cấp (middleware stacking) để xử lý các yêu cầu một cách linh hoạt. 
Ngoài ra, Express.js cũng cung cấp cơ chế xử lý lỗi (error handling) để kiểm 
soát và xử lý các lỗi trong ứng dụng của bạn.    4. Database 
MongoDB là m t h qu n tr c s d li u phi quan h (NoSQL database) phộ ệ ả ị ơ ở ữ ệ ệ 
ổ bi n và m r ng trong lĩnh v c phát tri n ng d ng. Nó đế ở ộ ự ể ứ ụ ược thi t k đ l uế 
ế ể ư tr và x lý các d li u phi c u trúc (unstructured data) và d liữ ử ữ ệ ấ ữ ệu có c u 
trúcấ linh ho t (flexible structured data).ạ 
Dưới đây là một số đặc điểm chính của MongoDB: 
- NoSQL và Document-Oriented: MongoDB thuộc loại cơ sở dữ liệu phi quan 
hệ, trong đó dữ liệu được tổ chức thành các tài liệu (documents) có cấu trúc 
linh hoạt (JSON-like). Điều này cho phép lưu trữ các loại dữ liệu không cố 
định và mở rộng dễ dàng.      lOMoARcPSD| 10435767
- Tích hợp linh hoạt: MongoDB hỗ trợ nhiều ngôn ngữ lập trình như JavaScript, 
Python, Java, Node.js, và nhiều ngôn ngữ khác. Bạn có thể sử dụng các thư 
viện và driver MongoDB để tương tác với cơ sở dữ liệu từ các ứng dụng phía 
máy chủ, ứng dụng web và ứng dụng di động. 
- Scale-Out và tính mở rộng: MongoDB có khả năng mở rộng ngang (horizontal 
scaling), cho phép bạn mở rộng hệ thống bằng cách thêm các node vào cụm 
(cluster). Điều này giúp nâng cao khả năng xử lý và khả năng chịu tải của cơ  sở dữ liệu. 
- Query mạnh mẽ: MongoDB cung cấp một ngôn ngữ truy vấn linh hoạt 
(MongoDB Query Language) để truy vấn dữ liệu. Bạn có thể thực hiện các 
truy vấn phức tạp và tìm kiếm dữ liệu theo nhiều tiêu chí khác nhau. 
- Tính năng Replica Sets và Sharding: MongoDB hỗ trợ các tính năng như 
replica sets (bộ đồng bộ dữ liệu) và sharding (chia nhỏ dữ liệu thành các phân 
đoạn), giúp đảm bảo khả năng cao cho dữ liệu và tăng tính sẵn sàng 
(availability) của hệ thống.    5. Cloud  a. Firebase 
Firebase là một nền tảng phát triển ứng dụng di động và web của Google. Nó cung 
cấp một loạt các dịch vụ điện toán đám mây để phát triển, triển khai và quảng bá ứng 
dụng. Dưới đây là một số dịch vụ quan trọng mà Firebase cung cấp: 
- Firebase Authentication: Dịch vụ xác thực người dùng, giúp quản lý đăng 
nhập, đăng ký và xác thực người dùng thông qua các phương thức như 
email/password, Google, Facebook, Twitter và nhiều phương thức xác thực  khác. 
- Firebase Realtime Database: Cơ sở dữ liệu thời gian thực, lưu trữ và đồng bộ 
dữ liệu giữa các thiết bị và người dùng một cách đồng bộ và tức thì. 
- Firebase Cloud Firestore: Dịch vụ cơ sở dữ liệu linh hoạt và mở rộng, được tổ 
chức theo cấu trúc tài liệu, cho phép lưu trữ và truy vấn dữ liệu một cách nhanh  chóng và mạnh mẽ. 
- Firebase Storage: Dịch vụ lưu trữ đám mây, cho phép lưu trữ và quản lý các 
tệp tin như hình ảnh, video, âm thanh và tệp tin khác. 
- Firebase Cloud Functions: Dịch vụ tích hợp, cho phép bạn viết và triển khai 
mã chạy phía máy chủ trong môi trường điện toán đám mây của Firebase. 
- Firebase Hosting: Dịch vụ lưu trữ và phân phối ứng dụng web tĩnh nhanh  chóng và dễ dàng. 
Ngoài ra, Firebase còn cung cấp nhiều dịch vụ khác như Firebase Analytics (phân 
tích dữ liệu), Firebase Cloud Messaging (gửi thông báo đẩy), Firebase Performance 
Monitoring (theo dõi và tối ưu hiệu suất ứng dụng) và nhiều dịch vụ khác để hỗ trợ 
phát triển ứng dụng di động và web một cách dễ dàng và hiệu quả.      lOMoARcPSD| 10435767   b. Render.com 
- Render.com là một nền tảng đám mây (cloud platform) được thiết kế để cung 
cấp dịch vụ hosting (lưu trữ) và triển khai ứng dụng web. Render.com hỗ trợ việc 
triển khai các ứng dụng web và các dự án công nghệ thông tin khác một cách dễ dàng  và hiệu quả. 
- Render.com cung cấp một môi trường phát triển và triển khai đáng tin cậy cho 
các ứng dụng web. Nền tảng này cho phép bạn triển khai các ứng dụng web mà không 
cần lo lắng về việc quản lý cơ sở hạ tầng. Render.com cung cấp khả năng mở rộng 
tự động, tối ưu hóa hiệu suất và đảm bảo độ tin cậy của ứng dụng. 
- Render.com hỗ trợ nhiều ngôn ngữ lập trình như Node.js, Python, Ruby, Go 
và cung cấp tích hợp liền mạch với các công cụ phát triển phổ biến như Git và Docker. 
Bạn có thể triển khai ứng dụng của mình bằng cách đơn giản push code lên repository 
Git của bạn hoặc sử dụng tích hợp với các công cụ CI/CD (Continuous 
Integration/Continuous Deployment) khác như GitHub Actions hay CircleCI.          lOMoARcPSD| 10435767
CHƯƠNG 3 : CÁC CLIENT , APPLICATION TRUY CẬP API 
1. Ứng dụng Android (React Native) 
a. Authentication: Màn hình v i ch c năng xác th c.ớ  ứ  ự   
- Đăng nh p: màn hình login ghi nh address sau khi user đã đăng nh p ítậ ớ ậ  nh t 1 l n.ấ ầ   
- Đăng ký: màn hình m c đ nh và sau khi đăng ký thành công v i thông tinặ  ị  ớ tr v .ả ề      lOMoARcPSD| 10435767  
- Quên m t kh u: màn hình m c đ nh và sau khi submit thông tin đ resetậ ẩ ặ ị ể  password   
b. Trang ch : màn hình trang chủ ủ v i danh sách các collection c aớ ủ  marketplace.      lOMoARcPSD| 10435767  
c. Chi ti t collection: Th hi n chi ti t thông tin c a collection.ế ể ệ ế ủ - Thông tin 
collection do mình s h u và do user khác s h u.ở ữ ở ữ        lOMoARcPSD| 10435767
- Ch nh s a thông tin c a collection: thumbnail, name, descriptionỉ  ử   ủ   
- Mint NFT thu c m t collection: image, name, price và descriptionộ ộ      lOMoARcPSD| 10435767  
d. Chi ti t NFT: Name, history, price chart và buyế      lOMoARcPSD| 10435767         lOMoARcPSD| 10435767  
- Listing và de-listing (cancel)      e. Profile:  - Thông tin cơ bản:      lOMoARcPSD| 10435767  
- Thêm mới một collection và danh sách NFT của collection trong profile.    - Đổi mật khẩu:      lOMoARcPSD| 10435767  
- N p ti n và rút ti n (Deposit và Withdraw)ạ ề  ề   
- Exchange gi a đ ng GOR và USDữ  ồ      lOMoARcPSD| 10435767  
- Transfer cho m t wallet address thu c m t userộ  ộ  ộ    2. Ứng dụng Web  a. Trang chủ      lOMoARcPSD| 10435767     b. Trang đăng nh pậ  c. Trang đăng ký      lOMoARcPSD| 10435767   d. Trang reset mật khẩu  e. Trang category    f. Trang Collection      lOMoARcPSD| 10435767   g. Trang NFT          lOMoARcPSD| 10435767 h. Trang Profile   
i. Trang quản lý NFT của chủ sở hữu      lOMoARcPSD| 10435767  
j. Form Tạo collection k. Form Mint NFT          lOMoARcPSD| 10435767   l. Form Đổi tiền 
m. Form Chuyển tiền    o. Form nạp tiền   
CHƯƠNG 4 : REST API 1. Overview 
Base URL: https://be-node.onrender.com 
Swagger document: https://be-node.onrender.com/docs/    Cấu    trúc    chung    của    1    response  {   "status": "Error code",   "message": “message",   "data": {   …   }  } 
status: Error code của request tới server, nếu thành công sẽ là OK 
message: Mô tả chung về response (Thông báo trạng thái của request, lý do lỗi(nếu  có) 
data: dữ liệu trả về (nếu có)      lOMoARcPSD| 10435767 2. Error Codes 
Error code mô tả tình trạng của request tới server  Gồm:  C  ERROR  OD  Description  E  OK  2 
request được gửi tới server thành công  00  và nhận được response  BAD_REQUEST  400 
request gửi đi từ user không hợp lệ hoặc 
không thể hiểu bởi máy chủ.  UN_AUTHENTICATION  401 
tình huống không xác thực hoặc không  có quyền truy cập  UN_AUTHORIZATIO  4 
tình huống không có quyền truy cập vào  N  03  tài nguyên  CONFLICT  409 
request không thể hoàn thành do xung 
đột hoặc mâu thuẫn với trạng thái hiện  tại của tài nguyên  INTERNAL_SERVER  500 
lỗi xảy ra phía server và không thể hoàn  thành yêu cầu của user   
Error code chỉ mô tả tình trạng request tới server, không mô tả logic hay response của request  đó  3. Xác thực 
Sau khi đăng nhập thành công sẽ nhận được một đoạn token (JWT) 
Các private API bắt buộc cần phải có JWT để xác thực hành vi, còn các public API  thì không cần. 
Một số public API như: logic, forgot_password, history_nft, price 
Một số private API như: transfer, withdraw, delete_nft, trade  4. Document 
Swagger document: https://be-node.onrender.com/docs/    a. Wallet   
- create: POST /wallet/create      lOMoARcPSD| 10435767
API tạo mới 1 địa chỉ ví 
Địa chỉ ví sẽ được sinh tự động và trả về cùng với private key Body  request:  {   "username": "string",   "password": "string"  }  Response:  {   "status": "OK", 
 "message": "Create new wallet successfully!",   "data": {   "address": "string",   "private_key": "string",   "username": "string",   "fiat_balance": 0,   "token_balance": 0   }  }  - login: POST  /wallet/login API đăng  nhập Body request:  {   "address": "string",   "password": "string"  }  Response:  {   "status": "OK", 
 "message": "Login successfully!",   "data": {   "jwt": "string",   "address": "string",   "fiat_balance": 0,   "token_balance": 0,   "username": "string"   }  } 
- forgot password: POST /wallet/forgot_password API lấy lại 
mật khẩu sử dụng private key Body request:  {   "private_key": "string",   "new_password": "string"  }  Response:  {      lOMoARcPSD| 10435767  "status": "OK", 
 "message": "Password has been reset!"  } 
- transfer: POST /wallet/transfer  API chuyển tiền, NFT 
Với mỗi type(Fiat, Token, NFT) thì sẽ yêu cầu các trường tương ứng, những 
trường không cần thiết sẽ được tự động bỏ qua  Body request:  {   "from": "string",   "to": "string",   "type": "string",   "nft_address": "string",   "amount": float  }  Response:  {   "status": "OK", 
 "message": "Transferred successfully!"  } 
- withdraw: POST /wallet/withdraw 
API rút tiền (USD/Fiat_balance)  Body request:  {   "address": "string",   "amount": float  }  Response:  {   "status": "OK", 
 "message": "Withdraw successfully!"  } 
- deposit: POST /wallet/deposit API 
nạp tiền (USD/Fiat_balance) Body  request:  {   "address": "string",   "amount": float  }  Response:  {   "status": "OK", 
 "message": "Deposited successfully!"  } 
- exchange: POST /wallet/exchange      lOMoARcPSD| 10435767
API đổi tiền từ GOR (Token) sang USD (Fiat) và ngược lại Body  request:  {   "address": "string",   "exchange_to": "string",   "amount": float  }  Response:  {   "status": "OK", 
 "message": "Exchanged successfully!"  }  b. Collection  - create: POST 
collection/create API tạo mới  1 collection Body request:  {   "creator": "string",   "thumbnail": "string",   "description": "string",   "title": "string",   "category": "string",   "rate": float  }  Response:  {   "status_code": 200,   "status": "OK", 
 "message": "Create new collection successfully!"  } 
- get collection by address : GET 
/collection/:address API lấy thông tin 1 collection 
theo address Parameters: address: address của  collection Response:  {   "status_code": 200,   "status": "OK", 
 "message": "Get collection successfully!",   "data": {   "_id": "string",   "address": "string",   "creator": "string",   "created": 1683976114853,   "updated": 1683976114853,   "title": "string",   "thumbnail": "urlstring",      lOMoARcPSD| 10435767  "description": "string",   "category": "string",   "rate": 0,   "txn_history": [],   "username": "string"   }  } 
- update: PUT /collection/:address API 
cập nhật thông tin của 1 collection 
Parameter: address: địa chỉ của  collection Body request:  {   "thumbnail": "string",   "description": "string",   "title": "string",   "category": "string",   "rate": float  }  Response:  {   "status_code": 200,   "status": "OK", 
 "message": "Update collection successfully!"  } 
- delete: DELETE /collection/:address API 
xoá 1 collection Parameter: address: địa 
chỉ của collection Response:  {   "status_code": 200,   "status": "OK", 
 "message": "Delete collection successfully!"  } 
- get list collection: GET /collection/ API 
lấy danh sách các collection (có phân  trang) Parameter:  page: số trang 
limit: số lượng collection mỗi trang Response:  {   "status_code": 200,   "status": "OK", 
 "message": "Get collections successfully!",   "data": [   {   "_id": "string",   "address": "string",   "creator": "string",      lOMoARcPSD| 10435767  "created": 1683976114853,   "updated": 1683976114853,   "title": "string",   "thumbnail": "urlstring",   "description": "string",   "category": "string",   "rate": 0,   "txn_history": [],   "username": "string"   }   ]  } 
- list collection by user: GET /collection/user/:user API 
lấy danh sách collection của 1 user (có phân trang) 
Parameter: user: địa chỉ của user page: số trang 
limit: số lượng collection mỗi trang Response:  {   "status_code": 200,   "status": "OK", 
 "message": "Get collections successfully!",   "data": [   {   "_id": "string",   "address": "string",   "creator": "string",   "created": 1683976114853,   "updated": 1683976114853,   "title": "string",   "thumbnail": "urlstring",   "description": "string",   "category": "string",   "rate": 0,   "txn_history": [],   "username": "string"   }   ]  } 
- list collection by category: GET 
/collection/category/:category API lấy danh sách collection 
theo danh mục Parameter: category: danh mục page: số trang 
limit: số lượng collection mỗi trang Response:  {   "status_code": 200,   "status": "OK", 
 "message": "Get collections successfully!",   "data": [      lOMoARcPSD| 10435767  {   "_id": "string",   "address": "string",   "creator": "string",   "created": 1683976114853,   "updated": 1683976114853,   "title": "string",   "thumbnail": "urlstring",   "description": "string",   "category": "string",   "rate": 0,   "txn_history": [],   "username": "string"   }   ]  } 
- list NFTs of collection: GET 
/collection/:collection/list_nft API lấy danh sách các NFTs  của collection Parameter: 
collection: địa chỉ của collection page:  số trang 
limit: số lượng collection mỗi trang Response:  {   "status_code": 200,   "status": "OK", 
 "message": "Get collections successfully!",   "data": [   {   "_id": "string",   "address": "string",   "owner": "string",   "creator": "string",   "collection": "string",   "created": 1683976114853,   "updated": 1683976114853,   "url": "urlstring",   "description": "string",   "price": 0   }   ]  }  c. NFT  - create: POST  /nft/create API tạo mới  1 nft Body request:      lOMoARcPSD| 10435767 {   "owner": "string",   "creator": "string",   "collection": "string",   "name": "string",   "url" :"string",   "description": "string",   "price": float  }  Response:  {   "status": "OK", 
 "message": "Create new nft successfully!",   "data": {   "address": "string",   "owner": "string",   "creator": "string",   "collection": "string",   "name": "string",   "url": "urlstring",   "description": "string",   "price": 10,   "listed": true,   "created": 1683976114853,   "updated": 1683976114853   }  } 
- update: PUT /nft/update_price 
API cập nhật giá của một nft  Body request:  {   "wallet_address": "string",   "nft_address": "string",   "price": float  }  Response:  {   "status": "OK", 
 "message": "Update price nft successfully!",   "data": {   "address": "string",   "price": float   }  }      lOMoARcPSD| 10435767
- delete: DELETE /nft/delete  API xoá một nft Body  request:  {       "nft_address": "string",    "owner_address": "string"  }  Response:  {   "status": "OK", 
 "message": "Delete nft successfully!"  } 
- trade: POST /nft/trade API  trade NFT Body request:  {      "buyer": "string",   "seller": "string",   "nft_address": "string”  }  Response:  {   "status": "OK", 
 "message": "Buy NFT successfully"  } 
- listing: PUT /nft/listing  API listing NFT Body  request:  {       "nft_address": "string",      "owner_address": "string"  }  Response:  {   "status": "OK", 
 "message": "NFT listing status updated successfully!",   "data": {   "nft_address": "string",   "listed": true   }  }  -  de-listing: PUT  /nft/delist API de- listing NFT Body  request:  {      lOMoARcPSD| 10435767      "nft_address": "string",      "owner_address": "string"  }  Response:  {   "status": "OK", 
 "message": "NFT listing status updated successfully!",   "data": {   "nft_address": "string",   "listed": false   }  }  - information : GET 
/nft/information/:address API get 
information NFT Parameter: nft_address : 
địa chỉ của NFT Response:  {   "status": "OK", 
 "message": "Get NFT information successfully!",   "data": {   "_id": "string",   "address": "string",   "owner": "string",   "creator": "string",   "collection": "string",   "name": "string",   "url": "urlstring",   "description": "string",   "price": 10,   "listed": true,   "created": 1683976114853,   "updated": 1683976114853       }  } 
- bought: GET /nft/:owner/bought  API get NFTs buy information 
Parameter: owner : owner of NFT 
page : number of page limit : limit  item of page Response:  {   "status": "OK", 
 "message": "Retrieve bought NFTs successfully!",   "data": {   "_id": "string",   "address": "string",   "owner": "string",      lOMoARcPSD| 10435767  "creator": "string",   "collection": "string",   "name": "string",   "url": "urlstring",   "description": "string",   "price": 10,   "listed": true,   "created": 1683976114853,   "updated": 1683976114853   }  }  d. Pricing   
- get price: GET /price 
API lấy giá quy đổi của GOR sang USD Response:  {   "status": "OK", 
 "message": "Get price successfully!",   "data": 0  }   
- price 24h: GET /price/list 
API lấy danh sách giá quy đổi trong vòng 24h Response:  {   "status": "OK", 
 "message": "Get list price successfully!",   "data": [   1.5,   1.2,   1.223,  1.255,   1.523,   1.25,   1.021,   1.0232,   1.221,  1.232,  1.443,  1.442,  1.556,  1.345,  1.334,  1.677,  1.322,   1.455,   1.42,  1.22,      lOMoARcPSD| 10435767 1.55,  1.86,   1.22,   1   ]  }   
- nft price change: POST /price/nft 
API trả về danh sách thay đổi giá gần nhất của 1 NFT  Body request:  {   "nft_address": "string"  }  Response:  {   "status": "OK", 
 "message": "Get nft list price successfully!",   "data": [      12,  14,  17   ]  }  e. Statistics 
- Trading history NFT: POST /history/nft 
API trả về lịch sử giao dịch của 1 NFT  Body request:  {   "nft_address": "string",   "page": int,   "limit": int  }  Response:  {   "status": "OK", 
 "message": "Get history successfully!",   "data": [   {   "_id": "string",   "txn_type": "Purchase",   "buyer": "string",   "seller": "string",   "time": 1684824540516,   "details": {   "at_price": 0,   "nft_address": "string"      lOMoARcPSD| 10435767  },   "txn_hash": "string"   }   ]  } 
- trending collections: GET 
/trending/collection API trả về top trending  collection Response:  {   "status": "OK", 
 "message": "Get trending collections successfully!",  "data": [   {   "_id": "string",   "address": "string",   "creator": "string",   "created": 1683976114853,   "updated": 1683976114853,   "title": "string",   "thumbnail": "urlstring",   "description": "string",   "category": "string",   "rate": 0,   "txn_history": [   "string",   "string",   "string"   ],   "username": "string"   }   ]  }    
