Tải bản đầy đủ (.docx) (90 trang)

đồ án 2 phát triển website học online

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.5 MB, 90 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>ĐẠI HỌC QUỐC GIA TP.HỒ CHÍ MINHTRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b>LỜI CẢM ƠN</b>

Bài báo cáo này được thực hiện tại Trường Đại học Công nghệ thông tin, Đại họcQuốc gia Thành phố Hồ Chí Minh dưới sự hướng dẫn khoa học của THS. Trần AnhDũng. Tơi xin bày tỏ lịng biết ơn sâu sắc tới thầy đã quan tâm, hướng dẫn từ các kỹ năngcơ bản đến định hướng khoa học, tạo điều kiện thuận lợi trong suốt quá trình làm bài báocáo tại trường.

Tôi cũng xin gửi lời cám ơn đến Ban Lãnh đạo Trường Đại học Công nghệ thơngtin, Đại học Quốc gia Thành phố Hồ Chí Minh đã tạo điều kiện tốt về cả cơ sở vật chấtlẫn tinh thần cho tơi trong suốt q trình hồn thành bài báo cáo này.

Cuối cùng, tơi bày tỏ lịng biết ơn tới bố mẹ, ông bà, các anh chị em trong giađình. Và lịng biết ơn vơ tận đến ông nội, sự ra đi của ông có lẽ là sự mất mát lớn nhấttrong cuộc đời tôi kèm theo đó là sự tiếc nuối những điều mà tơi chưa có khả năng làmcho ơng. Nhưng qua thời gian, tơi đã có thể mở lịng và đón nhận sự mất mát này hơn.Đối với tôi đây là động lực lớn nhất để tơi có thể hồn thành đồ án 2 này cũng như là tiếptúc phấn đấu cho những chặng đường tiếp theo trong cuộc đời.

<b>Thành phố Hồ Chí Minh, ngày 31 tháng 12 năm 2023</b>

<b> Trương Nguyễn Cơng Chính</b>

Mục lục

<small>CHƯƠNG 1. TỔNG QUAN ĐỀ TÀI4</small>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<small>1.1 Đặt vấn đề41.2 Giải pháp41.3 Mục tiêu đề tài41.4 Phạm vi đề tài51.5 Công cụ sử dụng51.6 Đối tượng nghiên cứu6</small>

<small>1.7 Khảo sát và đánh giá các ứng dụng hiện có6CHƯƠNG 2. TỔNG QUAN CÔNG NGHỆ102.1 Phương pháp làm việc10</small>

<small>2.2 Phương pháp nghiên cứu10</small>

<small>2.3 Phương pháp công nghệ và nền tảng102.4 Giới thiệu về ReactJS và Node.js10</small>

<small>CHƯƠNG 3. KHẢO SÁT VÀ PHÂN TÍCH ĐẶC TẢ YÊU CẦU143.1 Khảo sát hiện trạng14</small>

<small>3.2 Danh sách yêu cầu có trong ứng dụng14CHƯƠNG 4. PHÂN TÍCH HỆ THỐNG164.1 Phân tích các yêu cầu phần mềm164.2 Bẳng trách nhiệm cho từng loại yêu cầu18CHƯƠNG 5. THIẾT KẾ HỆ THỐNG19</small>

<small>5.1 Sơ đồ Usecase tổng quát19CHƯƠNG 6. THIẾT KẾ DỮ LIỆU696.1 Sơ đồ logic hoàn chỉnh69</small>

<small>6.2 Danh sách các bản dữ liệu trong sơ đồ logic696.3 Mô tả từng bảng dữ liệu69</small>

<small>CHƯƠNG 7. THIẾT KẾ GIAO DIỆN75CHƯƠNG 8. CÀI ĐẶT DEMO SẢN PHẨM76</small>

<small>CHƯƠNG 9. KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN78</small>

<b>CHƯƠNG 1. TỔNG QUAN ĐỀ TÀI</b>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>1.1 Đặt vấn đề</b>

Hệ thống giáo dục đang phải đối mặt với nhiều thách thức trong việc đảm bảo sự tiếpcận chất lượng và linh hoạt trong quá trình học. Đặc biệt, sau sự bùng nổ của cuộc cáchmạng công nghiệp 4.0, ứng dụng công nghệ trong giáo dục, đặc biệt là học online, đã trởthành một phần quan trọng của hệ thống giáo dục hiện đại.

Các thách thức của việc học online:

