基本設計書 — LMS SmartLibrary

Basic Design — Tìm kiếm & Đăng ký mượn sách


1. 表紙 (Bìa)

Mục Nội dung
プロジェクト名 LMS
機能名 BOOK SEARCH — Tìm kiếm & Đăng ký mượn sách
版数 00.01.00
日付 2026年5月25日
FPT-作成 FPT-レビュー FPT-確認
AnhNTM83
2026/5/25

2. 変更履歴 (Lịch sử chỉnh sửa)

No 版数 変更日 変更者 変更内容 要件確認 技術確認
1 00.01.00 2026/5/25 AnhNTM83 初版

3. Tổng quan màn hình

Screen: Tìm kiếm & Đăng ký mượn sách (Book Search & Borrow Registration)

Mô tả: Màn hình cho phép độc giả tìm kiếm sách trong thư viện, xem chi tiết sách, chọn sách để mượn ngay hoặc đặt trước, và gửi yêu cầu mượn gộp nhiều cuốn cùng lúc.

Chức năng chính:

3.1 Phân quyền truy cập

No Role Phạm vi hiển thị Xem Thao tác
1 Độc giả (Student) Toàn bộ sách trong thư viện
2 Độc giả (Teacher) Toàn bộ sách trong thư viện
3 Thủ thư Toàn bộ sách trong thư viện

4. Wireframe màn hình

4.1 Layout chính

Wireframe SmartLibrary — Tìm kiếm & Đăng ký mượn sách

4.2 Mô tả 8 Blocks

Block Tên Items Mô tả
Header Block 1.1–1.4 Logo, thông tin tài khoản độc giả
Search & Filter 2.1–2.4 Thanh tìm kiếm nhanh + bộ lọc nâng cao
Result Toolbar 3.1–3.4 Tổng kết quả, sắp xếp, chuyển đổi Grid/List
Book Card Grid 4.1–4.10 Danh sách thẻ sách kết quả
Pagination 5.1–5.4 Phân trang
Temp Table Header 6.1–6.4 Tiêu đề bảng tạm sách đã chọn
Temporary Book Grid 7.1–7.7 Bảng tạm danh sách sách mượn/đặt chờ
Summary Panel 8.1–8.4 Tổng hợp + nút gửi yêu cầu mượn gộp

4.3 Flowchart Ev01 — Khởi tạo màn hình

Flowchart Ev01


5. Danh sách bảng dữ liệu tham chiếu

No テーブル名 テーブル物理名 I/O 備考
1 Users users O Thông tin độc giả (session)
2 Books books I/O Danh mục sách, trạng thái sách
3 Book Copies book_copies O Bản sao vật lý của sách
4 Categories categories O Danh mục thể loại sách
5 Authors author O Thông tin tác giả
6 Publishers publisher O Thông tin nhà xuất bản
7 Borrow Basket borrow_basket O Giỏ mượn tạm thời
8 Loans loan I Phiếu mượn tổng
9 Loan Details loan_details I Chi tiết phiếu mượn từng sách
10 Reservations reservation I Phiếu đặt trước sách

6. 定義項目一覧 (Field Definition)

Block ① — Header

No 表示名 テーブル物理名.物理名 I/O 画面表示 種類 初期値 備考
1.1 SmartLibrary (Logo) Label Logo hệ thống + tagline "Đăng ký mượn & Đặt chỗ trực tuyến"
1.2 Tên độc giả users.full_name O Label Lấy từ session Ev01
1.3 Mã DG users.user_code O Label VD: HS-04269
1.4 Avatar users.avatar O Image Ảnh đại diện độc giả. Tham khảo Ev19

Block ② — Search & Filter

No 表示名 テーブル物理名.物理名 I/O 画面表示 種類 初期値 備考
2.1 Thanh tìm kiếm nhanh I TextBox "" (placeholder) Max 255 ký tự. Tham khảo Ev02
2.2 Bộ lọc nâng cao (Toggle) Button Tham khảo Ev03. Mặc định: Collapse
2.2.1 Tên sách I TextBox "" Max 100 ký tự. Param: Param_Search_BookName. Ev04
2.2.2 Tác giả I TextBox "" Max 100 ký tự. Param: Param_Search_Author. Ev04
2.2.3 Nhà xuất bản (NXB) I TextBox "" Max 100 ký tự. Param: Param_Search_Publisher. Ev04
2.2.4 Thể loại categories.category_id I Combobox "Tất cả thể loại" Param: Param_Search_CategoryID. Ev05
2.2.5 Chỉ hiện sách có sẵn (Mượn online) I Checkbox Unchecked Mutual exclusive với 2.2.6. Ev06
2.2.6 Chỉ hiện sách đã bị mượn (Đặt chờ) I Checkbox Unchecked Mutual exclusive với 2.2.5. Ev06
2.3 Nút "Tìm kiếm" Button Tham khảo Ev07
2.4 Nút "Reset bộ lọc" Button Tham khảo Ev08

Block ③ — Result Toolbar

No 表示名 テーブル物理名.物理名 I/O 画面表示 種類 初期値 備考
3.1 Tổng kết quả tìm kiếm O Label VD: "Tìm thấy 8 sách phù hợp"
3.2 Dropdown sắp xếp I Combobox "Tên sách (A-Z)" Options: A-Z, Z-A, Mới nhất. Ev09
3.3 Nút Grid View Button Active Ev10
3.4 Nút List View Button Inactive Ev10

Block ④ — Book Card (lặp lại cho mỗi cuốn sách)

No 表示名 テーブル物理名.物理名 I/O 画面表示 種類 初期値 備考
4.1 Mã sách books.book_id O Label VD: B-111
4.2 Ảnh bìa sách books.cover_image O Image Thumbnail bìa sách
4.3 Thể loại categories.category_name O Label VD: "Kinh tế / Quản trị"
4.4 Nguồn sách books.source_type O Badge "MƯỢN ONLINE" / "NGUỒN OFFLINE"
4.5 Tên sách books.title O Label Tên đầy đủ cuốn sách
4.6 Tác giả author.author_name O Label VD: "Tác giả: Song Hongbing"
4.7 Nhà xuất bản publisher.publisher_name O Label VD: "NXB: NXB Lao Động"
4.8 Trạng thái sách books.books_status O Badge "Còn sách sẵn" (xanh) / "Đã mượn hết" (đỏ)
4.9 Nút Xem chi tiết Button (icon mắt) Tham khảo Ev11
4.10 Nút Action Button Active "[+ Chọn mượn ngay]" / "[+ Chọn đặt chờ]" / "[✓ Đã chọn]". Ev12

Block ⑤ — Pagination

No 表示名 テーブル物理名.物理名 I/O 画面表示 種類 初期値 備考
5.1 Thông tin phân trang O Label "Hiển thị 1-8 trên tổng 12 bản ghi"
5.2 Nút Previous Button Tham khảo Ev13
5.3 Số trang (5.3.1, 5.3.2...) Button Trang 1 active Tham khảo Ev13
5.4 Nút Next Button Tham khảo Ev13

Block ⑥ — Temp Table Header

No 表示名 テーブル物理名.物理名 I/O 画面表示 種類 初期値 備考
6.1 Checkbox chọn tất cả I Checkbox Unchecked Tham khảo Ev14
6.2 Label tiêu đề Label "DANH SÁCH SÁCH BẢNG CHỌN MƯỢN / ĐẶT CHỜ"
6.3 Badge tổng số sách tạm O Badge 0 Tự động đếm tổng dòng trong Khối 7
6.4 Nút Collapse/Expand Button Expand Tham khảo Ev15. Toggle ẩn/hiện Khối 7 & 8

Block ⑦ — Temporary Book Grid (lặp lại cho mỗi dòng)

