admin/src/views/profile-management/api/internal/profiles/profiles nếu dùng MySQL) hoặc Collection MongoDB. Các tính năng chính bao gồm CRUD, Phân công Server, Mở khóa Captcha, Quản lý tiến trình (Sessions) & Tính toán thời gian vòng đời (Cooldown/Age).email, password mà còn là user-agent, proxy, geo-location, độ phân giải màn hình, hệ điều hành. Nói cách khác Profile là một trình duyệt Ảo.Composables độc lập kết hợp Modal, và ở Backend chia nhỏ Handlers theo nhóm nhiệm vụ.UnifiedProfileManagement.vue. Từ "Unified" ở đây mang ý nghĩa Giao Diện Đồng Nhất:UnifiedProfileManagement.vue nằm ở việc code Component này không chứa logic dài dòng. Nó tuân thủ mẫu thiết kế Controller (Smart/Dumb Components). Nó đóng vai trò "Trạm Trung Chuyển State" (Props Down, Events Up):operations, Logic liên quan đến Table đổ vào useProfileTable.useStore.ts, họ đã cắt vụn nó thành 3 file Actions độc lập:admin/src/views/profile-management/profiles/stores/useProfileCrudActions.ts. Khi có Bug về Load phân trang, vào useProfilePaginationActions.ts. Điều này giúp quản lý 10.000 dòng code Vue Frontend Store mà không bị rối rắm.Profile là một trong những Interface "bự" nhất trong codebase:useCountdownTimer)08:00, và thuật toán cho nó Cooldown 2 tiếng. Trong vòng bảng User Management, Status của nó sẽ là Cooldown (Chờ làm mát). Web App cần hiện thị cho người dùng biết "Còn bao nhiêu Giờ Phút Giây thì tài khoản này được giải phóng".composables/useCountdownTimer.ts, có một trick Force Vue Render rất thông minh:ProfileTable.vue sử dụng trigger này:01:59:59 -> 01:59:58 theo thời gian thực mà Ứng Dụng KHÔNG HỀ BỊ LAG! Kỹ Thuật Functional Render h() kết hợp Trigger này rất tốn chất xám để nghĩ ra!BulkAddAccountsModal.vue đóng vai trò Parsing.Email | Password | Recovery.Proxy|Server|Email.|), biến chuỗi thành Mảng JSON Array hàng nghìn Object.POST /api/profiles/bulk quá lớn, chứa hàng nghìn Account. Nếu Backend thực thi lệnh INSERT từng hàng trong vòng lặp for vào Database, mất tầm 5 phút, Cổng API sập Timeout Error.profile_crud_handlers.go)CreateProfile(InsertOne ở DB) tạo ra tình huống O(n) Network Call xuống MongoDB. Nhưng nhờ việc khoá trần (Cap Limit = 100), Thời gian response của Bulk Update vẫn an toàn dưới ngưỡng 3-5 giây. Frontend khi nhận được mảng errors sẽ hiển thị màu Đỏ cho những Account đã tồn tại (Duplicate) và Xanh cho những tài khoản Insert thành công. User Experience hoàn hảo thay vì ném ra 500 Internal Server Error vỡ cả mảng.api/internal/profiles/service/profile_crud.go có một hàm cốt tử định đoạt con bot nào được chạy:GetRandomAvailableProfile()filterProfilesByDailyLimit, hệ thống duyệt qua Tôn giáo MongoDB:CountDocuments) lọt trong vòng lặp VÀ CÀY TRỰC TIẾP lên DB (Vấn đề N+1 Query). Trả giá cho việc này là Query Cost có thể rất đắt. Để tối ưu trong tương lai, WinAd nên đổi sang dùng hàm Aggregate ($group) của MongoDB thay vì Loop Count.CountDocuments đã được Index trường Data created_at và assigned_profile_id, Tốc độ vẫn mượt mà cho 1 số lượng Server Node vừa phải.BulkUpdateProfiles? Bởi vì đôi khi 50 profile bị chết IP Proxy, người quản lý muốn ngắt cắm hàng loạt.BulkUpdateProfiles sẽ chạy câu lệnh MongoDB $updateMany: { $in: [ID_1, ID_2] }, cập nhật cái vèo toàn bộ 1000 row chuyển status thành deactivate. Tốc độ chỉ dưới 50ms. Cực kì lợi hại khi kết hợp Data Bulk Selection ở Frontend useBulkSelection.ts.profile_sessions (Cấu trúc BSON MongoDB Collection).Profile.sessions sẽ làm hỏng dữ liệu của Master. Việc Tách mảng profile_sessions giúp Backend ghi đè không sợ xung đột.CreateProfileSessionRequestprofile_sessions.go, đoạn code sau tự động hóa cấu hình ngày giờ chết của Session:ProfileDetailModal.vue chịu trách nhiệm gọi GET Array và vẽ một Component UI <n-card> liệt kê tất cả trình duyệt Chrome đang cắm vào tài khoản này (Hiển thị các tab IP, Trạng thái Active/Die).api/internal/profiles/service/profile_operations.go chứa Cây Logic phán xử (Penance Logic):is_deactivated = true cho Profile này. Node Cào Web tự vứt Profile đi và Roll Random Profile Mới. Không có sự tham gia của con người!PROFILETABLE.VUEUnifiedProfileManagement.vue là một trong những khối Component đồ sộ với Hàng chục nút Bấm Edit, Check, Watch Session, View Task.ProfileTable.vue:createColumns không nạp code chết HTML. Nó nạp bằng h() Vue Render Function trong Typescript để tạo ra JSX-like Elements.n-data-table của NaiveUI không phải Compile HTML Template hàng ngàn lần.user_token, profile_id, proxy_id, Tốc độ Paint Frame của Browser nhảy từ 30fps lên 120fps (Cực kỳ xịn xò với Native JSX Rendering Arrays).handler/profile_crud_handlers.go:profiles và bảng report_tasks thông qua từ khoá assigned_profile_id == profileID. Việc phân mảnh dữ liệu GetProfileReportTasksByDomain giúp Quản trị viên chỉ cần Nhấp Nút (Icon Mắt) tại Bảng Profile -> Hiện modal Load ngay lập tức danh sách hàng trăm dòng Job search nó vừa search được cho Domain abc.com. Không cần phải chạy File Excel ở trang Report Center Cồng Kềnh!PROFILEFILTERS.VUE) KHÔNG CẦN NÚT SEARCHProfileFilters.vue, nó không hoạt động theo kiểu "Chọn Xong Phải Bấm Nút OK Mới Lọc Mảng". Mọi Filter từ Status (Active/Cooldown) đến Server Host (VietNam_VPS_01, VietNam_VPS_02) đều được tự động Bind v-model kết nối Event Driven.Computed Properties với Get và Set (2-way Binding Pattern) để emit Data ngược về thằng Bố UnifiedProfileManagement.vue. Nhờ vậy, UnifiedProfileManagement.vue sẽ gọi fetchProfiles() ngay lập tức mỗi khi Giá trị statusFilter thay đổi, hệ thống sẽ chớp tắt nhẹ cái Table Loading và Data mới ùa ra. Cảm giác tương tác thời gian thực tuyệt vời!hasActiveFilters):NTag xanh lơ:Bộ lọc đang áp dụng: [Trạng thái: Hoạt Động] [Máy chủ: Server HN]CLEANUP_HANDLERS.GOProfileSessions.ExpireAt).profile_cleanup.go, Hàm Lớn Nhất là ComprehensiveCleanup:GET /api/profiles/admin/cleanup chạy hàng đêm bằng Node Schedule Master, Hệ thống sẽ bảo vệ được Data Space và Tốc độ Index Của Database Ổn Định Nhất Mức Có Thể.TestProfileConnection)PROFILE_EDIT_MODAL.VUEProfileEditModal.vue có tới gần 300 dòng mã nguồn vì nó chứa một cái Form Siêu Khổng Lồ để chỉnh sửa 1 Account Google.used_for (Loại Ứng Dụng của Tab Profile):AppPassword. Component đã tinh tế dùng v-if để ẩn field này đi nếu Profile đó chỉ dùng để Click Quảng Cáo (Search Based), giúp Frontend không bị rối.watch)UnifiedProfileManagement.vue) xuống Modal con vốn dĩ là Read-Only (Chỉ Đọc). Làm sao để Edit Form mà không làm rách Object của Cây cha?localProfile. Chỉ khi user bấm NButton @click="handleSave", nó mới bắn Ngược bản Local này lên cho thẻ Bố lưu vào Store. Pattern Modal chuẩn chỉnh!browser_type, operating_system, screen_resolution, user_agent, v.vprofiles MongoDB chứa:{
"browser_type": "chrome_128",
"operating_system": "Windows 11",
"screen_resolution": "1920x1080",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
}--window-size=1920,1080 khớp dính với Tài khoản. Tài khoản đó sẽ "Sống Mãi" như 1 con người thật!PROFILE_CRUD.GO VÀ PROFILE_OPERATIONS.GOprofile_service.go).profile_crud.go: Chỉ lo chuyện Thêm, Sửa (Update Name/Email), Xóa (Delete Row). Phục vụ Database thô sơ.profile_operations.go: Nhận các Lệnh phức tạp có tính Toán Logic. Vi dụ Hàm RecordFailedLogin phân tích số lần rớt mạng. Hoặc BulkUpdateProfiles cập nhật Hàng Lọt State.profile_crud.go, ta thấy API tạo Profile TỰ ĐỘNG CHỐNG OVERRIDE ID:createColumns của NaiveUI để cứu Tốc độ RAM Browser khi tải 10,000 Tài khoản đồng thời kích hoạt Event Timers cho Từng Hàng Hàng Loạt.CountDocuments của report_task để loại Profile đó ra khỏi Pool, bảo quản mạng sống cho Google Account của Công ty.GetAvailableProfiles gọi Select Mongo liên tục từ hàng nghìn Bot, Có thể áp dụng Redis Caching với List Pop (Redis SET). Pop Profile ra, khi nào dùng xong Push trả lại SET. Giúp MySQL / MongoDB rảnh tay xử lý những task nặng hơn (Báo Cáo Biểu Đồ).Pinia, như đã đề cập ở Phần II, File useProfilePaginationActions.ts chịu trách nhiệm 1 việc nhỏ bé nhưng cực kỳ sinh tử:this.fetchProfiles() theo phong cách Class-Based/Options API cổ lỗ sĩ, Mọi thứ được gói kín trong 1 Factory Function cấp phát store: any từ gốc mẹ. Nó giống như việc "Cho Mượn Pinia Store" để làm biến Local.store thành Object Trống { currentPage: 1, fetchProfiles: () => {} }. 100% Khả năng Test tự động thành công không cần phải khởi chạy môi trường Browser tốn kém bộ nhớ.proxy_id và proxy_region trong Bảng Profile là thứ sống còn.Service Create Profile:Behavior Analysis. Nếu hôm nay Profile admin@gmail.com ở IP Thái Bình (Việt Nam), ngày mai nó vọt sang IP New York, Mạng lưới Google sẽ đưa Account vào trạng thái Check Point (Mở khóa Captcha). Điều này khiến Bot Tool Chết hàng rạt.Server (Node Máy Cắm) -> Phải có Proxy cùng Region (Tỉnh Thành/Quốc gia). Đây là sự trỗi dậy của biến country và server_id. Admin chọn Nén (Map) Profile cho Máy chủ gốc tại VN, thì Proxy cấp phát cũng có Prefix là VN. Mảng Business Logic này là bức tường lửa sống chết phân biệt Hệ thống Boot Cùi Bắp và Hệ thống Cày View Siêu Cấp.ProfileEditModal.vue tự điều biến Fields để đối phó với sự khắc nghiệt của Yêu cầu Bảo vệ Google Account.ProfileFilters.vue thiết kế kiểu Emit Trigger V-Model, chớp tắt Filter Tag đẹp đẽ, đẳng cấp như Data Table của Github.*[Hex]bson.ObjectID.profiles để ghi trạng thái Đã Logged In, tạo bảng con profile_sessions để chống Lỗi Read/Write Deadlock ở Mongo DB!Cleanup_handlers.go dùng làm Cronjob bảo vệ File System Mongo không bị cháy RAM với rác Tracking Cookie 3 tháng. Giới hạn Cào (Daily Report Limits) bằng lệnh Lọc ở hàm GetRandomProfiles().useProfileTable.ts)ProfileTable.vue vô cùng mượt mà. Bí thuật thực sự nằm ở file useProfileTable.ts. Component này phô diễn kỹ năng sử dụng hàm h() (Hyperscript/Virtual DOM rendering) của Vue 3:<n-data-table>, nếu ta sử dụng kịch bản <template> trong thẻ .vue thông qua vòng lặp v-for hoặc slots, Vue Compiler sẽ hao tốn Resource để Parse Template thành Render Function.h(), Kỹ sư Front-End Bypass qua lớp Compile Template, Đẩy thẳng Cấu trúc Virtual Object vào Browser DOM. Điều này tiết kiệm 30-40% bộ nhớ RAM Của Chrome khi Render 1 Bảng Log dài hàng vạn Dòng.User-Interface trở thành một Cỗ máy Phân Luồng Màu Cờ Lập Trình thuần túy (Pure Functional Component). Hoàn toàn Không phụ thuộc HTML Markup!Xoá Cứng (Hard Delete) đối với Profile. Nếu Xóa cứng một profile, toàn bộ Biểu đồ Thống kê ngày hôm qua (đã cày bao nhiêu view) sẽ Bốc hơi do mất Khoá Ngoại (Foreign Key) profile_id.status: 'deleted' và gán Timestamp vào deleted_at.useProfileTable.ts xử lý cực mềm mại bằng cách Kiểm tra Cờ isDeleted: