Trần Đinh Nguyễn
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    # 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 |

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully