266 lines
30 KiB
Markdown
266 lines
30 KiB
Markdown
# UICONV — Quy ước giao diện — e-commerce
|
||
|
||
| | |
|
||
|---|---|
|
||
| **Version** | 1.1 |
|
||
| **Date** | 2026-09-08 |
|
||
| **Author** | BA (qua skill ba-3-specification, activity `uiconv`) |
|
||
| **Status** | 🟡 Draft |
|
||
| **Approved by** | Designer: — · PO: — *(dự án chưa có Designer riêng — PO ký thay, xem `DEC-01`)* |
|
||
| **Source** | `e-commerce/docs/sections/07-giao-dien.md` (SAD §7 "Thiết kế giao diện", `status: approved`, `version: 1` — coi là **prototype tham chiếu dạng văn bản**, xem `DEC-01` đã sửa) · `e-commerce/docs/sections/02-phan-tich-yeu-cau.md` (NFR-01, NFR-06, NFR-07, FR-15, FR-16) · `02-analysis/BR_CartCheckout_v1.0.md` §3 (vòng đời trạng thái `CART`/`ORDER_SELLER`/`PAYMENT` — nguồn cho Badge trạng thái §11) · `00-index/DECISION_e-commerce.md` (`DEC-01`, `DEC-05`) · `00-index/PROFILE_e-commerce.md` |
|
||
| **Scope** | Toàn project — mọi `SRS` và `WF` có `PRODUCT = screen`. Lần chạy này **ưu tiên điền quy ước phục vụ nhóm màn hình Guest/Customer** (`SCR-01`…`SCR-10`, SAD §7.1.1); nhóm Seller/Admin/Ops/CSR (`SCR-16`…`SCR-32`) dùng chung khung §1–§10 nhưng phần điều hướng/menu riêng của họ **chưa được đối chiếu chi tiết** ở lần chạy này — xem ghi chú ở §1 và §12. |
|
||
| **Profile** | `screen · greenfield · standard` (xem `00-index/PROFILE_e-commerce.md`) |
|
||
|
||
## Change Log
|
||
|
||
| Version | Date | Người sửa | Thay đổi | CR |
|
||
|---|---|---|---|---|
|
||
| 1.0 | 2026-09-08 | BA (qua skill ba-3-specification, activity `uiconv`) | Bản đầu — sinh từ SAD §7 (prototype dạng văn bản, `SCR-01`…`SCR-32`), NFR-01/06/07, `BR_CartCheckout_v1.0.md` §3. 10 open question mới (`OQ-018`…`OQ-027`) cho các ô "chọn một" mà SAD §7 không nói | — |
|
||
| 1.1 | 2026-09-08 | BA (qua skill ba-3-specification, activity `srs`/`wf` — bổ sung §10/§12 theo `SRS_US002-003_v1.0.md`/`WF_US002-003_v1.0.md`) | §10: cập nhật số kế tiếp chưa dùng của dãy `E-CART-` từ `0002` lên `0007` (đã dùng `0002`…`0006` cho US-002/US-003). §12: thêm 2 dòng ngoại lệ đã duyệt — (1) `SCR-04` dùng text riêng "Giỏ hàng trống"/"Tiếp tục mua sắm" thay mẫu chung §6 (đã ghi chú trước, nay chính thức hoá); (2) `SCR-04` sửa số lượng theo mẫu inline auto-save (không có nút Lưu riêng), khác quy ước §4 mặc định | — |
|
||
|
||
> ⚠️ **Ngoại lệ gate G2** — tài liệu này được sinh trong khi Gate G2 (Solution sign-off) của
|
||
> module Giỏ hàng & Checkout **chưa được PO + Tech Lead ký chính thức** (xem `DEC-02`, `DEC-05`
|
||
> ở `00-index/DECISION_e-commerce.md`). Ngoại lệ được người điều phối xác nhận rõ ràng. Nếu
|
||
> `BACKLOG_CartCheckout`/`BR_CartCheckout` đổi khi G2 ký thật, phải rà lại §11 (từ vựng thành
|
||
> phần liên quan Guest checkout) — xem `OQ-027`.
|
||
|
||
> **Vai trò của tài liệu này.** Một project có nhiều `SRS`, mỗi lần chạy tối đa 3 US. Không có
|
||
> tài liệu này thì mỗi `SRS` tự đặt một kiểu phân trang, một vị trí toast, một định dạng ngày.
|
||
> `SRS` và `WF` **tham chiếu** mục ở đây thay vì định nghĩa lại; muốn lệch phải ghi vào §12.
|
||
>
|
||
> **Thứ tự ưu tiên khi lệch:** Design system của dự án (nếu có) > Prototype đã duyệt > `UICONV`
|
||
> > `SRS` từng US. `SRS` chỉ được ghi khác `UICONV` khi có dòng ở §12.
|
||
|
||
---
|
||
|
||
## 0. Nguồn
|
||
|
||
| | |
|
||
|---|---|
|
||
| **Design system** | Chưa có lựa chọn cụ thể. NFR-07 (SAD §2.2) ghi "sử dụng design system chuẩn (VD. Material Design hoặc Ant Design) làm nền tảng giao diện" — **dev chọn, chưa chốt** → `OQ-022`. Quy ước ở tài liệu này là **ràng buộc tối thiểu** (bố cục, trạng thái, text), không phụ thuộc design system cụ thể nào. |
|
||
| **Prototype tham chiếu** | `e-commerce/docs/sections/07-giao-dien.md` — SAD §7 "Thiết kế giao diện" (`status: approved`, `version: 1`, ngày duyệt không ghi rõ trong front-matter). Mô tả bố cục dạng văn bản có cấu trúc (mục đích, persona, FR phục vụ, bố cục, 3 trạng thái, validation) cho `SCR-01`…`SCR-32`. **Không phải** Figma/ảnh — không có màu sắc/typography/khoảng cách chính xác (SAD §7.0 xác nhận rõ: "không có brand guideline cố định"). |
|
||
| **Guideline sẵn có của dự án** | Không có `GLOBAL_UI_CONVENTION.md` trước đó — đây là bản đầu tiên. |
|
||
| **Ai sở hữu quy ước** | BA đề xuất · **Designer duyệt** (dự án không có Designer ⇒ **PO ký thay**, `DEC-01`) · PO duyệt phần text/giọng văn |
|
||
| **Nền tảng** | Web responsive (desktop, tablet, mobile-web) — theo SAD §7.0. **Không** có app di động native trong MVP (out-of-scope, xem SAD §1.1). |
|
||
|
||
## 1. Khung layout
|
||
|
||
| | |
|
||
|---|---|
|
||
| **Grid** | 🔴 Chưa chốt — SAD §7 không cho số cột/gutter/max-width cụ thể → `OQ-018` |
|
||
| **Header cố định** | **Có** — chứa: logo sàn, thanh tìm kiếm (autocomplete), `LanguageSwitcher` (FR-15), `CurrencyToggle` (FR-16, giá tham khảo), icon giỏ hàng (badge số lượng), icon tài khoản/đăng nhập. *(Nguồn: SCR-01)* |
|
||
| **Sidebar / menu** | Nhóm **Guest/Customer**: **Không có** sidebar/menu cố định toàn cục — điều hướng chính qua header (tìm kiếm, tài khoản, giỏ hàng) + mega-menu ngành hàng (SCR-01 Section 2 "điều hướng ngành hàng"). Sidebar/bottom-sheet chỉ xuất hiện **cục bộ** ở màn hình có bộ lọc (SCR-02 — xem §3), không phải điều hướng toàn cục. *(Nhóm Seller có header menu điều hướng riêng — SCR-17: "Sản phẩm, Đơn hàng, Báo cáo, Thông báo"; nhóm Admin tương tự SCR-22 — hai nhóm này **ngoài phạm vi ưu tiên** lần chạy này, chưa được điền chi tiết ở §1–§9, xem §12 khi có lần chạy `uiconv` bổ sung.)* |
|
||
| **Footer** | **Có** — chứa: thông tin sàn, chính sách đổi trả, liên kết ngôn ngữ, thông tin tuân thủ (thông báo Bộ Công Thương theo NĐ 52/2013, 85/2021 — NFR-05). *(Nguồn: SCR-01)* |
|
||
|
||
| Breakpoint | Khoảng (px) | Sidebar | Bảng dữ liệu | Form |
|
||
|---|---|---|---|---|
|
||
| Desktop | 🔴 `OQ-018` | Bộ lọc hiện cố định trái *(SCR-02)* | N/A cho Guest/Customer — luôn dùng lưới `ProductCard`/`CartItem`, không phải bảng dữ liệu kiểu bảng-hành-chính *(SCR-01, SCR-04)* | 🔴 Số cột form — `OQ-018` |
|
||
| Tablet | 🔴 `OQ-018` | 🔴 Chưa chốt — SAD chỉ nói "desktop, tablet, mobile-web" không mô tả riêng hành vi tablet cho bộ lọc → `OQ-018` | Như trên | 🔴 `OQ-018` |
|
||
| Mobile | 🔴 `OQ-018` | Bottom-sheet *(SCR-02, nguyên văn: "Sidebar trái (desktop) / bottom-sheet (mobile)")* | Như trên | 🔴 `OQ-018` |
|
||
|
||
*Ghi chú:* bảng `Bảng → Card` chuyển đổi theo breakpoint (mô tả ở template gốc) áp dụng cho các
|
||
màn hình **quản trị** (Seller/Admin, VD SCR-18, SCR-19, SCR-23) dùng bảng dữ liệu thật —
|
||
ngoài phạm vi ưu tiên Guest/Customer của lần chạy này.
|
||
|
||
## 2. Điều hướng
|
||
|
||
| Câu hỏi | Quy ước |
|
||
|---|---|
|
||
| Quay lại từ màn hình chi tiết/form | Nút Back **và** breadcrumb — cả hai. *(Nguồn một phần: SCR-02 có breadcrumb "Trang chủ > Ngành hàng > Từ khoá"; nút Back không nói rõ trong SAD — BA đề xuất theo thực hành chung, PO/Dev FE xác nhận ở G3)* |
|
||
| Quay lại có giữ trạng thái danh sách (trang, bộ lọc, sắp xếp)? | ✅ Giữ, qua query string — BA đề xuất (SAD không nói), không mâu thuẫn gì đã có |
|
||
| Vào bằng URL trực tiếp với id không tồn tại | Trang trạng thái "Không tìm thấy" + nút về danh sách. *(Nguồn: SCR-03 error = "Sản phẩm không tồn tại/đã bị gỡ" + link quay lại danh mục)* |
|
||
| Vào bằng URL trực tiếp không có quyền | Trang "Không có quyền" + nút về trang chủ; **không** lộ tên bản ghi — BA đề xuất theo W7, chưa có ví dụ cụ thể trong SAD §7.1.1–7.1.2 nhưng nhất quán với RBAC §4 (`RBAC_CartCheckout_v1.0.md`, che PII) |
|
||
| Rời màn hình khi form đang dở | Modal xác nhận "Rời trang? Thay đổi chưa lưu sẽ mất." — BA đề xuất (SAD không nói) |
|
||
| Menu với chức năng không có quyền | ❌ Ẩn (W7) |
|
||
| Mở chi tiết | Cùng tab, đổi URL. *(Nguồn: luồng 7.2.1 "Tìm kiếm/duyệt danh mục (SCR-02, SCR-03)" mô tả điều hướng tuần tự trong cùng phiên, không có nhắc mở tab mới)* |
|
||
|
||
## 3. Danh sách
|
||
|
||
| | |
|
||
|---|---|
|
||
| **Kiểu phân trang** | 🔴 Chưa chốt — SCR-02 nêu cả "phân trang **hoặc** infinite-scroll", chưa chọn 1 → `OQ-019` |
|
||
| **Số dòng mỗi trang** | 🔴 Chưa chốt → `OQ-019` |
|
||
| **Sắp xếp mặc định** | 🔴 Chưa chốt — SCR-02 liệt kê tuỳ chọn "giá tăng/giảm, mới nhất, bán chạy" nhưng không nói mặc định là gì → `OQ-019` |
|
||
| **Bấm vào dòng** | Bấm vào `ProductCard` → mở chi tiết sản phẩm (SCR-03). *(Nguồn: luồng 7.2.1)*. Không áp dụng khái niệm "dòng bảng" cho Guest/Customer — xem §1 |
|
||
| **Cột hành động** | N/A cho lưới `ProductCard` (Guest/Customer). Áp dụng cho bảng quản trị Seller/Admin (SCR-18, SCR-19, SCR-23…) — ngoài phạm vi ưu tiên lần này |
|
||
| **Chọn nhiều dòng** | Riêng SCR-04 (Giỏ hàng): checkbox chọn/bỏ chọn **từng `CartItem` hoặc cả nhóm seller** để tính tạm tính — đây là chọn-để-tính-tổng, **không phải** thanh hành động hàng loạt kiểu xoá/duyệt. *(Nguồn: SCR-04)* |
|
||
| **Tìm kiếm** | Autocomplete, tối thiểu 1 ký tự trước khi gợi ý; không cho submit tìm kiếm rỗng. *(Nguồn: SCR-01 validation)*. Độ trễ debounce (ms) 🔴 chưa chốt → `OQ-024` |
|
||
| **Bộ lọc** | Thanh ngang trên bảng (desktop) · nút "Lọc" mở bottom-sheet (mobile) — tổng hợp từ SCR-02: "Sidebar trái (desktop) / bottom-sheet (mobile): bộ lọc — ngành hàng, khoảng giá, seller, rating, tình trạng còn hàng" *(SAD gọi là sidebar chứ không phải "thanh ngang", đã điều chỉnh nhãn cho khớp — nội dung bộ lọc giữ nguyên theo SAD)* |
|
||
| **Cột trên mobile** | N/A — Guest/Customer dùng `ProductCard`/`CartItem` xuyên suốt mọi breakpoint, không có khái niệm "cột bảng → card" (đã là card từ đầu) |
|
||
|
||
## 4. Form
|
||
|
||
| | |
|
||
|---|---|
|
||
| **Vị trí nút** | Lưu/CTA chính (nút chính) **bên phải**, Huỷ (nút phụ) bên trái nút chính — BA đề xuất, SAD không mô tả vị trí nút cụ thể, không mâu thuẫn với các CTA đã liệt kê (VD SCR-05 "Tiếp tục đến thanh toán", SCR-06 "Xác nhận thanh toán") |
|
||
| **Đánh dấu bắt buộc** | Dấu `*` màu cảnh báo sau nhãn — BA đề xuất (SAD không mô tả) |
|
||
| **Thời điểm validate** | Khi rời field (blur) **và** khi bấm nút chính — BA đề xuất, nhất quán với các validation liệt kê theo từng SCR (VD SCR-08 email đúng định dạng, SCR-09 SĐT đúng định dạng VN) |
|
||
| **Vị trí message lỗi** | Ngay dưới field, thay chỗ hint; field viền cảnh báo — BA đề xuất, khớp với mô tả "thông báo inline" xuất hiện nhiều nơi (SCR-05 coupon không hợp lệ, SCR-18 xung đột SKU) |
|
||
| **Lỗi nhiều field** | Focus vào field lỗi đầu tiên, cuộn tới nó — BA đề xuất (SAD không mô tả cơ chế UI chi tiết) |
|
||
| **Lỗi từ server không gắn field** | Banner đầu form — BA đề xuất, khớp mẫu "banner lỗi" đã dùng ở SCR-01 |
|
||
| **Sau lỗi mạng/5xx** | 🔴 **Giữ nguyên dữ liệu đã nhập**, mở lại nút chính — quy tắc bắt buộc theo `writing-rules.md`, áp dụng toàn hệ thống trừ khi SRS ghi khác ở §12 |
|
||
| **Đang gửi** | Khoá toàn form, spinner trong nút chính, nhãn đổi "Đang xử lý…". *(Nguồn gần nhất: SCR-06 "Đang xử lý thanh toán..." — không cho thao tác khác, tránh double-submit; SCR-16 "spinner khi upload file (progress bar)")* |
|
||
| **Huỷ khi có thay đổi** | Modal xác nhận — BA đề xuất |
|
||
| **Nhãn field** | Trên field (không đặt cạnh trái) — BA đề xuất |
|
||
| **Nút CTA chính khi form chưa hợp lệ** | 🔴 Chưa chốt — SAD chỉ nói rõ ở cấp **wizard** (SCR-16: "wizard chặn 'Next' nếu bước hiện tại chưa hợp lệ"), không nói cho form thường (VD SCR-08 đăng ký, SCR-09 hồ sơ) → `OQ-021` |
|
||
|
||
## 5. Phản hồi hệ thống
|
||
|
||
| Loại | Dùng khi | Vị trí | Thời lượng | Có nút đóng |
|
||
|---|---|---|---|---|
|
||
| **Toast thành công** | Lưu/xoá thành công | 🔴 Chưa chốt — SAD §7 không dùng khái niệm "toast" ở bất kỳ SCR nào → `OQ-020` | 🔴 `OQ-020` | 🔴 `OQ-020` |
|
||
| **Toast lỗi** | Lỗi không gắn field, có thể thử lại | 🔴 `OQ-020` | 🔴 `OQ-020` | 🔴 `OQ-020` |
|
||
| **Modal xác nhận** | Hành động không hoàn tác được (huỷ đơn, xoá) | Giữa màn. *(Nguồn: SCR-10 "xác nhận (dialog) trước khi huỷ đơn")* | — | Nút chính bên **phải**; hành động nguy hiểm dùng nút nguy hiểm — BA đề xuất vị trí, hành vi "cần xác nhận" đã có nguồn |
|
||
| **Inline dưới field** | Lỗi validation | Dưới field | Tới khi sửa | — |
|
||
| **Banner trong vùng** | Lỗi tải một vùng dữ liệu | Trong vùng đó. *(Nguồn: SCR-01 "banner lỗi 'Không tải được dữ liệu, thử lại' + nút retry"; SCR-02, SCR-03, SCR-09, SCR-10, SCR-14, SCR-15 dùng mẫu "lỗi tải + retry" tương tự)* | Tới khi thử lại | Nút Thử lại |
|
||
| **Trang trạng thái** | 404 / 403 / lỗi toàn trang | Toàn trang. *(Nguồn: SCR-03 "Sản phẩm không tồn tại/đã bị gỡ" + link quay lại danh mục)* | — | Nút về danh sách/trang chủ |
|
||
|
||
## 6. Trạng thái chuẩn
|
||
|
||
| Trạng thái | Hiển thị | Text mặc định (VI) | Text (EN) | Nút |
|
||
|---|---|---|---|---|
|
||
| Đang tải danh sách | Skeleton lưới/bảng. *(Nguồn: dùng ở hầu hết SCR-01…SCR-15, VD "loading = skeleton lưới sản phẩm/banner")* | — | — | — |
|
||
| Đang tải chi tiết/form | Skeleton theo bố cục. *(Nguồn: SCR-03 "loading = skeleton toàn trang")* | — | — | — |
|
||
| Đang tải cục bộ (tính lại phí ship/khuyến mãi) | Spinner nhỏ tại chỗ. *(Nguồn: SCR-05 "loading = tính lại phí vận chuyển/khuyến mãi khi thay đổi địa chỉ (spinner cục bộ)")* | — | — | — |
|
||
| **Rỗng — chưa có dữ liệu nào** | Minh hoạ + câu dẫn + nút chính | "Chưa có \<đối tượng\> nào." — mẫu quan sát được lặp lại nhiều nơi trong SAD (SCR-03 "Chưa có đánh giá nào", SCR-09 "Chưa có địa chỉ nào", SCR-14 "Chưa có giao dịch điểm thưởng nào", SCR-15 "Không có thông báo nào"). **Hai ngoại lệ đã có text riêng trong SAD, không theo mẫu chung** — giữ nguyên khi viết SRS cho đúng US: SCR-04 "Giỏ hàng trống", SCR-10 "Bạn chưa có đơn hàng nào" | 🔴 Chưa dịch chính thức — BA có thể đề xuất bản dịch EN khi viết SRS, ZH/KO/JA cần biên dịch chuyên nghiệp, không tự dịch → `OQ-023` | Tạo mới / CTA tương ứng (VD "Tiếp tục mua sắm" — SCR-04; "Tạo mới" — SCR-09) |
|
||
| **Rỗng — bộ lọc không khớp** | Câu dẫn + nút phụ | "Không tìm thấy \<đối tượng\> phù hợp với bộ lọc." — dựa trên SCR-02 "Không tìm thấy sản phẩm phù hợp" + gợi ý bỏ bớt bộ lọc | 🔴 `OQ-023` | Xoá lọc |
|
||
| Lỗi tải | Banner trong vùng | "Không tải được dữ liệu, thử lại." — nguyên văn SCR-01 | 🔴 `OQ-023` | Thử lại |
|
||
| Không có quyền | Trang trạng thái | "Bạn không có quyền truy cập nội dung này." — BA đề xuất (SAD không có ví dụ SCR cụ thể cho Guest/Customer, RBAC xử lý ở tầng khác) | 🔴 `OQ-023` | Về trang chủ |
|
||
| Không tìm thấy | Trang trạng thái | "Sản phẩm không tồn tại hoặc đã bị gỡ." (mẫu chung: "Không tìm thấy nội dung yêu cầu.") — nguồn SCR-03 | 🔴 `OQ-023` | Về danh sách |
|
||
|
||
`SRS` §2.3.6 chỉ ghi **phần khác** với bảng này (vd: câu dẫn riêng cho đối tượng), còn lại tham chiếu.
|
||
|
||
## 7. Ẩn · khoá · read-only *(quy tắc W7)*
|
||
|
||
| Trạng thái | Trình bày | Bắt buộc kèm |
|
||
|---|---|---|
|
||
| `❌ ẩn` | Không render | — |
|
||
| `🔒 disable` | Mờ 45%, con trỏ mặc định | **Tooltip nêu lý do** khi hover/focus. *(Nguồn hành vi tương tự: SCR-03 "nút chuyển trạng thái 'Hết hàng', disabled" khi SKU hết hàng — SAD xác nhận có dùng disable, không cho chi tiết % mờ/tooltip, phần trình bày cụ thể là đề xuất BA)* |
|
||
| `👁 read-only` | Giá trị dạng text, không viền ô nhập, nhãn giữ nguyên. *(Nguồn: SCR-06 "tóm tắt đơn hàng (read-only, tham chiếu từ SCR-05)"; SCR-09 "email (read-only hoặc yêu cầu xác thực lại khi đổi)")* | — |
|
||
|
||
## 8. Định dạng hiển thị
|
||
|
||
*`SRS` §4.3 tham chiếu bảng này; chỉ ghi khác khi có dòng ở §12.*
|
||
|
||
| Loại | Định dạng | Ví dụ | Ghi chú |
|
||
|---|---|---|---|
|
||
| Ngày | `dd/MM/yyyy` | 30/08/2026 | BA đề xuất theo chuẩn VN, SAD không cho ví dụ cụ thể |
|
||
| Ngày giờ | `dd/MM/yyyy HH:mm` | 30/08/2026 14:05 | **Múi giờ hiển thị:** đề xuất UTC+7 cố định (thị trường Việt Nam, giao dịch VND, tuân thủ NĐ 52/2013 — SAD §7.0) — 🔴 **chưa được Tech Lead/PO xác nhận chính thức là không cần hiển thị theo múi giờ địa phương của người dùng nước ngoài dùng EN/ZH/KO/JA**; coi là giả định của lần chạy này, cần xác nhận trước khi SRS dùng |
|
||
| Lưu trữ thời gian | ISO-8601 UTC | | Khớp `API` §1 (khi viết) |
|
||
| Số | `#,##0` | 1.234.567 | Dấu phân cách: theo chuẩn VN (dấu chấm phân nghìn) — BA đề xuất, SAD không cho ví dụ |
|
||
| Tiền (VND — giao dịch chính) | `#,##0 ₫` | 1.234.567 ₫ | Làm tròn: không làm tròn thêm ở cấp hiển thị (VND không có phần thập phân) — theo `BR-CART-09` (`BR_CartCheckout_v1.0.md`) |
|
||
| Giá quy đổi tham khảo (đa tiền tệ) | 🔴 Chưa chốt | | Nguồn tỷ giá, tần suất cập nhật, quy tắc làm tròn cho `CurrencyToggle`/`PriceDisplay` (FR-16/NFR-06) — SAD chỉ xác nhận đây là "giá quy đổi tham khảo", không phải giá giao dịch → `OQ-025` |
|
||
| Phần trăm | `0,0 %` | 12,5 % | BA đề xuất — dùng cho % hoa hồng (SCR-25), ngoài phạm vi ưu tiên Guest/Customer nhưng dùng chung định dạng |
|
||
| Rỗng / null | `—` | | Thống nhất toàn hệ thống — BA đề xuất |
|
||
| Số lớn (id, mã đơn) | Hiển thị nguyên văn chuỗi | `order_number`/`sub_order_number` — theo `BR_CartCheckout_v1.0.md` §4.1, đây là khoá nghiệp vụ dạng chuỗi, không phải số kỹ thuật để tính toán | Không format |
|
||
|
||
## 9. Ngôn ngữ và giọng văn
|
||
|
||
| | |
|
||
|---|---|
|
||
| **Ngôn ngữ hỗ trợ** | VI (mặc định) · EN · ZH · KO · JA — theo FR-15/NFR-06 (SAD §2.2, §7.0). Thiếu bản dịch ⇒ hiện **khoá** hay **VI**? 🔴 Chưa chốt → `OQ-023` |
|
||
| **Xưng hô** | 🔴 Chưa chốt — SAD §7 không đề cập giọng văn → `OQ-026` |
|
||
| **Thông điệp lỗi** | Nói **vì sao** và **làm gì tiếp**; không mã kỹ thuật; kết thúc bằng dấu chấm. *(Nguồn nhất quán với các ví dụ SAD: SCR-01 "Không tải được dữ liệu, thử lại", SCR-06 "thông báo lý do + nút 'Thử lại' hoặc 'Chọn phương thức khác'")* |
|
||
| **Nhãn nút** | Động từ, viết hoa chữ đầu — khớp các CTA đã liệt kê trong SAD: "Thêm vào giỏ", "Tiến hành Checkout", "Xác nhận thanh toán", "Tiếp tục mua sắm" |
|
||
| **Tiêu đề màn hình** | Danh từ — khớp SCR-04 "Giỏ hàng của bạn" (có xưng "bạn" — mâu thuẫn tiềm ẩn với `OQ-026` chưa chốt, cần thống nhất khi trả lời) |
|
||
| **Độ dài nhãn tối đa** | 🔴 Chưa chốt (ký tự) — SAD chỉ cảnh báo định tính "ZH/KO/JA cần rà soát độ dài chuỗi dịch có thể dài hơn, layout co giãn được" → `OQ-023` |
|
||
| **Khoá i18n** | `<scr>.<thành phần>.<thuộc tính>` — vd `scr01.search.ph` — quy ước kỹ thuật do BA đề xuất, Dev FE áp dụng, không cần PO duyệt |
|
||
|
||
## 10. Dãy mã lỗi
|
||
|
||
| Dãy | Module / phạm vi | Số kế tiếp chưa dùng | Ai cấp |
|
||
|---|---|---|---|
|
||
| `E-CART-` | Giỏ hàng & Checkout (RQ-001…RQ-004) | `0007` — `E-CART-0001` đã dùng cho `BR-CART-02` (giữ tồn kho khi checkout, `BR_CartCheckout_v1.0.md` §2); `E-CART-0002`…`0006` đã dùng cho US-002/US-003 (`SRS_US002-003_v1.0.md` §4.1) | BA |
|
||
|
||
*Các module khác (Catalog, Seller, Admin, Payout, Khuyến mãi/Loyalty…) chưa có `SRS`/`BR` viết
|
||
tới ở GĐ3 — sẽ đăng ký dãy mã khi module đó chạy `ba-3-specification`.*
|
||
|
||
## 11. Từ vựng thành phần
|
||
|
||
*`WF` §3.x.2 cột "Kiểu trình bày" chỉ dùng từ ở cột đầu. Cột thứ hai map sang design system khi có (🔴 `OQ-022` — design system chưa chọn, để trống).*
|
||
|
||
| Kiểu trình bày | Component trong design system | Dùng khi |
|
||
|---|---|---|
|
||
| Nút chính | 🔴 `OQ-022` | Một hành động chính mỗi màn hình (VD "Tiến hành Checkout" — SCR-04) |
|
||
| Nút phụ | 🔴 `OQ-022` | Huỷ, hành động thứ cấp |
|
||
| Nút nguy hiểm | 🔴 `OQ-022` | Xoá, huỷ đơn — luôn kèm modal xác nhận (SCR-10) |
|
||
| Liên kết | 🔴 `OQ-022` | Điều hướng trong text (VD "Theo dõi đơn hàng" — SCR-07) |
|
||
| Ô nhập | 🔴 `OQ-022` | |
|
||
| Ô nhập số | 🔴 `OQ-022` | Số lượng sản phẩm (SCR-03, SCR-04) |
|
||
| Chọn 1 | 🔴 `OQ-022` | Phương thức thanh toán (SCR-06: "radio group") — ≤ 7 lựa chọn |
|
||
| Chọn nhiều | 🔴 `OQ-022` | Checkbox chọn `CartItem` (SCR-04) |
|
||
| Chọn ngày / khoảng ngày | 🔴 `OQ-022` | |
|
||
| Công tắc | 🔴 `OQ-022` | |
|
||
| Bảng | 🔴 `OQ-022` | Desktop — chủ yếu dùng ở màn hình quản trị Seller/Admin, ngoài ưu tiên lần này |
|
||
| Card | 🔴 `OQ-022` | `ProductCard` (SCR-01, SCR-02, SCR-03, SCR-12), `CartItem` (SCR-04) — dùng xuyên suốt mọi breakpoint cho Guest/Customer, không chỉ trên mobile |
|
||
| Badge trạng thái | 🔴 `OQ-022` | Trạng thái vòng đời — xem bảng ánh xạ chi tiết bên dưới |
|
||
| Tab | 🔴 `OQ-022` | Đăng nhập/Đăng ký (SCR-08); Thông tin cá nhân/Sổ địa chỉ (SCR-09) |
|
||
| Modal | 🔴 `OQ-022` | Xác nhận huỷ đơn (SCR-10) |
|
||
| Drawer | 🔴 `OQ-022` | |
|
||
| Bottom-sheet | 🔴 `OQ-022` | Bộ lọc trên mobile (SCR-02) |
|
||
| Toast | 🔴 `OQ-022` + `OQ-020` (vị trí/thời lượng chưa chốt) | §5 |
|
||
| Skeleton | 🔴 `OQ-022` | §6 |
|
||
| `LanguageSwitcher` | 🔴 `OQ-022` | Component riêng của dự án (FR-15) — cố định ở header, mọi màn hình |
|
||
| `CurrencyToggle` / `PriceDisplay` | 🔴 `OQ-022` | Component riêng của dự án (FR-16) — hiển thị giá VND + giá quy đổi tham khảo, mọi nơi có giá |
|
||
|
||
### 11.1 Badge trạng thái — ánh xạ theo vòng đời (nguồn: `BR_CartCheckout_v1.0.md` §3)
|
||
|
||
*Chỉ mô tả **nhãn hiển thị** và **nhóm ý nghĩa màu** (không có hex cụ thể — SAD §7.0 xác nhận
|
||
dự án không có brand guideline; hex/màu chính xác thuộc `OQ-022` khi chọn design system).*
|
||
|
||
| Thực thể | Trạng thái kỹ thuật | Nhãn hiển thị (VI, đề xuất) | Nhóm ý nghĩa màu | Nguồn |
|
||
|---|---|---|---|---|
|
||
| `CART` | `active` | "Đang hoạt động" | Trung tính | `BR_CartCheckout_v1.0.md` §3 |
|
||
| `CART` | `converted` | "Đã chuyển thành đơn" | Thành công | nt |
|
||
| `CART` | `abandoned` | "Bỏ quên" | Trung tính/cảnh báo nhẹ | nt |
|
||
| `ORDER_SELLER` *(đoạn khởi tạo)* | `pending` | "Chờ thanh toán" | Cảnh báo | nt |
|
||
| `ORDER_SELLER` *(đoạn khởi tạo)* | `confirmed` | "Đã xác nhận" | Thành công | nt |
|
||
| `ORDER_SELLER` *(đoạn khởi tạo)* | `cancelled` | "Đã huỷ" | Lỗi/trung tính | nt |
|
||
| `PAYMENT` | `pending` | "Chờ xử lý" | Cảnh báo | nt |
|
||
| `PAYMENT` | `success` | "Thành công" | Thành công | nt |
|
||
| `PAYMENT` | `failed` | "Thất bại" | Lỗi | nt |
|
||
|
||
🔴 **Chưa đầy đủ để SRS dùng trực tiếp:** vòng đời đầy đủ của `ORDER_SELLER` sau `confirmed`
|
||
(packed/shipped/delivered/returned…) thuộc module Quản lý đơn hàng (FR-08/FR-19), **ngoài
|
||
phạm vi** module Giỏ hàng & Checkout — SRS của module đó phải bổ sung nhãn cho các trạng thái
|
||
còn lại (khớp danh sách filter đã có ở SCR-10: "Chờ xác nhận, Đang xử lý, Đang giao, Đã giao,
|
||
Đã huỷ, Yêu cầu đổi trả" — **các nhãn này chưa được đối chiếu 1-1 với state machine `BR` ở GĐ2**,
|
||
cần rà khi viết SRS US-004 trở đi). `Payment.status` khi COD (ghi `success` ngay hay giữ
|
||
`pending`) **chưa chốt** — xem `OQ-013` (đã mở từ GĐ2, chưa đóng).
|
||
|
||
## 12. Ngoại lệ đã duyệt
|
||
|
||
*`SRS`/`WF` lệch quy ước ⇒ phải có dòng ở đây. Không có dòng ⇒ lệch là lỗi, không phải quyết định.*
|
||
|
||
| # | Tài liệu | Mục lệch | Quy ước | Thực tế | Vì sao | Ai duyệt | Ngày |
|
||
|---|---|---|---|---|---|---|---|
|
||
| 1 | `SRS_US002-003_v1.0.md` §2.A.3.6, `WF_US002-003_v1.0.md` §3.1.3 | §6 Trạng thái chuẩn — "Rỗng, chưa có dữ liệu nào" | "Chưa có \<đối tượng\> nào." | "Giỏ hàng trống" + nút "Tiếp tục mua sắm" | Text nguyên văn đã có sẵn trong SAD §7.1.1 SCR-04 (nguồn duyệt sẵn), giữ nguyên để không tạo hai phiên bản câu chữ cho cùng một khái niệm | PO (thay Designer, `DEC-01`) | 2026-09-08 |
|
||
| 2 | `SRS_US002-003_v1.0.md` §2.A.3.1 (F01), `UICONV` §4 | §4 Form — "Vị trí nút Lưu... Thời điểm validate: khi rời field và khi bấm Lưu" | Không có nút "Lưu" riêng — mỗi lần đổi số lượng (F01) gửi `PATCH` ngay lập tức (auto-save) | Số lượng trong giỏ hàng là thao tác tần suất cao, chỉ một field; mẫu "inline edit" tránh người dùng phải nhớ bấm Lưu cho từng dòng trong danh sách nhiều dòng | PO (thay Designer, `DEC-01`) | 2026-09-08 |
|
||
|
||
## 13. Open Questions
|
||
|
||
| ID | Câu hỏi | Hỏi ai | Từ ngày | Chặn gì |
|
||
|---|---|---|---|---|
|
||
| OQ-018 | Ngưỡng breakpoint theo px cho desktop/tablet/mobile-web, và grid layout (số cột, gutter px, max-width px) toàn site | Dev FE / Tech Lead | 2026-09-08 | §1 |
|
||
| OQ-019 | Kiểu phân trang, số dòng/trang, tiêu chí sắp xếp mặc định cho danh sách sản phẩm (SCR-02) và lịch sử đơn hàng (SCR-10) | PO, Dev FE | 2026-09-08 | §3 |
|
||
| OQ-020 | Vị trí và thời lượng hiển thị toast thông báo | PO, Dev FE | 2026-09-08 | §5, §11 |
|
||
| OQ-021 | Nút CTA chính khi form chưa hợp lệ: bấm được rồi hiện lỗi, hay khoá (disable)? | PO, Dev FE | 2026-09-08 | §4 |
|
||
| OQ-022 | Chọn design system cụ thể (Material Design hay Ant Design) | Tech Lead | 2026-09-08 | §0, §11 |
|
||
| OQ-023 | Ngôn ngữ thiếu bản dịch: khoá hay fallback VI? Độ dài nhãn tối đa (ký tự)? Bản dịch EN/ZH/KO/JA cho các text mặc định ở §6 | PO, Dev FE (và cần đơn vị biên dịch cho ZH/KO/JA) | 2026-09-08 | §6, §9 |
|
||
| OQ-024 | Độ trễ debounce (ms) cho gợi ý autocomplete tìm kiếm | Dev FE | 2026-09-08 | §3 |
|
||
| OQ-025 | Quy tắc quy đổi tiền tệ tham khảo: nguồn tỷ giá, tần suất cập nhật, làm tròn | PO, Tech Lead | 2026-09-08 | §8 |
|
||
| OQ-026 | Xưng hô trong toàn bộ text hệ thống ("bạn" hay không xưng hô) | PO | 2026-09-08 | §9 |
|
||
| OQ-027 | 🔴 Ngoại lệ gate G2 chưa ký — ảnh hưởng tới §11 (Guest checkout) nếu `BACKLOG`/`BR` đổi khi ký G2 thật | PO, Tech Lead | 2026-09-08 | Baseline `UICONV` |
|
||
|
||
---
|
||
|
||
## Tự chấm
|
||
|
||
| # | Tiêu chí | ☐/✅ |
|
||
|---|---|---|
|
||
| 1 | Mọi ô "chọn một" đã chọn, không còn dấu `/` giữa các phương án | ☐ — 10 ô còn mở, mỗi ô có `OQ` tương ứng (§1, §3, §4, §5, §9), **không tự chọn** theo đúng chỉ đạo |
|
||
| 2 | §6 có hai trạng thái rỗng **trông khác nhau** | ✅ — "Rỗng — chưa có dữ liệu nào" (minh hoạ + nút chính, VD "Tạo mới"/"Tiếp tục mua sắm") khác "Rỗng — bộ lọc không khớp" (không minh hoạ, nút phụ "Xoá lọc"), theo đúng mẫu SCR-02 |
|
||
| 3 | §8 có múi giờ hiển thị và quy tắc làm tròn tiền | 🟡 — múi giờ đề xuất UTC+7 nhưng **chưa xác nhận chính thức** (đánh dấu 🔴 trong bảng); làm tròn VND đã có (không làm tròn thêm); làm tròn tiền quy đổi tham khảo **chưa chốt** (`OQ-025`) |
|
||
| 4 | §11 mọi kiểu trình bày dùng trong `WF` hiện có đều có dòng | ✅ — `WF_US002-003_v1.0.md` (SCR-04) chỉ dùng: Nhãn, Nút chính, Nút phụ, Nút nguy hiểm, Ô nhập số, Card, Modal, Badge trạng thái — cả 8 kiểu đều đã có dòng ở §11 |
|
||
| 5 | Có chữ ký Designer (hoặc ghi rõ dự án không có Designer ⇒ PO ký thay, `DEC-nn`) | ✅ — dự án không có Designer, PO ký thay theo `DEC-01` (đã sửa nội dung ở v1.2, giữ nguyên phần này); **chữ ký thật chưa có** — `Approved by` vẫn để trống, chờ PO ký ở G3 |
|