---
# System prepended metadata

title: Note Keyword Project ĐACN

---

# Note Keyword Project ĐACN

```
validaton: thẩm định
## mục đích sử dụng, ưu điểm, đang giải quyết vấn đề gì
# BE

So sánh: 
    1. uuid(giá trị không tuần tự, giá trị sau không cần biết giá trị trước là gì  ) vs cuid
    2. argon2 vs bcrypt 

Lý thuyết
    
    3. jsonwebtoken
    4. postgreSQL
    5. TypeORM (như select trong sql) 
    6. CronJob 
    7. Joi (JoiValidator) Joi cho phép bạn mô tả dữ liệu của mình bằng ngôn ngữ đơn giản, trực quan và có thể đọc được.
    8. toad-scheduler: tạo ra 1 vòng lặp. Sau 1 khoảng thời gian sẽ chạy 1 lần
# FE 
    1. React
    2. React query
    3. Facade architecture
```

## Công nghệ BE

1. Express: 
- Là một backend framework dùng để xây dựng RestfullAPI và các ứng dụng web dựa trên Node.js với mục đích tối giản và linh hoạt hơn, cung cấp một bộ tính năng mạnh mẽ cho các ứng dụng web và di động. Với vô số phương thức tiện ích HTTP và phần mềm trung gian , việc tạo một API mạnh mẽ rất nhanh chóng và dễ dàng.
- Express.js được viết bởi TJ Holowaychuk. Phiên bản đầu tiên dựa trên ExpressJS github là ngày 22 tháng 5 năm 2010 với phiên bản là 0.12.

- Express được phát hành miễn phí và là một phần mềm mã nguồn mở. Theo tác giả TJ Holowaychuk, Express được sử dụng trong các khối dự án như MEAN (MongoDB, ExpressJS, AngularJS, NodeJS), MERN (MongoDB, ExpressJS, ReactJS, NodeJS) or MEVN (MongoDB, ExpressJS, VueJS NodeJS).


2. PostpreSQL
    2.1. PostgreSQl là gì?
    - Là một hệ thống cơ sở dữ liệu quan hệ đối tượng mã nguồn mở, mạnh mẽ, sử dụng và mở rộng ngôn ngữ SQL kết hợp với nhiều tính năng giúp lưu trữ và thay đổi quy mô khối lượng công việc dữ liệu phức tạp nhất một cách an toàn. Nguồn gốc của PostgreSQL bắt đầu từ năm 1986 như một phần của dự án POSTGRES tại Đại học California ở Berkeley và đã có hơn 35 năm phát triển tích cực trên nền tảng cốt lõi.
    - PostgreSQL đã đạt được danh tiếng mạnh mẽ về kiến trúc, độ tin cậy, tính toàn vẹn của dữ liệu, bộ tính năng mạnh mẽ, khả năng mở rộng và sự cống hiến của cộng đồng nguồn mở đằng sau phần mềm để cung cấp các giải pháp sáng tạo và hiệu quả một cách nhất quán. PostgreSQL chạy trên tất cả các hệ điều hành chính , tuân thủ ACID từ năm 2001 và có các tiện ích bổ sung mạnh mẽ như bộ mở rộng cơ sở dữ liệu không gian địa lý PostGIS phổ biến . Không có gì ngạc nhiên khi PostgreSQL đã trở thành cơ sở dữ liệu quan hệ nguồn mở được nhiều người và tổ chức lựa chọn.
    
   2.2 Tại sao nên dùng PostpreSQL? 
   
    - PostpreSQL đi kèm với nhiều tính năng nhằm giúp các nhà phát triển xây dựng ứng dụng, quản trị viên để bảo vệ tính toàn vẹn của dữ liệu và xây dựng môi trường chịu lỗi, đồng thời giúp bạn quản lý dữ liệu của mình bất kể tập dữ liệu lớn hay nhỏ. Ngoài việc là mã nguồn mở và miễn phí , PostgreSQL có khả năng mở rộng cao. Ví dụ: bạn có thể xác định các loại dữ liệu của riêng mình, xây dựng các chức năng tùy chỉnh, thậm chí viết mã từ các ngôn ngữ lập trình khác nhau mà không cần biên dịch lại cơ sở dữ liệu của bạn!
    - PostgreSQL cố gắng tuân thủ tiêu chuẩn SQL khi sự tuân thủ đó không mâu thuẫn với các tính năng truyền thống hoặc có thể dẫn đến các quyết định kiến trúc kém. Nhiều tính năng theo yêu cầu của tiêu chuẩn SQL được hỗ trợ, mặc dù đôi khi có một chút khác biệt về cú pháp hoặc chức năng. Các bước tiếp theo hướng tới sự phù hợp có thể được mong đợi theo thời gian. Kể từ khi phát hành phiên bản 15 vào tháng 10 năm 2022, PostgreSQL tuân thủ ít nhất 170 trong số 179 tính năng bắt buộc đối với tuân thủ SQL:2016 Core. Khi viết bài này, không có cơ sở dữ liệu quan hệ nào đáp ứng đầy đủ sự phù hợp với tiêu chuẩn này.
    