- Học online thường gặp khó khăn trong việc cung cấp tương tác giữa giáo viên vàhọc viên, dẫn đến việc thiếu sự hỗ trợ cá nhân.

- Khả năng truyền đạt kiến thức và tạo nên môi trường học hiệu quả không phải lúcnào cũng được đảm bảo trong môi trường học online.

- Quản lý tiến độ học và theo dõi hoạt động của học viên đơi khi trở nên khó khăn,ảnh hưởng đến khả năng đánh giá và cải thiện chất lượng giáo dục.

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

trắng tương tác và bài giảng đa phương tiện.

Giao diện học của ứng dụng được thiết kế để thân thiện với người dùng, dễ sử dụngvà có khả năng tương tác để tối ưu hóa trải nghiệm học tập. Chúng tơi cũng xây dựng mộthệ thống quản lý tiến độ học viên thông minh, cung cấp dữ liệu chi tiết về hoạt động họctập để giáo viên có thể theo dõi và đánh giá hiệu suất một cách hiệu quả.

Đồ án này không chỉ hướng đến việc cải thiện trải nghiệm học tập của học viên màcòn đặt ra mục tiêu hỗ trợ giáo viên trong quá trình quản lý và giảng dạy. Nó mang lạigiải pháp tồn diện cho các thách thức trong học online, từ đó đóng góp vào sự nâng caochất lượng giáo dục và tạo ra một môi trường học tập hiệu quả và an toàn. Đồ án này hyvọng sẽ đóng góp vào sự phát triển bền vững của hệ thống học online, mang lại lợi íchlâu dài cho cả giáo viên và học viên.

<b>1.4 Phạm vi đề tài</b>

Đề tài này tập trung vào phát triển và triển khai một ứng dụng học online tiên tiến vớimục đích giải quyết những thách thức chính của mơi trường học online hiện nay.

<b>1.5 Công cụ sử dụng</b>

⮚ Công cụ phát triển: Visual Studio Code

⮚ Cơng cụ dùng để phân tích, thiết kế: Adobe illustrator, Adobe photoshop,Figma.

⮚ Công cụ quản lý dự án: Github.

⮚ Công cụ soạn thảo báo cáo và vẽ sơ đồ: Microsoft Word, draw.io.

<b>1.6 Đối tượng nghiên cứu</b>

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

Ứng dụng này chủ yếu được phát triển để phục vụ cả giáo viên và học viên trongmôi trường học online. Tuy nhiên, sự tập trung sẽ làm nổi bật những nhu cầu vàmong muốn chính của cả hai đối tượng này.

<b>1.7 Kháo sát, đánh giá các ứng dụng cạnh tranh hiện có1.7.1 Giao hàng nhanh</b>

<i>F8 – Học lập trình</i>

F8 là một nền tảng học trực tuyến cung cấp các khóa học và chứng chỉ từ tổ chức cánhân F8. F8 cung cấp hàng loạt các chủ đề về lập trình và bao gồm cả lộ trình đầy đủ chongười mới bắt đầu lập trình.

⮚ Ưu điểm của F8 bao gồm:

o Các khóa học F8 cung cấp thường được giảng dạy rất nhiệt tình và uy tính,đảm bảo chất lượng học tập.

o Học viên có thể theo học mọi nơi và mọi lúc có kết nối internet. Họ có thểtùy chọn thời gian học phù hợp với lịch trình cá nhân và làm việc của họ.o Sau khi hồn thành một khóa học, học viên có thể nhận được chứng chỉ

hoặc bằng cấp có giá trị, giúp họ cải thiện sự nghiệp và thăng tiến.

o Một số khóa học có thể được tham gia miễn phí, và người học chỉ phải trảphí nếu muốn nhận chứng chỉ hoặc tham gia các khóa học chuyên sâu.⮚ Tuy nhiên, F8 cũng có một số nhược điểm:

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

o Chưa cung cấp đa dạng các thể loại khóa học mà chỉ tập trung vào mỗi lậptrình.

o Bằng cấp được cấp trên đây chỉ có tác dụng ở một số doanh nghiệp cố địnhvà rất ít.

o Việc kiểm sốt thực hành là còn khá kém.

o Hạn chế trong việc tương tác trực tuyến giữa giảng viên và học viên và cáchọc viên khác trong cùng một khóa học.

<b>CHƯƠNG 2. TỔNG QUAN CÔNG NGHỆ2.1 Phương pháp làm việc</b>