No 表示名 テーブル物理名.物理名 I/O 画面表示 種類 初期値 備考
7.1 Checkbox chọn dòng I Checkbox Checked Tham khảo Ev16. Mặc định tích khi thêm mới
7.2 Mã sách books.book_id O Label Lấy từ thẻ sách đã chọn
7.3 Tên sách books.title O Label
7.4 Tác giả author.author_name O Label
7.5 Thể loại categories.category_name O Label
7.6 Hình thức đăng ký O Badge "Đăng ký mượn" (xanh) / "Đặt hàng chờ" (cam). Disable chỉnh sửa
7.7 Nút Xóa Button (icon thùng rác) Tham khảo Ev17

Block ⑧ — Summary Panel

No 表示名 テーブル物理名.物理名 I/O 画面表示 種類 初期値 備考
8.1 Label "Số lượng để chọn" Label
8.2 Số lượng sách đã tích chọn O Label 0 Tự động đếm dòng Checked = True
8.3 Nút Gửi Yêu Cầu Mượn Gộp Button Disabled Tham khảo Ev18. Enable khi 8.2 ∈ [1, 5]
8.4 Ghi chú giới hạn Label "Gộp tối đa 5 cuốn sách…"

Common Area

No 表示名 種類 備考
11 Header Common area Tham khảo tài liệu Common Design
12 Menu hệ thống Common area Tham khảo tài liệu Common Design

7. イベント定義 (Định nghĩa Event)

7.1 Danh sách Event

# ID Tên Event Trigger Mô tả
1 Ev01 Hiển thị khởi tạo màn hình Load Kiểm tra phân quyền, lấy session, tải 12 sách mặc định
2 Ev02 Nhập từ khóa tìm kiếm nhanh Text Change Gõ text tại thanh tìm kiếm nhanh (2.1)
3 Ev03 Click button "Bộ lọc nâng cao" Click Toggle ẩn/hiện panel bộ lọc chi tiết (2.2)
4 Ev04 Nhập thông tin lọc nâng cao Text Change Nhập Tên sách (2.2.1), Tác giả (2.2.2), NXB (2.2.3)
5 Ev05 Chọn Thể loại từ Dropdown Select Chọn thể loại sách từ dropdown (2.2.4)
6 Ev06 Tích chọn bộ lọc nhanh Checkbox Click Checkbox sách có sẵn (2.2.5) / đã mượn (2.2.6)
7 Ev07 Click button "Tìm kiếm" Click Thu thập filter → truy vấn DB → tải kết quả
8 Ev08 Click button "Reset bộ lọc" Click Xóa sạch bộ lọc, về trạng thái mặc định
9 Ev09 Thay đổi tiêu chí Sắp xếp Select Chọn sắp xếp: A-Z, Z-A, Mới nhất (3.2)
10 Ev10 Thay đổi chế độ xem Grid/List Click Toggle Grid (3.3) / List (3.4)
11 Ev11 Click button "Xem chi tiết" Click Icon mắt (4.9) → Popup chi tiết sách
12 Ev12 Chọn mượn / đặt chờ (Add Book) Click Nút Action (4.10) → thêm sách vào bảng tạm
13 Ev13 Ấn chuyển trang Pagination Click Click số trang / prev-next (Khối 5)
14 Ev14 Tích chọn tất cả bảng tạm Click Checkbox header (6.1) → check/uncheck tất cả
15 Ev15 Click button "Thu gọn / Mở rộng" Click Toggle collapse/expand panel bảng tạm (6.4)
16 Ev16 Chỉnh sửa trạng thái chọn đơn gộp Click Checkbox đầu dòng (7.1)
17 Ev17 Xóa sách khỏi bảng tạm (Delete line) Click Icon thùng rác (7.7)
18 Ev18 Click button "Gửi Yêu Cầu Mượn Gộp" Click Validate → Confirm → tạo đơn mượn
19 Ev19 Tương tác thông tin Tài khoản độc giả Click Click tên/mã/avatar (1.2-1.4) → dropdown

7.2 Chi tiết Event


Ev01 — Hiển thị khởi tạo màn hình