3. CronJob

    Cron là chương trình để xử lý các tác vụ cần lặp đi lặp lại nhiều lần. Cron Job đưa ra một lệnh để lên lịch “làm việc” cho một hành động cụ thể, tại một thời điểm cụ thể mà cần lặp đi lặp lại.
    
    App của em dùng thư viện toad-scheduler và có sử dụng cronjob để thực hiện các tác động trong khoảng thời gian cho trước. Chẳng hạn như dùng để hủy hóa đơn nếu như quá thời gian cho phép vì có thể người bán hàng sẽ quên hủy hoặc xảy ra những vấn khác liên quan tới hoá đơn.

4. TypeORM
 4.1 ORM(Object–relational mapping) là gì?
    - Object-Relational Mapping (ORM) là một loại kỹ thuật giúp ta truy xuất và sử dụng dữ liệu từ database bằng phương pháp hướng đối tượng. Ta có thể sử dụng các thư viện ORM để truy vấn dữ liệu mà không cần phải viết câu truy vấn SQL mà ta có thể tương tác thông qua ngôn ngữ mà mình sử dụng.
    - Ưu điểm:
        - Tất cả các mô hình dữ liệu đểu được viết ở cùng 1 nơi, nên sẽ rất dễ dàng nâng cấp và tái sử dụng.
        - Tất cả mọi thứ đều dc tự động hoá,ta không còn phải lo lắng đến các vấn đề liên quan đến truy vấn dữ liệu mà có thể tập trung vào việc xử lý các vấn đề mà chúng ta cần phải quan tâm.
        - Ta không cần phải viết câu truy vấn SQL một cách khó khăn (thường đa số các lập trình viên đều dở trong việc này vì SQL quá phức tạp và khó sử dụng).
        - ORM được viết bằng ngôn ngữ mà ta chọn nên sẽ rất dễ dàng để sử dụng.
        - Mối liên kết giữa các mô hình dữ liệu không quá chặt chẽ nên có thể dễ dàng thay đổi và dùng được ở mọi nơi.
        - ORM cho phép chúng ta sử dụng tính kế thừa trong hướng đối tượng.
    - Nhược điểm:
        - Ta phải học sử dụng thư viện ORM, với lượng kiến thức cũng không hề nhẹ nhàng.
        - Người mới sử dụng sẽ dễ dàng dính phải các lỗi vô lý như loop hell.
        
    4.2 TypeORM là gì?
    - TypeORM là một ORM có thể chạy trong các nền tảng NodeJS, Browser, Cordova, PhoneGap, Ionic, React Native, NativeScript, Expo và Electron và có thể được sử dụng với TypeScript và JavaScript (ES5, ES6, ES7, ES8). Mục tiêu của nó là luôn hỗ trợ các tính năng JavaScript mới nhất và cung cấp các tính năng bổ sung giúp bạn phát triển bất kỳ loại ứng dụng nào sử dụng cơ sở dữ liệu - từ ứng dụng nhỏ với một vài bảng đến ứng dụng doanh nghiệp quy mô lớn với nhiều cơ sở dữ liệu.

    - TypeORM hỗ trợ cả các mẫu Bản ghi hoạt động và Trình ánh xạ dữ liệu, không giống như tất cả các ORM JavaScript khác hiện đang tồn tại, điều đó có nghĩa là bạn có thể viết các ứng dụng chất lượng cao, liên kết lỏng lẻo, có thể mở rộng, có thể bảo trì theo cách hiệu quả nhất.

    - TypeORM bị ảnh hưởng nhiều bởi các ORM khác, chẳng hạn như Hibernate, Doctrine và Entity Framework.


## Công nghệ FE