Làm việc khi tâm trạng đạt trạng thái tốt nhất. Thường xuyên ghi chép lạicác ý tưởng cũng như là những thay đổi lớn liên quan đến ứng dụng để thuận tiệncho việc chỉnh sửa sau này.

<b>2.2 Phương pháp nghiên cứu</b>

- Phân tích nhu cầu sử dụng của các đối tượng có liên quan đến ứng dụng.- Nghiên cứu, phân tích và đánh giá các ứng dụng có sẵn trên thị trường.

<b>2.3 Phương pháp cơng nghệ và nền tảng</b>

<b>- Tìm hiểu ngơn ngữ và framework để xây dựng website:</b>

+ Ngơn ngữ lập trình backend: Javascript với Express, Postman.+ Ngơn ngữ lập trình frontend: Javascript với ReactJS

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

- Ứng dụng sẽ được xây dựng trên mơ hình client server:

Hình 1. Mơ hình Client – Server

<b>Mơ hình client-server là một kiến trúc phần mềm phổ biến trong lập trình và thiết</b>

kế hệ thống, trong đó các thành phần chính được chia thành hai vai trò quan trọng: client(khách hàng) và server (máy chủ). Mơ hình này tạo ra một mơi trường làm việc phân tán,nơi mà các thiết bị hay phần mềm có thể giao tiếp và truyền thơng tin với nhau thơng quamạng.

Trong mơ hình này, client là thành phần u cầu và sử dụng các dịch vụ từ server.Client có thể là một ứng dụng hoặc thiết bị độc lập, thường là người dùng cuối, nhận diệnvà sử dụng các tài nguyên được cung cấp bởi server. Trong khi đó, server là nơi cung cấpcác dịch vụ, tài nguyên, hoặc thơng tin được u cầu bởi client. Server có trách nhiệm xửlý các yêu cầu từ client và trả lại kết quả tương ứng.

Mơ hình client-server cho phép sự phân tách giữa nhiều client và một server duynhất hoặc nhiều server tương tác với nhau. Điều này giúp tăng cường khả năng mở rộngvà quản lý hệ thống, vì server có thể tập trung vào xử lý và cung cấp dịch vụ mà khôngcần quan tâm đến giao diện người dùng hay các yêu cầu cụ thể của từng client.

Mô hình client-server thường được áp dụng trong nhiều ứng dụng, từ các trang

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

web, ứng dụng di động cho đến hệ thống doanh nghiệp lớn. Sự phân tách giữa client vàserver mang lại tính linh hoạt, bảo mật và quản lý hiệu quả, làm cho mơ hình này trởthành một trong những kiến trúc phổ biến và quan trọng trong phát triển phần mềm và hệthống.

<b>2.4 Giới thiệu ReactJS và NodeJS</b>

<b>2.4.1 Node.js</b>

Node.js là một môi trường chạy mã JavaScript phía máy chủ (server-side) đượcxây dựng dựa trên nền tảng JavaScript V8 engine của Google Chrome. Nó cho phép pháttriển ứng dụng web và các dịch vụ mạng có khả năng xử lý đa luồng, đáp ứng cao và cókhả năng mở rộng.

<b>Dưới đây là một số ưu điểm của Node.js:</b>

⮚ Hiệu suất cao: Node.js sử dụng kiến trúc không đồng bộ và hướng sự kiện driven), cho phép xử lý đa luồng mà không bị chặn bởi I/O. Điều này giúp tăngcường hiệu suất và đáp ứng nhanh hơn trong các ứng dụng có tính tải cao.

(event-⮚ Xây dựng ứng dụng thời gian thực: Node.js hỗ trợ xử lý đồng thời và gửi dữ liệuqua WebSockets, cho phép xây dựng các ứng dụng thời gian thực như trò chuyệntrực tuyến, trò chơi đa người chơi, ứng dụng đồng bộ, v.v.

⮚ Mã nguồn mở và cộng đồng phát triển đông đảo: Node.js là một dự án mã nguồnmở, có nhiều thư viện, framework và cơng cụ phát triển phong phú. Cộng đồngphát triển của Node.js rất lớn và năng động, mang lại nhiều tài nguyên và hỗ trợcho nhà phát triển.

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

⮚ Đơn giản và dễ học: Node.js sử dụng ngôn ngữ JavaScript, ngôn ngữ phổ biến vàdễ học. Điều này giúp cho việc học và phát triển ứng dụng trở nên dễ dàng vànhanh chóng.

<b>Tuy nhiên, Node.js cũng có một số nhược điểm cần lưu ý:</b>

⮚ Xử lý CPU-intensive chậm: Do Node.js sử dụng mơ hình đơn luồng, nếu ứng dụngcó nhiều tác vụ CPU-intensive (như tính tốn phức tạp), hiệu suất có thể giảm.Node.js thích hợp hơn cho các ứng dụng I/O-intensive (như ứng dụng web) hơn làCPU-intensive.

⮚ Tiềm ẩn về quản lý bộ nhớ: Node.js sử dụng bộ nhớ không đồng bộ blocking) và sự kiện để đạt hiệu suất cao. Tuy nhiên, điều này có thể tạo ra một sốthách thức trong quản lý bộ nhớ, đặc biệt là khi xử lý các tác vụ dài hạn hoặc cókhối lượng dữ liệu lớn.