★Trigger: Độc giả đăng nhập vào hệ thống thành công, click chọn menu "Tìm kiếm & Đăng ký mượn sách" từ màn hình Trang chủ.

フローチャット: ✅ Có (xem mục 4.3)

Chi tiết xử lý:

1. Kiểm tra phân quyền

2. Get data (DB)

Bảng kết nối Dữ liệu lấy
users Thông tin độc giả (tên, mã, avatar)
books Danh sách 12 sách mặc định (ORDER BY book_name ASC, LIMIT 12)
borrow_basket Thông tin giỏ mượn gộp hiện tại

3. Hiển thị hạng mục màn hình

[Xử lý 99] Lỗi: Không hợp lệ / Chưa Login → Hiển thị popup cảnh báo nợ phạt/lỗi → Redirect


Ev02 — Nhập từ khóa tìm kiếm nhanh

★Trigger: Độc giả đặt con trỏ chuột vào thanh tìm kiếm nhanh (mục 2.1) và thực hiện gõ phím hoặc thay đổi text (Change Event).

フローチャット: ❌ (logic đơn giản)

Chi tiết xử lý:

Validation:

No Hạng mục Điều kiện
1 Thanh tìm kiếm nhanh (2.1) Kiểu: String. Chấp nhận tiếng Việt, Anh, Nhật. Giá trị ≥ 0, ≤ 255 ký tự

Ev03 — Click button "Bộ lọc nâng cao"

★Trigger: Độc giả click nút [Bộ lọc nâng cao ⌃] (mục 2.2).

フローチャット:

Chi tiết xử lý:


Ev04 — Nhập thông tin lọc nâng cao

★Trigger: Độc giả nhập hoặc thay đổi giá trị text tại: Tên sách (2.2.1), Tác giả (2.2.2), Nhà xuất bản (2.2.3).

フローチャット:

Chi tiết xử lý:

1. Kiểm tra và giới hạn định dạng nhập:

2. Lưu trữ trạng thái lọc:


Ev05 — Chọn Thể loại từ Dropdown

★Trigger: Độc giả click vào Combobox Thể loại (mục 2.2.4) và chọn một thể loại cụ thể từ danh sách xổ xuống.

フローチャット:

Chi tiết xử lý:

1. Ghi nhận mã danh mục:


Ev06 — Tích chọn bộ lọc nhanh (Checkbox)

★Trigger: Độc giả click tích chọn hoặc bỏ tích chọn tại: "Chỉ hiện sách có sẵn" (2.2.5) hoặc "Chỉ hiện sách đã bị mượn" (2.2.6).

フローチャット:

Chi tiết xử lý:

1. Logic loại trừ lẫn nhau (Mutual Exclusive):

2. Lưu tham số trạng thái:


Ev07 — Click button "Tìm kiếm"

★Trigger: Độc giả click [Tìm kiếm] hoặc nhấn Enter khi con trỏ ở các ô filter.

フローチャット:

Chi tiết xử lý:

Step 1. Thu thập tham số lọc từ UI:

Lấy: chuỗi tìm nhanh (2.1), Tên sách (2.2.1), Tác giả (2.2.2), NXB (2.2.3), Thể loại (2.2.4), Checkbox (2.2.5, 2.2.6).

Step 2. Truy vấn SQL:

Bảng kết nối Mệnh đề điều kiện lọc
books, author, publisher, category Kế thừa quyền truy cập từ Ev01
AND (LOWER(books.title) LIKE '%Keyword%'
OR LOWER(author.author_name) LIKE '%Keyword%'
OR LOWER(publisher.publisher_name) LIKE '%Keyword%'
OR LOWER(category.category_name) LIKE '%Keyword%')
Nếu 2.2.5 = True → AND books.books_status = 'Available'
Nếu 2.2.6 = True → AND books.books_status = 'Out of stock'

Step 3. Cập nhật giao diện:


Ev08 — Click button "Reset bộ lọc"