1. React 
    1.1 React là gì?
    React là thư viện JavaScript phổ biến nhất để xây dựng giao diện người dùng (UI). Nó cho tốc độ phản hồi tuyệt vời khi user nhập liệu bằng cách sử dụng phương pháp mới để render trang web.
    React làm cho việc tạo giao diện người dùng tương tác trở nên dễ dàng. Thiết kế các chế độ xem đơn giản cho từng trạng thái trong ứng dụng của bạn và React sẽ cập nhật và hiển thị hiệu quả chỉ các thành phần phù hợp khi dữ liệu của bạn thay đổi.Chế độ xem khai báo làm cho mã của bạn dễ dự đoán hơn và dễ gỡ lỗi hơn.
    1.2 Tại sao sử dụng React?
    + Dễ sử dụng:
        React là một thư viện GUI nguồn mở JavaScript tập trung vào một điều cụ thể; hoàn thành nhiệm vụ UI hiệu quả. Nó được phân loại thành kiểu “V” trong mô hình MVC (Model-View-Controller).

        Là lập trình viên JavaScript, bạn sẽ dễ dàng hiểu được những điều cơ bản về React. Bạn thậm chí có thể bắt đầu phát triển các ứng dụng dựa trên web bằng cách sử dụng react chỉ trong vài ngày.

        Để củng cố hiểu biết của mình, bạn hãy thử khám phá thêm nhiều hướng dẫn về React. Chúng mang đến nhiều thông tin về cách sử dụng công cụ: videos, hướng dẫn và dữ liệu làm phong phú góc nhìn của bạn.
    
    + Nó hỗ trợ Reusable Component trong Java:
        Cho phép bạn sử dụng lại components đã được phát triển thành các ứng dụng khác có cùng chức năng. Tính năng tái sử dụng component là một lợi thế khác biệt cho các lập trình viên.
    + Viết component dễ dàng hơn:
        React component dễ viết hơn vì nó sử dụng JSX, mở rộng cú pháp tùy chọn cho JavaScript cho phép bạn kết hợp HTML với JavaScript.
    + Hiệu suất tốt hơn với Virtual DOM:
        React sẽ cập nhật hiệu quả quá trình DOM (Document Object Model – Mô hình đối tượng tài liệu). Như bạn có thể biết, quá trình này có thể gây ra nhiều thất vọng trong các dự án ứng dụng dựa trên web. 
    + SEO
        React cho phép bạn tạo giao diện người dùng có thể được truy cập trên các công cụ tìm kiếm khác nhau. Tính năng này là một lợi thế rất lớn vì không phải tất cả các khung JavaScript đều thân thiện với SEO.

    Ngoài ra, vì React có thể tăng tốc quá trình của ứng dụng nên có thể cải thiện kết quả SEO. Cuối cùng tốc độ web đóng một vai trò quan trọng trong tối ưu hóa SEO.
2. Facade architecture
    Là nhiều khối hộp dữ liệu xếp chồng lên nhau tạo thành một khối to và lập trình viên có thể truy xuất, cập nhật được tất cả các dữ liệu khi mà đang làm việc trong khối đó. Và tất nhiên bên ngoài sẽ không thể truy cập được bất kì dữ liệu gì của khối
    
## So sánh

| STT | Từ khóa | Mục đích | Ưu điểm | Đang giải quyết vấn đề |
| ---- | -------- | -------- | -------- | -------- |
| BE   |
| 1  | 
| 1.1   |  uuid   | Giảm tối đa trùng lặp     | nó có thể sinh ra ở bất kỳ đâu chứ không nhất thiết phải ở trong database server| Cho phép mở rộng hệ thống , tối ưu tốc độ tìm kiếm nhị phân      |
| 1.2   |  cuid   | Giảm tối đa trùng lặp     | Đoạn mã(id) tạo ra của cuid ngắn hơn 25 ký tự so với uuid là 40 ký tự,    | Tiết kiệm không gian lưu trữ       |
| 2 | 
| 2.1   |  argon2(2015)   | Lưu trữ mật khẩu    | Nó có khả năng chống bẻ khóa mật khẩu tốt hơn (khi được định cấu hình chính xác) so với  Bcrypt (đối với các tham số cấu hình tương tự cho việc sử dụng CPU và RAM).   | Mã hóa 1 chiều và bảo mật, mật khẩu cho người dùng     |
|  2.2  |  bcrypt(1999)   | Lưu trữ mật khẩu   | Được nhiều người dùng nhưng nó khá cũ. Là một chức năng thích ứng theo thời gian, số lần lặp lại có thể được tăng lên để làm cho nó chậm hơn, do đó, nó vẫn có khả năng chống lại các cuộc tấn công     | Mã hóa 1 chiều và bảo mật, mật khẩu cho người dùng      |
| 3 |
|  3.1  |  jsonwebtoken  |  Tạo ra token để FE và BE giao ước với nhau  | Khi Fe cần token nào thì sẽ gửi token đó về cho Be.Ở phía Be sẽ có 1 key và nó mã hóa thành dạng chuỗi  |   Dùng để authenticator  |
| FE   |
| 4 |
| 4.1   |  React-query   | Gọi đến backend để truy xuất dữ liệu     |Có thể lưu dữ liệu và quản lý trạng thái | Lưu dữ liệu sau khi được lấy từ Backend, khi truy vấn dữ liệu lần nữa, react-query sẽ kiểm tra dữ liệu đó ở BE, nếu không có gì thay đổi, nó sẽ không cập nhật lại dữ liệu ở FE  |