(non-Chưa hoàn thiện trong việc hỗ trợ một số tính năng: Mặc dù Node.js đã phát triểnmạnh mẽ, nhưng vẫn cịn một số tính năng và giao diện chưa được hoàn thiện hoặc thiếuhỗ trợ tốt.

<b>2.4.2 ReactJs</b>

ReactJS là một thư viện JavaScript mã nguồn mở được sử dụng để xây dựng giao diện người dùng (UI) động trong các ứng dụng web. Với ReactJS, người phát triển có thểxây dựng các thành phần giao diện độc lập, tái sử dụng và quản lý trạng thái của ứng dụng một cách hiệu quả.

<b>Dưới đây là một số ưu điểm của ReactJS:</b>

⮚ Hiệu suất cao: ReactJS sử dụng Virtual DOM (DOM ảo) để làm việc, giúp cải thiện hiệu suất bằng cách chỉ cập nhật lại các phần tử cần thiết trên trang web, thay

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

vì cập nhật toàn bộ DOM. Điều này giúp giảm thời gian render và cải thiện trải nghiệm người dùng.

⮚ Quản lý trạng thái dễ dàng: ReactJS sử dụng mơ hình quản lý trạng thái (state) và các thành phần có trạng thái (stateful components), cho phép người phát triển quảnlý và cập nhật trạng thái của ứng dụng một cách dễ dàng và nhất quán.

⮚ Tính năng tái sử dụng cao: ReactJS khuyến khích việc phân chia giao diện thành các thành phần nhỏ và độc lập, cho phép tái sử dụng và kết hợp chúng để xây dựng giao diện phức tạp. Điều này giúp giảm mã lặp và tăng tính chất lượng của mã nguồn.

⮚ Cộng đồng và hỗ trợ đa dạng: ReactJS có một cộng đồng phát triển rất lớn và năngđộng, cung cấp nhiều tài liệu, ví dụ, và thư viện mở rộng. Ngồi ra, có nhiều cơng cụ hỗ trợ như Redux, React Router, và Material-UI giúp việc phát triển ứng dụng dễ dàng hơn.

<b>Tuy nhiên, ReactJS cũng có một số nhược điểm:</b>

⮚ Khái niệm phức tạp ban đầu: ReactJS sử dụng cú pháp và khái niệm mới, đòi hỏi một thời gian để làm quen và hiểu rõ cách thức hoạt động. Điều này có thể địi hỏi người phát triển phải có một q trình học tập ban đầu.

⮚ Phụ thuộc vào hệ sinh thái: Để tận dụng hết tiềm năng của ReactJS, người phát triển thường phải sử dụng các thư viện và công cụ khác như Redux, React Router, hoặc CSS-in-JS. Điều này có thể khiến ứng dụng trở nên phức tạp và phụ thuộc nhiều vào hệ sinh thái ReactJS.

⮚ Kích thước tải xuống ban đầu: Mặc dù ReactJS đã được tối ưu để tải xuống nhanh hơn, tuy nhiên, ứng dụng ReactJS ban đầu có kích thước lớn hơn so với các trang web tĩnh. Điều này có thể gây ảnh hưởng đến thời gian tải trang đầu và yêu cầu mạng.

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

Tóm lại, ReactJS là một cơng nghệ mạnh mẽ để xây dựng giao diện người dùng linh hoạt và hiệu suất cao. Tuy nhiên, việc sử dụng ReactJS cần xem xét kỹ lưỡng và đảm bảorằng nó phù hợp với u cầu và quy mơ dự án của bạn.

<b>2.4.3 Next.js</b>

Để bỗ trợ cho việc sử dụng thư viện React. Em quyết định sử dụng một framework đang hot hiện nay với lượng truy cập và sử dụng đơng đảo, kèm theo đó là cộng đồng support đông đảo.

Next.js là một framework phổ biến trong cộng đồng phát triển web, được xây dựng trên nền tảng JavaScript và React. Được giới thiệu bởi Vercel, Next.js mang lại nhiều lợi ích và tiện ích cho việc xây dựng ứng dụng web hiện đại. Dưới đây là một giới thiệu về Next.js, kèm theo ưu điểm và nhược điểm của nó.

Next.js giới thiệu mơ hình phát triển web có tự động hóa nhiều cơng đoạn quan trọng. Nó cung cấp hệ thống routing tự động, giúp dễ dàng quản lý các trang và tài nguyên. Một trong những ưu điểm lớn nhất của Next.js là khả năng hỗ trợ rendering ở cả phía máy chủ (server-side rendering - SSR) và phía máy khách (client-side rendering - CSR), mang lại trải nghiệm người dùng mượt mà và tối ưu cho cơng cụ tìm kiếm.

Ưu điểm của Next.js khơng chỉ dừng lại ở đó. Next.js hỗ trợ pre-rendering tại thời điểm xây dựng (build time) và thời điểm yêu cầu (runtime), tối ưu hóa hiệu suất và giảm thời gian tải trang. Bằng cách tích hợp tốt với React, Next.js giúp tái sử dụng các thành phần và mã nguồn, giảm thiểu độ phức tạp của ứng dụng.

Tuy nhiên, như mọi cơng nghệ, Next.js cũng có nhược điểm của mình. Một trong những điểm yếu có thể là khả năng đánh đổi giữa độ phức tạp và quyết định của nó. Đôi khi, việc quản lý và hiểu rõ về cách Next.js hoạt động có thể địi hỏi một thời gian học và làm quen, đặc biệt là đối với những người mới bắt đầu với framework này.

Tóm lại, Next.js là một framework mạnh mẽ và linh hoạt cho việc xây dựng ứng dụng web hiện đại. Với khả năng SSR, CSR, và hỗ trợ pre-rendering, nó mang lại hiệu suất và trải nghiệm người dùng tốt. Tuy nhiên, việc hiểu rõ về cách Next.js hoạt động có thể là thách thức, và đơi khi có đánh đổi giữa tính linh hoạt và độ phức tạp.

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

<b>CHƯƠNG 3. KHẢO SÁT VÀ PHÂN TÍCH ĐẶC TẢ YÊU CẦU3.1 Khảo sát hiện trạng</b>

- Phương pháp: Dựa trên báo cáo, nghiên cứu chính thức. Ngồi ra cịn thực hiện một cuộc khảo sát quy mô nhỏ và nhận được khoảng 121 phản hồi.

- Kết quả nhận được từ cuộc khảo sát:

● Tỷ lệ người đã từng sử dụng dịch vụ:

● Đánh giá tổng thể về trải nghiệm sử dụng ứng dụng trên thang điểm từ 1 đến 10:

● Các ưu điểm chính của ứng dụng theo ý kiến người dùng (người dùng được yêu cầu chọn nhiều lựa chọn):

o Giao diện người dùng thân thiện và dễ sử dụng: 83%o Tốc độ xử lý ổn định: 72%

o Cung cấp các tính năng về học online: 68%

<b>3.2 Danh sách yêu cầu có trong ứng dụng</b>

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

9Chức năngĐăng ký vào khóa học

<b>CHƯƠNG 4: PHÂN TÍCH HỆ THỐNG4.1 Phân loại các yêu cầu phần mềm</b>

<b>4.1.1 Yêu cầu hệ thống</b>

<b>- </b>

Ứng dụng có thể hoạt động như các website thơng thường.

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

- Ứng dụng đáp ứng được các nhu cầu cần thiết, cơ bản của khách hàng cũng như các chức năng khác liên quan như là quản lý các mục thông tin liên quan đến ứng dụng.

<b>4.1.2 Yêu cầu nghiệp vụ</b>

để có thể sử dụng website

các chức năng của ứng dụng

4

Thay đổi thông tin cá nhân

Thay đổi các thông tin được cho phép thay đổi.

khoản.

người dùng khả năng tìm lại mật khẩu.

7Xem danh sách khóa học

Cho phép người dùng xem tất cả khóa học được đăng cơng khai.

8Xem chi tiết khóa học

Cho phép người dùng xem chi tiết nội dung khóa học

10Quyền truy cập vào khóa học

Cho phép người dùng tham gia vào bài học

cho phép người dùng nộp bài kiểm tra và tính điểm.

13Kiểm tra tiến độ khóa học

Cho phép người dùng kiểm tra tiến độ khóa

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

học của mình

16Sửa thơng tin khóa học

Cho phép giảng viên sửa, thay đổi các thơng tin về khóa học của mình.

18Quản lý học viên đăng ký

Cho phép giảng viên quản lý tất cả các học viên đã đăng ký khóa học của mình.

20Xem tiến độ học viên

Cho phép giảng viên xem tiến độ của các học viên đã đăng ký khóa học.

<b>4.2 Bảng trách nhiệm cho từng loại yêu cầu</b>

<b>STT</b>

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<b>5.1 Sơ đồ Usecase tổng quát</b>

Sơ đồ 1. Use case học viên

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

Sơ đồ 2. Use case Giảng viên

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

Sơ đồ 3. Use case Admin

<b>5.1.1 Yêu cầu tổng quát</b>

<b><small>Pre-condition</small></b> Người dùng đang ở trang đăng nhập.

<b><small>Post-</small></b> Ta - Nếu thông tin đăng nhập hợp lệ, người dùng sẽ được chuyển hướng đến bảng

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<b><small>Name Đăng nhập</small></b>

<b><small>condition</small></b> điều khiển.

- - Nếu thông tin xác thực không hợp lệ, thông báo lỗi sẽ hiển thị và người dùng có thể thử lại. Nếu đạt đến giới hạn thử lại, tài khoản người dùng sẽ bị khóa.

<b><small>Activities Flow</small></b>

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

- Ký hiệu (@)

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

- Một hoặc nhiều ký tự chữ cái (không phân biệt chữ hoa chữ thường), số, dấu chấm hoặc dấu gạch ngang.

- Dấu chấm (phải được đặt trong dấu gạch chéo vì đây là ký tự đặc biệt trong biểu thức chính quy).

- Ít nhất hai ký tự chữ cái cho phần mở rộng tên miền (ví dụ: com, net).- [passwordRegex] = “^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-

Za-z\d@$!%*?&]{8,}$”- Ít nhất một chữ thường.- Tối thiểu một chữ hoa.