★Trigger: Độc giả click [Reset bộ lọc].

フローチャット:

Chi tiết xử lý:

Step 1. Làm trống UI:

Step 2. Tải lại mặc định:


Ev09 — Thay đổi tiêu chí Sắp xếp

★Trigger: Độc giả mở Combobox Sắp xếp (3.2) và chọn tiêu chí.

フローチャット:

Chi tiết xử lý:

Step 1. Ghi nhận tiêu chí:

Option SQL
Tên sách (A-Z) ORDER BY b.book_name ASC
Tên sách (Z-A) ORDER BY b.book_name DESC
Sách mới nhất ORDER BY b.created_at DESC

Step 2. Tải lại: Chạy lại SQL hiện tại + ORDER BY mới.


Ev10 — Thay đổi chế độ xem (Grid / List View)

★Trigger: Độc giả click nút Lưới (3.3) hoặc Danh sách (3.4).

フローチャット:

Chi tiết xử lý:

Step 1. Toggle nút bấm:

Step 2. Thay đổi CSS Layout:


Ev11 — Click button "Xem chi tiết"

★Trigger: Độc giả click icon con mắt [Xem chi tiết] (mục 4.9) trên thẻ sách.

フローチャット:

Chi tiết xử lý:

Step 1. Lấy mã sách: Nhận books.book_id của thẻ sách được click.

Step 2. Truy vấn chi tiết: Tương tự Get data mục 3.2 Ev01. Lấy thêm: books.description, năm xuất bản, ảnh bìa phóng to, mã sách...

Step 3. Hiển thị: Mở Popup Modal / Dialog giữa màn hình. Điền thông tin. Nút [X] hoặc [Đóng] để tắt.


Ev12 — Chọn mượn / đặt chờ (Add Book)

★Trigger: Độc giả click button Action [+ Chọn mượn ngay] hoặc [+ Chọn đặt chờ] (mục 4.10) trên thẻ sách.

フローチャット:

Chi tiết xử lý:

Step 1. Khởi tạo dòng mới vào Bảng tạm (Khối 7):

No Hạng mục Giá trị mặc định
1 Thông tin sách Lấy từ thẻ sách (4.1–4.8)
2 Hình thức đăng ký [+ mượn ngay] → "Đăng ký mượn" (xanh) / [+ đặt trước] → "Đặt hàng chờ" (cam)
3 Trạng thái dòng (7.1) Checked

Step 2. Thiết lập trạng thái nhập liệu:

No Hạng mục Trạng thái
1 Checkbox (7.1) Enable
2 Hình thức đăng ký (7.6) Disable (chỉ xem)
3 Nút Xóa (7.7) Enable

Step 3. Validate:

No Hạng mục Điều kiện
1 Trùng lặp books.book_id chưa tồn tại trong Khối 7

Step 4. Cập nhật UI:


Ev13 — Ấn chuyển trang (Pagination)

★Trigger: Độc giả click số trang hoặc nút [<] [>] tại Khối 5.

フローチャット:

Chi tiết xử lý:

Step 1. Xác định Current_Page.

Step 2. Tính Offset = (Current_Page - 1) × 12.

Step 3. Thực hiện SQL hiện tại + LIMIT 12 OFFSET {Offset}.

Step 4. Đổ 12 sách mới lên Khối 4. Tô đậm trang hiện tại.


Ev14 — Tích chọn tất cả bảng tạm

★Trigger: Độc giả click Checkbox tiêu đề (mục 6.1).

フローチャット:

Chi tiết xử lý:

1. Tích chọn (Checked = True):

2. Bỏ tích (Checked = False):

3. Cập nhật nút (8.3): Nếu 8.2 = 0 → Disable.


Ev15 — Click button "Thu gọn / Mở rộng"

★Trigger: Độc giả click nút mũi tên (mục 6.4).

フローチャット:

Chi tiết xử lý:


Ev16 — Chỉnh sửa trạng thái chọn đơn gộp

★Trigger: Độc giả click Checkbox (7.1) đầu dòng sách cụ thể.

