Một danh sách duy nhất liệt kê toàn bộ nội dung hiển thị cho giáo viên trên teacher.flyer.us và teacher.teado.ai. Đội marketing xem, đề xuất sửa, gửi duyệt và theo dõi lịch sử từng thay đổi; bản mới lên production mà không cần build lại mã nguồn.
Nội dung mà giáo viên nhìn thấy trên teacher.flyer.us hiện nằm ở bốn nơi, với bốn cách sửa và bốn mức lịch sử khác nhau. Bảng dưới đây được đối chiếu trực tiếp với mã nguồn partner-web, cơ sở dữ liệu production và admin.flyer.vn ngày 10/09/2026.
| Lớp nội dung | Đang ở đâu | Khối lượng | Ai sửa được | Lịch sử | Thời gian lên production |
|---|---|---|---|---|---|
| Chuỗi giao diện (nhãn nút, tiêu đề, hướng dẫn trong ứng dụng, mô tả gói, cẩm nang) | 16 file JSON trong mã nguồn (src/locales/vi|en|es), đóng gói lúc build | 6.515 VI 6.524 EN 6.524 ES | Chỉ dev | Chỉ có trong git; marketing không đọc được | Chờ commit → build → deploy (57 phút) theo nhịp release, thường 7–14 ngày |
| Popup “Có gì mới” theo phiên bản | Bảng version_notifications; admin.flyer.vn đã có màn nhập | 69 bản (34 · 21 · 14 theo năm 2024–26) | Admin và marketing (linhpham 31 lần, nghiepbv 20, kallie 5, uyenemma 4) | Chỉ ghi ai sửa lần cuối, khi nào; không giữ bản cũ | Ngay |
| Popup giới thiệu theo menu | Bảng menu_notifications; admin.flyer.vn | 29 bản, toàn bộ đang tắt từ 06/08/2026 | Admin và marketing | Như trên | Ngay |
| Trung tâm trợ giúp help.flyer.vn | GitBook | 35 bài cho giáo viên | Marketing | GitBook giữ lịch sử riêng | Ngay, nhưng không nối với màn hình sản phẩm |
Trang giới thiệu khi chưa đăng nhập có tài liệu riêng: PRD trang giới thiệu teacher.flyer.us. Nội dung học liệu (đề, chương trình, video) thuộc đội Academic và không nằm trong phạm vi này.
common.json; muốn biết màn hình Gói dịch vụ đang viết gì phải mở mã nguồn.Mục tiêu: một nơi liệt kê 100% nội dung sản phẩm, marketing tự rà soát và đề xuất sửa, PM duyệt, hệ thống giữ lịch sử từng mục (ai, khi nào, bản cũ, bản mới, lý do), và bản đã duyệt hiển thị trên production trong vòng một ngày mà không cần build lại mã.
Xây một Kho nội dung (content registry) gom cả bốn lớp thành một danh sách phẳng. Mỗi mục có mã, màn hình xuất hiện, ba ngôn ngữ, trạng thái, ngày và người cập nhật gần nhất, và dòng lịch sử. Luồng làm việc duy nhất cho mọi lớp:
Ba nguyên tắc thiết kế:
Kho được triển khai theo hai phần: Phần A chạy ngay bằng Google Sheet và một script, không cần dev, để đo nhu cầu thật của marketing trong bốn tuần; Phần B xây màn hình trong admin.flyer.vn nếu Phần A chứng minh được giá trị.
Đội marketing đã dùng Google Sheet để đề xuất sửa nhãn nút và nội dung popup. Phần còn thiếu chỉ là đường đưa những đề xuất đó lên production. Khảo sát mã nguồn ngày 10/09/2026 cho thấy hạ tầng cần thiết đã có sẵn trong sản phẩm, chia làm hai nhóm với hai mức sẵn sàng khác nhau.
Hai bảng version_notifications (69 bản) và menu_notifications (29 bản) đã có màn nhập trong admin.flyer.vn, và marketing đang thao tác trực tiếp trên đó: lịch sử sửa ghi nhận linhpham 31 lần, nghiepbv 20 lần, kallie 5 lần, uyenemma 4 lần. Nội dung lưu ở cơ sở dữ liệu nên hiển thị ngay sau khi lưu, không qua build.
Ba việc cần bổ sung, làm được trong tuần mà không cần lập trình:
Đây là nhóm đang phải chờ release. Điểm mấu chốt tìm được: sản phẩm đã tích hợp sẵn Firebase Remote Config và đang chạy trên production.
| Thành phần đã có | Trạng thái trong mã nguồn |
|---|---|
Thư viện firebase 12.11.0 kèm firebase/remote-config | Đã cài, đang dùng |
RemoteConfigProvider bọc toàn ứng dụng | Gắn tại src/pages/_app.tsx, bao ngoài mọi màn hình |
| Tự động tải và kích hoạt giá trị mới | fetchAndActivate chạy mỗi lần khởi tạo; giá trị dạng JSON được tự phân giải |
| Nhịp làm mới | Production 6 giờ, môi trường phát triển 20 giây; đổi bằng biến môi trường, không cần sửa mã |
| Dự án Firebase | mover-online-english cho production |
Nghĩa là đã có sẵn một kênh đẩy dữ liệu từ ngoài vào ứng dụng đang chạy. Việc còn lại là nối kênh đó vào lớp ngôn ngữ.
Thư viện next-translate 3.1.1 cho phép lồng I18nProvider, và bản lồng bên trong ghi đè lên bản bên ngoài. Vì vậy chỉ cần thêm một thành phần đọc giá trị từ Remote Config, trộn lên bộ chuỗi hiện có, rồi bọc quanh nội dung trang.
| Việc | Khối lượng | Rủi ro |
|---|---|---|
Thành phần trộn chuỗi ghi đè, bọc quanh <Component /> trong _app.tsx | Một file mới khoảng 25 dòng, sửa 2 dòng ở _app.tsx | Thấp. Không đụng tới 779 file đang gọi useTranslation; không có giá trị ghi đè thì mọi thứ chạy y như hiện tại |
Tham số contentOverrides trên Firebase console | Tạo một lần | Không |
| Script đọc sheet, ghi vào Remote Config qua Firebase Admin SDK | Nửa ngày | Thấp. Có thể bỏ qua ở giai đoạn đầu, marketing dán JSON thẳng vào console |
NEXT_PUBLIC_REMOTE_CONFIG_FETCH_INTERVAL_MILLIS xuống 15 phút, chỉ là đổi biến môi trường.I18nProvider ghi đè theo cả nhóm chứ không theo từng khoá, nên thành phần trộn phải giữ lại toàn bộ chuỗi gốc của nhóm rồi mới đắp phần sửa lên. Thứ hai, đây là lớp tạm: khi dev đưa bản mới vào mã nguồn, cần gỡ giá trị ghi đè tương ứng để tránh chữ cũ đè lên chữ mới. Quy ước gỡ nằm ở mục 5.partner_package.plan_desc_1 đang ghi “hơn 6000 đề” trong khi trang giới thiệu và email đã dùng số 20.000.Đội marketing đã dùng Google Sheet cho việc đề xuất sửa. Phần này chuẩn hoá lại sheet đó để phủ đủ 6.515 chuỗi và nối được với kênh phát hành ở mục 3.
Script đọc 16 file JSON của ba ngôn ngữ, gắn mỗi chuỗi với màn hình bằng bảng route → namespace sẵn có trong i18n.js (ví dụ /program → program.json, /flyer-ai → flyer_ai.json, /tuition-management → tuition_management.json) và nhóm cấp một trong common.json (partner_package, home_new, user_guide…). Kết quả là sheet “Kho nội dung teacher.flyer.us”:
| Cột | Nội dung | Ai điền |
|---|---|---|
| Mã | common.partner_package.plan_desc_1 | Script |
| Màn hình | Gói dịch vụ · /partner-package | Script |
| VI · EN · ES | Bản đang chạy trên production | Script; marketing sửa trực tiếp vào ô |
| Trạng thái | Giữ nguyên · Đề xuất sửa · Đã duyệt · Đã lên production | Marketing đổi sang “Đề xuất sửa”; PM đổi sang “Đã duyệt” |
| Lý do | Một câu vì sao cần sửa | Marketing |
| Người · Ngày | Tự điền bằng công thức khi ô thay đổi | Sheet |
Lọc theo cột Màn hình để rà từng khu vực. Sửa chữ ngay trong ô VI/EN, đổi trạng thái sang “Đề xuất sửa”, ghi lý do. Google Sheet giữ lịch sử phiên bản của từng ô, nên yêu cầu “ghi lại ngày cập nhật” được đáp ứng mà không cần xây gì thêm.
content: tuần 38. Dev merge cùng release gần nhất.Giữ nguyên admin.flyer.vn và GitBook. Sheet có thêm tab Popup & Help liệt kê 69 popup phiên bản, 29 popup theo menu và 35 bài help kèm link và ngày sửa gần nhất, để marketing rà soát cùng một chỗ. Khi sửa popup trên admin, marketing dán bản cũ vào tab Nhật ký trước khi ghi đè.
Xây khi Phần A cho thấy nhu cầu ổn định (gợi ý: từ 20 đề xuất mỗi tuần trở lên, hoặc thời gian chờ lên production là điểm nghẽn chính).
Mục Nội dung sản phẩm trong admin.flyer.vn, đặt cạnh mục Thông báo hiện có (nơi popup đang được sửa). Ba vai trò:
| Vai trò | Được làm | Không được làm |
|---|---|---|
| Marketing | Xem toàn bộ, đề xuất sửa, xem lịch sử, khôi phục đề xuất do chính người đó tạo | Phát hành |
| PM | Duyệt, trả lại, phát hành, khôi phục bất kỳ phiên bản | — |
| Dev | Xem trạng thái đồng bộ mã nguồn, thu hồi bản ghi đè | — |
Một bảng phẳng, mỗi dòng là một mục nội dung. Bộ lọc: màn hình, ngôn ngữ, trạng thái, ngày sửa, người sửa; ô tìm kiếm theo chữ hoặc theo mã. Nút Mở trên sản phẩm nhảy tới đúng trang teacher.flyer.us nhờ bảng route → namespace.
| Mã · Màn hình | VI | Trạng thái | Sửa lần cuối |
|---|---|---|---|
partner_package.plan_desc_1Gói dịch vụ | Truy cập vào kho tài nguyên với hơn 6000 đề | Chờ duyệt | 10/09 · Linh |
home_new.all_classes_performanceTrang chủ | Hiệu suất học tập của các lớp | Đang chạy | 02/07 · dev |
user_guide.guid_61Cẩm nang | Bài tập sẽ được tự động gửi cho học sinh khi đến giờ đã hẹn | Đang chạy | 15/05 · dev |
v4.goals.titleOnboarding | Bạn muốn bắt đầu với mục tiêu nào? | Mới — chưa rà | 03/07 · dev |
Mô phỏng bố cục màn hình danh sách; số liệu trong bảng lấy từ production ngày 10/09/2026.
{{name}}, {{count}}) để tránh vỡ cú pháp nội suy.PM thấy hàng chờ, so sánh bản cũ và bản mới cạnh nhau, chọn Duyệt hoặc Trả lại kèm ghi chú. Phát hành ghi bản ghi đè lên kho phân phối; ứng dụng nạp bản mới trong tối đa năm phút, không cần build. Có nút Phát hành thử cho tôi để người duyệt thấy bản mới trên tài khoản của người duyệt trước khi phát hành cho tất cả.
Hai bảng version_notifications và menu_notifications được đọc và ghi qua các mutation đã có của admin; kho chỉ thêm lớp lịch sử và bước duyệt. Bài trên help.flyer.vn được liệt kê kèm ngày sửa từ GitBook, có thể gắn với màn hình tương ứng để marketing thấy chỗ nào của sản phẩm đang thiếu bài hướng dẫn.
Một tác vụ đọc nhánh dev mỗi giờ. Mục mới trong JSON được gắn nhãn Mới — chưa rà; mục đã xoá khỏi mã được gắn Đã xoá khỏi mã và bản ghi đè của nó tự vô hiệu. Nếu dev sửa chính chuỗi đang có bản ghi đè, kho báo xung đột cho PM chọn giữ bản nào.
| Thành phần | Thiết kế | Ghi chú |
|---|---|---|
| Lưu trữ | content_items (mã, namespace, màn hình, ngôn ngữ, bản gốc, bản ghi đè, trạng thái, người và thời điểm sửa) và content_versions (mục, phiên bản, nội dung, tác giả, lý do, thời điểm) | Cùng Postgres và Hasura đang dùng; không thêm hạ tầng |
| Phân phối | Sau khi phát hành, tác vụ xuất bản ghi đè thành file tĩnh /overrides/<lang>/<namespace>.json lên CDN, cache 5 phút | Dùng statics.flyer.us hiện có hoặc R2 |
| Ứng dụng nạp | loadLocaleFrom trong i18n.js đã là hàm bất đồng bộ và đã có mergeWithBase để trộn ES lên EN; thêm một bước tải file ghi đè rồi trộn lên JSON gốc theo cùng hàm | Lỗi mạng hoặc file trống → dùng bản gốc, không bao giờ chặn trang |
| Màn hình của mỗi mục | Suy từ bảng route → namespace trong i18n.js và nhóm cấp một của khoá; bảng ánh xạ do PM chỉnh tay cho các nhóm chung của common.json | 120 nhóm cấp một trong common.json cần gán tay một lần |
| Popup | Dùng mutation sẵn có của admin cho version_notifications và menu_notifications; thêm ghi phiên bản trước khi cập nhật | Trường show_domain đã có, dùng để tách flyer.us và teado.ai |
| Đồng bộ mã | Tác vụ đọc src/locales trên nhánh dev qua Gitea API mỗi giờ, so khoá | Không chạm vào quy trình build hiện tại |
Rủi ro cần xử lý trong thiết kế chi tiết: chuỗi chứa HTML hoặc biến nội suy (kiểm tra cú pháp trước khi phát hành); một khoá dùng ở nhiều màn hình (hiển thị mọi nơi dùng); xung đột khi dev và marketing cùng sửa một khoá (quy ước bản ghi đè có hiệu lực cho đến khi dev merge và kho tự thu hồi); tiếng Tây Ban Nha hiện dùng bản EN khi thiếu khoá, cần giữ nguyên hành vi đó với lớp ghi đè.
| Giai đoạn | Phạm vi | Nguồn lực | Điều kiện lên tiếp |
|---|---|---|---|
| P0 — tuần 15–19/09 | Phần A: script xuất sheet, tab Nhật ký, nhịp duyệt thứ Tư, PR đầu tiên | 0,5 ngày dev hoặc PM chạy script; marketing bắt đầu rà từ màn Gói dịch vụ và Trang chủ | Chạy đủ 4 tuần, có số đo ở mục 7 |
| P1 — Sprint 115 | Danh sách, sửa, duyệt, lịch sử cho tiếng Việt; lớp ghi đè và nạp trên ứng dụng | Khoảng 2 tuần dev (1 backend, 1 frontend admin) | Marketing tự phát hành được 1 tuần không cần dev can thiệp |
| P2 — Sprint 116 | EN và ES; popup vào cùng kho; đồng bộ khoá tự động; xem trước với biến thật | Khoảng 1,5 tuần dev | — |
| P3 | Liệt kê bài help.flyer.vn theo màn hình; trang giới thiệu khi chưa đăng nhập | Theo PRD trang giới thiệu | — |
| Chỉ số | Hiện tại | Sau Phần A | Sau Phần B |
|---|---|---|---|
| Thời gian từ đề xuất sửa đến lên production | Một chu kỳ release, 7–14 ngày, nếu dev nhận | ≤ 7 ngày | ≤ 1 ngày |
| Tỉ lệ nội dung đã được marketing rà soát | 0% | Màn Gói dịch vụ, Trang chủ, Onboarding: 100% | 100% trong 2 tháng |
| Số lần dev phải sửa nội dung thay marketing mỗi tháng | Không đo được; ước từ 100 commit chạm nội dung / 90 ngày | Có số đo | Tiến về 0 |
| Mục có lịch sử từ 2 phiên bản trở lên | Chỉ có với chuỗi giao diện, trong git | Toàn bộ dòng đã sửa | 100% mục đã sửa, kể cả popup |
show_domain, gợi ý dùng một kho chung.Mười dòng dưới đây lấy trực tiếp từ src/locales/vi/common.json ngày 10/09/2026, theo đúng định dạng sheet của Phần A. Đây là những nhóm marketing nhiều khả năng muốn sửa trước: mô tả gói dịch vụ, chỉ số trên trang chủ, và cẩm nang trong ứng dụng.
| Mã | Màn hình | VI đang chạy | Trạng thái |
|---|---|---|---|
partner_package.plan_desc | Gói dịch vụ | Mở khoá tính năng không giới hạn của Trợ giảng AI, bao gồm | Giữ nguyên |
partner_package.plan_desc_1 | Gói dịch vụ | Truy cập vào kho tài nguyên với hơn 6000 đề | Đề xuất sửa (số đã cũ) |
partner_package.plan_desc_2 | Gói dịch vụ | Quản lý lớp học lên đến 50 học sinh với đầy đủ các tính năng | Giữ nguyên |
home_new.test_level_details | Trang chủ | Thông tin chi tiết theo cấp độ bài thi | Giữ nguyên |
home_new.all_classes_performance | Trang chủ | Hiệu suất học tập của các lớp | Giữ nguyên |
home_new.total_number_of_assign_tests | Trang chủ | Số lượng bài tập giáo viên đã giao | Giữ nguyên |
user_guide.guid_61 | Cẩm nang trong ứng dụng | Bài tập sẽ được tự động gửi cho học sinh khi đến giờ đã hẹn | Giữ nguyên |
user_guide.guid_63 | Cẩm nang trong ứng dụng | Hệ thống tự động đánh dấu những bài nộp muộn thời hạn | Giữ nguyên |
user_guide.guid_66 | Cẩm nang trong ứng dụng | để hoàn thành việc giao bài | Đề xuất sửa (câu cụt) |
v4.goals.title | Onboarding | Bạn muốn bắt đầu với mục tiêu nào? | Mới — chưa rà |
Quy mô đầy đủ theo nhóm file: common 3.607 · my_exam 770 · flyer_ai 661 · centralized_exam 264 · tuition_management 249 · onboarding 229 · program 168 · challenge 121 · auth 106 · title 82 · bank_account 58 · modal 50 · course 47 · student_info_modal 47 · và 2 file nhỏ còn lại.
Nguồn: mã nguồn partner-web nhánh dev (i18n.js, src/locales), read-replica production (version_notifications, menu_notifications), admin.flyer.vn (mục Thông báo), help.flyer.vn · Tài liệu liên quan: PRD trang giới thiệu · PRD email onboarding · Danh mục PRD · Roadmap