- Ít nhất một ký tự đặc biệt (có thể thay đổi tùy theo yêu cầu của bạn).- Ít nhất 8 ký tự từ các nhóm trên.

Chức năng này hoạt động:

if [usernameRegex].test([username]) === true && [passwordRegex].test([password]) ===true

return ĐÚNGelse SAI

Khi người dùng nhấp vào nút Đăng nhập, chức năng validation() sẽ tiến hành kiểm tra thông tin đầu vào trước tiên:

If ![username] && ![password]

Hiển thị thông báo lỗi bên cạnh nhãn nhập Email/Mật khẩu có màu đỏ. Nội dung làMSG06.

If else ( validation() )Next()

<small>Hiển thị thông báo lỗi bên cạnh nhãn nhập Email/Mật khẩu có màu đỏ. Nội dung là MSG07.</small>

<small>Form đăng nhập:</small>

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

<b>Nội quy ghi nhớ mật khẩu:</b>

Khi người dùng điều hướng đến trang đăng nhập:

Hệ thống sẽ kiểm tra “LocalStorage” để xem có trường thơng tin userInfo hay khơng.

Nếu nó tồn tại, gán giá trị trạng thái hiện tại:[username] = userInfo[username]

Khi người dùng nhấn vào nút Ghi nhớ:Đặt [isRemember] = true.

