src/router/modules/. Các route được tự động nạp bằng import.meta.glob và gắn vào layout chính.| Màn hình | URL | Route name | Mô tả |
|---|---|---|---|
| Đăng nhập | /login | login | Form nhập email và mật khẩu. Sau khi xác thực xong, hệ thống kiểm tra trạng thái 2FA để chuyển hướng tiếp. |
| Xác thực 2FA | /auth-factor | auth-factor | Nhập mã OTP 6 chữ số từ Google Authenticator. Nếu chưa thiết lập 2FA, màn hình này hiển thị mã QR để quét và kích hoạt. |
| Đăng ký | /signup | signup | Chỉ khả dụng khi MODE=development. Ở môi trường khác sẽ bị redirect về trang đăng nhập. |
| Màn hình | URL | Route name | Mô tả |
|---|---|---|---|
| Thống kê hàng ngày | /report-daily | reportDaily.root | Trang mặc định sau khi đăng nhập. Báo cáo sản lượng traffic theo ngày, lọc được theo khoảng thời gian. |
| Dashboard báo cáo | /report-dashboard | report-dashboard | Trung tâm báo cáo với nhiều tab: tổng quan, hiệu suất theo nền tảng, phân tích thương hiệu, xu hướng theo ngày. |
| Thống kê click quảng cáo | /dashboard1/click-ads | dashboard.click-ads | Chi tiết các lượt click vào Google Ads và CocCoc Ads. |
| Thống kê Negative SEO | /dashboard1/negative-seo | dashboard.negative-seo | Traffic Kill gửi đến website đối thủ, kèm biểu đồ thứ hạng từ khóa theo thời gian. |
| Thống kê traffic tự nhiên | /dashboard1/traffic-natural | dashboard.traffic-natural | Traffic mô phỏng hành vi truy cập tự nhiên không qua quảng cáo. |
| Màn hình | URL | Route name | Mô tả |
|---|---|---|---|
| Tìm kiếm tự động | /auto-search | auto-search | Route gốc, tự động chuyển hướng đến tab Google Ads. |
| Google Ads | /auto-search/google-search | auto-search.google-search | Quản lý nhóm từ khóa giả lập click quảng cáo Google. Hỗ trợ tạo hàng loạt, cập nhật trạng thái và xem lịch sử kết quả. |
| CocCoc Ads | /auto-search/coccoc-search | auto-search.cococ-search | Tương tự Google Ads nhưng dùng engine CocCoc. |
| Hiệu suất máy chủ | /auto-search/server-performance | auto-search.server-performance | Theo dõi hiệu suất Worker theo thời gian thực. Biểu đồ phân tích theo khung giờ với các chỉ số: xử lý, thành công, thất bại, captcha, lỗi. |
| Quản lý vị trí | /auto-search/location | auto-search.location | Danh sách vị trí địa lý (lat/lng) gán cho các chiến dịch traffic. |
| Màn hình | URL | Route name | Mô tả |
|---|---|---|---|
| Quản lý máy chủ | /system-management/server-management | system-management.server-management | Danh sách Worker với thông tin IP, giới hạn tiến trình, số tiến trình hiện tại và trạng thái. Hỗ trợ kích hoạt/vô hiệu hóa và xóa hàng loạt. |
| Quản lý proxy | /system-management/proxy-management | system-management.proxy-management | Danh sách proxy IP với đầy đủ thông tin: host, port, username, password, khu vực, nhà cung cấp, ngày hết hạn, giá và trạng thái. Hỗ trợ import từ Excel và xóa hàng loạt. |
| Quản lý backup proxy | /system-management/backup-proxy-management | system-management.backup-proxy-management | Proxy dự phòng kích hoạt khi proxy chính gặp sự cố. Hỗ trợ kiểm tra sức khỏe, import từ Proxifly và xóa hàng loạt. |
| Quản lý gói proxy | /system-management/proxy-package-management | system-management.proxy-package-management | Theo dõi các gói proxy đã mua: mã gói, tên, giá, nhà cung cấp và trạng thái kích hoạt. |
| Quản lý nhà cung cấp | /system-management/proxy-provider-management | system-management.proxy-provider-management | Thông tin nhà cung cấp proxy: tên, tài khoản, domain, loại kết nối (4G/ADSL), chu kỳ reset và dữ liệu sử dụng. Hỗ trợ sắp xếp thứ tự ưu tiên. |
| Màn hình | URL | Route name | Mô tả |
|---|---|---|---|
| Quản lý tài khoản | /user-management/users | user-management.user | Tạo, chỉnh sửa, xóa tài khoản nhân sự. Hỗ trợ đổi mật khẩu và kích hoạt/vô hiệu hóa. |
| Nhật ký hoạt động | /user-management/activities | user-management.active | Lịch sử hành động của từng tài khoản: thao tác gì, trên đối tượng nào, giá trị trước/sau khi thay đổi, IP và User-Agent. |
| Màn hình | URL | Route name | Mô tả |
|---|---|---|---|
| Quản lý chiến dịch | /campaigns | campaigns | Danh sách chiến dịch traffic với thống kê tổng hợp. Hỗ trợ xuất dữ liệu ra Excel theo khoảng thời gian. |
| Quản lý hồ sơ | /profile-management | profile-management | Quản lý Browser Profile dùng cho tự động hóa. Theo dõi trạng thái, lần sử dụng cuối, số lần click và tìm kiếm. |
| Danh sách tác vụ | /tasks | tasks | Chi tiết các tác vụ traffic đang thực thi: tiến độ, loại traffic, thiết bị và từ khóa. |
| Trang 404 | — | notFound | Hiển thị khi URL không khớp với bất kỳ route nào. |
| Trang 403 | — | forbidden | Hiển thị khi tài khoản không có quyền truy cập. |
/login.POST /api/user/login. Server trả về AuthToken gồm token, refresh_token, device_token và cờ is_2fa.authStore.login() lưu AuthToken vào Pinia store và cập nhật sessionStorage.is_2fa.GET /api/user/profile để lấy thông tin người dùng, lưu vào authStore.profile.profile.two_factor: nếu false thì chuyển đến màn hình quét QR, nếu true thì chuyển đến màn hình nhập OTP.POST /api/user/verify-totp, token được lưu vào localStorage với key auth_token và sessionStorage.move_to_dashboard được đặt thành 'true'.move_to_dashboard và cho phép vào trang reportDaily.src/router/index.ts thực hiện:auth_token từ localStorage và parse thành AuthToken.authStore.authToken.GET /api/user/profile để xác minh token còn hiệu lực.sessionStorage.move_to_dashboard = 'true' và tiếp tục điều hướng.auth_token khỏi localStorage, ghi log lỗi và redirect về trang đăng nhập.router.beforeEach kiểm soát toàn bộ điều hướng theo thứ tự sau:login và đã có auth_token hợp lệ: phục hồi phiên và vào thẳng Dashboard.signup và không phải môi trường development: redirect về login.authStore.authToken hoặc authStore.profile trống: kiểm tra localStorage. Không có token thì lưu URL hiện tại vào sessionStorage.redirectTo và redirect về login.auth-factor: luôn cho phép để người dùng hoàn tất 2FA.sessionStorage.move_to_dashboard không phải 'true': chặn và redirect về login.sessionStorage.redirectTo tồn tại: xóa giá trị này và chuyển người dùng về URL họ muốn truy cập ban đầu.| Nơi lưu | Dữ liệu | Lý do |
|---|---|---|
localStorage (key: auth_token) | Toàn bộ AuthToken dạng JSON | Tồn tại qua các lần đóng/mở trình duyệt, cho phép phục hồi phiên tự động. |
sessionStorage (key: move_to_dashboard) | Chuỗi 'true' | Bị xóa khi đóng tab, đảm bảo mỗi phiên mới phải qua xác thực. Ngăn truy cập trực tiếp vào Dashboard khi chưa hoàn tất 2FA. |
sessionStorage (key: redirectTo) | Đường dẫn URL | Sau khi đăng nhập xong, hệ thống đưa người dùng về đúng trang họ muốn vào. |
sessionStorage (key: is_2fa) | 'true' hoặc 'false' | Màn hình auth-factor dùng để biết hiển thị form OTP hay form quét QR. |
| Pinia store (persist) | sideBarCollapsed, i18nLocale | Ghi nhớ tùy chọn giao diện giữa các phiên qua pinia-plugin-persistedstate. |
src/configs/axios.ts tự động gọi useAuthStore().logout(). Hàm này:authStore.authToken = null và authStore.profile = null.auth_token khỏi localStorage.is_2fa và move_to_dashboard khỏi sessionStorage.login.authStore cũng có hàm refreshToken() gọi POST /api/user/refresh để làm mới token trước khi hết hạn, sau đó cập nhật store và localStorage.src/layouts/LayoutDefault.vue, chia màn hình thành hai vùng:sideBarCollapsed) lưu vào localStorage qua appStore. Khi thu gọn chỉ hiện icon, khi mở rộng hiện đầy đủ tên.HeaderBar phía trên và RouterView bên dưới để render màn hình hiện tại.route.meta.title của các route đang active. Không cần khai báo thủ công ở bất kỳ component nào.authStore.profile.authStore.logout().appStore.i18nLocale.router.afterEach chạy sau mỗi lần điều hướng thành công:to.matched — mảng tất cả route đang active từ gốc đến lá.meta.title, tạo một breadcrumb gồm text, to và routeName.appStore.breadcrumbs.HeaderBar lắng nghe và render tự động.window.$loadingBar được mount toàn cục từ Naive UI:router.beforeEach gọi window.$loadingBar.start() khi bắt đầu xử lý điều hướng.router.afterEach gọi window.$loadingBar.finish() sau khi hoàn tất.src/main.ts và truy cập qua window.$message, window.$notification, window.$loadingBar.| Kênh | Khi nào dùng | Thời gian hiển thị |
|---|---|---|
window.$message.success() | Tác vụ thành công: lưu cấu hình, tạo bản ghi, xóa xong. | 3 giây, tự ẩn. |
window.$message.error() | Lỗi từ API hoặc lỗi JavaScript. | 5 giây, tự ẩn. |
window.$message.warning() | Cảnh báo: chưa chọn bản ghi, dữ liệu không hợp lệ. | 3 giây, tự ẩn. |
window.$message.info() | Thông tin trung tính không cần hành động. | 3 giây, tự ẩn. |
showMessageError trong src/composables/utils.ts là điểm duy nhất xử lý và hiển thị lỗi API. Nó chuẩn hóa lỗi theo thứ tự ưu tiên:response.data.errors (lỗi validation nhiều trường): nối tất cả thành chuỗi xuống dòng.response.data.message (chuỗi đơn): dùng trực tiếp.error.message (lỗi JavaScript thuần): dùng trực tiếp.defaultMsg hoặc 'An error occurred' làm fallback cuối.vue-i18n v9, cấu hình trong src/plugins/i18n.ts.vi-VN).vi-VN và en-US.locales/vi-VN.json và locales/en-US.json.appStore.i18nLocale, persist qua pinia-plugin-persistedstate.useI18n() hoặc $t(). Trong file TypeScript thuần dùng (window as any).$t vì useI18n() chỉ hoạt động trong Vue component context.AxiosHttp trong src/configs/axios.ts tạo một Axios instance duy nhất:baseURL: Đọc từ useEnv('VITE_API_SERVER') và nối thêm /api.timeout: 10,000ms mặc định.Authorization: Bearer {token} vào mọi request.device_token, đính kèm thêm header Device-Token./import-all: 300,000ms (5 phút) — import proxy hàng loạt./get-data-report: 60,000ms (1 phút) — tổng hợp báo cáo lớn.authStore.logout() và redirect về login.showMessageError.src/types/modules/. File src/types/index.ts re-export tất cả để các file khác chỉ cần import từ một nơi: import type { Auth, Server, Proxy } from '@/types'.Auth, AutoSearchKeyword, Server, ServerPerformance, Proxy, Campaign, Task, User, Package, Provider, Location, NegativeSeo, TrafficNatural, Activity, Profile.ref và reactive trong composable riêng.keyword_results.action_status và confirm_status cho từng kết quả.pending — Chờ xử lý, Worker chưa thực hiện hành động.clicked — Worker đã click thành công.skipped — Worker bỏ qua theo cấu hình.error — Worker gặp lỗi khi xử lý..xlsx.Campaign chứa nhiều Task.Item.GET /api/campaign/export với tham số ngày, server trả về file Excel (Blob) được tải xuống tự động qua useDownload.active, inactive, cooldown, banned.total_clicks, total_searches, report_task_count, profile_age.server_id, server_region, used_for.cooldown với thời gian kết thúc lưu trong cooldown_until. Worker không dùng profile này cho đến khi hết cooldown.MALICIOUS_AD, PHISHING_AD, MISREPRESENTATION_AD.LOW, MEDIUM, HIGH, CRITICAL.PENDING, SUBMITTING, COMPLETED, FAILED, PARTIAL.user_id, action (create/update/delete), model_name, model_id, old_value, new_value, ip_address, user_agent, created_at.vue-echarts): Biểu đồ cột, đường, tròn cho Server Performance và Dashboard.xlsx — Đọc/ghi file Excel cơ bản.xlsx-js-style — Mở rộng của xlsx với hỗ trợ định dạng màu sắc, font và border.responseType: 'blob', server trả về file Excel dạng binary, hàm useDownload(blob, fileName) tạo URL tạm và kích hoạt download tự động.xlsx-js-style mà không cần gọi API.