フローチャット:

Chi tiết xử lý:

1. Ghi nhận True/False cho dòng đó.

2. Đếm lại tổng Checked = True → cập nhật 8.2.

3. Nếu 8.2 ∈ [1, 5] → Enable nút 8.3. Nếu = 0 hoặc > 5 → Disable.


Ev17 — Xóa sách khỏi bảng tạm (Delete line)

★Trigger: Độc giả click icon thùng rác [Xóa] (mục 7.7).

フローチャット:

Chi tiết xử lý:

1. Lấy books.book_id của dòng bị xóa.

2. Loại bỏ dòng khỏi Khối 7. Đồng bộ ngược Khối 4: tìm thẻ sách tương ứng, đổi button (4.10) từ [✓ Đã chọn][+ Chọn mượn ngay] hoặc [+ Chọn đặt chờ].

3. Đếm lại tổng sách → cập nhật 6.3. Đếm lại Checked = True → cập nhật 8.2. Kiểm tra nút 8.3: [1,5] → Enable, ngược lại → Disable.


Ev18 — Click button "Gửi Yêu Cầu Mượn Gộp"

★Trigger: Độc giả click [Gửi Yêu Cầu Mượn Gộp] (mục 8.3).

フローチャット:

Chi tiết xử lý:

Step 1. Pop-up Confirm:

Mục Nội dung
Tiêu đề XÁC NHẬN GỬI YÊU CẦU
Nội dung "Bạn có chắc chắn muốn gửi yêu cầu gộp đơn cho các cuốn sách đã chọn không?"
Nút 1 [Hủy bỏ] — xám
Nút 2 [Xác nhận gửi] — xanh

Step 2. Validate:

No Hạng mục Điều kiện
1 Tổng sách gộp đơn Dòng Checked = True: ≥ 1 VÀ ≤ 5

Step 3. Phân loại dữ liệu:

Step 4. Input data vào DB:

4.1 Luồng 'borrow' → Bảng loan + loan_details:

Insert loan:

No Field Quy tắc gán
1 loan.loan_id Tự sinh (VD: L-0623001)
2 loan.user_id Từ Get data Ev01
3 loan.status 'Pending'
4 loan.created_at Current_Time
5 loan.expires_at Current_Time + 24h

Insert loan_details (cho mỗi cuốn sách):

No Field Quy tắc gán
6 loan_details.id Tự sinh PK
7 loan_details.loan_id = loan.loan_id (FK)
8 loan_details.status 'Pending'
9 loan_details.book_id = books.book_id từ bảng tạm

Update books:

No Field Điều kiện
1 books.books_status Khi COUNT(book_copies.ID) - COUNT(loan_details.ID) = 0'Out of stock'

Bắt buộc kiểm tra đồng thời để tránh Race Condition.

4.2 Luồng 'reserve' → Bảng reservation:

No Field Quy tắc gán
1 reservation.reservation_id Tự sinh PK
2 reservation.user_id Từ Get data Ev01
3 reservation.book_id = books.book_id
4 reservation.registered_at Current_Time
5 reservation.reservation_status 'Waiting'
6 reservation.reservation_position Current_Max_Position + 1

Step 5. Hoàn tất:

[Xử lý 99] Error Handling:

# Loại lỗi Xử lý
1 Lỗi DB (kết nối / trùng lặp) Rollback toàn bộ SQL
2 Race Condition (sách bị mượn trước vài giây) Rollback + thông báo
3 Lỗi dữ liệu tạm Toast: "Đã xảy ra lỗi khi tạo phiếu mượn. Vui lòng tải lại trang và chọn lại sách!" + đóng hộp thoại

Ev19 — Tương tác thông tin Tài khoản độc giả

★Trigger: Độc giả click vùng tên/mã/avatar (1.2, 1.3, 1.4) góc trên bên phải.

フローチャット:

Chi tiết xử lý:

Hiển thị dropdown menu:


— Hết tài liệu —