Khi người dùng đăng nhập thành công:

Lưu userInfo[username] có giá trị bằng trạng thái hiện tại [username] vào “LocalStorage”

Khơng bao giờ lưu [password] vì lý do bảo mật.

<i><small>(2)BR2</small></i> Quy tắc thông báo:

Khi người dùng click vào nút đăng nhập và handLogin() đang chạy. Hệ thống sẽ thông báo cho người dùng và thông báo [EM] sẽ được quản lý dưới dạng mã lỗi [EC]. Dựa trên mã lỗi được máy chủ trả về:

if [EC] === 0

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

[EM] = MSG01if [EC] === 1[EM] = MSG02if [EC] === 2[EM] = MSG03if [EC] === -1[EM] = MSG04if [EC] === -2[EM] = MSG05

- Form thông báo:

<small>Nội dung[EM]</small>

Thông báo sẽ xuất hiện ở góc dưới bên phải màn hình và biến mất sau 2 giây.Người dùng có thể tắt nó trước bằng cách vuốt ngang.

Lưu ý: Không tạo bất kỳ nút nào để thực thi hành động tắt thông báo.

<i><small>(5)BR3</small></i> Khi người dùng đăng nhập thành công:

Việc nhận mã thông báo jwt từ máy chủ sẽ lưu nó vào cả cookie và localStorage với:

