Bài báo cáo môn Phát triển đề tài hướng dịch vụ đề tài "Xây dựng ứng dụng Marketplace bán tranh NFT"

Bài báo cáo môn Phát triển đề tài hướng dịch vụ đề tài "Xây dựng ứng dụng Marketplace bán tranh NFT" của Học viện Công nghệ Bưu chính Viễn thông với những kiến thức và thông tin bổ ích giúp sinh viên tham khảo, ôn luyện và phục vụ nhu cầu học tập của mình cụ thể là có định hướng ôn tập, nắm vững kiến thức môn học và làm bài tốt trong những bài kiểm tra, bài tiểu luận, bài tập kết thúc học phần, từ đó học tập tốt và có kết quả cao cũng như có thể vận dụng tốt những kiến thức mình đã học vào thực tiễn cuộc sống. Mời bạn đọc đón xem!

| 1/46

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" } ] }