diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..a5336484a850356876682d1285f7812cc054c6ae --- /dev/null +++ b/.dockerignore @@ -0,0 +1,13 @@ +node_modules +npm-debug.log +temp/* +.git +.gitignore +.dockerignore +Dockerfile +nodemon.json +README.md +C:\Users\huuda\.gemini\antigravity\brain/* +# Bỏ qua các file rác macOS/Windows +.DS_Store +Thumbs.db diff --git a/.gitattributes b/.gitattributes index a6344aac8c09253b3b630fb776ae94478aa0275b..eff6fc98ab6566490f89e7767ee758be4b389bc7 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,35 +1,3 @@ -*.7z filter=lfs diff=lfs merge=lfs -text -*.arrow filter=lfs diff=lfs merge=lfs -text -*.bin filter=lfs diff=lfs merge=lfs -text -*.bz2 filter=lfs diff=lfs merge=lfs -text -*.ckpt filter=lfs diff=lfs merge=lfs -text -*.ftz filter=lfs diff=lfs merge=lfs -text -*.gz filter=lfs diff=lfs merge=lfs -text -*.h5 filter=lfs diff=lfs merge=lfs -text -*.joblib filter=lfs diff=lfs merge=lfs -text -*.lfs.* filter=lfs diff=lfs merge=lfs -text -*.mlmodel filter=lfs diff=lfs merge=lfs -text -*.model filter=lfs diff=lfs merge=lfs -text -*.msgpack filter=lfs diff=lfs merge=lfs -text -*.npy filter=lfs diff=lfs merge=lfs -text -*.npz filter=lfs diff=lfs merge=lfs -text -*.onnx filter=lfs diff=lfs merge=lfs -text -*.ot filter=lfs diff=lfs merge=lfs -text -*.parquet filter=lfs diff=lfs merge=lfs -text -*.pb filter=lfs diff=lfs merge=lfs -text -*.pickle filter=lfs diff=lfs merge=lfs -text -*.pkl filter=lfs diff=lfs merge=lfs -text -*.pt filter=lfs diff=lfs merge=lfs -text -*.pth filter=lfs diff=lfs merge=lfs -text -*.rar filter=lfs diff=lfs merge=lfs -text -*.safetensors filter=lfs diff=lfs merge=lfs -text -saved_model/**/* filter=lfs diff=lfs merge=lfs -text -*.tar.* filter=lfs diff=lfs merge=lfs -text -*.tar filter=lfs diff=lfs merge=lfs -text -*.tflite filter=lfs diff=lfs merge=lfs -text -*.tgz filter=lfs diff=lfs merge=lfs -text -*.wasm filter=lfs diff=lfs merge=lfs -text -*.xz filter=lfs diff=lfs merge=lfs -text -*.zip filter=lfs diff=lfs merge=lfs -text -*.zst filter=lfs diff=lfs merge=lfs -text -*tfevents* filter=lfs diff=lfs merge=lfs -text +# Auto detect text files and perform LF normalization +* text=auto +img/screenshot.png filter=lfs diff=lfs merge=lfs -text diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..9d16c470592eaa632b8231fdb19a351eeba0ac66 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,42 @@ +# Sử dụng Node.js image làm căn bản +FROM node:18-slim + +# Cài đặt các trình biên dịch và thư viện hệ thống cho OpenCV +RUN apt-get update && apt-get install -y \ + gcc \ + g++ \ + openjdk-17-jdk \ + python3 \ + python3-pip \ + libgl1-mesa-glx \ + libglib2.0-0 \ + && rm -rf /var/lib/apt/lists/* + +# Tạo thư mục làm việc +WORKDIR /app + +# Copy package.json và cài đặt dependencies +COPY package*.json ./ +RUN npm install + +# Cài đặt các thư viện Python theo yêu cầu +RUN pip3 install --no-cache-dir numpy matplotlib sympy opencv-python + +# Copy toàn bộ mã nguồn vào container +COPY . . + +# Bảo mật: Tạo user không phải root để chạy ứng dụng +RUN useradd -m unicode_user && \ + mkdir -p temp && \ + chown -R unicode_user:unicode_user /app && \ + chmod 777 temp + +# Chuyển sang dùng user unicode_user +USER unicode_user + +# Hugging Face Spaces yêu cầu cổng 7860 +ENV PORT=7860 +EXPOSE 7860 + +# Lệnh khởi chạy ứng dụng +CMD ["npm", "start"] diff --git a/README.md b/README.md index 0b9367628c91c7bd1eee39fcda72b8d862693bce..8758a7e217f5cff8102e97113f93ea5d2ab77397 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,63 @@ ---- -title: Unicode -emoji: 😻 -colorFrom: blue -colorTo: yellow -sdk: docker -pinned: false ---- - -Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference +# unidocs - Kho tài liệu môn học 📚 + +**unidocs** là hệ thống lưu trữ và chia sẻ tài liệu học tập miễn phí, giúp sinh viên truy cập giáo trình, đề thi và bài giảng chất lượng cao một cách nhanh chóng và tiện lợi. + +![unidocs Preview](img/screenshot.png) + +## ✨ Tính năng nổi bật + +- **🗂️ Phân loại môn học thông minh**: Dễ dàng tìm kiếm môn học theo nhóm ngành (Công nghệ thông tin, Toán, Kỹ năng...). +- **📱 Giao diện Mobile-First**: Trải nghiệm như ứng dụng di động: + - Menu trượt mượt mà. + - Chế độ xem tài liệu toàn màn hình. + - Tương tác chạm vuốt thân thiện. +- **👁️ Xem trước tài liệu trực tiếp**: Hỗ trợ xem nhanh các định dạng phổ biến (PDF, Word, Excel, PowerPoint) ngay trên trình duyệt mà không cần tải về. +- **⬇️ Tải xuống trọn bộ**: Tính năng nén và tải toàn bộ tài liệu của một môn học chỉ với 1 cú click (file .zip). +- **🎨 Giao diện hiện đại**: Thiết kế với phong cách Glassmorphism, sạch sẽ và tập trung vào nội dung. + +## 🛠️ Công nghệ sử dụng + +Dự án được xây dựng hoàn toàn bằng **Vanilla Web Technologies**, đảm bảo tốc độ tải trang cực nhanh và dễ dàng triển khai: + +- **HTML5**: Cấu trúc ngữ nghĩa. +- **Tailwind CSS**: Styling nhanh chóng và đẹp mắt. +- **Vanilla JavaScript**: Xử lý logic, render dữ liệu động và tương tác UI. +- **Phosphor Icons**: Bộ icon hiện đại, sắc nét. +- **Thư viện hỗ trợ**: + - `JSZip`: Nén file phía client. + - `pptxjs`, `docx-preview`, `sheetjs`: Hỗ trợ xem trước file Office. + +## 🚀 Hướng dẫn cài đặt & Sử dụng + +Dự án này là **Static Web**, bạn không cần cài đặt backend hay database phức tạp. + +1. **Clone dự án**: + ```bash + git clone https://github.com/TranHuuDat2004/unidocs.git + ``` +2. **Khởi chạy**: + - Dùng Live Server (VS Code) để mở file `index.html` . + +## 🤝 Cấu trúc dữ liệu + +Dữ liệu môn học được lưu trữ tại `data/subjects.json`. Để thêm môn học mới: + +1. Mở `data/subjects.json`. +2. Thêm object mới vào mảng: + ```json + { + "id": "ten_mon_hoc", + "name": "Tên Môn Học", + "description": "Mô tả ngắn...", + "icon": "ph-books", + "category": "programming_algo" + } + ``` +3. Tạo file chi tiết `data/details/ten_mon_hoc.json` chứa danh sách file. + +## 👤 Tác giả + +Developed by **TranHuuDat2004**. + +--- +*unidocs - Chia sẻ tri thức, kết nối thành công.* diff --git a/components/sidebar.html b/components/sidebar.html new file mode 100644 index 0000000000000000000000000000000000000000..62d820517d7ba6157e3a50e9ae2093a829aa25e7 --- /dev/null +++ b/components/sidebar.html @@ -0,0 +1,49 @@ + +
+ +
+
+ +
+ UniChat. +
+ + + + + +
+ + + Cài đặt + + +
+
\ No newline at end of file diff --git a/data/details/aptis.json b/data/details/aptis.json new file mode 100644 index 0000000000000000000000000000000000000000..5297624855f0c68a7d1bf7f6e14513625d45b165 --- /dev/null +++ b/data/details/aptis.json @@ -0,0 +1,118 @@ +{ + "id": "aptis", + "name": "Aptis ESOL", + "files": [ + { + "name": "Listening Part 1-13.pdf", + "url": "documents/aptis/Listening Part 1-13.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "200.39 KB" + }, + { + "name": "Listening Part 15.pdf", + "url": "documents/aptis/Listening Part 15.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "115.20 KB" + }, + { + "name": "Listening Part 16-17.pdf", + "url": "documents/aptis/Listening Part 16-17.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "164.65 KB" + }, + { + "name": "Reading Part 1-2-3.pdf", + "url": "documents/aptis/Reading Part 1-2-3.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "256.94 KB" + }, + { + "name": "Speaking Part 2.pdf", + "url": "documents/aptis/Speaking Part 2.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "625.18 KB" + }, + { + "name": "Speaking Part 3.1.pdf", + "url": "documents/aptis/Speaking Part 3.1.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "1.02 MB" + }, + { + "name": "Speaking Part 3.2.pdf", + "url": "documents/aptis/Speaking Part 3.2.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "604.10 KB" + }, + { + "name": "Speaking Part 4.pdf", + "url": "documents/aptis/Speaking Part 4.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "889.31 KB" + }, + { + "name": "Writing 1. TRAVEL – HOME LIVING – SCIENCE - WALKING.pdf", + "url": "documents/aptis/Writing 1. TRAVEL – HOME LIVING – SCIENCE - WALKING.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "642.62 KB" + }, + { + "name": "Writing 2. FOOD + ENGLISH + LANGUAGE + WALKING CLUB.pdf", + "url": "documents/aptis/Writing 2. FOOD + ENGLISH + LANGUAGE + WALKING CLUB.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "1.09 MB" + }, + { + "name": "Writing 3. GARDENING + CAR + LANGUAGE 02 +NATURE + CLUB.pdf", + "url": "documents/aptis/Writing 3. GARDENING + CAR + LANGUAGE 02 +NATURE + CLUB.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "434.17 KB" + }, + { + "name": "Writing 4. BOOK CLUB + READING CLUB.pdf", + "url": "documents/aptis/Writing 4. BOOK CLUB + READING CLUB.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "482.67 KB" + }, + { + "name": "Writing 5. PHOTOGRAPHY CLUB.pdf", + "url": "documents/aptis/Writing 5. PHOTOGRAPHY CLUB.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "541.72 KB" + }, + { + "name": "Writing 6. GARDEN CLUB.pdf", + "url": "documents/aptis/Writing 6. GARDEN CLUB.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "152.62 KB" + }, + { + "name": "Writing 7. DESIGN CLUB + OUTDOOR CLUB + NATURE CLUB.pdf", + "url": "documents/aptis/Writing 7. DESIGN CLUB + OUTDOOR CLUB + NATURE CLUB.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "357.49 KB" + }, + { + "name": "Writing 8. APTIS COLLEGE.pdf", + "url": "documents/aptis/Writing 8. APTIS COLLEGE.pdf", + "type": "pdf", + "date": "01/02/2026", + "size": "158.81 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/artificial_intelligence.json b/data/details/artificial_intelligence.json new file mode 100644 index 0000000000000000000000000000000000000000..91e4ae85b1dfc74b57cdf657ceea905ccebd6a68 --- /dev/null +++ b/data/details/artificial_intelligence.json @@ -0,0 +1,78 @@ +{ + "id": "artificial_intelligence", + "name": "Nhập môn trí tuệ nhân tạo", + "files": [ + { + "name": "AI-lec01-Introduction.pdf", + "type": "pdf", + "url": "documents/artificial_intelligence/AI-lec01-Introduction.pdf", + "date": "05/01/2024" + }, + { + "name": "AI-lec02-IntelligentAgents.pdf", + "type": "pdf", + "url": "documents/artificial_intelligence/AI-lec02-IntelligentAgents.pdf", + "date": "12/01/2024" + }, + { + "name": "AI-lec03-ProblemSolvingUsingSearching.pdf", + "type": "pdf", + "url": "documents/artificial_intelligence/AI-lec03-ProblemSolvingUsingSearching.pdf", + "date": "20/01/2024" + }, + { + "name": "AI-lec04-UninformedSearch.pdf", + "type": "pdf", + "url": "documents/artificial_intelligence/AI-lec04-UninformedSearch.pdf", + "date": "02/02/2024" + }, + { + "name": "AI-lec05-InformedSearch.pdf", + "type": "pdf", + "url": "documents/artificial_intelligence/AI-lec05-InformedSearch.pdf", + "date": "10/02/2024" + }, + { + "name": "AI-lec06-LocalSearch.pdf", + "type": "pdf", + "url": "documents/artificial_intelligence/AI-lec06-LocalSearch.pdf", + "date": "15/02/2024" + }, + { + "name": "AI-lec07-Adversarial Search.pdf", + "type": "pdf", + "url": "documents/artificial_intelligence/AI-lec07-Adversarial Search.pdf", + "date": "25/02/2024" + }, + { + "name": "AI-lec08-CSPs.pdf", + "type": "pdf", + "url": "documents/artificial_intelligence/AI-lec08-CSPs.pdf", + "date": "05/03/2024" + }, + { + "name": "AI-lec09-Logical Agents - Propositional Logic.pdf", + "type": "pdf", + "url": "documents/artificial_intelligence/AI-lec09-Logical Agents - Propositional Logic.pdf", + "date": "15/03/2024" + }, + { + "name": "AI-lec10-First Order Logic.pdf", + "type": "pdf", + "url": "documents/artificial_intelligence/AI-lec10-First Order Logic.pdf", + "date": "25/03/2024" + }, + { + "name": "AI-lec11-Bayesian Networks.pdf", + "type": "pdf", + "url": "documents/artificial_intelligence/AI-lec11-Bayesian Networks.pdf", + "date": "05/04/2024" + }, + { + "name": "AI-lec12-Basic-Machine-Learning.pdf", + "type": "pdf", + "url": "documents/artificial_intelligence/AI-lec12-Basic-Machine-Learning.pdf", + "date": "15/04/2024" + } + ] +} \ No newline at end of file diff --git a/data/details/big_data.json b/data/details/big_data.json new file mode 100644 index 0000000000000000000000000000000000000000..4712490e51c6419f1c591439ea24f06df6e5d777 --- /dev/null +++ b/data/details/big_data.json @@ -0,0 +1,126 @@ +{ + "id": "big_data", + "name": "Xử lí dữ liệu lớn", + "files": [ + { + "name": "01-intro.pdf", + "type": "pdf", + "url": "documents/big_data/01-intro.pdf", + "date": "02/01/2025" + }, + { + "name": "02-assocrules.pdf", + "type": "pdf", + "url": "documents/big_data/02-assocrules.pdf", + "date": "08/01/2025" + }, + { + "name": "03-lsh.pdf", + "type": "pdf", + "url": "documents/big_data/03-lsh.pdf", + "date": "15/01/2025" + }, + { + "name": "04-lsh_theory.pdf", + "type": "pdf", + "url": "documents/big_data/04-lsh_theory.pdf", + "date": "22/01/2025" + }, + { + "name": "05-clustering.pdf", + "type": "pdf", + "url": "documents/big_data/05-clustering.pdf", + "date": "29/01/2025" + }, + { + "name": "06-dim_red.pdf", + "type": "pdf", + "url": "documents/big_data/06-dim_red.pdf", + "date": "05/02/2025" + }, + { + "name": "07-recsys1.pdf", + "type": "pdf", + "url": "documents/big_data/07-recsys1.pdf", + "date": "12/02/2025" + }, + { + "name": "08-recsys2.pdf", + "type": "pdf", + "url": "documents/big_data/08-recsys2.pdf", + "date": "19/02/2025" + }, + { + "name": "09-pagerank.pdf", + "type": "pdf", + "url": "documents/big_data/09-pagerank.pdf", + "date": "26/02/2025" + }, + { + "name": "10-spam.pdf", + "type": "pdf", + "url": "documents/big_data/10-spam.pdf", + "date": "05/03/2025" + }, + { + "name": "11-graphs1.pdf", + "type": "pdf", + "url": "documents/big_data/11-graphs1.pdf", + "date": "12/03/2025" + }, + { + "name": "12-graphs2.pdf", + "type": "pdf", + "url": "documents/big_data/12-graphs2.pdf", + "date": "19/03/2025" + }, + { + "name": "13-GNNs.pdf", + "type": "pdf", + "url": "documents/big_data/13-GNNs.pdf", + "date": "26/03/2025" + }, + { + "name": "13-dt.pdf", + "type": "pdf", + "url": "documents/big_data/13-dt.pdf", + "date": "02/04/2025" + }, + { + "name": "14-learning_emb.pdf", + "type": "pdf", + "url": "documents/big_data/14-learning_emb.pdf", + "date": "09/04/2025" + }, + { + "name": "15-streams.pdf", + "type": "pdf", + "url": "documents/big_data/15-streams.pdf", + "date": "16/04/2025" + }, + { + "name": "17-matrix_sketching.pdf", + "type": "pdf", + "url": "documents/big_data/17-matrix_sketching.pdf", + "date": "23/04/2025" + }, + { + "name": "18-advertising.pdf", + "type": "pdf", + "url": "documents/big_data/18-advertising.pdf", + "date": "30/04/2025" + }, + { + "name": "19-bandits.pdf", + "type": "pdf", + "url": "documents/big_data/19-bandits.pdf", + "date": "07/05/2025" + }, + { + "name": "20-submodular.pdf", + "type": "pdf", + "url": "documents/big_data/20-submodular.pdf", + "date": "14/05/2025" + } + ] +} \ No newline at end of file diff --git a/data/details/calculus.json b/data/details/calculus.json new file mode 100644 index 0000000000000000000000000000000000000000..79da363c060c7a47747fd07bc4e4ed0236fc3097 --- /dev/null +++ b/data/details/calculus.json @@ -0,0 +1,69 @@ +{ + "id": "calculus", + "name": "Giải tích (Calculus)", + "files": [ + { + "name": "MA1521Chap0.pdf", + "type": "pdf", + "url": "documents/calculus/MA1521Chap0.pdf", + "size": "224 KB", + "date": "15/09/2022" + }, + { + "name": "MA1521Chap1.pdf", + "type": "pdf", + "url": "documents/calculus/MA1521Chap1.pdf", + "size": "269 KB", + "date": "22/09/2022" + }, + { + "name": "MA1521Chap2.pdf", + "type": "pdf", + "url": "documents/calculus/MA1521Chap2.pdf", + "size": "409 KB", + "date": "03/10/2022" + }, + { + "name": "MA1521Chap3.pdf", + "type": "pdf", + "url": "documents/calculus/MA1521Chap3.pdf", + "size": "228 KB", + "date": "18/10/2022" + }, + { + "name": "MA1521Chap4.pdf", + "type": "pdf", + "url": "documents/calculus/MA1521Chap4.pdf", + "size": "171 KB", + "date": "05/11/2022" + }, + { + "name": "MA1521Chap5.pdf", + "type": "pdf", + "url": "documents/calculus/MA1521Chap5.pdf", + "size": "466 KB", + "date": "20/11/2022" + }, + { + "name": "MA1521Chap6-1.pdf", + "type": "pdf", + "url": "documents/calculus/MA1521Chap6-1.pdf", + "size": "251 KB", + "date": "01/12/2022" + }, + { + "name": "MA1521Chap6-2.pdf", + "type": "pdf", + "url": "documents/calculus/MA1521Chap6-2.pdf", + "size": "2.38 MB", + "date": "12/12/2022" + }, + { + "name": "MA1521Chap7.pdf", + "type": "pdf", + "url": "documents/calculus/MA1521Chap7.pdf", + "size": "200 KB", + "date": "28/12/2022" + } + ] +} \ No newline at end of file diff --git a/data/details/calculus_python.json b/data/details/calculus_python.json new file mode 100644 index 0000000000000000000000000000000000000000..2f2b0251b6819638dcc081e329e74cd1bbd34a7a --- /dev/null +++ b/data/details/calculus_python.json @@ -0,0 +1,84 @@ +{ + "id": "calculus_python", + "name": "Thực hành Giải tích với Python", + "noteHtml": "Bạn có thể xem đoạn code tham khảo hoặc bài giải tham khảo ngay tại đây.", + "files": [ + { + "name": "cheat_sheet.pdf", + "url": "documents/calculus-code/cheat_sheet.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "129.61 KB" + }, + { + "name": "Lab01_Python1.pdf", + "url": "documents/calculus-code/Lab01_Python1.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "425.90 KB" + }, + { + "name": "Lab02_Python2.pdf", + "url": "documents/calculus-code/Lab02_Python2.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "483.40 KB" + }, + { + "name": "Lab03.pdf", + "url": "documents/calculus-code/Lab03.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "592.13 KB" + }, + { + "name": "Lab04.ex.pdf", + "url": "documents/calculus-code/Lab04.ex.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "134.66 KB" + }, + { + "name": "Lab04.guide.pdf", + "url": "documents/calculus-code/Lab04.guide.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "337.71 KB" + }, + { + "name": "Lab05_06.pdf", + "url": "documents/calculus-code/Lab05_06.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "126.96 KB" + }, + { + "name": "Lab07.pdf", + "url": "documents/calculus-code/Lab07.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "134.86 KB" + }, + { + "name": "Lab08.pdf", + "url": "documents/calculus-code/Lab08.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "118.39 KB" + }, + { + "name": "Lab09.pdf", + "url": "documents/calculus-code/Lab09.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "110.61 KB" + }, + { + "name": "Lab10.pdf", + "url": "documents/calculus-code/Lab10.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "146.66 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/code_samples.json b/data/details/code_samples.json new file mode 100644 index 0000000000000000000000000000000000000000..b25aa05dad11831a18cfdbe7056a3ff2d70acd33 --- /dev/null +++ b/data/details/code_samples.json @@ -0,0 +1,26 @@ +{ + "name": "Lập trình mẫu", + "files": [ + { + "name": "Hello World.c", + "url": "documents/hello.c", + "type": "c", + "date": "2026-03-16", + "size": "1 KB" + }, + { + "name": "Hello World.java", + "url": "documents/hello.java", + "type": "java", + "date": "2026-03-16", + "size": "1 KB" + }, + { + "name": "Hello World.py", + "url": "documents/hello.py", + "type": "python", + "date": "2026-03-16", + "size": "1 KB" + } + ] +} diff --git a/data/details/computer_network.json b/data/details/computer_network.json new file mode 100644 index 0000000000000000000000000000000000000000..78e7ba6c17e997ad25490a0a71a4d2d6bc377ae6 --- /dev/null +++ b/data/details/computer_network.json @@ -0,0 +1,54 @@ +{ + "id": "computer_network", + "name": "Mạng máy tính", + "files": [ + { + "name": "Lecture 0 - Course introduction (IT)-2019.pdf", + "type": "pdf", + "url": "documents/computer_network/Lecture 0 - Course introduction (IT)-2019.pdf", + "date": "05/09/2023" + }, + { + "name": "Lecture 1 - Introduction (IT).pdf", + "type": "pdf", + "url": "documents/computer_network/Lecture 1 - Introduction (IT).pdf", + "date": "15/09/2023" + }, + { + "name": "Lecture 2 - Applications (IT)-2021.pdf", + "type": "pdf", + "url": "documents/computer_network/Lecture 2 - Applications (IT)-2021.pdf", + "date": "25/09/2023" + }, + { + "name": "Lecture 3 - Transport layer (IT).pdf", + "type": "pdf", + "url": "documents/computer_network/Lecture 3 - Transport layer (IT).pdf", + "date": "05/10/2023" + }, + { + "name": "Lecture 4 - IP Addressing (IT).pdf", + "type": "pdf", + "url": "documents/computer_network/Lecture 4 - IP Addressing (IT).pdf", + "date": "15/10/2023" + }, + { + "name": "Lecture 5 - Network layer (IT).pdf", + "type": "pdf", + "url": "documents/computer_network/Lecture 5 - Network layer (IT).pdf", + "date": "25/10/2023" + }, + { + "name": "Lecture 6 - Datalink layer (IT).pdf", + "type": "pdf", + "url": "documents/computer_network/Lecture 6 - Datalink layer (IT).pdf", + "date": "10/11/2023" + }, + { + "name": "Lecture 7 - Wireless and Mobile Networks.pdf", + "type": "pdf", + "url": "documents/computer_network/Lecture 7 - Wireless and Mobile Networks.pdf", + "date": "25/11/2023" + } + ] +} \ No newline at end of file diff --git a/data/details/computer_organization.json b/data/details/computer_organization.json new file mode 100644 index 0000000000000000000000000000000000000000..20b79e9db369307089c441a420915a4099f8b155 --- /dev/null +++ b/data/details/computer_organization.json @@ -0,0 +1,196 @@ +{ + "id": "computer_organization", + "name": "Tổ chức máy tính", + "files": [ + { + "name": "[1 new]Digital_Design_5th_Edition_M._Morris_Man.pdf", + "type": "pdf", + "url": "documents/computer_organization/[1 new]Digital_Design_5th_Edition_M._Morris_Man.pdf", + "size": "2.99 MB", + "date": "01/09/2022" + }, + { + "name": "CS161_ MIPS Instruction Reference.pdf", + "type": "pdf", + "url": "documents/computer_organization/CS161_ MIPS Instruction Reference.pdf", + "size": "218 KB", + "date": "05/09/2022" + }, + { + "name": "Chapter 1.1 - Introduction.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 1.1 - Introduction.pdf", + "size": "1.82 MB", + "date": "08/09/2022" + }, + { + "name": "Chapter 1.2 - Number systems and Codes.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 1.2 - Number systems and Codes.pdf", + "size": "715 KB", + "date": "10/09/2022" + }, + { + "name": "Chapter 1.3 - Number systems supplimentary notes.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 1.3 - Number systems supplimentary notes.pdf", + "size": "188 KB", + "date": "15/09/2022" + }, + + { + "name": "Chapter 2 - Boolean algebra.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 2 - Boolean algebra.pdf", + "size": "301 KB", + "date": "18/09/2022" + }, + { + "name": "Chapter 3 - Logic gates and circuits.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 3 - Logic gates and circuits.pdf", + "size": "539 KB", + "date": "22/09/2022" + }, + { + "name": "Chapter 4.1 - Karnaugh-Maps.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 4.1 - Karnaugh-Maps.pdf", + "size": "604 KB", + "date": "29/09/2022" + }, + { + "name": "Chapter 4.2 - Quine-McCluskey.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 4.2 - Quine-McCluskey.pdf", + "size": "297 KB", + "date": "03/10/2022" + }, + { + "name": "Chapter 5 - Combinational-Circuits.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 5 - Combinational-Circuits.pdf", + "size": "699 KB", + "date": "08/10/2022" + }, + { + "name": "Chapter 6 - Sequential-Logic.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 6 - Sequential-Logic.pdf", + "size": "921 KB", + "date": "15/10/2022" + }, + { + "name": "Chapter 7 - Computer Organisation.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 7 - Computer Organisation.pdf", + "size": "2.00 MB", + "date": "22/10/2022" + }, + { + "name": "Chapter 8 - Computer Performance.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 8 - Computer Performance.pdf", + "size": "1.10 MB", + "date": "29/10/2022" + }, + { + "name": "Chapter 9.0 - MSI Components.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 9.0 - MSI Components.pdf", + "size": "1.57 MB", + "date": "01/11/2022" + }, + { + "name": "Chapter 9.1 - MIPS Introduction.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 9.1 - MIPS Introduction.pdf", + "size": "1.01 MB", + "date": "04/11/2022" + }, + { + "name": "Chapter 9.2 - MIPS II - More Instructions.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 9.2 - MIPS II - More Instructions.pdf", + "size": "1.02 MB", + "date": "06/11/2022" + }, + { + "name": "Chapter 9.3 - MIPS III - Format _ Encoding.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 9.3 - MIPS III - Format _ Encoding.pdf", + "size": "973 KB", + "date": "08/11/2022" + }, + { + "name": "Chapter 10 - Instruction Set Architecture (ISA).pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 10 - Instruction Set Architecture (ISA).pdf", + "size": "819 KB", + "date": "10/11/2022" + }, + { + "name": "Chapter 11.1 - Bộ xử lí.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 11.1 - Bộ xử lí.pdf", + "size": "2.42 MB", + "date": "16/11/2022" + }, + { + "name": "Chapter 11.1 - Processor DataPath.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 11.1 - Processor DataPath.pdf", + "size": "1.00 MB", + "date": "16/11/2022" + }, + { + "name": "Chapter 11.2 - Processor Control.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 11.2 - Processor Control.pdf", + "size": "1.16 MB", + "date": "20/11/2022" + }, + { + "name": "Chapter 12 - Pipelining.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 12 - Pipelining.pdf", + "size": "3.31 MB", + "date": "25/11/2022" + }, + { + "name": "Chapter 13.1 - Cache Part I.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 13.1 - Cache Part I.pdf", + "size": "2.35 MB", + "date": "02/12/2022" + }, + { + "name": "Chapter 13.2 - Cache Part II.pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 13.2 - Cache Part II.pdf", + "size": "2.08 MB", + "date": "05/12/2022" + }, + { + "name": "Chapter 14.1 - Virtual memory (Own Reading Only).pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 14.1 - Virtual memory (Own Reading Only).pdf", + "size": "763 KB", + "date": "12/12/2022" + }, + { + "name": "Chapter 14.2 - IO (Own Reading Only).pdf", + "type": "pdf", + "url": "documents/computer_organization/Chapter 14.2 - IO (Own Reading Only).pdf", + "size": "912 KB", + "date": "15/12/2022" + }, + { + "name": "TO CHUC MAY TINH GK1.pdf", + "type": "pdf", + "url": "documents/computer_organization/TO CHUC MAY TINH GK1.pdf", + "size": "491 KB", + "date": "28/11/2022" + } + ] +} \ No newline at end of file diff --git a/data/details/computer_organization_lab.json b/data/details/computer_organization_lab.json new file mode 100644 index 0000000000000000000000000000000000000000..4059058f780e1d62c3c07917f8e5a26b5299973d --- /dev/null +++ b/data/details/computer_organization_lab.json @@ -0,0 +1,105 @@ +{ + "id": "computer_organization_lab", + "name": "Thực hành Tổ chức máy tính", + "noteHtml": "Bạn có thể xem đoạn code tham khảo hoặc bài giải tham khảo ngay tại đây.", + "files": [ + { + "name": "ARRAY.pdf", + "url": "documents/computer_organization_code/ARRAY.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "107.31 KB" + }, + { + "name": "Buoi 5 - Gioi thieu MIPS va cac lenh co ban.pdf", + "url": "documents/computer_organization_code/Buoi 5 - Gioi thieu MIPS va cac lenh co ban.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "796.21 KB" + }, + { + "name": "Buoi 8 - Chuong trinh con.pdf", + "url": "documents/computer_organization_code/Buoi 8 - Chuong trinh con.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "81.23 KB" + }, + { + "name": "Bai thuc hanh Tuan 03.pdf", + "url": "documents/computer_organization_code/Bai thuc hanh Tuan 03.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "165.77 KB" + }, + { + "name": "Bai thuc hanh Tuan 3.pdf", + "url": "documents/computer_organization_code/Bai thuc hanh Tuan 3.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "126.00 KB" + }, + { + "name": "Bai thuc hanh Tuan 4.pdf", + "url": "documents/computer_organization_code/Bai thuc hanh Tuan 4.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "114.37 KB" + }, + { + "name": "Cau truc re nhanh va vong lap.pdf", + "url": "documents/computer_organization_code/Cau truc re nhanh va vong lap.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "126.13 KB" + }, + { + "name": "Gioi thieu MIPS va cac thao tac co ban.pdf", + "url": "documents/computer_organization_code/Gioi thieu MIPS va cac thao tac co ban.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "229.70 KB" + }, + { + "name": "Lab 1.1 Intro to Logism.pdf", + "url": "documents/computer_organization_code/Lab 1.1 Intro to Logism.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "282.02 KB" + }, + { + "name": "Lab 1.2 Combination circuits.pdf", + "url": "documents/computer_organization_code/Lab 1.2 Combination circuits.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "260.00 KB" + }, + { + "name": "Lab 1.3 Build and Use subcircuit.pdf", + "url": "documents/computer_organization_code/Lab 1.3 Build and Use subcircuit.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "300.00 KB" + }, + { + "name": "Lab 2.1_Full Adder.pdf", + "url": "documents/computer_organization_code/Lab 2.1_Full Adder.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "280.00 KB" + }, + { + "name": "Lab2.pdf", + "url": "documents/computer_organization_code/Lab2.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "253.49 KB" + }, + { + "name": "STACK (NGAN XEP).pdf", + "url": "documents/computer_organization_code/STACK (NGAN XEP).pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "137.07 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/computer_vision.json b/data/details/computer_vision.json new file mode 100644 index 0000000000000000000000000000000000000000..212163891d8b58ee02ab7dc4a600d56f41b42016 --- /dev/null +++ b/data/details/computer_vision.json @@ -0,0 +1,114 @@ +{ + "id": "computer_vision", + "name": "Thị giác máy tính", + "files": [ + { + "name": "lecture_1_part_1.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_1_part_1.pdf", + "date": "05/08/2025" + }, + { + "name": "lecture_1_part_2.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_1_part_2.pdf", + "date": "06/08/2025" + }, + { + "name": "lecture_2.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_2.pdf", + "date": "12/08/2025" + }, + { + "name": "lecture_3.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_3.pdf", + "date": "19/08/2025" + }, + { + "name": "lecture_4.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_4.pdf", + "date": "26/08/2025" + }, + { + "name": "lecture_5.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_5.pdf", + "date": "05/09/2025" + }, + { + "name": "lecture_6.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_6.pdf", + "date": "12/09/2025" + }, + { + "name": "lecture_7.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_7.pdf", + "date": "19/09/2025" + }, + { + "name": "lecture_8.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_8.pdf", + "date": "26/09/2025" + }, + { + "name": "lecture_9.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_9.pdf", + "date": "05/10/2025" + }, + { + "name": "lecture_10.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_10.pdf", + "date": "12/10/2025" + }, + { + "name": "lecture_11.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_11.pdf", + "date": "19/10/2025" + }, + { + "name": "lecture_12.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_12.pdf", + "date": "26/10/2025" + }, + { + "name": "lecture_13.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_13.pdf", + "date": "05/11/2025" + }, + { + "name": "lecture_14.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_14.pdf", + "date": "12/11/2025" + }, + { + "name": "lecture_15.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_15.pdf", + "date": "19/11/2025" + }, + { + "name": "lecture_16.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_16.pdf", + "date": "26/11/2025" + }, + { + "name": "lecture_17.pdf", + "type": "pdf", + "url": "documents/computer_vision/lecture_17.pdf", + "date": "05/12/2025" + } + ] +} \ No newline at end of file diff --git a/data/details/critical_thinking.json b/data/details/critical_thinking.json new file mode 100644 index 0000000000000000000000000000000000000000..7f3dd819db1f3b564169d972aa40e7e31cf5cc82 --- /dev/null +++ b/data/details/critical_thinking.json @@ -0,0 +1,41 @@ +{ + "id": "critical_thinking", + "name": "Tư duy phản biện", + "files": [ + { + "name": "Bài tập lớn (L00046_522H0081_TranHuuDat).pdf", + "type": "pdf", + "url": "documents/Tu_duy_phan_bien/L00046_522H0081_TranHuuDat.pdf", + "date": "10/02/2026", + "size": "220.34 KB" + }, + { + "name": "Giới thiệu tư duy phản biện.pdf", + "type": "pdf", + "url": "documents/Tu_duy_phan_bien/gioi-thieu.pdf", + "date": "27/02/2026", + "size": "706.27 KB" + }, + { + "name": "Phát triển kĩ năng.pdf", + "type": "pdf", + "url": "documents/Tu_duy_phan_bien/phat-trien-ki-nang.pdf", + "date": "27/02/2026", + "size": "2.80 MB" + }, + { + "name": "Thực hành.pdf", + "type": "pdf", + "url": "documents/Tu_duy_phan_bien/thuc-hanh.pdf", + "date": "27/02/2026", + "size": "5.05 MB" + }, + { + "name": "Tổng quan tư duy phản biện.pdf", + "type": "pdf", + "url": "documents/Tu_duy_phan_bien/tong-quan.pdf", + "date": "27/02/2026", + "size": "1.75 MB" + } + ] +} \ No newline at end of file diff --git a/data/details/daa.json b/data/details/daa.json new file mode 100644 index 0000000000000000000000000000000000000000..095d58bf8af6fbc732663dd51829f73eada2b57f --- /dev/null +++ b/data/details/daa.json @@ -0,0 +1,78 @@ +{ + "id": "daa", + "name": "Phân tích và thiết kế thuật toán", + "files": [ + { + "name": "ch01n.pdf", + "type": "pdf", + "url": "documents/design_analysis_algorithm/ch01n.pdf", + "date": "05/09/2024" + }, + { + "name": "ch02n.pdf", + "type": "pdf", + "url": "documents/design_analysis_algorithm/ch02n.pdf", + "date": "15/09/2024" + }, + { + "name": "ch03n.pdf", + "type": "pdf", + "url": "documents/design_analysis_algorithm/ch03n.pdf", + "date": "20/09/2024" + }, + { + "name": "ch04n.pdf", + "type": "pdf", + "url": "documents/design_analysis_algorithm/ch04n.pdf", + "date": "05/10/2024" + }, + { + "name": "ch05n.pdf", + "type": "pdf", + "url": "documents/design_analysis_algorithm/ch05n.pdf", + "date": "10/10/2024" + }, + { + "name": "ch06n.pdf", + "type": "pdf", + "url": "documents/design_analysis_algorithm/ch06n.pdf", + "date": "20/10/2024" + }, + { + "name": "ch07n.pdf", + "type": "pdf", + "url": "documents/design_analysis_algorithm/ch07n.pdf", + "date": "25/10/2024" + }, + { + "name": "ch08n.pdf", + "type": "pdf", + "url": "documents/design_analysis_algorithm/ch08n.pdf", + "date": "05/11/2024" + }, + { + "name": "ch09n.pdf", + "type": "pdf", + "url": "documents/design_analysis_algorithm/ch09n.pdf", + "date": "15/11/2024" + }, + { + "name": "ch10n.pdf", + "type": "pdf", + "url": "documents/design_analysis_algorithm/ch10n.pdf", + "date": "25/11/2024" + }, + { + "name": "ch11n.pdf", + "type": "pdf", + "url": "documents/design_analysis_algorithm/ch11n.pdf", + "date": "05/12/2024" + }, + { + "name": "ch12n.pdf", + "type": "pdf", + "url": "documents/design_analysis_algorithm/ch12n.pdf", + "date": "15/12/2024" + } + ] +} \ No newline at end of file diff --git a/data/details/decision_making.json b/data/details/decision_making.json new file mode 100644 index 0000000000000000000000000000000000000000..e9dd6dc3404f5a2d46a8b2b3680e7476cce27e95 --- /dev/null +++ b/data/details/decision_making.json @@ -0,0 +1,41 @@ +{ + "id": "decision_making", + "name": "Kĩ năng đưa ra quyết định", + "files": [ + { + "name": "Bài tập lớn (L00048_522H0081_TranHuuDat).pdf", + "type": "pdf", + "url": "documents/Ki_nang_ra_quyet_dinh/L00048_522H0081_TranHuuDat.pdf", + "date": "10/02/2026", + "size": "401.61 KB" + }, + { + "name": "Giới thiệu ra quyết định.pdf", + "type": "pdf", + "url": "documents/Ki_nang_ra_quyet_dinh/gioi-thieua.pdf", + "date": "27/02/2026", + "size": "522.48 KB" + }, + { + "name": "Phương pháp quyết định.pdf", + "type": "pdf", + "url": "documents/Ki_nang_ra_quyet_dinh/phuong-phap-quyet-dinh.pdf", + "date": "27/02/2026", + "size": "508.30 KB" + }, + { + "name": "Phương pháp ra quyết định chi tiết.pdf", + "type": "pdf", + "url": "documents/Ki_nang_ra_quyet_dinh/phuong-phap-ra-quyet-dinh.pdf", + "date": "27/02/2026", + "size": "3.80 MB" + }, + { + "name": "Tổng quan ra quyết định.pdf", + "type": "pdf", + "url": "documents/Ki_nang_ra_quyet_dinh/tong-qian-quyet-dinh.pdf", + "date": "27/02/2026", + "size": "845.17 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/discrete_structures.json b/data/details/discrete_structures.json new file mode 100644 index 0000000000000000000000000000000000000000..fc9c6e11e9a1da222f21a492396c5232678c31c8 --- /dev/null +++ b/data/details/discrete_structures.json @@ -0,0 +1,84 @@ +{ + "id": "discrete_structures", + "name": "Cấu trúc rời rạc", + "files": [ + { + "name": "501044-DiscreteStructures-10_Functions.pdf", + "type": "pdf", + "url": "documents/discrete_structures/501044-DiscreteStructures-10_Functions.pdf", + "date": "05/01/2024" + }, + { + "name": "501044-DiscreteStructures-11_Cardinality.pdf", + "type": "pdf", + "url": "documents/discrete_structures/501044-DiscreteStructures-11_Cardinality.pdf", + "date": "15/01/2024" + }, + { + "name": "501044-DiscreteStructures-12_Counting_and_Probability_1.pdf", + "type": "pdf", + "url": "documents/discrete_structures/501044-DiscreteStructures-12_Counting_and_Probability_1.pdf", + "date": "20/01/2024" + }, + { + "name": "501044-DiscreteStructures-13_Counting_and_Probability_2.pdf", + "type": "pdf", + "url": "documents/discrete_structures/501044-DiscreteStructures-13_Counting_and_Probability_2.pdf", + "date": "28/01/2024" + }, + { + "name": "501044-DiscreteStructures-14_Graphs_and_Trees_1.pdf", + "type": "pdf", + "url": "documents/discrete_structures/501044-DiscreteStructures-14_Graphs_and_Trees_1.pdf", + "date": "05/02/2024" + }, + { + "name": "501044-DiscreteStructures-15_Graphs_and_Trees_2 (1).pdf", + "type": "pdf", + "url": "documents/discrete_structures/501044-DiscreteStructures-15_Graphs_and_Trees_2 (1).pdf", + "date": "12/02/2024" + }, + { + "name": "501044-DiscreteStructures-1_PropositionalLogic.pdf", + "type": "pdf", + "url": "documents/discrete_structures/501044-DiscreteStructures-1_PropositionalLogic.pdf", + "date": "20/02/2024" + }, + { + "name": "501044-DiscreteStructures-2-FirstOrderLogic.pdf", + "type": "pdf", + "url": "documents/discrete_structures/501044-DiscreteStructures-2-FirstOrderLogic.pdf", + "date": "28/02/2024" + }, + { + "name": "501044-DiscreteStructures-3_Proof_Techniques.pdf", + "type": "pdf", + "url": "documents/discrete_structures/501044-DiscreteStructures-3_Proof_Techniques.pdf", + "date": "05/03/2024" + }, + { + "name": "501044-DiscreteStructures-4_5_NumberTheory.pdf", + "type": "pdf", + "url": "documents/discrete_structures/501044-DiscreteStructures-4_5_NumberTheory.pdf", + "date": "15/03/2024" + }, + { + "name": "501044-DiscreteStructures-6_7_Sequences_and_Recursion.pdf", + "type": "pdf", + "url": "documents/discrete_structures/501044-DiscreteStructures-6_7_Sequences_and_Recursion.pdf", + "date": "22/03/2024" + }, + { + "name": "501044-DiscreteStructures-9_Relations1.pdf", + "type": "pdf", + "url": "documents/discrete_structures/501044-DiscreteStructures-9_Relations1.pdf", + "date": "02/04/2024" + }, + { + "name": "501044-DiscreteStructures-9_Relations2.pdf", + "type": "pdf", + "url": "documents/discrete_structures/501044-DiscreteStructures-9_Relations2.pdf", + "date": "10/04/2024" + } + ] +} \ No newline at end of file diff --git a/data/details/dsa.json b/data/details/dsa.json new file mode 100644 index 0000000000000000000000000000000000000000..38af251e8e5ba4bfbad3d3e532ae86113e040611 --- /dev/null +++ b/data/details/dsa.json @@ -0,0 +1,102 @@ +{ + "id": "dsa", + "name": "Cấu trúc dữ liệu và giải thuật", + "files": [ + { + "name": "01_ADT.pdf", + "type": "pdf", + "url": "documents/DSA/01_ADT.pdf", + "date": "05/01/2023" + }, + { + "name": "02_Linked List.pdf", + "type": "pdf", + "url": "documents/DSA/02_Linked List.pdf", + "date": "10/01/2023" + }, + { + "name": "03_Stack_Queue.pdf", + "type": "pdf", + "url": "documents/DSA/03_Stack_Queue.pdf", + "date": "20/01/2023" + }, + { + "name": "04-Recursion.pdf", + "type": "pdf", + "url": "documents/DSA/04-Recursion.pdf", + "date": "02/02/2023" + }, + { + "name": "05-Analysis-of-Algorithms.pdf", + "type": "pdf", + "url": "documents/DSA/05-Analysis-of-Algorithms.pdf", + "date": "10/02/2023" + }, + { + "name": "06-Sorting.pdf", + "type": "pdf", + "url": "documents/DSA/06-Sorting.pdf", + "date": "15/02/2023" + }, + { + "name": "07-Hashing.pdf", + "type": "pdf", + "url": "documents/DSA/07-Hashing.pdf", + "date": "25/02/2023" + }, + { + "name": "08_BST.pdf", + "type": "pdf", + "url": "documents/DSA/08_BST.pdf", + "date": "05/03/2023" + }, + { + "name": "09_AVL.pdf", + "type": "pdf", + "url": "documents/DSA/09_AVL.pdf", + "date": "12/03/2023" + }, + { + "name": "0_Introduction.pdf", + "type": "pdf", + "url": "documents/DSA/0_Introduction.pdf", + "date": "20/03/2023" + }, + { + "name": "10_PriorityQueue_BinaryMaxHeap.pdf", + "type": "pdf", + "url": "documents/DSA/10_PriorityQueue_BinaryMaxHeap.pdf", + "date": "02/04/2023" + }, + { + "name": "11_Graph_Basic.pdf", + "type": "pdf", + "url": "documents/DSA/11_Graph_Basic.pdf", + "date": "10/04/2023" + }, + { + "name": "12_BFS_DFS.pdf", + "type": "pdf", + "url": "documents/DSA/12_BFS_DFS.pdf", + "date": "20/04/2023" + }, + { + "name": "13_MST.pdf", + "type": "pdf", + "url": "documents/DSA/13_MST.pdf", + "date": "01/05/2023" + }, + { + "name": "14_Dijkstra.pdf", + "type": "pdf", + "url": "documents/DSA/14_Dijkstra.pdf", + "date": "05/05/2023" + }, + { + "name": "15_BellmanFord.pdf", + "type": "pdf", + "url": "documents/DSA/15_BellmanFord.pdf", + "date": "10/05/2023" + } + ] +} \ No newline at end of file diff --git a/data/details/dsa_lab.json b/data/details/dsa_lab.json new file mode 100644 index 0000000000000000000000000000000000000000..5a9e7771f00eb7857556beaaa8f587746b66781b --- /dev/null +++ b/data/details/dsa_lab.json @@ -0,0 +1,77 @@ +{ + "id": "dsa_lab", + "name": "Thực hành CTDLGT", + "noteHtml": "Bạn có thể xem đoạn code tham khảo hoặc bài giải tham khảo ngay tại đây.", + "files": [ + { + "name": "Lab1.pdf", + "url": "documents/DSA_code/Lab1.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "517.22 KB" + }, + { + "name": "Lab2.pdf", + "url": "documents/DSA_code/Lab2.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "581.16 KB" + }, + { + "name": "Lab3.pdf", + "url": "documents/DSA_code/Lab3.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "627.53 KB" + }, + { + "name": "Lab4.pdf", + "url": "documents/DSA_code/Lab4.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "769.08 KB" + }, + { + "name": "Lab5.pdf", + "url": "documents/DSA_code/Lab5.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "512.84 KB" + }, + { + "name": "Lab6.pdf", + "url": "documents/DSA_code/Lab6.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "810.02 KB" + }, + { + "name": "Lab7.pdf", + "url": "documents/DSA_code/Lab7.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "649.23 KB" + }, + { + "name": "Lab8.pdf", + "url": "documents/DSA_code/Lab8.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "674.59 KB" + }, + { + "name": "Lab9.pdf", + "url": "documents/DSA_code/Lab9.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "711.26 KB" + }, + { + "name": "Lab10.pdf", + "url": "documents/DSA_code/Lab10.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "671.40 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/flutter.json b/data/details/flutter.json new file mode 100644 index 0000000000000000000000000000000000000000..a320c6dac6ebf3ae62e35a3939d77144658ff46d --- /dev/null +++ b/data/details/flutter.json @@ -0,0 +1,72 @@ +{ + "id": "flutter", + "name": "Phát triển ứng dụng đa nền tảng", + "files": [ + { + "name": "502071_Chapter 0. Introduction to the course.pdf", + "type": "pdf", + "url": "documents/flutter/502071_Chapter 0. Introduction to the course.pdf", + "date": "02/01/2025" + }, + { + "name": "502071_Chapter 1. Introduction to Dart.pdf", + "type": "pdf", + "url": "documents/flutter/502071_Chapter 1. Introduction to Dart.pdf", + "date": "10/01/2025" + }, + { + "name": "502071_Chapter 2. Getting Started to Flutter.pdf", + "type": "pdf", + "url": "documents/flutter/502071_Chapter 2. Getting Started to Flutter.pdf", + "date": "18/01/2025" + }, + { + "name": "502071_Chapter 3. Layout widgets.pdf", + "type": "pdf", + "url": "documents/flutter/502071_Chapter 3. Layout widgets.pdf", + "date": "25/01/2025" + }, + { + "name": "502071_Chapter 4. List-based widgets.pdf", + "type": "pdf", + "url": "documents/flutter/502071_Chapter 4. List-based widgets.pdf", + "date": "05/02/2025" + }, + { + "name": "502071_Chapter 5. Material Navigation Widgets.pdf", + "type": "pdf", + "url": "documents/flutter/502071_Chapter 5. Material Navigation Widgets.pdf", + "date": "15/02/2025" + }, + { + "name": "502071_Chapter 6. Working with Forms in Flutter.pdf", + "type": "pdf", + "url": "documents/flutter/502071_Chapter 6. Working with Forms in Flutter.pdf", + "date": "25/02/2025" + }, + { + "name": "502071_Chapter 7. Navigation and Routing.pdf", + "type": "pdf", + "url": "documents/flutter/502071_Chapter 7. Navigation and Routing.pdf", + "date": "10/03/2025" + }, + { + "name": "502071_Chapter 8. Dialogs.pdf", + "type": "pdf", + "url": "documents/flutter/502071_Chapter 8. Dialogs.pdf", + "date": "25/03/2025" + }, + { + "name": "502071_Chapter 9. Persistence.pdf", + "type": "pdf", + "url": "documents/flutter/502071_Chapter 9. Persistence.pdf", + "date": "10/04/2025" + }, + { + "name": "502071_Chapter 10. Networking.pdf", + "type": "pdf", + "url": "documents/flutter/502071_Chapter 10. Networking.pdf", + "date": "25/04/2025" + } + ] +} \ No newline at end of file diff --git a/data/details/game_dev.json b/data/details/game_dev.json new file mode 100644 index 0000000000000000000000000000000000000000..40a9e3dd5afc33b3071f6d778bbd51033e689be6 --- /dev/null +++ b/data/details/game_dev.json @@ -0,0 +1,83 @@ +{ + "id": "game_dev", + "name": "Phát triển game Unity", + "files": [ + { + "name": "Lecture00- Introduction.pptx", + "type": "ppt", + "url": "documents/game_dev/Lecture00- Introduction.pptx", + "size": "2.15 MB", + "date": "05/09/2025" + }, + { + "name": "lecture01 Introduction. C# and Unity3D Basics.pdf", + "type": "pdf", + "url": "documents/game_dev/lecture01 Introduction.pdf", + "size": "864 KB", + "date": "12/09/2025" + }, + { + "name": "lecture02 3D Games and User Input.pdf", + "type": "pdf", + "url": "documents/game_dev/lecture02 3D Games and User Input.pdf", + "size": "2.22 MB", + "date": "18/09/2025" + }, + { + "name": "lecture03 3D Games Models and Physics.pdf", + "type": "pdf", + "url": "documents/game_dev/lecture03 3D Games Models and Physics.pdf", + "size": "2.89 MB", + "date": "25/09/2025" + }, + { + "name": "lecture04 Cameras, Audio, Lights and Shadows.pdf", + "type": "pdf", + "url": "documents/game_dev/lecture04 Cameras, Audio, Lights and Shadows.pdf", + "size": "2.22 MB", + "date": "02/10/2025" + }, + { + "name": "lecture05 Terrains.pdf", + "type": "pdf", + "url": "documents/game_dev/lecture05 Terrains.pdf", + "size": "6.71 MB", + "date": "10/10/2025" + }, + { + "name": "lecture06 GUIs, Menus and Particle Systems.pdf", + "type": "pdf", + "url": "documents/game_dev/lecture06 GUIs, Menus and Particle Systems.pdf", + "size": "1.29 MB", + "date": "20/10/2025" + }, + { + "name": "lecture07 Persistance and Animations.pdf", + "type": "pdf", + "url": "documents/game_dev/lecture07 Persistance and Animations.pdf", + "size": "1.06 MB", + "date": "30/10/2025" + }, + { + "name": "lecture08 Steering and Navigation.pdf", + "type": "pdf", + "url": "documents/game_dev/lecture08 Steering and Navigation.pdf", + "size": "1.41 MB", + "date": "08/11/2025" + }, + { + "name": "lecture09 Game AI Decision Making.pdf", + "type": "pdf", + "url": "documents/game_dev/lecture09 Game AI Decision Making.pdf", + "size": "1.14 MB", + "date": "15/11/2025" + }, + { + "name": "lecture10 2D Games.pdf", + "type": "pdf", + "url": "documents/game_dev/lecture10 2D Games.pdf", + "size": "1.36 MB", + "date": "25/11/2025" + } + ] +} \ No newline at end of file diff --git a/data/details/information_security.json b/data/details/information_security.json new file mode 100644 index 0000000000000000000000000000000000000000..abd39d9d6c64a13113f52af2e241ea419b2d579f --- /dev/null +++ b/data/details/information_security.json @@ -0,0 +1,30 @@ +{ + "id": "information_security", + "name": "Bảo mật thông tin", + "files": [ + { + "name": "502049_Introduction to Information Security_Chapter 1_Security management concepts and principles.pdf", + "type": "pdf", + "url": "documents/information_security/502049_Introduction to Information Security_Chapter 1_Security management concepts and principles.pdf", + "date": "05/01/2025" + }, + { + "name": "502049_Introduction to Information Security_Chapter 2_Attacks.pdf", + "type": "pdf", + "url": "documents/information_security/502049_Introduction to Information Security_Chapter 2_Attacks.pdf", + "date": "15/01/2025" + }, + { + "name": "Lec 3_Identification and Authentication.pdf", + "type": "pdf", + "url": "documents/information_security/Lec 3_Identification and Authentication.pdf", + "date": "25/02/2025" + }, + { + "name": "[01_GiaoTrinh]_Computer Security Wiley.pdf", + "type": "pdf", + "url": "documents/information_security/[01_GiaoTrinh]_Computer Security Wiley.pdf", + "date": "10/03/2025" + } + ] +} \ No newline at end of file diff --git a/data/details/internship.json b/data/details/internship.json new file mode 100644 index 0000000000000000000000000000000000000000..9a5a9af76d3f0a4ad93ca890359eede47a506f6f --- /dev/null +++ b/data/details/internship.json @@ -0,0 +1,27 @@ +{ + "id": "internship", + "name": "Cẩm nang thực tập", + "files": [ + { + "name": "KTCN-SinhVien.pdf", + "url": "documents/internship/KTCN-SinhVien.pdf", + "type": "pdf", + "date": "01/01/2026", + "size": "9.41 MB" + }, + { + "name": "TSNN-SinhVien.pdf", + "url": "documents/internship/TSNN-SinhVien.pdf", + "type": "pdf", + "date": "01/01/2026", + "size": "8.35 MB" + }, + { + "name": "Video-ThucTap.pdf", + "url": "documents/internship/Video-ThucTap.pdf", + "type": "pdf", + "date": "01/01/2026", + "size": "140 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/java_web.json b/data/details/java_web.json new file mode 100644 index 0000000000000000000000000000000000000000..c9cbaebdebd6c21d32031c82a64f144ed01710f8 --- /dev/null +++ b/data/details/java_web.json @@ -0,0 +1,60 @@ +{ + "id": "java_web", + "name": "Lập trình web với Java (JSP - Servlet)", + "files": [ + { + "name": "503111_Java Technology_Chapter 0. Introduction to the course.pdf", + "type": "pdf", + "url": "documents/java_web/503111_Java Technology_Chapter 0. Introduction to the course.pdf", + "date": "05/01/2025" + }, + { + "name": "503111_Java Technology_Chapter 1. Introduction to Java Development.pdf", + "type": "pdf", + "url": "documents/java_web/503111_Java Technology_Chapter 1. Introduction to Java Development.pdf", + "date": "15/01/2025" + }, + { + "name": "503111_Java Technology_Chapter 2. JDBC.pdf", + "type": "pdf", + "url": "documents/java_web/503111_Java Technology_Chapter 2. JDBC.pdf", + "date": "25/01/2025" + }, + { + "name": "503111_Java Technology_Chapter 3. Hibernate.pdf", + "type": "pdf", + "url": "documents/java_web/503111_Java Technology_Chapter 3. Hibernate.pdf", + "date": "05/02/2025" + }, + { + "name": "503111_Java Technology_Chapter 4-5. Servlet and JSP.pdf", + "type": "pdf", + "url": "documents/java_web/503111_Java Technology_Chapter 4-5. Servlet and JSP.pdf", + "date": "15/02/2025" + }, + { + "name": "503111_Java Technology_Chapter 6. Spring Framework.pdf", + "type": "pdf", + "url": "documents/java_web/503111_Java Technology_Chapter 6. Spring Framework.pdf", + "date": "25/02/2025" + }, + { + "name": "503111_Java Technology_Chapter 7. Spring Data JPA.pdf", + "type": "pdf", + "url": "documents/java_web/503111_Java Technology_Chapter 7. Spring Data JPA.pdf", + "date": "10/03/2025" + }, + { + "name": "503111_Java Technology_Chapter 8-9. Spring MVC.pdf", + "type": "pdf", + "url": "documents/java_web/503111_Java Technology_Chapter 8-9. Spring MVC.pdf", + "date": "25/03/2025" + }, + { + "name": "503111_Java Technology_Chapter 10. Spring Security.pdf", + "type": "pdf", + "url": "documents/java_web/503111_Java Technology_Chapter 10. Spring Security.pdf", + "date": "10/04/2025" + } + ] +} \ No newline at end of file diff --git a/data/details/kaizen_5s.json b/data/details/kaizen_5s.json new file mode 100644 index 0000000000000000000000000000000000000000..f580b60642e18e1a3b20238afc0079a13fdcd021 --- /dev/null +++ b/data/details/kaizen_5s.json @@ -0,0 +1,55 @@ +{ + "id": "kaizen_5s", + "name": "Kĩ năng Kaizen & 5S", + "files": [ + { + "name": "Chia sẻ cảm nhận sau khi thực hành 5S.pdf", + "type": "pdf", + "url": "documents/Kaizen_5S/Chia sẻ cảm nhận sau khi thực hành 5S.pdf", + "date": "10/02/2026", + "size": "134.98 KB" + }, + { + "name": "Bài tập lớn (L00047_522H0081_TranHuuDat).pdf", + "type": "pdf", + "url": "documents/Kaizen_5S/L00047_522H0081_TranHuuDat.pdf", + "date": "10/02/2026", + "size": "1.01 MB" + }, + { + "name": "Tiêu chí đánh giá.pdf", + "type": "pdf", + "url": "documents/Kaizen_5S/TIEU CHI DANH GIA.pdf", + "date": "10/02/2026", + "size": "134.74 KB" + }, + { + "name": "Giới thiệu 5S.pdf", + "type": "pdf", + "url": "documents/Kaizen_5S/gioi-thieu.pdf", + "date": "27/02/2026", + "size": "2.83 MB" + }, + { + "name": "Khái niệm 5S.pdf", + "type": "pdf", + "url": "documents/Kaizen_5S/khai-niem.pdf", + "date": "27/02/2026", + "size": "1.03 MB" + }, + { + "name": "Thực hiện 5S.pdf", + "type": "pdf", + "url": "documents/Kaizen_5S/thuc-hieen-5S.pdf", + "date": "27/02/2026", + "size": "2.34 MB" + }, + { + "name": "Tổng quan 5S.pdf", + "type": "pdf", + "url": "documents/Kaizen_5S/tong-quan-5s.pdf", + "date": "27/02/2026", + "size": "2.97 MB" + } + ] +} \ No newline at end of file diff --git a/data/details/knthcm.json b/data/details/knthcm.json new file mode 100644 index 0000000000000000000000000000000000000000..e669aa35b013e49d60b4b060717f251f439a1739 --- /dev/null +++ b/data/details/knthcm.json @@ -0,0 +1,34 @@ +{ + "id": "knthcm", + "name": "Ôn tập Kĩ năng thực hành chuyên môn", + "files": [ + { + "name": "Đề ôn tập KNTHCM 2024-2025.pdf", + "url": "documents/KNTHCM/Namhoc-2024-2025.pdf", + "type": "pdf", + "date": "05/02/2026", + "size": "151.31 KB" + }, + { + "name": "Đề ôn tập KNTHCM 2023-2024.pdf", + "url": "documents/KNTHCM/Namhoc-2023-2024.pdf", + "type": "pdf", + "date": "05/02/2026", + "size": "178.33 KB" + }, + { + "name": "Đề ôn tập KHMT - T11 - 2025.pdf", + "url": "documents/KNTHCM/KHMT -T11 - 2025.pdf", + "type": "pdf", + "date": "13/03/2026", + "size": "125.27 KB" + }, + { + "name": "Đề ôn tập MMT - T11 - 2025.pdf", + "url": "documents/KNTHCM/MMT - T11 - 2025.pdf", + "type": "pdf", + "date": "13/03/2026", + "size": "152.92 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/ktcn.json b/data/details/ktcn.json new file mode 100644 index 0000000000000000000000000000000000000000..87a88ae23e81924779095b354774a424ac2fec57 --- /dev/null +++ b/data/details/ktcn.json @@ -0,0 +1,48 @@ +{ + "id": "ktcn", + "name": "Kiến tập công nghiệp", + "files": [ + { + "name": "BM01_XacNhanThucTap.docx", + "url": "documents/KTCN/BM01_XacNhanThucTap.docx", + "type": "docx", + "date": "01/01/2026", + "size": "3.58 MB" + }, + { + "name": "BM02_PhieuDiemDanh_DoanhNghiep.docx", + "url": "documents/KTCN/BM02_PhieuDiemDanh_DoanhNghiep.docx", + "type": "docx", + "date": "01/01/2026", + "size": "22.12 KB" + }, + { + "name": "BM03_PhieuDiemDanh_GVGS.docx", + "url": "documents/KTCN/BM03_PhieuDiemDanh_GVGS.docx", + "type": "docx", + "date": "01/01/2026", + "size": "21.98 KB" + }, + { + "name": "BM04_PhieuChamDiem_DoanhNghiep.docx", + "url": "documents/KTCN/BM04_PhieuChamDiem_DoanhNghiep.docx", + "type": "docx", + "date": "01/01/2026", + "size": "32.74 KB" + }, + { + "name": "BM05_PhieuChamDiem_GVGS.docx", + "url": "documents/KTCN/BM05_PhieuChamDiem_GVGS.docx", + "type": "docx", + "date": "01/01/2026", + "size": "24.01 KB" + }, + { + "name": "BM06_PhieuChamDiem_GVPB.docx", + "url": "documents/KTCN/BM06_PhieuChamDiem_GVPB.docx", + "type": "docx", + "date": "01/01/2026", + "size": "24.12 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/linear_algebra.json b/data/details/linear_algebra.json new file mode 100644 index 0000000000000000000000000000000000000000..879c896c336f1ebc216f34e24efad15c8f8eeb06 --- /dev/null +++ b/data/details/linear_algebra.json @@ -0,0 +1,144 @@ +{ + "id": "linear_algebra", + "name": "Đại số tuyến tính", + "files": [ + { + "name": "Lecture 01.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 01.pdf", + "date": "05/01/2023" + }, + { + "name": "Lecture 02.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 02.pdf", + "date": "10/01/2023" + }, + { + "name": "Lecture 03.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 03.pdf", + "date": "15/01/2023" + }, + { + "name": "Lecture 04.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 04.pdf", + "date": "20/01/2023" + }, + { + "name": "Lecture 05.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 05.pdf", + "date": "02/02/2023" + }, + { + "name": "Lecture 06.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 06.pdf", + "date": "05/02/2023" + }, + { + "name": "Lecture 07.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 07.pdf", + "date": "12/02/2023" + }, + { + "name": "Lecture 08.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 08.pdf", + "date": "15/02/2023" + }, + { + "name": "Lecture 09.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 09.pdf", + "date": "20/02/2023" + }, + { + "name": "Lecture 10.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 10.pdf", + "date": "01/03/2023" + }, + { + "name": "Lecture 11.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 11.pdf", + "date": "05/03/2023" + }, + { + "name": "Lecture 12.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 12.pdf", + "date": "10/03/2023" + }, + { + "name": "Lecture 13.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 13.pdf", + "date": "15/03/2023" + }, + { + "name": "Lecture 14.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 14.pdf", + "date": "20/03/2023" + }, + { + "name": "Lecture 15 .pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 15 .pdf", + "date": "01/04/2023" + }, + { + "name": "Lecture 16.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 16.pdf", + "date": "05/04/2023" + }, + { + "name": "Lecture 17.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 17.pdf", + "date": "10/04/2023" + }, + { + "name": "Lecture 18.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 18.pdf", + "date": "15/04/2023" + }, + { + "name": "Lecture 19.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 19.pdf", + "date": "20/04/2023" + }, + { + "name": "Lecture 20.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 20.pdf", + "date": "01/05/2023" + }, + { + "name": "Lecture 21.pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 21.pdf", + "date": "05/05/2023" + }, + { + "name": "Lecture 22 (Revision).pdf", + "type": "pdf", + "url": "documents/linear_algebra/Lecture 22 (Revision).pdf", + "date": "10/05/2023" + }, + { + "name": "dai_so-tuyen_tinh.pdf", + "type": "pdf", + "url": "documents/linear_algebra/dai_so-tuyen_tinh.pdf", + "date": "15/05/2023" + } + ] +} \ No newline at end of file diff --git a/data/details/linear_algebra_python.json b/data/details/linear_algebra_python.json new file mode 100644 index 0000000000000000000000000000000000000000..7a314cdf2ab40143ab0873949fa22514ee5c7194 --- /dev/null +++ b/data/details/linear_algebra_python.json @@ -0,0 +1,77 @@ +{ + "id": "linear_algebra_python", + "name": "Thực hành Đại số tuyến tính với Python", + "noteHtml": "Bạn có thể xem đoạn code tham khảo hoặc bài giải tham khảo ngay tại đây.", + "files": [ + { + "name": "Essay_Algebra_2023.pdf", + "url": "documents/linear_algebra_code/Essay_Algebra_2023.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "374.79 KB" + }, + { + "name": "lab07.pdf", + "url": "documents/linear_algebra_code/lab07.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "116.04 KB" + }, + { + "name": "lab08-09.pdf", + "url": "documents/linear_algebra_code/lab08-09.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "211.03 KB" + }, + { + "name": "Lab1.pdf", + "url": "documents/linear_algebra_code/Lab1.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "112.74 KB" + }, + { + "name": "lab10.pdf", + "url": "documents/linear_algebra_code/lab10.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "109.62 KB" + }, + { + "name": "Lab2_3.pdf", + "url": "documents/linear_algebra_code/Lab2_3.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "111.69 KB" + }, + { + "name": "Lab4.pdf", + "url": "documents/linear_algebra_code/Lab4.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "149.38 KB" + }, + { + "name": "Lab5.pdf", + "url": "documents/linear_algebra_code/Lab5.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "401.80 KB" + }, + { + "name": "Lab6.pdf", + "url": "documents/linear_algebra_code/Lab6.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "138.62 KB" + }, + { + "name": "Lab9_add.pdf", + "url": "documents/linear_algebra_code/Lab9_add.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "48.99 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/machine_learning.json b/data/details/machine_learning.json new file mode 100644 index 0000000000000000000000000000000000000000..a22e200b7760a0636668d925ff2c1ef2fa0572ce --- /dev/null +++ b/data/details/machine_learning.json @@ -0,0 +1,96 @@ +{ + "id": "machine_learning", + "name": "Nhập môn Học máy", + "files": [ + { + "name": "Lecture 0 - Introduction to ML-2023.pdf", + "type": "pdf", + "url": "documents/machine_learning/Lecture 0 - Introduction to ML-2023.pdf", + "date": "05/05/2024" + }, + { + "name": "Lecture 1 - Data Preparation for ML.pdf", + "type": "pdf", + "url": "documents/machine_learning/Lecture 1 - Data Preparation for ML.pdf", + "date": "12/05/2024" + }, + { + "name": "Lecture 2 - Principle of Machine Learning.pdf", + "type": "pdf", + "url": "documents/machine_learning/Lecture 2 - Principle of Machine Learning.pdf", + "date": "20/05/2024" + }, + { + "name": "Lecture 3a - K-Nearest-Neighbors algorithm.pdf", + "type": "pdf", + "url": "documents/machine_learning/Lecture 3a - K-Nearest-Neighbors algorithm.pdf", + "date": "28/05/2024" + }, + { + "name": "Lecture 3b - Evaluation .pdf", + "type": "pdf", + "url": "documents/machine_learning/Lecture 3b - Evaluation .pdf", + "date": "02/06/2024" + }, + { + "name": "Lecture 4 - Decision tree.pdf", + "type": "pdf", + "url": "documents/machine_learning/Lecture 4 - Decision tree.pdf", + "date": "10/06/2024" + }, + { + "name": "Lecture 5 -naive_bayes_classification.pdf", + "type": "pdf", + "url": "documents/machine_learning/Lecture 5 -naive_bayes_classification.pdf", + "date": "18/06/2024" + }, + { + "name": "Lecture 6 - Unsupervised Learning and Clustering.pdf", + "type": "pdf", + "url": "documents/machine_learning/Lecture 6 - Unsupervised Learning and Clustering.pdf", + "date": "25/06/2024" + }, + { + "name": "Lecture 7 - svm-kernel method.pdf", + "type": "pdf", + "url": "documents/machine_learning/Lecture 7 - svm-kernel method.pdf", + "date": "02/07/2024" + }, + { + "name": "Lecture 8.3 - Classification with softmax function.pdf", + "type": "pdf", + "url": "documents/machine_learning/Lecture 8.3 - Classification with softmax function.pdf", + "date": "10/07/2024" + }, + { + "name": "Lecture 9- Linear Regression and Gradient Descent.pdf", + "type": "pdf", + "url": "documents/machine_learning/Lecture 9- Linear Regression and Gradient Descent.pdf", + "date": "18/07/2024" + }, + { + "name": "Lecture 10 - Neural Networks and Backpropagation Algorithm.pdf", + "type": "pdf", + "url": "documents/machine_learning/Lecture 10 - Neural Networks and Backpropagation Algorithm.pdf", + "date": "25/07/2024" + }, + { + "name": "Lecture 11- Ensemble Learning.pdf", + "type": "pdf", + "url": "documents/machine_learning/Lecture 11- Ensemble Learning.pdf", + "date": "02/08/2024" + }, + { + "name": "Lecture Overfiting.pdf", + "type": "pdf", + "url": "documents/machine_learning/Lecture Overfiting.pdf", + "date": "08/08/2024" + }, + { + "name": "Seminar - DL Introduction 2.pdf", + "type": "pdf", + "url": "documents/machine_learning/Seminar - DL Introduction 2.pdf", + "date": "15/08/2024" + } + ] +} \ No newline at end of file diff --git a/data/details/mobile_app.json b/data/details/mobile_app.json new file mode 100644 index 0000000000000000000000000000000000000000..268974e4b42bbb485121e7714311d8c74bd47342 --- /dev/null +++ b/data/details/mobile_app.json @@ -0,0 +1,144 @@ +{ + "id": "mobile_app", + "name": "Phát triển ứng dụng di động", + "files": [ + { + "name": "503074_00. Course Introduction.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_00. Course Introduction.pdf", + "date": "02/01/2025" + }, + { + "name": "503074_01. Introduction to Android.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_01. Introduction to Android.pdf", + "date": "08/01/2025" + }, + { + "name": "503074_02. Create Your First Android App.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_02. Create Your First Android App.pdf", + "date": "15/01/2025" + }, + { + "name": "503074_03. Activity lifecycle and state.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_03. Activity lifecycle and state.pdf", + "date": "22/01/2025" + }, + { + "name": "503074_04. Graphical User Interfaces.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_04. Graphical User Interfaces.pdf", + "date": "29/01/2025" + }, + { + "name": "503074_05-1. Selection-Widgets - Part1.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_05-1. Selection-Widgets - Part1.pdf", + "date": "05/02/2025" + }, + { + "name": "503074_05-2. Selection-Widgets - Part2.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_05-2. Selection-Widgets - Part2.pdf", + "date": "08/02/2025" + }, + { + "name": "503074_05-3. Recycler View.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_05-3. Recycler View.pdf", + "date": "12/02/2025" + }, + { + "name": "503074_05-4. Android Fragments.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_05-4. Android Fragments.pdf", + "date": "15/02/2025" + }, + { + "name": "503074_05-5. ActionBar Menus.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_05-5. ActionBar Menus.pdf", + "date": "19/02/2025" + }, + { + "name": "503074_06-1. Activities and Intents.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_06-1. Activities and Intents.pdf", + "date": "22/02/2025" + }, + { + "name": "503074_06-2. Starting Activities with Implicit Intents.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_06-2. Starting Activities with Implicit Intents.pdf", + "date": "26/02/2025" + }, + { + "name": "503074_07-1. AsyncTask and AsyncTaskLoader.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_07-1. AsyncTask and AsyncTaskLoader.pdf", + "date": "01/03/2025" + }, + { + "name": "503074_07-2. Efficient data transfer and JobScheduler.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_07-2. Efficient data transfer and JobScheduler.pdf", + "date": "05/03/2025" + }, + { + "name": "503074_08-1. Storing Data.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_08-1. Storing Data.pdf", + "date": "08/03/2025" + }, + { + "name": "503074_08-2. Shared Preferences.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_08-2. Shared Preferences.pdf", + "date": "12/03/2025" + }, + { + "name": "503074_08-3. SQLite Database.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_08-3. SQLite Database.pdf", + "date": "15/03/2025" + }, + { + "name": "503074_08-4. Room LiveData and ViewModel.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_08-4. Room LiveData and ViewModel.pdf", + "date": "19/03/2025" + }, + { + "name": "503074_09. Internet connection.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_09. Internet connection.pdf", + "date": "02/04/2025" + }, + { + "name": "503074_10-1. Broadcasts.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_10-1. Broadcasts.pdf", + "date": "15/04/2025" + }, + { + "name": "503074_10-2. Services.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_10-2. Services.pdf", + "date": "25/04/2025" + }, + { + "name": "503074_11-1. Notifications.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_11-1. Notifications.pdf", + "date": "10/05/2025" + }, + { + "name": "503074_11-2. Location.pdf", + "type": "pdf", + "url": "documents/mobile_app/503074_11-2. Location.pdf", + "date": "20/05/2025" + } + ] +} \ No newline at end of file diff --git a/data/details/nodejs.json b/data/details/nodejs.json new file mode 100644 index 0000000000000000000000000000000000000000..f43b1e3b50fa06815b5a5df2d665f24fb9bd6a91 --- /dev/null +++ b/data/details/nodejs.json @@ -0,0 +1,72 @@ +{ + "id": "nodejs", + "name": "Lập trình web với Nodejs", + "files": [ + { + "name": "0. Introduction.pdf", + "type": "pdf", + "url": "documents/Nodejs/0. Introduction.pdf", + "date": "05/09/2024" + }, + { + "name": "1. Introduction to NodeJS.pdf", + "type": "pdf", + "url": "documents/Nodejs/1. Introduction to NodeJS.pdf", + "date": "15/09/2024" + }, + { + "name": "2. ExpressJS.pdf", + "type": "pdf", + "url": "documents/Nodejs/2. ExpressJS.pdf", + "date": "20/09/2024" + }, + { + "name": "3. Templating.pdf", + "type": "pdf", + "url": "documents/Nodejs/3. Templating.pdf", + "date": "05/10/2024" + }, + { + "name": "4. Form Handling.pdf", + "type": "pdf", + "url": "documents/Nodejs/4. Form Handling.pdf", + "date": "10/10/2024" + }, + { + "name": "5. Cookie and Session.pdf", + "type": "pdf", + "url": "documents/Nodejs/5. Cookie and Session.pdf", + "date": "20/10/2024" + }, + { + "name": "6. Middleware.pdf", + "type": "pdf", + "url": "documents/Nodejs/6. Middleware.pdf", + "date": "25/10/2024" + }, + { + "name": "7. Routing.pdf", + "type": "pdf", + "url": "documents/Nodejs/7. Routing.pdf", + "date": "05/11/2024" + }, + { + "name": "8. Rest API and JSON.pdf", + "type": "pdf", + "url": "documents/Nodejs/8. Rest API and JSON.pdf", + "date": "15/11/2024" + }, + { + "name": "9. Static Content.pdf", + "type": "pdf", + "url": "documents/Nodejs/9. Static Content.pdf", + "date": "25/11/2024" + }, + { + "name": "10. Integrating with third party.pdf", + "type": "pdf", + "url": "documents/Nodejs/10. Integrating with third party.pdf", + "date": "10/12/2024" + } + ] +} \ No newline at end of file diff --git a/data/details/oop.json b/data/details/oop.json new file mode 100644 index 0000000000000000000000000000000000000000..b9afc46a92b38204afa6243415354d4be28a2bcc --- /dev/null +++ b/data/details/oop.json @@ -0,0 +1,96 @@ +{ + "id": "oop", + "name": "Lập trình hướng đối tượng", + "files": [ + { + "name": "0-Introduction.pdf", + "type": "pdf", + "url": "documents/OOP/0-Introduction.pdf", + "date": "05/01/2023" + }, + { + "name": "Chương0.pdf", + "type": "pdf", + "url": "documents/OOP/Chương0.pdf", + "date": "10/01/2023" + }, + { + "name": "Chương1-2.pdf", + "type": "pdf", + "url": "documents/OOP/Chương1-2.pdf", + "date": "15/01/2023" + }, + { + "name": "Chương3.pdf", + "type": "pdf", + "url": "documents/OOP/Chương3.pdf", + "date": "20/01/2023" + }, + { + "name": "Chương3_2.pdf", + "type": "pdf", + "url": "documents/OOP/Chương3_2.pdf", + "date": "02/02/2023" + }, + { + "name": "Chương4.pdf", + "type": "pdf", + "url": "documents/OOP/Chương4.pdf", + "date": "10/02/2023" + }, + { + "name": "Chương5.pdf", + "type": "pdf", + "url": "documents/OOP/Chương5.pdf", + "date": "18/02/2023" + }, + { + "name": "Chương6-7.pdf", + "type": "pdf", + "url": "documents/OOP/Chương6-7.pdf", + "date": "25/02/2023" + }, + { + "name": "Chương8.pdf", + "type": "pdf", + "url": "documents/OOP/Chương8.pdf", + "date": "05/03/2023" + }, + { + "name": "Chương9.pdf", + "type": "pdf", + "url": "documents/OOP/Chương9.pdf", + "date": "12/03/2023" + }, + { + "name": "Chương10.pdf", + "type": "pdf", + "url": "documents/OOP/Chương10.pdf", + "date": "20/03/2023" + }, + { + "name": "Chương11.pdf", + "type": "pdf", + "url": "documents/OOP/Chương11.pdf", + "date": "02/04/2023" + }, + { + "name": "Chương12.pdf", + "type": "pdf", + "url": "documents/OOP/Chương12.pdf", + "date": "15/04/2023" + }, + { + "name": "Chương13.pdf", + "type": "pdf", + "url": "documents/OOP/Chương13.pdf", + "date": "25/04/2023" + }, + { + "name": "Chương14-15.pdf", + "type": "pdf", + "url": "documents/OOP/Chương14-15.pdf", + "date": "05/05/2023" + } + ] +} \ No newline at end of file diff --git a/data/details/oop_lab.json b/data/details/oop_lab.json new file mode 100644 index 0000000000000000000000000000000000000000..2d1f8f703d0b48650762daa24324116d21d6f3d9 --- /dev/null +++ b/data/details/oop_lab.json @@ -0,0 +1,84 @@ +{ + "id": "oop_lab", + "name": "Thực hành Hướng đối tượng", + "noteHtml": "Bạn có thể xem đoạn code tham khảo hoặc bài giải tham khảo ngay tại đây.", + "files": [ + { + "name": "BaiTapLamThemNhomCa4.pdf", + "url": "documents/OOP_code/BaiTapLamThemNhomCa4.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "151.79 KB" + }, + { + "name": "Lab1.pdf", + "url": "documents/OOP_code/Lab1.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "523.65 KB" + }, + { + "name": "Lab2.pdf", + "url": "documents/OOP_code/Lab2.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "250.52 KB" + }, + { + "name": "Lab3.pdf", + "url": "documents/OOP_code/Lab3.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "221.67 KB" + }, + { + "name": "Lab4.pdf", + "url": "documents/OOP_code/Lab4.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "433.40 KB" + }, + { + "name": "Lab5.pdf", + "url": "documents/OOP_code/Lab5.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "242.92 KB" + }, + { + "name": "Lab6.pdf", + "url": "documents/OOP_code/Lab6.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "478.71 KB" + }, + { + "name": "Lab7.pdf", + "url": "documents/OOP_code/Lab7.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "640.51 KB" + }, + { + "name": "Lab8.pdf", + "url": "documents/OOP_code/Lab8.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "249.68 KB" + }, + { + "name": "Lab9.pdf", + "url": "documents/OOP_code/Lab9.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "216.24 KB" + }, + { + "name": "Lab10.pdf", + "url": "documents/OOP_code/Lab10.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "330.83 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/os.json b/data/details/os.json new file mode 100644 index 0000000000000000000000000000000000000000..b10dade14b1f0785c2c1cb7200155918cb87f8b9 --- /dev/null +++ b/data/details/os.json @@ -0,0 +1,78 @@ +{ + "id": "os", + "name": "Nhập môn hệ điều hành", + "files": [ + { + "name": "ch1 - Intro to OS.pdf", + "type": "pdf", + "url": "documents/OS/ch1 - Intro to OS.pdf", + "date": "05/01/2023" + }, + { + "name": "ch10 - Virtual Memory.pdf", + "type": "pdf", + "url": "documents/OS/ch10 - Virtual Memory.pdf", + "date": "10/01/2023" + }, + { + "name": "ch2 - OS structure.pdf", + "type": "pdf", + "url": "documents/OS/ch2 - OS structure.pdf", + "date": "20/01/2023" + }, + { + "name": "ch3A - Process.pdf", + "type": "pdf", + "url": "documents/OS/ch3A - Process.pdf", + "date": "02/02/2023" + }, + { + "name": "ch3B - Interprocess communication.pdf", + "type": "pdf", + "url": "documents/OS/ch3B - Interprocess communication.pdf", + "date": "15/02/2023" + }, + { + "name": "ch4 - Threads.pdf", + "type": "pdf", + "url": "documents/OS/ch4 - Threads.pdf", + "date": "25/02/2023" + }, + { + "name": "ch5 - CPU Scheduling.pdf", + "type": "pdf", + "url": "documents/OS/ch5 - CPU Scheduling.pdf", + "date": "05/03/2023" + }, + { + "name": "ch5_B - CPU Scheduling.pdf", + "type": "pdf", + "url": "documents/OS/ch5_B - CPU Scheduling.pdf", + "date": "15/03/2023" + }, + { + "name": "ch6 - Synchronization Tools.pdf", + "type": "pdf", + "url": "documents/OS/ch6 - Synchronization Tools.pdf", + "date": "25/03/2023" + }, + { + "name": "ch7 - Synchronization Examples.pdf", + "type": "pdf", + "url": "documents/OS/ch7 - Synchronization Examples.pdf", + "date": "05/04/2023" + }, + { + "name": "ch8 - Deadlocks.pdf", + "type": "pdf", + "url": "documents/OS/ch8 - Deadlocks.pdf", + "date": "15/04/2023" + }, + { + "name": "ch9 - Main Memory.pdf", + "type": "pdf", + "url": "documents/OS/ch9 - Main Memory.pdf", + "date": "25/04/2023" + } + ] +} \ No newline at end of file diff --git a/data/details/os_lab.json b/data/details/os_lab.json new file mode 100644 index 0000000000000000000000000000000000000000..0572174349e60b16d6fc539adb31df9ed361080f --- /dev/null +++ b/data/details/os_lab.json @@ -0,0 +1,196 @@ +{ + "id": "os_lab", + "name": "Thực hành Hệ điều hành", + "noteHtml": "Bạn có thể xem đoạn code tham khảo hoặc bài giải tham khảo ngay tại đây.", + "files": [ + { + "name": "1.1-VN-VirtualBox setup with Ubuntu image.pdf", + "url": "documents/OS_code/1.1-VN-VirtualBox setup with Ubuntu image.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "754.00 KB" + }, + { + "name": "1.2-VN-Linux Commands.pdf", + "url": "documents/OS_code/1.2-VN-Linux Commands.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "578.81 KB" + }, + { + "name": "1.3-VN-UbuntuOnWindows10.pdf", + "url": "documents/OS_code/1.3-VN-UbuntuOnWindows10.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "509.27 KB" + }, + { + "name": "2.1-VN-CompilewithGCC.pdf", + "url": "documents/OS_code/2.1-VN-CompilewithGCC.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "387.59 KB" + }, + { + "name": "2.2-VN-Passing parameterr.pdf", + "url": "documents/OS_code/2.2-VN-Passing parameterr.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "303.65 KB" + }, + { + "name": "2.3-VN-Static_vs_Dynamic_Linking.pdf", + "url": "documents/OS_code/2.3-VN-Static_vs_Dynamic_Linking.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "456.97 KB" + }, + { + "name": "3.1-VN-Quanlytientrinh.pdf", + "url": "documents/OS_code/3.1-VN-Quanlytientrinh.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "637.20 KB" + }, + { + "name": "3.2-VN-TaoTientrinh.pdf", + "url": "documents/OS_code/3.2-VN-TaoTientrinh.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "568.31 KB" + }, + { + "name": "3.3-VN-Caytientrinh.pdf", + "url": "documents/OS_code/3.3-VN-Caytientrinh.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "341.29 KB" + }, + { + "name": "3.4-VN-SyncChildProcess.pdf", + "url": "documents/OS_code/3.4-VN-SyncChildProcess.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "363.29 KB" + }, + { + "name": "4.1-VN-ThreadCreate.pdf", + "url": "documents/OS_code/4.1-VN-ThreadCreate.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "400.29 KB" + }, + { + "name": "4.2-VN-ThreadTiming.pdf", + "url": "documents/OS_code/4.2-VN-ThreadTiming.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "418.53 KB" + }, + { + "name": "4.3-VN-Thaotactaptin.pdf", + "url": "documents/OS_code/4.3-VN-Thaotactaptin.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "321.26 KB" + }, + { + "name": "5.1-VN-LienlacDuongong.pdf", + "url": "documents/OS_code/5.1-VN-LienlacDuongong.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "342.74 KB" + }, + { + "name": "5.2-VN-DuongongDatten.pdf", + "url": "documents/OS_code/5.2-VN-DuongongDatten.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "542.00 KB" + }, + { + "name": "5.3-VN-VungnhoChiase.pdf", + "url": "documents/OS_code/5.3-VN-VungnhoChiase.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "424.64 KB" + }, + { + "name": "5.4-VN-Truyenthongdiep.pdf", + "url": "documents/OS_code/5.4-VN-Truyenthongdiep.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "322.80 KB" + }, + { + "name": "6.1-VN-CPUAffinity.pdf", + "url": "documents/OS_code/6.1-VN-CPUAffinity.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "476.44 KB" + }, + { + "name": "6.2-VN-CPUscheduling.pdf", + "url": "documents/OS_code/6.2-VN-CPUscheduling.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "406.18 KB" + }, + { + "name": "6.3-VN-CPUScheduerFCFS.pdf", + "url": "documents/OS_code/6.3-VN-CPUScheduerFCFS.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "615.90 KB" + }, + { + "name": "6.4-VN-CPUScheduerSJF.pdf", + "url": "documents/OS_code/6.4-VN-CPUScheduerSJF.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "320.35 KB" + }, + { + "name": "6.5-VN-CPUScheduerRR.pdf", + "url": "documents/OS_code/6.5-VN-CPUScheduerRR.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "332.53 KB" + }, + { + "name": "7.1-VN-Nhatquandulieu.pdf", + "url": "documents/OS_code/7.1-VN-Nhatquandulieu.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "313.85 KB" + }, + { + "name": "7.2-VN-GiaiphapPeterson.pdf", + "url": "documents/OS_code/7.2-VN-GiaiphapPeterson.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "303.36 KB" + }, + { + "name": "7.3-VN-HangraoBonho.pdf", + "url": "documents/OS_code/7.3-VN-HangraoBonho.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "406.37 KB" + }, + { + "name": "7.4.-VN-Lenhphancung.pdf", + "url": "documents/OS_code/7.4.-VN-Lenhphancung.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "324.52 KB" + }, + { + "name": "7.5-VN-ThuvienDonnguyen.pdf", + "url": "documents/OS_code/7.5-VN-ThuvienDonnguyen.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "306.29 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/probability_statistics.json b/data/details/probability_statistics.json new file mode 100644 index 0000000000000000000000000000000000000000..91fd1608e096a1ca0200a1b4b5fa6128648f10cb --- /dev/null +++ b/data/details/probability_statistics.json @@ -0,0 +1,48 @@ +{ + "id": "probability_statistics", + "name": "Xác suất thống kê", + "files": [ + { + "name": "502061_APPLIED PROBABILITY AND STATISTICS FOR IT_ch00.pdf", + "type": "pdf", + "url": "documents/probability_statistics/502061_APPLIED PROBABILITY AND STATISTICS FOR IT_ch00.pdf", + "date": "05/06/2023" + }, + { + "name": "502061_APPLIED PROBABILITY AND STATISTICS FOR IT_ch01.pdf", + "type": "pdf", + "url": "documents/probability_statistics/502061_APPLIED PROBABILITY AND STATISTICS FOR IT_ch01.pdf", + "date": "15/06/2023" + }, + { + "name": "502061_APPLIED PROBABILITY AND STATISTICS FOR IT_ch02.pdf", + "type": "pdf", + "url": "documents/probability_statistics/502061_APPLIED PROBABILITY AND STATISTICS FOR IT_ch02.pdf", + "date": "25/06/2023" + }, + { + "name": "502061_APPLIED PROBABILITY AND STATISTICS FOR IT_ch03.pdf", + "type": "pdf", + "url": "documents/probability_statistics/502061_APPLIED PROBABILITY AND STATISTICS FOR IT_ch03.pdf", + "date": "10/07/2023" + }, + { + "name": "502061_APPLIED PROBABILITY AND STATISTICS FOR IT_ch04.pdf", + "type": "pdf", + "url": "documents/probability_statistics/502061_APPLIED PROBABILITY AND STATISTICS FOR IT_ch04.pdf", + "date": "20/07/2023" + }, + { + "name": "502061_APPLIED PROBABILITY AND STATISTICS FOR IT_ch05.pdf", + "type": "pdf", + "url": "documents/probability_statistics/502061_APPLIED PROBABILITY AND STATISTICS FOR IT_ch05.pdf", + "date": "05/08/2023" + }, + { + "name": "502061_APPLIED PROBABILITY AND STATISTICS FOR IT_ch06.pdf", + "type": "pdf", + "url": "documents/probability_statistics/502061_APPLIED PROBABILITY AND STATISTICS FOR IT_ch06.pdf", + "date": "15/08/2023" + } + ] +} \ No newline at end of file diff --git a/data/details/programming_methodology.json b/data/details/programming_methodology.json new file mode 100644 index 0000000000000000000000000000000000000000..5e182d4f8953a0797acdfd9eab1b0dd058041cc6 --- /dev/null +++ b/data/details/programming_methodology.json @@ -0,0 +1,258 @@ +{ + "id": "programming_methodology", + "name": "Phương pháp lập trình", + "files": [ + { + "name": "ADVANCED_Unit7_Testing_and_Debugging.pdf", + "type": "pdf", + "url": "documents/programming_methodology/ADVANCED_Unit7_Testing_and_Debugging.pdf", + "date": "05/08/2022" + }, + { + "name": "PH_Open_Unit1_Computing_Fundamentals.pdf", + "type": "pdf", + "url": "documents/programming_methodology/PH_Open_Unit1_Computing_Fundamentals.pdf", + "date": "10/08/2022" + }, + { + "name": "PH_Open_Unit2_Algorithmic_Problem_Solving.pdf", + "type": "pdf", + "url": "documents/programming_methodology/PH_Open_Unit2_Algorithmic_Problem_Solving.pdf", + "date": "15/08/2022" + }, + { + "name": "PH_Open_Unit3_Extra.pdf", + "type": "pdf", + "url": "documents/programming_methodology/PH_Open_Unit3_Extra.pdf", + "date": "20/08/2022" + }, + { + "name": "PH_Open_Unit3_Overview_of_C_Programming.pdf", + "type": "pdf", + "url": "documents/programming_methodology/PH_Open_Unit3_Overview_of_C_Programming.pdf", + "date": "25/08/2022" + }, + { + "name": "PH_Open_Unit4_Top_Down_Design_and_Functions.pdf", + "type": "pdf", + "url": "documents/programming_methodology/PH_Open_Unit4_Top_Down_Design_and_Functions.pdf", + "date": "02/09/2022" + }, + { + "name": "PH_Open_Unit5_Selection_Statements.pdf", + "type": "pdf", + "url": "documents/programming_methodology/PH_Open_Unit5_Selection_Statements.pdf", + "date": "06/09/2022" + }, + { + "name": "PH_Unit8_Pointers.pdf", + "type": "pdf", + "url": "documents/programming_methodology/PH_Unit8_Pointers.pdf", + "date": "12/09/2022" + }, + { + "name": "Unit10_Multidimensional_Arrays.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Unit10_Multidimensional_Arrays.pdf", + "date": "15/09/2022" + }, + { + "name": "Unit11_Random_Numbers.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Unit11_Random_Numbers.pdf", + "date": "20/09/2022" + }, + { + "name": "Unit12_UNIX_IO_Redirection.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Unit12_UNIX_IO_Redirection.pdf", + "date": "25/09/2022" + }, + { + "name": "Unit14_Functions_with_Pointer_Parameters.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Unit14_Functions_with_Pointer_Parameters.pdf", + "date": "01/10/2022" + }, + { + "name": "Unit15_File_Processing.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Unit15_File_Processing.pdf", + "date": "05/10/2022" + }, + { + "name": "Unit16_Characters_and_Strings.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Unit16_Characters_and_Strings.pdf", + "date": "10/10/2022" + }, + { + "name": "Unit16_Extra.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Unit16_Extra.pdf", + "date": "12/10/2022" + }, + { + "name": "Unit17_Recursion.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Unit17_Recursion.pdf", + "date": "15/10/2022" + }, + { + "name": "Unit17_Towers_of_Hanoi.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Unit17_Towers_of_Hanoi.pdf", + "date": "18/10/2022" + }, + { + "name": "Unit18_Searching_and_Sorting.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Unit18_Searching_and_Sorting.pdf", + "date": "20/10/2022" + }, + { + "name": "Unit19_Structures.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Unit19_Structures.pdf", + "date": "25/10/2022" + }, + { + "name": "Unit20_C_to_Java.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Unit20_C_to_Java.pdf", + "date": "28/10/2022" + }, + { + "name": "Unit6_Repetition_Statements.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Unit6_Repetition_Statements.pdf", + "date": "01/11/2022" + }, + { + "name": "Unit9_Arrays.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Unit9_Arrays.pdf", + "date": "05/11/2022" + }, + { + "name": "Updated_Unit10_Random_Numbers.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit10_Random_Numbers.pdf", + "date": "10/11/2022" + }, + { + "name": "Updated_Unit11_UNIX_IO_Redirection.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit11_UNIX_IO_Redirection.pdf", + "date": "12/11/2022" + }, + { + "name": "Updated_Unit12_Testing_and_Debugging.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit12_Testing_and_Debugging.pdf", + "date": "15/11/2022" + }, + { + "name": "Updated_Unit13_Separate_Compilation.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit13_Separate_Compilation.pdf", + "date": "18/11/2022" + }, + { + "name": "Updated_Unit14_Functions_with_Pointer_Parameters.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit14_Functions_with_Pointer_Parameters.pdf", + "date": "20/11/2022" + }, + { + "name": "Updated_Unit15_Structures.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit15_Structures.pdf", + "date": "22/11/2022" + }, + { + "name": "Updated_Unit16_Characters_and_Strings.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit16_Characters_and_Strings.pdf", + "date": "25/11/2022" + }, + { + "name": "Updated_Unit17_Recursion.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit17_Recursion.pdf", + "date": "28/11/2022" + }, + { + "name": "Updated_Unit17_Towers_of_Hanoi.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit17_Towers_of_Hanoi.pdf", + "date": "30/11/2022" + }, + { + "name": "Updated_Unit18_More_about_Structures.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit18_More_about_Structures.pdf", + "date": "02/12/2022" + }, + { + "name": "Updated_Unit19_File_Processing.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit19_File_Processing.pdf", + "date": "05/12/2022" + }, + { + "name": "Updated_Unit20_Searching_and_Sorting.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit20_Searching_and_Sorting.pdf", + "date": "08/12/2022" + }, + { + "name": "Updated_Unit20_Searching_and_Sorting_full.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit20_Searching_and_Sorting_full.pdf", + "date": "10/12/2022" + }, + { + "name": "Updated_Unit21_C_to_Java.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit21_C_to_Java.pdf", + "date": "15/12/2022" + }, + { + "name": "Updated_Unit4_Overview_of_C_Programming.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit4_Overview_of_C_Programming.pdf", + "date": "18/12/2022" + }, + { + "name": "Updated_Unit5_Top_Down_Design_and_Functions.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit5_Top_Down_Design_and_Functions.pdf", + "date": "20/12/2022" + }, + { + "name": "Updated_Unit6_Problem_Solving_with_Selection_and_Repetition.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit6_Problem_Solving_with_Selection_and_Repetition.pdf", + "date": "22/12/2022" + }, + { + "name": "Updated_Unit7_Pointers.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit7_Pointers.pdf", + "date": "25/12/2022" + }, + { + "name": "Updated_Unit8_Arrays.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit8_Arrays.pdf", + "date": "28/12/2022" + }, + { + "name": "Updated_Unit9_Multidimensional_Arrays.pdf", + "type": "pdf", + "url": "documents/programming_methodology/Updated_Unit9_Multidimensional_Arrays.pdf", + "date": "30/12/2022" + } + ] +} \ No newline at end of file diff --git a/data/details/programming_methodology_c.json b/data/details/programming_methodology_c.json new file mode 100644 index 0000000000000000000000000000000000000000..45c508c155934e899d101791e3a9ca31aaa26cee --- /dev/null +++ b/data/details/programming_methodology_c.json @@ -0,0 +1,105 @@ +{ + "id": "programming_methodology_c", + "name": "Phương pháp lập trình với Ngôn ngữ C", + "noteHtml": "Bạn có thể xem đoạn code tham khảo hoặc bài giải tham khảo ngay tại đây.", + "files": [ + { + "name": "BAI TAP LON PPLT.pdf", + "url": "documents/programming_methodology_code/BAI TAP LON PPLT.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "0.99 MB" + }, + { + "name": "GIUA KY.pdf", + "url": "documents/programming_methodology_code/GIUA KY.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "608.96 KB" + }, + { + "name": "Lab1.pdf", + "url": "documents/programming_methodology_code/Lab1.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "795.26 KB" + }, + { + "name": "Lab2.pdf", + "url": "documents/programming_methodology_code/Lab2.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "2.20 MB" + }, + { + "name": "Lab3.pdf", + "url": "documents/programming_methodology_code/Lab3.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "866.89 KB" + }, + { + "name": "Lab4.pdf", + "url": "documents/programming_methodology_code/Lab4.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "451.02 KB" + }, + { + "name": "Lab5.pdf", + "url": "documents/programming_methodology_code/Lab5.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "269.12 KB" + }, + { + "name": "Lab5_Review.pdf", + "url": "documents/programming_methodology_code/Lab5_Review.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "153.73 KB" + }, + { + "name": "Lab6.pdf", + "url": "documents/programming_methodology_code/Lab6.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "283.57 KB" + }, + { + "name": "Lab7.pdf", + "url": "documents/programming_methodology_code/Lab7.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "1.30 MB" + }, + { + "name": "Lab8.pdf", + "url": "documents/programming_methodology_code/Lab8.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "245.11 KB" + }, + { + "name": "Lab9.pdf", + "url": "documents/programming_methodology_code/Lab9.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "242.18 KB" + }, + { + "name": "Lab10.pdf", + "url": "documents/programming_methodology_code/Lab10.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "179.60 KB" + }, + { + "name": "ON TAP GIUA KY MON PPLT HK 1 2022_2023.pdf", + "url": "documents/programming_methodology_code/ON TAP GIUA KY MON PPLT HK 1 2022_2023.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "754.14 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/requirements_analysis_design.json b/data/details/requirements_analysis_design.json new file mode 100644 index 0000000000000000000000000000000000000000..47876e1954581fece03425fb6f17505ffb8544f9 --- /dev/null +++ b/data/details/requirements_analysis_design.json @@ -0,0 +1,66 @@ +{ + "id": "requirements_analysis_design", + "name": "Phân tích thiết kế yêu cầu", + "files": [ + { + "name": "ch01.pdf", + "type": "pdf", + "url": "documents/requirements_analysis_design/ch01.pdf", + "date": "05/03/2024" + }, + { + "name": "ch02.pdf", + "type": "pdf", + "url": "documents/requirements_analysis_design/ch02.pdf", + "date": "12/03/2024" + }, + { + "name": "ch03.pdf", + "type": "pdf", + "url": "documents/requirements_analysis_design/ch03.pdf", + "date": "25/03/2024" + }, + { + "name": "ch04.pdf", + "type": "pdf", + "url": "documents/requirements_analysis_design/ch04.pdf", + "date": "02/04/2024" + }, + { + "name": "ch05.pdf", + "type": "pdf", + "url": "documents/requirements_analysis_design/ch05.pdf", + "date": "15/04/2024" + }, + { + "name": "ch06.pdf", + "type": "pdf", + "url": "documents/requirements_analysis_design/ch06.pdf", + "date": "28/04/2024" + }, + { + "name": "ch07.pdf", + "type": "pdf", + "url": "documents/requirements_analysis_design/ch07.pdf", + "date": "10/05/2024" + }, + { + "name": "ch08..pdf", + "type": "pdf", + "url": "documents/requirements_analysis_design/ch08..pdf", + "date": "22/05/2024" + }, + { + "name": "ch09.pdf", + "type": "pdf", + "url": "documents/requirements_analysis_design/ch09.pdf", + "date": "15/06/2024" + }, + { + "name": "ch10.pdf", + "type": "pdf", + "url": "documents/requirements_analysis_design/ch10.pdf", + "date": "10/07/2024" + } + ] +} \ No newline at end of file diff --git a/data/details/self_learning.json b/data/details/self_learning.json new file mode 100644 index 0000000000000000000000000000000000000000..9b0a7a30e37f1d57fd4e3caeed1af2446f650e94 --- /dev/null +++ b/data/details/self_learning.json @@ -0,0 +1,48 @@ +{ + "id": "self_learning", + "name": "Kĩ năng tự học", + "files": [ + { + "name": "Bài tập lớn (L00052_522H0081_TranHuuDat).pdf", + "type": "pdf", + "url": "documents/Ki_nang_tu_hoc/L00052_522H0081_TranHuuDat.pdf", + "date": "10/02/2026", + "size": "139.08 KB" + }, + { + "name": "Các bước tự học.pdf", + "type": "pdf", + "url": "documents/Ki_nang_tu_hoc/cac-buoc-tu-hoc.pdf", + "date": "27/02/2026", + "size": "1.00 MB" + }, + { + "name": "Giới thiệu kĩ năng tự học.pdf", + "type": "pdf", + "url": "documents/Ki_nang_tu_hoc/gioi-thieu.pdf", + "date": "27/02/2026", + "size": "1.62 MB" + }, + { + "name": "Một số kĩ năng tự học.pdf", + "type": "pdf", + "url": "documents/Ki_nang_tu_hoc/mot-so-ki-nang-tu-hoc.pdf", + "date": "27/02/2026", + "size": "5.29 MB" + }, + { + "name": "Tổng quan tự học.pdf", + "type": "pdf", + "url": "documents/Ki_nang_tu_hoc/tong-quan.pdf", + "date": "27/02/2026", + "size": "1.79 MB" + }, + { + "name": "Xác định phong cách học.pdf", + "type": "pdf", + "url": "documents/Ki_nang_tu_hoc/xac-dinh-phong-cach-hoc.pdf", + "date": "27/02/2026", + "size": "1.64 MB" + } + ] +} \ No newline at end of file diff --git a/data/details/software_engineering.json b/data/details/software_engineering.json new file mode 100644 index 0000000000000000000000000000000000000000..a8e5309928cb23d9fe0388c3760a033a256cf9d5 --- /dev/null +++ b/data/details/software_engineering.json @@ -0,0 +1,118 @@ +{ + "id": "software_engineering", + "name": "Công nghệ phần mềm", + "files": [ + { + "name": "00_Course Description.pdf", + "type": "pdf", + "url": "documents/software_engineering/00_Course Description.pdf", + "size": "962 KB", + "date": "05/01/2024" + }, + { + "name": "01_Introduction to Software Engineering.pdf", + "type": "pdf", + "url": "documents/software_engineering/01_Introduction to Software Engineering.pdf", + "size": "590 KB", + "date": "08/01/2024" + }, + { + "name": "02_Software Process.pdf", + "type": "pdf", + "url": "documents/software_engineering/02_Software Process.pdf", + "size": "879 KB", + "date": "12/01/2024" + }, + { + "name": "03_Agile Process.pdf", + "type": "pdf", + "url": "documents/software_engineering/03_Agile Process.pdf", + "size": "496 KB", + "date": "15/01/2024" + }, + { + "name": "04_Requirement Process.pdf", + "type": "pdf", + "url": "documents/software_engineering/04_Requirement Process.pdf", + "size": "730 KB", + "date": "20/01/2024" + }, + { + "name": "05_UML.pdf", + "type": "pdf", + "url": "documents/software_engineering/05_UML.pdf", + "size": "896 KB", + "date": "25/01/2024" + }, + { + "name": "06_Software Design.pdf", + "type": "pdf", + "url": "documents/software_engineering/06_Software Design.pdf", + "size": "497 KB", + "date": "01/02/2024" + }, + { + "name": "07_Implementation Issues.pdf", + "type": "pdf", + "url": "documents/software_engineering/07_Implementation Issues.pdf", + "size": "220 KB", + "date": "05/02/2024" + }, + { + "name": "08_Coding Process and Convention.pdf", + "type": "pdf", + "url": "documents/software_engineering/08_Coding Process and Convention.pdf", + "size": "142 KB", + "date": "10/02/2024" + }, + { + "name": "09_Code Review.pdf", + "type": "pdf", + "url": "documents/software_engineering/09_Code Review.pdf", + "size": "240 KB", + "date": "15/02/2024" + }, + { + "name": "10_Version Control Basics.pdf", + "type": "pdf", + "url": "documents/software_engineering/10_Version Control Basics.pdf", + "size": "2.37 MB", + "date": "22/02/2024" + }, + { + "name": "11_Testing.pdf", + "type": "pdf", + "url": "documents/software_engineering/11_Testing.pdf", + "size": "1.22 MB", + "date": "28/02/2024" + }, + { + "name": "12_Unit Testing.pdf", + "type": "pdf", + "url": "documents/software_engineering/12_Unit Testing.pdf", + "size": "1.57 MB", + "date": "05/03/2024" + }, + { + "name": "13_Graphic User Interface.pdf", + "type": "pdf", + "url": "documents/software_engineering/13_Graphic User Interface.pdf", + "size": "357 KB", + "date": "12/03/2024" + }, + { + "name": "14_Version Control With SVN.pdf", + "type": "pdf", + "url": "documents/software_engineering/14_Version Control With SVN.pdf", + "size": "17.47 MB", + "date": "20/03/2024" + }, + { + "name": "15_Version Control With Git.pdf", + "type": "pdf", + "url": "documents/software_engineering/15_Version Control With Git.pdf", + "size": "2.26 MB", + "date": "01/04/2024" + } + ] +} \ No newline at end of file diff --git a/data/details/sql.json b/data/details/sql.json new file mode 100644 index 0000000000000000000000000000000000000000..e0535dd9160d356179fc24b8a51804e798d6dd89 --- /dev/null +++ b/data/details/sql.json @@ -0,0 +1,60 @@ +{ + "id": "sql", + "name": "Hệ cơ sở dữ liệu", + "files": [ + { + "name": "Chapter 1_What_s in a Database.pdf", + "type": "pdf", + "url": "documents/SQL/Chapter 1_What_s in a Database.pdf", + "date": "05/08/2023" + }, + { + "name": "Chapter 2_relational model.pdf", + "type": "pdf", + "url": "documents/SQL/Chapter 2_relational model.pdf", + "date": "15/08/2023" + }, + { + "name": "Chapter 4_Algebra.pdf", + "type": "pdf", + "url": "documents/SQL/Chapter 4_Algebra.pdf", + "date": "25/08/2023" + }, + { + "name": "Chapter 5_SQL1.pdf", + "type": "pdf", + "url": "documents/SQL/Chapter 5_SQL1.pdf", + "date": "05/09/2023" + }, + { + "name": "Chapter 5_SQL2.pdf", + "type": "pdf", + "url": "documents/SQL/Chapter 5_SQL2.pdf", + "date": "15/09/2023" + }, + { + "name": "Chapter 6_advancedSQL.pdf", + "type": "pdf", + "url": "documents/SQL/Chapter 6_advancedSQL.pdf", + "date": "25/09/2023" + }, + { + "name": "Chapter 7_conceptual modeling.pdf", + "type": "pdf", + "url": "documents/SQL/Chapter 7_conceptual modeling.pdf", + "date": "10/10/2023" + }, + { + "name": "Chapter 8_Functional Dependencies.pdf", + "type": "pdf", + "url": "documents/SQL/Chapter 8_Functional Dependencies.pdf", + "date": "25/10/2023" + }, + { + "name": "Chapter 8_normalization.pdf", + "type": "pdf", + "url": "documents/SQL/Chapter 8_normalization.pdf", + "date": "10/11/2023" + } + ] +} \ No newline at end of file diff --git a/data/details/sql_lab.json b/data/details/sql_lab.json new file mode 100644 index 0000000000000000000000000000000000000000..5bcfe404514a30324168b4b20ff5d51482c00b16 --- /dev/null +++ b/data/details/sql_lab.json @@ -0,0 +1,56 @@ +{ + "id": "sql_lab", + "name": "Thực hành Cơ sở dữ liệu", + "noteHtml": "Bạn có thể xem đoạn code tham khảo hoặc bài giải tham khảo ngay tại đây.", + "files": [ + { + "name": "bai-tap-phan-ra-dang-chuan.pdf", + "url": "documents/SQL_code/bai-tap-phan-ra-dang-chuan.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "104.97 KB" + }, + { + "name": "BaiTap-MH-TTLK.pdf", + "url": "documents/SQL_code/BaiTap-MH-TTLK.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "196.59 KB" + }, + { + "name": "BT - DSQH- Luyen tap-1.pdf", + "url": "documents/SQL_code/BT - DSQH- Luyen tap-1.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "264.82 KB" + }, + { + "name": "Chuong 4-SQL.pdf", + "url": "documents/SQL_code/Chuong 4-SQL.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "1.25 MB" + }, + { + "name": "ERD-Vi-BaiTap-MH-TTLK.pdf", + "url": "documents/SQL_code/ERD-Vi-BaiTap-MH-TTLK.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "196.59 KB" + }, + { + "name": "Final_Practice Test_CLC_2022.pdf", + "url": "documents/SQL_code/Final_Practice Test_CLC_2022.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "51.06 KB" + }, + { + "name": "MidTerm-Review-2022.pdf", + "url": "documents/SQL_code/MidTerm-Review-2022.pdf", + "type": "pdf", + "date": "06/02/2026", + "size": "93.83 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/thai_do_song1.json b/data/details/thai_do_song1.json new file mode 100644 index 0000000000000000000000000000000000000000..8b36276bda0dc875eea6db1b953d5eaefe56c16c --- /dev/null +++ b/data/details/thai_do_song1.json @@ -0,0 +1,34 @@ +{ + "id": "thai_do_song1", + "name": "Thái độ sống 1", + "files": [ + { + "name": "522H0081_TranHuuDat.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_1/522H0081_TranHuuDat.pdf", + "date": "10/02/2026", + "size": "2.54 MB" + }, + { + "name": "Thai_Do_Song1_Part1.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_1/Thai_Do_Song1_Part1.pdf", + "date": "10/02/2026", + "size": "638.25 KB" + }, + { + "name": "Thai_Do_Song1_Part2.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_1/Thai_Do_Song1_Part2.pdf", + "date": "10/02/2026", + "size": "715.99 KB" + }, + { + "name": "Thai_Do_Song1_Part3.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_1/Thai_Do_Song1_Part3.pdf", + "date": "10/02/2026", + "size": "728.45 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/thai_do_song2.json b/data/details/thai_do_song2.json new file mode 100644 index 0000000000000000000000000000000000000000..4716b036d6b3f18a951a57f643d062102dfddb8e --- /dev/null +++ b/data/details/thai_do_song2.json @@ -0,0 +1,48 @@ +{ + "id": "thai_do_song2", + "name": "Thái độ sống 2", + "files": [ + { + "name": "522H0081_TranHuuDat.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_2/522H0081_TranHuuDat.pdf", + "date": "10/02/2026", + "size": "434.48 KB" + }, + { + "name": "DaoDuc_24DiemManh.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_2/DaoDuc_24DiemManh.pdf", + "date": "10/02/2026", + "size": "424.60 KB" + }, + { + "name": "LongBietOn.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_2/LongBietOn.pdf", + "date": "10/02/2026", + "size": "317.15 KB" + }, + { + "name": "PhongTuc-TapQuan.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_2/PhongTuc-TapQuan.pdf", + "date": "10/02/2026", + "size": "202.15 KB" + }, + { + "name": "RaQuyetDinh.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_2/RaQuyetDinh.pdf", + "date": "10/02/2026", + "size": "387.70 KB" + }, + { + "name": "TrachNhiem.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_2/TrachNhiem.pdf", + "date": "10/02/2026", + "size": "413.98 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/thai_do_song3.json b/data/details/thai_do_song3.json new file mode 100644 index 0000000000000000000000000000000000000000..bd9d0e065e4224b7f6fd8891093dc0aa2ff60305 --- /dev/null +++ b/data/details/thai_do_song3.json @@ -0,0 +1,62 @@ +{ + "id": "thai_do_song3", + "name": "Thái độ sống 3", + "files": [ + { + "name": "Báo cáo kết quả rèn luyện tại nhà.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_3/TDS3.BC. BAO CAO KET QUA REN LUYEN TAI NHA.pdf", + "date": "10/02/2026", + "size": "416.73 KB" + }, + { + "name": "Báo cáo nhóm.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_3/bao_cao_nhom.pdf", + "date": "10/02/2026", + "size": "178.72 KB" + }, + { + "name": "Hướng dẫn thực hiện (hdtn).pdf", + "type": "pdf", + "url": "documents/Thai_do_song_3/hdtn.pdf", + "date": "27/02/2026", + "size": "731.45 KB" + }, + { + "name": "Đạo đức doanh nghiệp.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_3/dao-duc-danh-nghiep.pdf", + "date": "27/02/2026", + "size": "4.16 MB" + }, + { + "name": "Lương tâm nghề nghiệp.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_3/luong-tam-nghe-nghiep.pdf", + "date": "27/02/2026", + "size": "953.49 KB" + }, + { + "name": "Nhân phẩm và danh dự.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_3/nham-pham-danh-du.pdf", + "date": "27/02/2026", + "size": "1.36 MB" + }, + { + "name": "Phạm trù cơ bản của đạo đức.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_3/pham-tru-co-ban-dao-duc.pdf", + "date": "27/02/2026", + "size": "2.09 MB" + }, + { + "name": "Quan niệm về thành công.pdf", + "type": "pdf", + "url": "documents/Thai_do_song_3/quan-niem-thanh-cong.pdf", + "date": "27/02/2026", + "size": "4.16 MB" + } + ] +} \ No newline at end of file diff --git a/data/details/tsnn.json b/data/details/tsnn.json new file mode 100644 index 0000000000000000000000000000000000000000..18ebfdbc4f01462de1b521cd0068a614027b2b2a --- /dev/null +++ b/data/details/tsnn.json @@ -0,0 +1,34 @@ +{ + "id": "tsnn", + "name": "Tập sự nghề nghiệp", + "files": [ + { + "name": "BM01_XacNhanThucTap.docx", + "url": "documents/TSNN/BM01_XacNhanThucTap.docx", + "type": "docx", + "date": "01/01/2026", + "size": "3.58 MB" + }, + { + "name": "BM04_PhieuChamDiem_DoanhNghiep.docx", + "url": "documents/TSNN/BM04_PhieuChamDiem_DoanhNghiep.docx", + "type": "docx", + "date": "01/01/2026", + "size": "32.67 KB" + }, + { + "name": "BM05_PhieuChamDiem_GVGS.docx", + "url": "documents/TSNN/BM05_PhieuChamDiem_GVGS.docx", + "type": "docx", + "date": "01/01/2026", + "size": "24.03 KB" + }, + { + "name": "BM06_PhieuChamDiem_GVPB.docx", + "url": "documents/TSNN/BM06_PhieuChamDiem_GVPB.docx", + "type": "docx", + "date": "01/01/2026", + "size": "24.01 KB" + } + ] +} \ No newline at end of file diff --git a/data/details/ui_ux.json b/data/details/ui_ux.json new file mode 100644 index 0000000000000000000000000000000000000000..da5548aa3cd6c0543dd548a313e23c48d056bb12 --- /dev/null +++ b/data/details/ui_ux.json @@ -0,0 +1,66 @@ +{ + "id": "ui_ux", + "name": "Thiết kế giao diện người dùng", + "files": [ + { + "name": "503108 - 01 - Introduction.pdf", + "type": "pdf", + "url": "documents/ui_ux/503108 - 01 - Introduction.pdf", + "date": "05/09/2024" + }, + { + "name": "503108 - 02 - Establishing Requirements.pdf", + "type": "pdf", + "url": "documents/ui_ux/503108 - 02 - Establishing Requirements.pdf", + "date": "15/09/2024" + }, + { + "name": "503108 - 03 - Personas.pdf", + "type": "pdf", + "url": "documents/ui_ux/503108 - 03 - Personas.pdf", + "date": "20/09/2024" + }, + { + "name": "503108 - 04 - Transition From Defining to Designing.pdf", + "type": "pdf", + "url": "documents/ui_ux/503108 - 04 - Transition From Defining to Designing.pdf", + "date": "05/10/2024" + }, + { + "name": "503108 - 05 - Design Principles.pdf", + "type": "pdf", + "url": "documents/ui_ux/503108 - 05 - Design Principles.pdf", + "date": "10/10/2024" + }, + { + "name": "503108 - 06 - Sitemap and Taskflow.pdf", + "type": "pdf", + "url": "documents/ui_ux/503108 - 06 - Sitemap and Taskflow.pdf", + "date": "20/10/2024" + }, + { + "name": "503108 - 07 - Wireframes.pdf", + "type": "pdf", + "url": "documents/ui_ux/503108 - 07 - Wireframes.pdf", + "date": "25/10/2024" + }, + { + "name": "503108 - 08 - Mockup and Prototype.pdf", + "type": "pdf", + "url": "documents/ui_ux/503108 - 08 - Mockup and Prototype.pdf", + "date": "05/11/2024" + }, + { + "name": "503108 - 09 - HTML CSS Javascript.pdf", + "type": "pdf", + "url": "documents/ui_ux/503108 - 09 - HTML CSS Javascript.pdf", + "date": "15/11/2024" + }, + { + "name": "503108 - 10 - Design Testing.pdf", + "type": "pdf", + "url": "documents/ui_ux/503108 - 10 - Design Testing.pdf", + "date": "25/11/2024" + } + ] +} \ No newline at end of file diff --git a/data/details/web.json b/data/details/web.json new file mode 100644 index 0000000000000000000000000000000000000000..5e9a37fdb1f7650903680b9df516c23732b991f9 --- /dev/null +++ b/data/details/web.json @@ -0,0 +1,75 @@ +{ + "id": "web", + "name": "Lập trình Web", + "files": [ + { + "name": "1. Introduction.pdf", + "type": "pdf", + "url": "documents/web/1. Introduction.pdf", + "date": "05/01/2024" + }, + { + "name": "2. HTML.pdf", + "type": "pdf", + "url": "documents/web/2. HTML.pdf", + "size": "9.68 MB", + "date": "12/01/2024" + }, + { + "name": "3. CSS.pdf", + "type": "pdf", + "url": "documents/web/3. CSS.pdf", + "size": "2.23 MB", + "date": "20/01/2024" + }, + { + "name": "4. Javascript.pdf", + "type": "pdf", + "url": "documents/web/4. Javascript.pdf", + "size": "3.51 MB", + "date": "01/02/2024" + }, + { + "name": "5. Bootstrap.pdf", + "type": "pdf", + "url": "documents/web/5. Bootstrap.pdf", + "size": "2.23 MB", + "date": "10/02/2024" + }, + { + "name": "6. Slide - Basic PHP.pdf", + "type": "pdf", + "url": "documents/web/6. Slide - Basic PHP.pdf", + "size": "3.22 MB", + "date": "25/02/2024" + }, + { + "name": "7. Slide - Advanced PHP.pdf", + "type": "pdf", + "url": "documents/web/7. Slide - Advanced PHP.pdf", + "size": "6.77 MB", + "date": "05/03/2024" + }, + { + "name": "8. Slide - PHP MySQL.pdf", + "type": "pdf", + "url": "documents/web/8. Slide - PHP MySQL.pdf", + "size": "3.76 MB", + "date": "15/03/2024" + }, + { + "name": "9. Slide - Web Services.pdf", + "type": "pdf", + "url": "documents/web/9. Slide - Web Services.pdf", + "size": "4.97 MB", + "date": "01/04/2024" + }, + { + "name": "10. Slide - Final.pdf", + "type": "pdf", + "url": "documents/web/10. Slide - Final.pdf", + "size": "2.11 MB", + "date": "10/04/2024" + } + ] +} \ No newline at end of file diff --git a/data/subjects.json b/data/subjects.json new file mode 100644 index 0000000000000000000000000000000000000000..215010ce541fb38b67bd8efe0a8826362ad8379e --- /dev/null +++ b/data/subjects.json @@ -0,0 +1,331 @@ +[ + { + "id": "code_samples", + "name": "Mã nguồn mẫu", + "icon": "ph-code", + "description": "Các bài tập mẫu bằng C, Java, Python để trải nghiệm trình biên dịch.", + "category": "programming_algo" + }, + { + "id": "calculus", + "name": "Giải tích (Calculus)", + "icon": "ph-function", + "description": "Bao gồm giáo trình MA1521, bài tập về giới hạn, đạo hàm và tích phân.", + "category": "math_basic" + }, + { + "id": "linear_algebra_python", + "name": "Thực hành Đại số tuyến tính với Python", + "icon": "ph-code", + "description": "Làm quen với tính toán ma trận.", + "category": "math_basic" + }, + { + "id": "calculus_python", + "name": "Thực hành Giải tích với Python", + "icon": "ph-code", + "description": "Bài tập thực hành giải tích sử dụng ngôn ngữ Python.", + "category": "math_basic" + }, + { + "id": "programming_methodology_c", + "name": "Phương pháp lập trình với Ngôn ngữ C", + "icon": "ph-code", + "description": "Thực hành phương pháp lập trình sử dụng ngôn ngữ C.", + "category": "programming_algo" + }, + { + "id": "computer_organization_lab", + "name": "Thực hành Tổ chức máy tính", + "icon": "ph-circuitry", + "description": "Thiết kế mạch toán nhị phân (OR, AND, XOR) và code assembly.", + "category": "system_network" + }, + { + "id": "computer_organization", + "name": "Tổ chức máy tính", + "icon": "ph-cpu", + "description": "Slide bài giảng, hợp ngữ MIPS và các bài lab thực hành.", + "category": "system_network" + }, + { + "id": "programming_methodology", + "name": "Phương pháp lập trình", + "icon": "ph-code", + "description": "Tư duy lập trình, giải thuật, cấu trúc dữ liệu và lập trình C/C++ căn bản.", + "category": "programming_algo" + }, + { + "id": "linear_algebra", + "name": "Đại số tuyến tính", + "icon": "ph-matrix-logo", + "description": "Ma trận, định thức, hệ phương trình tuyến tính và không gian vector.", + "category": "math_basic" + }, + { + "id": "oop", + "name": "Lập trình hướng đối tượng", + "icon": "ph-cube", + "description": "Lớp, đối tượng, kế thừa, đa hình và các nguyên lý SOLID trong Java.", + "category": "programming_algo" + }, + { + "id": "oop_lab", + "name": "Thực hành Hướng đối tượng", + "icon": "ph-code", + "description": "Làm quen với lập trình hướng đối tượng.", + "category": "programming_algo" + }, + { + "id": "dsa", + "name": "Cấu trúc dữ liệu và giải thuật", + "icon": "ph-tree-structure", + "description": "Các thuật toán sắp xếp, tìm kiếm, BST, AVL và đồ thị.", + "category": "programming_algo" + }, + { + "id": "dsa_lab", + "name": "Thực hành CTDLGT", + "icon": "ph-tree-structure", + "description": "Bài tập thực hành Cấu trúc dữ liệu và giải thuật.", + "category": "programming_algo" + }, + { + "id": "os", + "name": "Nhập môn hệ điều hành", + "icon": "ph-desktop", + "description": "Quản lý tiến trình, bộ nhớ, file system và lập trình hệ thống.", + "category": "system_network" + }, + { + "id": "os_lab", + "name": "Thực hành Hệ điều hành", + "icon": "ph-terminal-window", + "description": "Thực hành lệnh Linux, quản lý tiến trình, file system trên CocalC.", + "category": "system_network" + }, + { + "id": "sql", + "name": "Hệ cơ sở dữ liệu", + "icon": "ph-database", + "description": "Mô hình quan hệ, đại số quan hệ, SQL và chuẩn hóa dữ liệu.", + "category": "software_db" + }, + { + "id": "sql_lab", + "name": "Thực hành Cơ sở dữ liệu", + "icon": "ph-database", + "description": "Bài tập thực hành SQL và thiết kế cơ sở dữ liệu.", + "category": "software_db" + }, + { + "id": "probability_statistics", + "name": "Xác suất thống kê", + "icon": "ph-chart-bar", + "description": "Không gian mẫu, biến ngẫu nhiên, phân phối xác suất và kiểm định giả thuyết.", + "category": "math_basic" + }, + { + "id": "computer_network", + "name": "Mạng máy tính", + "icon": "ph-globe-stand", + "description": "Mô hình OSI-TCP/IP, giao thức mạng, định tuyến và bảo mật mạng.", + "category": "system_network" + }, + { + "id": "software_engineering", + "name": "Công nghệ phần mềm", + "icon": "ph-gear", + "description": "Slide bài giảng, quy trình phần mềm (Agile, Waterfall), UML và kiểm thử.", + "category": "software_db" + }, + { + "id": "discrete_structures", + "name": "Cấu trúc rời rạc", + "icon": "ph-graph", + "description": "Logic, tập hợp, lý thuyết đồ thị và các cấu trúc toán học trong KHMT.", + "category": "math_basic" + }, + { + "id": "web", + "name": "Lập trình Web (HTML, CSS, JS)", + "icon": "ph-globe", + "description": "Tài liệu HTML5, CSS3, JS và các framework phổ biến.", + "category": "app_dev" + }, + { + "id": "java_web", + "name": "Lập trình web với Java (JSP - Servlet)", + "icon": "ph-coffee", + "description": "JSP, Servlet, JDBC, Hibernate và Spring Framework cơ bản.", + "category": "app_dev" + }, + { + "id": "nodejs", + "name": "Lập trình web với Nodejs", + "icon": "ph-file-code", + "description": "Backend với Node.js, Express, xử lý form, cookie và RESTful API.", + "category": "app_dev" + }, + { + "id": "requirements_analysis_design", + "name": "Phân tích thiết kế yêu cầu", + "icon": "ph-clipboard-text", + "description": "Thu thập yêu cầu, phân tích nghiệp vụ và thiết kế hệ thống phần mềm.", + "category": "software_db" + }, + { + "id": "daa", + "name": "Phân tích và thiết kế thuật toán", + "icon": "ph-chart-line-up", + "description": "Chia để trị, quy hoạch động, tham lam và các bài toán đồ thị nâng cao.", + "category": "programming_algo" + }, + { + "id": "ui_ux", + "name": "Thiết kế giao diện người dùng", + "icon": "ph-paint-brush", + "description": "Nguyên lý thiết kế, wireframe, prototype và trải nghiệm người dùng.", + "category": "app_dev" + }, + { + "id": "information_security", + "name": "Bảo mật thông tin", + "icon": "ph-shield-check", + "description": "Mật mã học, xác thực, kiểm soát truy cập và an ninh mạng.", + "category": "system_network" + }, + { + "id": "mobile_app", + "name": "Phát triển ứng dụng di động", + "icon": "ph-device-mobile", + "description": "Android với Java/Kotlin, Activity, Fragment và SQLite.", + "category": "app_dev" + }, + { + "id": "flutter", + "name": "Phát triển ứng dụng đa nền tảng", + "icon": "ph-device-tablet-camera", + "description": "Flutter framework, Dart language, UI widgets và state management.", + "category": "app_dev" + }, + { + "id": "artificial_intelligence", + "name": "Nhập môn trí tuệ nhân tạo", + "icon": "ph-brain", + "description": "Các khái niệm cơ bản về AI, tác tử thông minh, tìm kiếm và học máy.", + "category": "ai" + }, + { + "id": "machine_learning", + "name": "Nhập môn Học máy", + "icon": "ph-robot", + "description": "Hồi quy tuyến tính, cây quyết định, SVM, mạng nơ-ron và Deep Learning.", + "category": "ai" + }, + { + "id": "big_data", + "name": "Xử lí dữ liệu lớn", + "icon": "ph-database", + "description": "Hadoop, Spark, MapReduce và phân tích dữ liệu quy mô lớn.", + "category": "software_db" + }, + { + "id": "computer_vision", + "name": "Thị giác máy tính", + "icon": "ph-eye", + "description": "Xử lý ảnh, trích xuất đặc trưng, nhận dạng đối tượng và CNN.", + "category": "ai" + }, + { + "id": "game_dev", + "name": "Phát triển game Unity", + "icon": "ph-game-controller", + "description": "Tài liệu lập trình game 3D với Unity, C# và thiết kế game.", + "category": "app_dev" + }, + { + "id": "internship", + "name": "Cẩm nang thực tập", + "icon": "ph-briefcase", + "description": "Tài liệu hướng dẫn, quy trình và biểu mẫu thực tập cho sinh viên.", + "category": "intern" + }, + { + "id": "tsnn", + "name": "Tập sự nghề nghiệp", + "icon": "ph-briefcase", + "description": "Biểu mẫu và hướng dẫn cho môn Tập sự nghề nghiệp.", + "category": "intern" + }, + { + "id": "ktcn", + "name": "Kiến tập công nghiệp", + "icon": "ph-factory", + "description": "Biểu mẫu và hướng dẫn cho môn Kiến tập công nghiệp.", + "category": "intern" + }, + { + "id": "aptis", + "name": "Aptis ESOL", + "icon": "ph-translate", + "description": "Tài liệu ôn thi chứng chỉ tiếng Anh Aptis ESOL.", + "category": "other" + }, + { + "id": "knthcm", + "name": "Ôn tập KNTHCM", + "icon": "ph-check-circle", + "description": "Tài liệu ôn tập Kĩ năng thực hành chuyên môn.", + "category": "intern" + }, + { + "id": "thai_do_song1", + "name": "Thái độ sống 1", + "icon": "ph-users-three", + "description": "Môn học rèn luyện thái độ sống tích cực và kỹ năng mềm với gia đình.", + "category": "skills" + }, + { + "id": "thai_do_song2", + "name": "Thái độ sống 2", + "icon": "ph-users-three", + "description": "Môn học rèn luyện thái độ sống tích cực và kỹ năng mềm trong môi trường đại học.", + "category": "skills" + }, + { + "id": "thai_do_song3", + "name": "Thái độ sống 3", + "icon": "ph-users-three", + "description": "Môn học rèn luyện kỹ năng mềm trong môi trường doanh nghiệp.", + "category": "skills" + }, + { + "id": "decision_making", + "name": "Kĩ năng đưa ra quyết định", + "icon": "ph-scales", + "description": "Kỹ năng phân tích, đánh giá và lựa chọn giải pháp tối ưu.", + "category": "skills" + }, + { + "id": "kaizen_5s", + "name": "Kĩ năng Kaizen & 5S", + "icon": "ph-chart-line-up", + "description": "Phương pháp cải tiến liên tục và tổ chức nơi làm việc hiệu quả.", + "category": "skills" + }, + { + "id": "critical_thinking", + "name": "Tư duy phản biện", + "icon": "ph-brain", + "description": "Kỹ năng phân tích, đánh giá và lập luận logic.", + "category": "skills" + }, + { + "id": "self_learning", + "name": "Kĩ năng tự học", + "icon": "ph-book-open", + "description": "Phương pháp tự nghiên cứu và học tập suốt đời.", + "category": "skills" + } +] \ No newline at end of file diff --git a/img/screenshot.png b/img/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1c9e3c69b4fd9a9cef9161b78bd67b7e0e8592 --- /dev/null +++ b/img/screenshot.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b314f986cfb421a36cabe1921ff9a07c16030289956e4a675596339c3c065a7e +size 178126 diff --git a/nodemon.json b/nodemon.json new file mode 100644 index 0000000000000000000000000000000000000000..522d9571c131fdf6ac1d228430a3209dc7495a14 --- /dev/null +++ b/nodemon.json @@ -0,0 +1,3 @@ +{ + "ignore": ["temp/*"] +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..cb6a656bc3d000523daa4d918ccabba8d7935926 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1228 @@ +{ + "name": "unicode-backend", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "unicode-backend", + "version": "1.0.0", + "dependencies": { + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "ejs": "^5.0.1", + "express": "^4.18.2", + "nodemon": "^3.1.14", + "uuid": "^9.0.1" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/brace-expansion": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz", + "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==", + "license": "MIT" + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/ejs": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-5.0.1.tgz", + "integrity": "sha512-COqBPFMxuPTPspXl2DkVYaDS3HtrD1GpzOGkNTJ1IYkifq/r9h8SVEFrjA3D9/VJGOEoMQcrlhpntcSUrM8k6A==", + "license": "Apache-2.0", + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.12.18" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", + "content-type": "~1.0.4", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "~0.1.12", + "proxy-addr": "~2.0.7", + "qs": "~6.14.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "~0.19.0", + "serve-static": "~1.16.2", + "setprototypeof": "1.2.0", + "statuses": "~2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz", + "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "~2.4.1", + "parseurl": "~1.3.3", + "statuses": "~2.0.2", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore-by-default": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", + "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "license": "ISC" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nodemon": { + "version": "3.1.14", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.14.tgz", + "integrity": "sha512-jakjZi93UtB3jHMWsXL68FXSAosbLfY0In5gtKq3niLSkrWznrVBzXFNOEMJUfc9+Ke7SHWoAZsiMkNP3vq6Jw==", + "license": "MIT", + "dependencies": { + "chokidar": "^3.5.2", + "debug": "^4", + "ignore-by-default": "^1.0.1", + "minimatch": "^10.2.1", + "pstree.remy": "^1.1.8", + "semver": "^7.5.3", + "simple-update-notifier": "^2.0.0", + "supports-color": "^5.5.0", + "touch": "^3.1.0", + "undefsafe": "^2.0.5" + }, + "bin": { + "nodemon": "bin/nodemon.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nodemon" + } + }, + "node_modules/nodemon/node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/nodemon/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/pstree.remy": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", + "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz", + "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.4.1", + "range-parser": "~1.2.1", + "statuses": "~2.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz", + "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "~0.19.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/simple-update-notifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", + "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/touch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", + "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "license": "ISC", + "bin": { + "nodetouch": "bin/nodetouch.js" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/undefsafe": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", + "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "license": "MIT" + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000000000000000000000000000000000..36de844fc6dec96e7aff6f0934643e63c8cca653 --- /dev/null +++ b/package.json @@ -0,0 +1,18 @@ +{ + "name": "unicode-backend", + "version": "1.0.0", + "description": "Backend for UniCode code execution platform", + "main": "server.js", + "scripts": { + "start": "nodemon server.js", + "dev": "nodemon server.js" + }, + "dependencies": { + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "ejs": "^5.0.1", + "express": "^4.18.2", + "nodemon": "^3.1.14", + "uuid": "^9.0.1" + } +} diff --git a/scripts/convert_docx_to_pdf.py b/scripts/convert_docx_to_pdf.py new file mode 100644 index 0000000000000000000000000000000000000000..4043b601be028ba524e00c2accd4e1485d8da979 --- /dev/null +++ b/scripts/convert_docx_to_pdf.py @@ -0,0 +1,51 @@ +import os +import sys +import comtypes.client + +# Force UTF-8 encoding for stdout to prevent cp1252 errors on Windows +if sys.stdout.encoding.lower() != 'utf-8': + sys.stdout.reconfigure(encoding='utf-8') + +def convert_folder(folder_path): + folder_path = os.path.abspath(folder_path) + if not os.path.exists(folder_path): + print(f"Directory not found: {folder_path}") + return + + word = comtypes.client.CreateObject("Word.Application") + word.Visible = 0 + + try: + files = [f for f in os.listdir(folder_path) if f.lower().endswith(('.doc', '.docx')) and not f.startswith('~$')] + print(f"Found {len(files)} Word files in {folder_path}") + + for filename in files: + file_path = os.path.join(folder_path, filename) + file_name_no_ext = os.path.splitext(filename)[0] + pdf_path = os.path.join(folder_path, file_name_no_ext + ".pdf") + + if os.path.exists(pdf_path): + print(f"Skipping (PDF exists): {filename}") + continue + + print(f"Converting: {filename}...") + try: + doc = word.Documents.Open(file_path) + # 17 = wdFormatPDF + doc.SaveAs(pdf_path, FileFormat=17) + doc.Close() + print(f"Success: {pdf_path}") + except Exception as e: + print(f"Failed to convert {filename}: {e}") + + finally: + word.Quit() + +if __name__ == "__main__": + if len(sys.argv) > 1: + target_folder = sys.argv[1] + else: + print("Usage: python convert_docx_to_pdf.py ") + sys.exit(1) + + convert_folder(target_folder) diff --git a/scripts/convert_to_pdf.py b/scripts/convert_to_pdf.py new file mode 100644 index 0000000000000000000000000000000000000000..634d3d7fcb101200d5d2be9c4f6d9e49a8b63d8e --- /dev/null +++ b/scripts/convert_to_pdf.py @@ -0,0 +1,48 @@ +import os +import sys +import comtypes.client + +def convert_folder(folder_path): + folder_path = os.path.abspath(folder_path) + if not os.path.exists(folder_path): + print(f"Directory not found: {folder_path}") + return + + powerpoint = comtypes.client.CreateObject("PowerPoint.Application") + powerpoint.Visible = 1 + + try: + files = [f for f in os.listdir(folder_path) if f.lower().endswith(('.ppt', '.pptx'))] + print(f"Found {len(files)} PowerPoint files in {folder_path}") + + for filename in files: + file_path = os.path.join(folder_path, filename) + file_name_no_ext = os.path.splitext(filename)[0] + pdf_path = os.path.join(folder_path, file_name_no_ext + ".pdf") + + if os.path.exists(pdf_path): + print(f"Skipping (PDF exists): {filename}") + continue + + print(f"Converting: {filename}...") + try: + deck = powerpoint.Presentations.Open(file_path) + # 32 = ppSaveAsPDF + deck.SaveAs(pdf_path, 32) + deck.Close() + print(f"Success: {pdf_path}") + except Exception as e: + print(f"Failed to convert {filename}: {e}") + + finally: + powerpoint.Quit() + +if __name__ == "__main__": + if len(sys.argv) > 1: + target_folder = sys.argv[1] + else: + # Default or prompt + print("Usage: python convert_to_pdf.py ") + sys.exit(1) + + convert_folder(target_folder) diff --git a/scripts/rename_files_unsigned.py b/scripts/rename_files_unsigned.py new file mode 100644 index 0000000000000000000000000000000000000000..684d844a5250d962ebeaaaa589d176a658ea0ce0 --- /dev/null +++ b/scripts/rename_files_unsigned.py @@ -0,0 +1,77 @@ +import os +import sys +import unicodedata +import re + +def remove_accents(input_str): + if not input_str: + return "" + s1 = unicodedata.normalize('NFD', input_str) + s2 = ''.join(c for c in s1 if unicodedata.category(c) != 'Mn') + s3 = re.sub(r'đ', 'd', s2) + s4 = re.sub(r'Đ', 'D', s3) + return s4 + +def rename_files_in_folder(folder_path): + folder_path = os.path.abspath(folder_path) + if not os.path.exists(folder_path): + print(f"Directory not found: {folder_path}") + return + + files = os.listdir(folder_path) + print(f"Found {len(files)} files in {folder_path}") + + # Sort files to rename longer names first or just by name to avoid conflicts? + # Actually just iterating is fine if we check target existence + + for filename in files: + # Skip directories + if os.path.isdir(os.path.join(folder_path, filename)): + continue + + # Get name and extension + name, ext = os.path.splitext(filename) + + # Remove accents from name part + new_name = remove_accents(name) + + # Clean up special characters characters that might be unsafe for web + # Keep alphanumeric, spaces, hyphens, underscores, dots, parenthesis + new_name = re.sub(r'[^a-zA-Z0-9\s\-\_\(\)\.]', '', new_name) + + # Collapse multiple spaces + new_name = re.sub(r'\s+', ' ', new_name).strip() + + new_filename = new_name + ext + + if new_filename != filename: + old_path = os.path.join(folder_path, filename) + new_path = os.path.join(folder_path, new_filename) + + # Handle potential collision + if os.path.exists(new_path): + print(f"Skipping (Target exists): {filename} -> {new_filename}") + continue + + try: + os.rename(old_path, new_path) + # Print mapping for JSON update manually if needed, or just list later + # Print using repr to handle potential encoding display issues + print(f"Renamed: {filename} -> {new_filename}") + except Exception as e: + print(f"Error renaming {filename}: {e}") + else: + print(f"No change needed: {filename}") + +if __name__ == "__main__": + # Force UTF-8 stdout + if sys.stdout.encoding.lower() != 'utf-8': + sys.stdout.reconfigure(encoding='utf-8') + + if len(sys.argv) > 1: + target_folder = sys.argv[1] + else: + print("Usage: python rename_files_unsigned.py ") + sys.exit(1) + + rename_files_in_folder(target_folder) diff --git a/server.js b/server.js new file mode 100644 index 0000000000000000000000000000000000000000..8d14c7fa15090efb0c039396acdcfd8c4a5fb228 --- /dev/null +++ b/server.js @@ -0,0 +1,110 @@ +const express = require('express'); +const cors = require('cors'); +const bodyParser = require('body-parser'); +const { exec } = require('child_process'); +const fs = require('fs'); +const path = require('path'); +const { v4: uuidv4 } = require('uuid'); + +const app = express(); +const port = process.env.PORT || 7860; + +app.set('view engine', 'ejs'); +app.set('views', path.join(__dirname, 'views')); + +app.use(cors()); +app.use(bodyParser.json()); +app.use(express.static(__dirname)); + +app.get('/', (req, res) => { + res.render('index'); +}); + +app.get('/subject', (req, res) => { + res.render('subject'); +}); + +const TEMP_DIR = path.join(__dirname, 'temp'); +if (!fs.existsSync(TEMP_DIR)) { + fs.mkdirSync(TEMP_DIR); +} + +app.post('/run', (req, res) => { + const { code, language, input } = req.body; + const id = uuidv4(); + let fileName, compileCmd, runCmd; + + switch (language) { + case 'c': + fileName = `main_${id}.c`; + const exeName = `main_${id}.exe`; + fs.writeFileSync(path.join(TEMP_DIR, fileName), code); + compileCmd = `gcc ${path.join(TEMP_DIR, fileName)} -o ${path.join(TEMP_DIR, exeName)}`; + runCmd = `${path.join(TEMP_DIR, exeName)}`; + break; + case 'python': + fileName = `main_${id}.py`; + fs.writeFileSync(path.join(TEMP_DIR, fileName), code); + runCmd = `python ${path.join(TEMP_DIR, fileName)}`; + break; + case 'java': + fileName = `Main_${id.replace(/-/g, '_')}.java`; + // Note: Java requires class name to match file name + const javaCode = code.replace(/public class \w+/, `public class Main_${id.replace(/-/g, '_')}`); + fs.writeFileSync(path.join(TEMP_DIR, fileName), javaCode); + compileCmd = `javac ${path.join(TEMP_DIR, fileName)}`; + runCmd = `java -cp ${TEMP_DIR} Main_${id.replace(/-/g, '_')}`; + break; + default: + return res.status(400).json({ error: 'Unsupported language' }); + } + + const execute = () => { + const process = exec(runCmd, { timeout: 10000 }, (runErr, stdout, stderr) => { + // Cleanup + fs.readdirSync(TEMP_DIR).forEach(file => { + if (file.includes(id) || file.includes(id.replace(/-/g, '_'))) { + try { fs.unlinkSync(path.join(TEMP_DIR, file)); } catch (e) {} + } + }); + + if (runErr && runErr.killed) { + return res.json({ + stdout: stdout, + stderr: 'Error: Execution timed out (limit: 10s)', + exitCode: 124 + }); + } + + res.json({ + stdout: stdout, + stderr: stderr || (runErr ? runErr.message : ''), + exitCode: runErr ? runErr.code : 0 + }); + }); + + if (input) { + process.stdin.write(input); + process.stdin.end(); + } + }; + + if (compileCmd) { + exec(compileCmd, (compErr, stdout, stderr) => { + if (compErr) { + return res.json({ + stdout: stdout, + stderr: stderr || compErr.message, + exitCode: compErr.code + }); + } + execute(); + }); + } else { + execute(); + } +}); + +app.listen(port, () => { + console.log(`UniCode Backend running at http://localhost:${port}`); +}); diff --git a/task/GEMINI.md b/task/GEMINI.md new file mode 100644 index 0000000000000000000000000000000000000000..9bbb14708961c475f63f771f30836886f933db59 --- /dev/null +++ b/task/GEMINI.md @@ -0,0 +1,59 @@ +# Gemini Session Log +Date: 05/02/2026 + +## Summary of Work +We have completed a comprehensive update to the UniDocs application, adding a wide range of new lab subjects and enhancing the UI/UX for better accessibility and mobile responsiveness. + +### 1. New Content Added +- **Lab Subjects**: + - **Thực hành Giải tích với Python** (Calculus Python). + - **Phương pháp lập trình với Ngôn ngữ C** (Methodology C) - included Assignment file. + - **Thực hành Tổ chức máy tính** (Computer Org Lab) - converted DOCX to PDF, renamed files. + - **Thực hành Đại số tuyến tính với Python** (Linear Algebra Python). + - **Thực hành Hướng đối tượng** (OOP Lab). + - **Thực hành Hệ điều hành** (OS Lab). + - **Thực hành CTDLGT** (DSA Lab). + - **Thực hành Cơ sở dữ liệu** (SQL Lab) - converted DOCX to PDF. +- **Internship Subjects**: + - Added "Tập sự nghề nghiệp" (TSNN) and "Kiến tập công nghiệp" (KTCN). + - Restored "Cẩm nang thực tập". +- **English Certificates**: + - Added **Aptis ESOL**. +- **Skill Review**: + - Added **Ôn tập Kĩ năng thực hành chuyên môn** (KNTHCM). + - Added **Thái độ sống 2** (Thai Do Song 2) to new **Skills** category. + - Added **Thái độ sống 1** (Thai Do Song 1). + - Added **Thái độ sống 3** (Thai Do Song 3) and updated with 5 new documents. + - Added **Kĩ năng đưa ra quyết định** (Decision Making) and updated with 4 new documents. + - Added **Kĩ năng Kaizen & 5S** (Kaizen & 5S) and updated with 4 new documents. + - Added **Tư duy phản biện** (Critical Thinking) and updated with 4 new documents. + - Added **Kĩ năng tự học** (Self-learning) and updated with 5 new documents. + - Organized internship subjects into new **Thực tập** (Internship) category. + +### 2. UI/UX Improvements +- **Responsive Design**: + - Adjusted sidebar breakpoints to `min-[1400px]`. + - Implemented a **Responsive Preview Modal** for tablet/laptop screens (<1300px). +- **Mobile Enhancements**: + - Fixed Master-Detail layout and added hamburger menu toggle. + - **Clickable File List**: Made the entire file row clickable for easier preview access (Desktop & Mobile). +- **Notification Feature**: + - Added blue notification box for external links (Google Drive) in subject headers. + +### 4. Git Operations +- Successfully added and pushed all changes to `origin main`. +- Pushed Critical Thinking and Self-learning subjects (PDF format). +- Pushed additional files for Thái độ sống 3, Kaizen & 5S, Kĩ năng đưa ra quyết định, Tư duy phản biện, and Kĩ năng tự học. + +### 3. Technical Enhancements +- **File Processing**: + - Created scripts to **convert DOCX to PDF** (`convert_docx_to_pdf.py`). + - Created scripts to **rename files** to remove Vietnamese accents (`rename_files_unsigned.py`) to fix web display issues. +- **PDF Rendering**: + - Integrated **PDF.js** to fix scrolling issues on iOS devices. + - **Fixed Race Condition**: Implemented `currentRenderId` check to prevent overlapping pages when switching files quickly. +- **DOCX Preview**: + - Integrated `docx-preview` library. + +### 4. Git Operations +- Successfully added and pushed all changes to `origin main`. diff --git a/views/index.ejs b/views/index.ejs new file mode 100644 index 0000000000000000000000000000000000000000..7075a4b1f2fba76ab2a2a8bd71ddca57eb0f048c --- /dev/null +++ b/views/index.ejs @@ -0,0 +1,602 @@ + + + + + + + UniCode - Kho mã nguồn & Trình biên dịch + + + + + + + + +
+ +
+
+ + + + +
+
+ + +
+

+ Học tập qua
+ UniCode. +

+ +

+ Hệ thống chia sẻ và chạy mã nguồn các môn học (C/C++, Java, Python). + Xem code, chỉnh sửa và nhận kết quả ngay trên trình duyệt. +

+ + + + + +
+
+
+ +
+ Code & Chạy +
+
+
+ +
+ Đa ngôn ngữ +
+
+
+ +
+ Miễn phí +
+
+
+ + +
+
+
+
+ +
+ +
+ +
+
+ +
+
+ + Free 100% +
+
+ +
+
+
+ +
+
+
+ + +
+
+
+

Môn học hiện có

+

Chọn môn học để xem bài tập và code mẫu

+
+ +
+ + +
+ +
+ + +
+
+ +

Đang tải danh sách môn học...

+
+
+
+ + +
+
+
+

Hệ sinh thái học tập

+

Các dự án mã nguồn mở khác được phát triển bởi Dat

+
+ +
+ + +
+
+
+ +
+
+

UniDocs

+ Hiện + tại +
+
+

+ Kho tài liệu môn học mở, giúp sinh viên chia sẻ và tiếp cận kiến thức dễ dàng. +

+ +
+ + +
+
+
+ +
+
+

Slidify

+ Slide + Platform +
+
+

+ Slidify - Nền tảng học tập qua Slide. Trình bày nội dung bài học trực quan và sinh động. +

+ +
+ + +
+
+
+ +
+
+

Aptis Practice

+ Luyện + thi +
+
+

+ Một trang web luyện thi Aptis ESOL tương tác được xây dựng bằng HTML, CSS và JavaScript. +

+ +
+ +
+
+
+ + + + + + + + \ No newline at end of file diff --git a/views/subject.ejs b/views/subject.ejs new file mode 100644 index 0000000000000000000000000000000000000000..3835d2eaacc3f4fadbc5d2ec66cb1e3b265b5ef1 --- /dev/null +++ b/views/subject.ejs @@ -0,0 +1,271 @@ + + + + + + + Trình biên dịch - UniCode + + + + + + + + + + + + + + + + +
+ +
+
+ +

+ Loading... +

+
+
+ +
+
+ +
+ +
+
+ Mã nguồn + Ngôn ngữ +
+
+ +
+
+ + +
+ +
+
+
+ + +
+
+ Output + +
+
+
+
+
+
+ + + + + \ No newline at end of file