key = “jwt”

value= [accessToken]

Điều hướng đến trang dashboard.

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

UC2: Đăng xuất

<b><small>Description</small></b> Thể hiện quá trình người dùng đăng xuất khỏi hệ thống.

<b><small>Actor</small></b> Tất cả người dùng

<b><small>Trigger</small></b> Người dùng chọn “Đăng xuất”.

<b><small>Pre-condition</small></b> Người dùng đã đăng nhập vào hệ thống.

<b><small>Post-condition</small></b> Người dùng được chuyển hướng đến trang chủ sau khi đăng xuất thành công.

<b><small>Activities Flow</small></b>

<b><small>Sequence diagram</small></b>

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

<i><small>Business Rules</small></i>

<b><small>ActivityBR </small></b>

<i><small>(1)BR4</small></i> Khi người dùng nhấp vào nút đăng xuất, hãy gọi hàm xử lý Logout():

Hệ thống sẽ xóa trường thơng tin có key="jwt", được lưu trữ trong cookie và localStorage.

<small>Chuyển hướng đến trang chủ.</small>

UC3: Đăng ký

<b><small>Description</small></b> Thể hiện quá trình người dùng nhập chi tiết đăng ký và tạo tài khoản.

<b><small>Actor</small></b> Student, Intructor

<b><small>Trigger</small></b> Người dùng nhấn vào nút đăng ký.

<b><small>Pre-condition</small></b> Người dùng đang ở trang đăng ký.

<b><small>Post-condition</small></b> Tài khoản người dùng được tạo và người dùng được chuyển hướng đến trang đăng nhập nếu thông tin chi tiết hợp lệ và duy nhất. Thông báo lỗi được hiển thị cho các chi tiết không hợp lệ hoặc không duy nhất.

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

<b><small>Activities Flow</small></b>

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

Ít nhất hai ký tự chữ cái cho phần mở rộng tên miền (ví dụ: com, net).

[passwordRegex] = “^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A- Za-z\d@$!%*?&]{8,}$”

Ít nhất một chữ thường.Tối thiểu một chữ hoa.

Ít nhất một ký tự đặc biệt (có thể thay đổi tùy theo yêu cầu của bạn).Ít nhất 8 ký tự từ các nhóm trên.

Chức năng này hoạt động:

if [usernameRegex].test([username]) === true &&

[passwordRegex].test([password]) === true && [isCheck] === true

// [isCheck] Trạng thái của nó phụ thuộc vào hộp kiểm đồng ý với các điều khoản của chúng tơi và nó phải đúng.

trả về ĐÚNG

nếu khơng thì trả về SAI

Khi người dùng nhấp vào nút Đăng ký xác thực chức năng() sẽ tiến hành kiểm tra thông tin đầu vào trước tiên:

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

if ![username] && ![password] && ![rePassword]

Hiển thị thông báo lỗi bên cạnh nhãn nhập Email/Mật khẩu có màu đỏ. Nội dung làMSG06.

Else if ([password] !== [rePassword])

Hiển thị thông báo lỗi bên cạnh nhãn nhập Mật khẩu và có màu đỏ. Nội dung là MSG08.

Else if ( validation() )Next()

Hiển thị thông báo lỗi bên cạnh nhãn nhập Email/Mật khẩu có màu đỏ. Nội dung làMSG07.

<b>Mẫu đăng ký:</b>

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

Khi người dùng click vào nút đăng ký và handleRegister() đang chạy. Hệ thống sẽ thông báo cho người dùng và thông báo [EM] sẽ được quản lý dưới dạng mã lỗi [EC]. Dựa trên mã lỗi được máy chủ trả về:

if [EC] === 0[EM] = MSG09if [EC] === 1[EM] = MSG10if [EC] === -1[EM] = MSG04if [EC] === -2[EM] = MSG05

<b>Mẫu thông báo:</b>

<small>Nội dung[EM]</small>

<i><small>(6)BR7</small></i> Khi người dùng đăng ký thành công:Điều hướng đến trang đăng nhập.

UC4: Xem danh sách khóa học

<b><small>Description</small></b> Xem danh sách các khóa học hiện có

<b><small>Actor</small></b> Mọi tác nhân

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

<b><small>Name Xem danh sách khóa học</small></b>

<b><small>Trigger</small></b> Người dùng truy cập vào phần “Khóa học”

<b><small>Pre-condition</small></b> Người dùng đã đăng nhập

<b><small>Post-condition</small></b> Danh sách các khóa học có sẵn được hiển thị

<b><small>Activities Flow</small></b>

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

<b><small>Sequence diagram</small></b>

<i><small>Business Rules</small></i>

<b><small>ActivityBR Code</small></b>

- Nếu res[EC] khác ⇒ Điều hướng đến trang đăng nhập.

<i><small>(5)BR9</small></i> Quy tắc khi lấy khóa học:

Ngay khi bạn vào trang khóa học, dữ liệu sẽ được tìm nạp trước:// Các khóa học sẽ được sắp xếp mặc định theo thời gian tạo (tăng dần).getCourse([page],[limit])

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

[page]: Số thứ tự trang bạn muốn lấy.

[limit]: Số lượng khóa học tối đa mong muốn trên mỗi trang. Và cài đặt mặc định là 6 khóa học.

<small>Ảnh với nguồn = item[thumbnail]</small>

<small>Giá</small> <i><small>// 2 mức giá này khi được tạo sẽ mặc định bằng nhau. Nếu có sự thay đổi về giáthì cả hai mức giá vẫn được giữ nguyên và bằng giá mới. Nếu giá mới giảm thì chỉ [newPrice] được cập nhật.</small></i>

<small>if( item[oldPrice] !== item[newPrice] )</small>

<small>return item.[oldPrice] + “đ” + item[newPrice] + “đ”else</small>

<small>return item[newPrice] + “đ”</small>

<i><small>// Màu giá cũ phải chìm hơn giá mới.</small></i>

<small>)})</small>

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

bảng và [limit] là tham số được gửi ở trên.

UC5: Xem chi tiết khóa học

<b><small>Description</small></b> Xem chi tiết khóa học đã chọn

<b><small>Actor</small></b> Tất cả tác nhân

<b><small>Trigger</small></b> Người dùng chọn khóa học để xem chi tiết

<b><small>Pre-condition</small></b> Người dùng đã đăng nhập và khóa học được chọn

<b><small>Post-condition</small></b> Chi tiết khóa học được hiển thị cho người dùng

<b><small>Activities Flow</small></b>

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

<b><small>Sequence diagram</small></b>

<i><small>Business Rules</small></i>

<b><small>ActivityBR Code</small></b>

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

<b><small>Nội dung</small></b> <small>[body] = “Không thể tìm thấy khóa </small>

<b><small>học này. Nhấn vào đây để trở về </small></b>

<i><small>//Đánh giá sẽ được hiển thị dưới </small></i>

<i><small>dạng ngơi sao.</small></i>

<b><small>Body</small></b> <small>//Quy tắc để hiển thị giá khóa học như đã khai báo ở </small>

<small>Giácourse[price]ButtonMua ngay</small>

<b><small>Tổng quanTóm tắtMục tiêu khóahọc</small></b>

<small>-Mục này chưa </small>

<small>-Mục này chứa </small>

<small>-Mục này hiển thị </small>

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

<small>tổng quan thơng tin về khóa học.</small>

<small>danh sách các chương, bài học,</small>

<small>danh sách các mục tiêu sẽ đạt được sau khi tham gia khóa học.</small>

<b><small>CommentQuy tắc bình luận:</small></b>

<small>course[comments].map(comment </small>

<small>(comment) ⇒ {) ⇒ { ⇒ { { return (</small>

<small>Avatar </small> <b><small>Tên</small></b> <small>comment[owner][name]</small>

<b><small>Bình luận</small></b> <small>comment[content )</small>

<small> } )</small>

<i><small>// Cho phép tất cả người dùng đã mua khóa học bình luận đánh giá về khóa học.</small></i>

<b><small>-Tạo bình luận bằng hàm createComment([data]):</small></b>

<small>Với dữ liệu bao gồm: data[title] && data[userId].Comment Form:</small>

</div>

×