News
    • Tổng quan
    • Gốc

    Tổng quan

    Tài liệu Frontend - NewsLooks Theme#

    1. Tổng quan#

    Theme NewsLooks cung cấp các chức năng frontend cho website tin tức/blog, bao gồm hiển thị trang chủ, chi tiết bài viết, danh mục, tìm kiếm, bình luận, đăng ký newsletter, và nhiều tính năng khác.

    2. Yêu cầu từ Thethaoso.online#

    Website tổng hợp tin tức thể thao trực tuyến với các chức năng:
    Tin tức bóng đá trong nước và quốc tế
    Tin chuyển nhượng, nhận định trận đấu
    Lịch thi đấu, kết quả, bảng xếp hạng
    Dữ liệu đội bóng, cầu thủ, HLV, giải đấu
    Hệ thống cào dữ liệu và AI viết bài tự động
    Tổng hợp nhận định và tips chuyên gia
    Analytics và tracking user
    Page builder kéo thả
    Quản lý nội dung, người dùng, phân quyền

    LƯU Ý PRODUCTION
    1.
    Các data section, block của các page trên production sẽ được lưu data của chức năng page builder
    2.
    Các chức năng sẽ có các trường quản lý nội dung
    FIGMA: https://www.figma.com/design/rhAvJ0Thj70CNsHSsaShth/DEV---Trang-Tin-Tu%CC%9B%CC%81c-The%CC%82%CC%89-Thao?node-id=496-10026&m=dev
    CÀI ĐẶT:
    1.
    Import file database đã cung cấp
    2.
    Clone source vào httdocs của xampp hoặc các server web
    3.
    Install các module của laravel với composer install
    4.
    Thay đổi đúng env
    db dev: https://drive.google.com/file/d/1xldck1PKyUXQAELiaBqhW5FY2b8_8Ye4/view?usp=drive_link
    db local: https://drive.google.com/file/d/1e48nd6l6WPHmnOv9dvXxSLJTEsYrvBiw/view?usp=sharing
    ENV
    `
    APP_NAME=Laravel
    APP_ENV=local
    APP_KEY=base64:QpKADkaSFTP60qtQaOr6V0BWuEC/c+pTbPCXX+Nnbgo=
    APP_DEBUG=true
    APP_URL=http://localhost/newslooks
    LOG_CHANNEL=stack
    LOG_DEPRECATIONS_CHANNEL=null
    LOG_LEVEL=debug
    DB_CONNECTION=mysql
    DB_HOST=localhost
    DB_PORT=3306
    DB_DATABASE=newslook
    DB_USERNAME=root
    DB_PASSWORD=root
    BROADCAST_DRIVER=log
    CACHE_DRIVER=file
    FILESYSTEM_DISK=local
    QUEUE_CONNECTION=database
    SESSION_DRIVER=file
    SESSION_LIFETIME=120
    MEMCACHED_HOST=127.0.0.1
    REDIS_HOST=127.0.0.1
    REDIS_PASSWORD=null
    REDIS_PORT=6379
    MAIL_MAILER=smtp
    MAIL_HOST=smtp.gmail.com
    MAIL_PORT=587
    MAIL_USERNAME=
    MAIL_PASSWORD=
    MAIL_ENCRYPTION=
    MAIL_FROM_ADDRESS=
    MAIL_FROM_NAME=
    MAILGUN_DOMAIN=
    MAILGUN_SECRET=
    AWS_ACCESS_KEY_ID=
    AWS_SECRET_ACCESS_KEY=
    AWS_DEFAULT_REGION=us-east-1
    AWS_BUCKET=
    AWS_USE_PATH_STYLE_ENDPOINT=false
    PUSHER_APP_ID=
    PUSHER_APP_KEY=
    PUSHER_APP_SECRET=
    PUSHER_APP_CLUSTER=mt1
    MIX_PUSHER_APP_KEY="PUSHERA​PPK​EY"MIXP​USHERA​PPC​LUSTER="{PUSHER_APP_CLUSTER}"
    JWT_SECRET=
    JWT_ALGO=HS256
    APP_TIMEZONE=Asia/Dhaka
    MAILCHIMP_APIKEY=
    MAILCHIMP_LIST_ID=
    APP_DEMO=false
    IS_USER_REGISTERED=1
    LICENSE_CHECKED=1
    AWS_URL=
    ANYTHING_AI_KEY=Y72P38Y-ZX7MNM4-Q1SCY84-B3SF5DS
    ANYTHING_AI_URL=https://ai.nospace.network/api/v1/openai/chat/completions
    ANYTHING_AI_MODEL=test-ai
    MAIL_TO_ADDRESS=t.rap.dnh@gmail.com
    `

    3. AI Settings - Chi Tiết#

    3.1. Tổng quan#

    Trang quản lý cấu hình AI nằm tại Core/Views/base/blog/settings/ai_setting.blade.php và được điều khiển bởi AIAssistantController::AISetting().
    Route: GET /ai-settings → core.blog.ai.setting
    Table lưu trữ: open_ai_settings (1 row duy nhất)

    3.2. Cấu trúc Fields trong open_ai_settings#

    FieldTypeMô tả
    idbigintPrimary key
    default_modelvarchar(100)Model OpenAI mặc định (gpt-4, gpt-3.5-turbo-instruct...)
    api_keytextOpenAI Secret Key (encrypted)
    enable_blog_ai_assistanttinyintBật/tắt AI Assistant (0/1)
    ai_job_interval_minutesintKhoảng thời gian giữa các lần chạy AI job (default: 5 phút)
    ai_job_batch_sizeintSố blog xử lý mỗi lần chạy (default: 1)
    ai_blog_statusvarchar(50)Status blog sau khi AI xử lý (pending/publish/draft)
    use_custom_modeltinyintBật sử dụng custom AI model thay vì OpenAI mặc định (0/1)
    custom_api_urltextURL API của custom AI provider
    custom_api_keytextAPI Key của custom AI provider
    custom_modelvarchar(255)Tên model custom
    translate_model_namevarchar(255)Tên model dùng cho translate operation
    title_model_namevarchar(255)Tên model dùng cho title rewrite
    description_model_namevarchar(255)Tên model dùng cho description rewrite
    content_model_namevarchar(255)Tên model dùng cho content rewrite
    translate_workspace_chainvarchar(500)Danh sách model fallback cho translate (comma-separated)
    title_workspace_chainvarchar(500)Danh sách model fallback cho title (comma-separated)
    description_workspace_chainvarchar(500)Danh sách model fallback cho description (comma-separated)
    content_workspace_chainvarchar(500)Danh sách model fallback cho content (comma-separated)
    mattermost_enabledtinyintBật thông báo Mattermost (0/1)
    mattermost_server_urltextURL Mattermost server
    mattermost_bot_tokentextBot access token cho thông báo thành công
    mattermost_channel_idvarchar(255)Channel ID nhận thông báo thành công
    mattermost_error_server_urltextURL Mattermost server cho bot lỗi
    mattermost_error_bot_tokentextBot access token cho thông báo lỗi
    mattermost_error_channel_idvarchar(255)Channel ID nhận thông báo lỗi
    promptslongtextJSON chứa custom prompts (định dạng mới: {key: {system, user}})

    3.3. Cấu hình các nhóm settings trong AI Settings Page#

    3.3.1. Enable AI Assistant#

    Toggle bật/tắt toàn bộ chức năng AI
    Lưu vào getGeneralSetting('enable_blog_ai_assistant')

    3.3.2. Default OpenAI Model#

    Field: default_model
    Options: gpt-4, gpt-3.5-turbo-instruct, text-davinci-003, text-babbage-001, text-curie-001, text-ada-001
    Model mặc định được sử dụng khi không cấu hình custom model

    3.3.3. OpenAI Secret Key#

    Field: api_key
    Input type: password
    Lưu trữ OpenAI API key để gọi Chat Completions API

    3.3.4. AI Job Settings (AI Job Configuration)#

    Cấu hình cách AI job tự động xử lý blog:
    FieldDB FieldDefaultMô tả
    AI Job Interval (minutes)ai_job_interval_minutes5Khoảng thời gian giữa 2 lần chạy job
    AI Job Batch Sizeai_job_batch_size1Số blog xử lý mỗi lần chạy
    AI Blog Status After Updateai_blog_statuspendingStatus blog sau khi AI update

    3.3.5. Custom AI Model Configuration#

    Khi bật use_custom_model = true, hệ thống ưu tiên dùng custom model thay vì OpenAI mặc định:
    FieldDB FieldMô tảVí dụ
    Use Custom Modeluse_custom_modelToggle bật/tắt-
    Custom API URLcustom_api_urlURL API endpoint (OpenAI-compatible)https://api.example.com/v1/chat/completions
    Custom API Keycustom_api_keyAPI key của custom provider-
    Custom Model Namecustom_modelTên modelgpt-4, llama-2-7b, mistral-7b
    Workspace Model Names (sử dụng chung API URL/Key của custom model):
    FieldDB FieldMô tả
    Translate Model Nametranslate_model_nameModel cho operation dịch
    Title Model Nametitle_model_nameModel cho viết lại title
    Description Model Namedescription_model_nameModel cho viết lại description
    Content Model Namecontent_model_nameModel cho viết lại content
    Retry Chain (Workspace Retry Chains - fallback models):
    FieldDB FieldMô tả
    Translate Workspace Retry Chaintranslate_workspace_chainModel fallback cho translate (comma-separated)
    Title Workspace Retry Chaintitle_workspace_chainModel fallback cho title
    Description Workspace Retry Chaindescription_workspace_chainModel fallback cho description
    Content Workspace Chaincontent_workspace_chainModel fallback cho content

    3.3.6. Mattermost Integration#

    Cấu hình gửi thông báo qua Mattermost khi AI update blog:
    Success Bot:
    FieldDB FieldMô tả
    Enable Mattermostmattermost_enabledToggle bật/tắt
    Mattermost Server URLmattermost_server_urlURL Mattermost server
    Bot Access Tokenmattermost_bot_tokenBot token
    Channel IDmattermost_channel_idChannel nhận thông báo
    Error Bot (Bot riêng cho lỗi):
    FieldDB FieldMô tả
    Error Bot Server URLmattermost_error_server_urlURL Mattermost server lỗi
    Error Bot Tokenmattermost_error_bot_tokenBot token lỗi
    Error Channel IDmattermost_error_channel_idChannel nhận lỗi

    3.3.7. AI Prompts Management#

    Cấu hình custom prompts cho 4 loại operation, lưu trong field prompts (JSON format):
    Format:
    {
      "title_and_description_rewrite": {
        "system": "System role prompt...",
        "user": "User prompt với placeholders..."
      },
      "content_rewrite": {
        "system": "...",
        "user": "..."
      },
      "title_rewrite": {
        "system": "...",
        "user": "..."
      },
      "description_rewrite": {
        "system": "...",
        "user": "..."
      }
    }
    Prompt KeyOperationPlaceholdersMô tả
    title_and_description_rewriteViết lại title + description{blog_title}, {short_details}Rewrite cả title và short description cùng lúc
    content_rewriteViết lại nội dung HTML{blog_content}Dịch + viết lại nội dung blog
    title_rewriteViết lại title{blog_title}Chỉ viết lại title
    description_rewriteViết lại description{short_details}Chỉ viết lại short description
    Mỗi prompt có 2 phần:
    System Role: Định nghĩa vai trò AI (role + context)
    User Prompt: Prompt chính với placeholders được thay thế tự động

    3.4. AIAssistantController - Chi tiết Methods#

    File: Core/Http/Controllers/AIAssistantController.php (3753+ lines)

    3.4.1. Constructor#

    Load open_ai_settings từ database
    Khởi tạo api_key, default_model, ai_settings
    Áp dụng middleware themelooks + license

    3.4.2. AI Settings Management#

    MethodRouteMô tả
    AISetting()GET /ai-settingsHiển thị trang AI Settings
    updateAISetting(Request)POST /ai-settings-updateLưu cấu hình AI settings

    3.4.3. AI Content Generation (Frontend)#

    MethodRouteMô tả
    generateContent(Request)POST /generate-content-with-aiTạo nội dung mới với AI
    generateUpdateContent(Request)PUT /generate-content-with-aiCập nhật nội dung blog với AI

    3.4.4. AI Crawl/Update System (Backend)#

    MethodRouteMô tả
    updateContentBlogs(Request, $id)GET /crawl-ai / /crawl-ai/{id}Xử lý AI update cho blog(s)
    forceRunSingleCrawlJobAI($crawlJobId, Request)-Force chạy AI cho 1 crawl job
    getUpdateContent($request)-Lấy content cần update
    generateUpdateOutput($type, $request, $workspace)-Tạo output từ AI response
    translateEditorialTone($request)-Dịch + chỉnh sửa editorial tone
    generatePromptForShortDescription($request)-Tạo prompt cho short description
    generatePromptForBlogContent($request)-Tạo prompt cho blog content
    generatePromptForBlogTitle($request)-Tạo prompt cho blog title

    3.4.5. AI Logs#

    MethodRouteMô tả
    viewBlogAILogs($id)GET /blog/{id}/ai-logsXem AI logs của 1 blog
    listAILogs(Request)GET /ai-logsDanh sách tất cả AI logs
    showAILogDetail($logId)GET /ai-logs/{logId}Chi tiết 1 AI log
    deleteAILog($logId)DELETE /ai-logs/{logId}Xóa AI log

    3.4.6. Internal Methods (Private/Helpers)#

    MethodMô tả
    getPromptKeyMapping()Map operation type → prompt key
    getPromptPlaceholders($promptKey)Lấy available placeholders cho 1 prompt key
    getPrompt($promptKey, $defaultPrompt, $data, $defaultSystemRole)Lấy prompt từ DB hoặc default, tự động replace placeholders
    replacePromptPlaceholders($prompt, $replacements)Replace placeholders trong prompt
    cleanPromptWhitespace($prompt)Clean extra whitespace trong prompt
    getAIConfig()Lấy AI config ưu tiên: custom model → default OpenAI
    logApiRequest(...)Log API request vào ai_api_logs table
    setCurrentBlogId($id)Set blog ID hiện tại cho logging
    setCurrentCrawlJobId($id)Set crawl job ID hiện tại cho logging

    3.4.7. Workflow của updateContentBlogs()#

    1.
    Load AI Settings: Lấy config từ open_ai_settings
    2.
    Select Blogs: Chọn blogs cần xử lý (pending/draft, có name_crawl)
    3.
    Get AI Config: Ưu tiên custom model > default OpenAI
    4.
    Get Workspace: Build workspace config (API URL, key, model name, retry chain)
    5.
    Process Operations:
    title_and_description → translate + rewrite title + description (JSON output)
    blog_details → translate + rewrite content (HTML output)
    short_details → rewrite description
    6.
    Workspace Chain: Nếu primary model fail → retry với chain models
    7.
    Update Blog: Cập nhật name, short_description, content vào database
    8.
    Mattermost Notification: Gửi thông báo thành công/lỗi
    9.
    Update Schedule: Cập nhật ai_next_run_time cho crawl job

    3.4.8. Mattermost Notification Flow#

    Thành công: Gửi message qua success bot với thông tin blog đã update
    Lỗi: Gửi message qua error bot với error details
    Mỗi loại operation có bot/channel riêng

    3.5. AI API Logs Table Schema#

    Table: ai_api_logs
    ColumnTypeMô tả
    idbigintPrimary key
    blog_idbigintBlog ID liên quan
    crawl_job_idbigintCrawl job ID liên quan
    operation_typevarchar(100)Loại operation (title_and_description, content_rewrite...)
    model_namevarchar(255)Tên model được sử dụng
    api_urltextAPI URL đã gọi
    request_datajsonDữ liệu request
    response_datajsonDữ liệu response
    http_codeintHTTP status code
    retry_attemptintSố lần retry
    successtinyintThành công (0/1)
    error_messagetextError message nếu fail
    duration_msintThời gian xử lý (ms)
    created_attimestampThời gian tạo

    3.6. Placeholder System#

    Hệ thống hỗ trợ auto-replace placeholders trong prompts:
    PlaceholderGiá trịÁp dụng cho
    {blog_title}Tiêu đề bài viết gốctitle_and_description_rewrite, title_rewrite
    {short_details}Mô tả ngắn bài viết gốctitle_and_description_rewrite, description_rewrite
    {blog_content}Nội dung HTML bài viết gốccontent_rewrite
    {content}Fallback - đại diện cho content duy nhấtLegacy prompts

    3.7. AI Config Priority Flow#

    1. Check "Use Custom Model" toggle
       ├── YES + custom_api_url/key/model configured
       │   └── Use: custom_api_url + custom_api_key + custom_model (hoặc operation-specific model)
       └── NO or incomplete
           └── Use: https://api.openai.com/v1/chat/completions + api_key + default_model
    
    2. Per-Operation Model Override
       ├── translate_model_name → dùng cho translate operation
       ├── title_model_name → dùng cho title rewrite
       ├── description_model_name → dùng cho description rewrite
       └── content_model_name → dùng cho content rewrite
    
    3. Workspace Retry Chain
       ├── Primary model fail → retry với model #2 trong chain
       ├── Model #2 fail → retry với model #3...
       └── Cuối cùng fail → log error + gửi Mattermost notification

    4. Phân Tích Tính Năng#

    4.1. Tính năng đã có ✅#

    Yêu cầuTrạng tháiChi tiết
    Tin tức bóng đá✅ CóHệ thống Blog với categories/tags
    Chuyển nhượng✅ Có thể thêmBlog category riêng
    Nhận định trận đấu✅ CóBlog system với categories
    Thống kê đội bóng✅ Có widgetleague_ranking_widget
    Lịch thi đấu✅ Có widgetmatch_schedule_widget
    Kết quả trận đấu✅ Có widgetmatch_schedule_widget
    Bảng xếp hạng✅ Có widgetleague_ranking_widget, sports_ranking_widget
    Analytics/Tracking✅ CóAnalyticsDashboardController, Heatmap
    Page Builder✅ Cónewslooks-pagebuilder plugin
    Quản lý nội dung✅ CóCore Blog, Page, Media, Sitemap
    Quản lý người dùng✅ CóUser authentication, roles, permissions
    Tips chuyên gia✅ Có widgetsports_expert_tips_widget, hot_tips_widget

    4.2. Tính năng cần phát triển thêm ❌#

    Yêu cầuTrạng tháiĐề xuất
    Dữ liệu đội bóng, cầu thủ, HLV⚠️ Cơ bảnCó SportsDataHelper, Widgets sẵn có
    Hệ thống cào dữ liệu✅ Có đầy đủCrawlJobController, CrawlerService, Dashboard
    AI viết bài tự động✅ Có đầy đủAIAssistantController, AI Settings, Auto-translate

    5. Cấu trúc Controller#

    5.1. FrontendController (src/Http/Controllers/Frontend/FrontendController.php)#

    MethodRouteMô tả
    index()/Trang chủ - hiển thị homepage với pagebuilder
    pageDetails()/{permalink}Hiển thị chi tiết trang (page)
    pageOrBlogDetails()/{permalink?}Xử lý cả page và blog - ưu tiên page trước
    getPageContent()POST /page/password/loadLấy nội dung trang có password
    changeLanguage()POST /language-changeĐổi ngôn ngữ frontend
    vote()POST /poll-voteBình chọn (poll/voting)
    privacyPolicy()/chinh-sach-bao-matTrang chính sách bảo mật
    termsOfService()/dieu-khoan-su-dungTrang điều khoản sử dụng
    feedback()/gop-yTrang góp ý
    submitFeedback()POST /gop-y/submitSubmit form góp ý
    adContact()/lien-he-quang-caoTrang liên hệ quảng cáo
    submitAdContact()POST /lien-he-quang-cao/submitSubmit form liên hệ quảng cáo
    sendMessage()POST /contact/submitGửi tin nhắn liên hệ

    5.2. FrontendBlogController (src/Http/Controllers/Frontend/FrontendBlogController.php)#

    MethodRouteMô tả
    blogs()/postsDanh sách tất cả bài viết
    blogByCategory()/{prefix}/{permalink}Lọc bài viết theo danh mục
    blogByVideo()/{prefix}/videoLọc bài viết video
    blogByTag()/{tag_prefix}/{permalink}Lọc bài viết theo tag
    blogBySearch()/search/{text}Tìm kiếm bài viết
    blogByAuthor()/author/{name}Lọc bài viết theo tác giả
    blogByDate()/date/{date}Lọc bài viết theo ngày
    blogByFilter()/filter/{filter}Lọc bài viết theo bộ lọc (featured, popular, recent...)
    details()/{permalink}Chi tiết bài viết (v1)
    blogDetailsV2()/v2/{permalink}Chi tiết bài viết (v2)
    getBlogContent()POST /post/password/loadLấy nội dung bài viết có password
    loadBlogComment()POST /post/commentLoad bình luận bài viết
    createBlogComment()POST /post/comment/createTạo bình luận mới
    getPaginationData()-Lấy dữ liệu phân trang (internal)
    getBlogsPagination()GET /blogsAPI phân trang bài viết
    findBlogsPagination()GET /blogs-searchAPI tìm kiếm bài viết

    5.3. NewsletterController (src/Http/Controllers/Frontend/NewsletterController.php)#

    MethodRouteMô tả
    store()POST /newsletter/storeĐăng ký nhận newsletter qua Mailchimp

    6. Các Route chính#

    6.1. Route công khai (không cần đăng nhập)#

    6.2. Route cần đăng nhập (User)#

    6.3. Route Backend (Admin)#

    7. Repository Layer#

    7.1. FrontendBlogRepository (src/Repositories/FrontendBlogRepository.php)#

    MethodMô tả
    getBlogs($paginate, $type, $value)Lấy danh sách bài viết với phân trang và bộ lọc
    blogDetails($permalink)Lấy chi tiết bài viết (v1)
    blogDetailsV2($permalink)Lấy chi tiết bài viết (v2)
    getBlogContent($request)Lấy nội dung bài viết có password

    7.2. BlogCommentRepository (src/Repositories/BlogCommentRepository.php)#

    MethodMô tả
    getBlogComment($request)Lấy danh sách bình luận của bài viết
    createComment($request)Tạo bình luận mới

    8. Middleware#

    tract.visitor - Theo dõi lượt truy cập
    auth - Yêu cầu đăng nhập
    user.guard - Guard cho user
    admin.guard - Guard cho admin
    throttle - Giới hạn request

    9. Tên Route (Route Names)#

    Tên RouteController@Method
    homeFrontendController@index
    theme.newslooks.blog.listFrontendBlogController@blogs
    theme.newslooks.blog.blogByCategoryFrontendBlogController@blogByCategory
    theme.newslooks.blog.blogByTagFrontendBlogController@blogByTag
    theme.newslooks.blog.blogBySearchFrontendBlogController@blogBySearch
    theme.newslooks.blog.blogByAuthorFrontendBlogController@blogByAuthor
    theme.newslooks.blog.blogByDateFrontendBlogController@blogByDate
    theme.newslooks.blog.blogByFilterFrontendBlogController@blogByFilter
    theme.newslooks.blog.detailsFrontendController@pageOrBlogDetails
    theme.newslooks.blog.details.v2FrontendBlogController@blogDetailsV2
    theme.newslooks.newsletter.storeNewsletterController@store
    theme.newslooks.contact.submitFrontendController@sendMessage
    theme.newslooks.vote.giveFrontendController@vote
    theme.newslooks.language.changeFrontendController@changeLanguage
    theme.newslooks.user.loginUserController@login
    theme.newslooks.user.registrationUserController@registration
    theme.newslooks.user.dashboardUserController@dashboard

    10. Cấu hình URL Prefix#

    Các prefix URL được cấu hình động qua helper functions:
    getCategoryUrlPrefix() - Prefix cho danh mục (mặc định: danh-muc)
    getTagUrlPrefix() - Prefix cho tag (mặc định: tag)

    11. View Files#

    Các view templates nằm trong thư mục resources/views/frontend/:
    pages/home.blade.php - Trang chủ
    pages/page.blade.php - Chi tiết trang
    pages/blogs.blade.php - Danh sách bài viết
    pages/category.blade.php - Danh mục/Tag
    pages/search.blade.php - Tìm kiếm
    pages/blog-details.blade.php - Chi tiết bài viết (v1)
    pages/blog-details-v2.blade.php - Chi tiết bài viết (v2)
    pages/privacy-policy.blade.php - Chính sách bảo mật
    pages/terms-of-service.blade.php - Điều khoản sử dụng
    pages/ad-contact.blade.php - Liên hệ quảng cáo

    12. Models liên quan#

    Core\Models\TlBlog - Bài viết
    Core\Models\TlBlogCategory - Danh mục
    Core\Models\TlBlogTag - Tag
    Core\Models\TlPage - Trang (Page)
    Core\Models\User - User
    Theme\NewsLooks\Models\Vote - Bình chọn
    Theme\NewsLooks\Models\VoteCount - Lượt bình chọn

    13. Helpers hỗ trợ#

    getActiveTheme() - Lấy theme hiện tại
    getThemeOption($option, $theme_id) - Lấy cấu hình theme
    isActivePluging($plugin) - Kiểm tra plugin có active không
    getFrontLocale() - Lấy ngôn ngữ frontend
    front_translate($text) - Dịch text frontend
    toastNotification($type, $message) - Hiển thị thông báo
    newlooksTimeAgo($date) - Format thời gian relative
    getImageVariation($image, $size) - Lấy image variant

    14. Sports Data Integration#

    14.1. SportsDataHelper (app/Helpers/SportsDataHelper.php)#

    Helper class cung cấp dữ liệu bóng đá tĩnh:
    MethodMô tả
    getArrayLeague()Lấy danh sách giải đấu (có image)
    getArrayLeagueSimple()Lấy danh sách giải đấu (không image)
    getNationalTeams()Lấy danh sách đội tuyển quốc gia
    getLeagueByValue($value)Lấy thông tin giải đấu theo ID
    getNationalTeamById($id)Lấy thông tin đội tuyển theo ID
    Các giải đấu được hỗ trợ:
    Ngoại Hạng Anh (36)
    VĐQG Tây Ban Nha (31)
    VĐQG Ý (34)
    VĐQG Đức (8)
    VĐQG Pháp (11)
    Cúp C1 châu âu (103)
    Europa League (113)
    Copa Libertadores (89)
    MLS Mỹ (21)
    AFC Champions League (192)
    V-League (766)
    VĐQG Bồ Đào Nha (23)
    VĐQG Brazil (4)
    VĐQG Argentina (2)
    VĐQG Thổ Nhĩ Kỳ (30)
    VĐQG Hà Lan (16)
    Mexico Liga MX (140)
    VĐQG Nhật Bản (25)
    K-League Hàn Quốc (15)
    VĐQG Ả Rập Xê Út (292)

    14.2. Sports Widgets (Page Builder)#

    WidgetFileMô tả
    match_schedule_widgetmatch_schedule_widget.blade.phpLịch thi đấu
    match_analysis_list_widgetmatch_analysis_list_widget.blade.phpDanh sách nhận định trận đấu
    league_ranking_widgetleague_ranking_widget.blade.phpBảng xếp hạng giải đấu
    sports_ranking_widgetsports_ranking_widget.blade.phpXếp hạng thể thao
    sports_schedule_boardsports_schedule_board.blade.phpBảng lịch thi đấu
    sports_team_feature_widgetsports_team_feature_widgetNổi bật đội bóng
    sport_team_postsport_team_post.blade.phpBài viết về đội bóng
    sports_expert_tips_widgetsports_expert_tips_widget.blade.phpTips chuyên gia
    hot_tips_widgethot_tips_widget.blade.phpTips nóng
    video_thethaosovideo_thethaoso.blade.phpVideo thể thao
    tips_thethaosotips_thethaoso.blade.phpTips Thethaoso
    odds_slidersports_odds_slider.blade.phpTỷ lệ kèo

    14.3. Match Schedule Widget#

    Widget hiển thị lịch thi đấu bóng đá:
    Widget Title: Tiêu đề widget
    Max Matches: Số trận tối đa hiển thị (default: 10)
    Selected League: Chọn giải đấu (mặc định: 36 - Ngoại Hạng Anh)
    Dữ liệu được load từ: API bên thứ 3 hoặc SportsDataHelper

    15. Models & Database#

    15.1. Core Models#

    ModelBảngMô tả
    TlBlogtl_blogsBài viết
    TlBlogCategorytl_blog_categoriesDanh mục
    TlBlogTagtl_blog_tagsTags
    TlBlogCommenttl_blog_commentsBình luận
    TlPagetl_pagesTrang
    UserusersNgười dùng
    RolerolesVai trò
    PermissionpermissionsQuyền
    Languagetl_languagesNgôn ngữ
    Menutl_menusMenu
    UploadedFileuploaded_filesMedia files

    15.2. Theme Models#

    ModelBảngMô tả
    Votetl_votesBình chọn/Polls
    VoteCounttl_vote_countsLượt bình chọn
    VoteTranslationtl_vote_translationsDịch bình chọn
    Visitortl_visitorsKhách truy cập
    ReadingListtl_reading_listsDanh sách đọc
    ThemeSidebartl_theme_sidebarsSidebar
    Widgettl_widgetsWidgets

    16. API Endpoints#

    16.1. Public APIs#

    EndpointMethodMô tả
    /blogsGETPhân trang bài viết
    /blogs-searchGETTìm kiếm bài viết
    /heatmap/clickPOSTGhi nhận click heatmap
    /heatmap/gridGETLấy dữ liệu heatmap
    /exchange-rateGETTỷ giá ngoại hối
    /location-cityGETVị trí và thành phố

    16.2. Blog APIs#

    EndpointMethodMô tả
    /post/password/loadPOSTLấy nội dung bài viết có password
    /post/commentPOSTLoad bình luận
    /post/comment/createPOSTTạo bình luận mới

    17. Page Builder Widgets (Toàn bộ)#

    17.1. Post/Blog Widgets#

    post_thethaoso - Bài viết Thethaoso
    post_thethaoso_match - Bài viết trận đấu
    post_list_thethaoso - Danh sách bài viết
    post_layout - Layout bài viết
    post_filter - Lọc bài viết
    post_tab - Tab bài viết
    post_advance_layout - Layout nâng cao
    gallery_post - Gallery bài viết
    video_post - Video bài viết
    slider_post - Slider bài viết
    hot_tips - Tips nóng

    17.2. Category/Tag Widgets#

    category_thethaoso - Danh mục Thethaoso
    category - Danh mục
    tag - Tag
    tag_thethaoso - Tag Thethaoso
    tag_nhandinh - Tag nhận định

    17.3. Sports Widgets#

    match_schedule_widget - Lịch thi đấu
    match_analysis_list_widget - Nhận định trận đấu
    league_ranking_widget - Bảng xếp hạng
    sports_ranking_widget - Xếp hạng thể thao
    sports_schedule_board - Bảng lịch thi đấu
    sports_team_feature_widget - Đội bóng nổi bật
    sport_team_post - Bài viết đội bóng
    sports_expert_tips_widget - Tips chuyên gia
    odds_slider - Tỷ lệ kèo
    video_thethaoso - Video
    tips_thethaoso - Tips

    17.4. Common Widgets#

    slider_thethaoso - Slider
    header - Header
    footer - Footer
    breadcrumb_thethaoso - Breadcrumb
    search - Tìm kiếm
    newsletter - Newsletter
    voting - Bình chọn
    contact - Liên hệ
    contact_info_box - Thông tin liên hệ
    contact_ads_form - Form quảng cáo
    text_editor - Text editor
    text_editor_thethaoso - Text editor Thethaoso
    image - Hình ảnh
    button - Nút
    social - Social links
    author - Tác giả
    recent_comments - Bình luận gần đây
    ads - Quảng cáo
    menu_links - Menu links
    heading_tag - Heading
    address - Địa chỉ
    error_page - Trang lỗi

    18. Crawl Data System (Hệ thống Cào Dữ liệu)#

    18.1. CrawlJobController (app/Http/Controllers/CrawlJobController.php)#

    MethodRouteMô tả
    index()GET /crawl-jobsDanh sách tất cả crawl jobs
    add()GET /crawl-jobs/addForm tạo crawl job mới
    store()POST /crawl-jobsTạo/cập nhật crawl job
    edit($id)GET /crawl-jobs/edit/{id}Form chỉnh sửa crawl job
    preview(Request)POST /crawl-jobs/previewPreview kết quả crawl
    show($id)GET /crawl-jobs/{id}Xem chi tiết job
    destroy($id)DELETE /crawl-jobs/{id}Xóa crawl job
    dashboard()GET /crawl-jobs/dashboardDashboard quản lý crawl với thống kê
    forceRunAI($id)POST /crawl-jobs/{id}/force-run-aiForce chạy crawl/AI (bỏ qua timing)
    toggleActive($id)POST /crawl-jobs/{id}/toggle-activeBật/tắt trạng thái active
    getStatus($id)GET /crawl-jobs/{id}/statusLấy trạng thái job (JSON)

    18.2. CrawlJob Model (app/Models/CrawlJob.php)#

    Bảng: crawl_jobs
    Thuộc tínhKiểuMô tả
    urlstringURL nguồn cần crawl
    categorystringID danh mục gán vào
    limit_postsintegerSố bài viết tối đa cần crawl
    pageintegerSố trang pagination
    classstringCSS selector cho danh sách bài
    titlestringCSS selector cho tiêu đề bài viết
    detailstringCSS selector cho link chi tiết
    contentstringCSS selector cho nội dung bài
    replace_textstringText cần thay thế trong content
    remove_elementstringCSS selector các element cần loại bỏ
    tag_selectorstringCSS selector cho tags
    tag_limitintegerSố tag tối đa
    imagestringCSS selector cho thumbnail
    image_detailstringCSS selector cho ảnh trong chi tiết
    paginationstringCSS selector cho pagination
    frequencystringTần suất: once, daily, hourly
    frequency_timedatetimeThời gian chạy tiếp theo
    activebooleanTrạng thái hoạt động
    start_timedatetimeThời gian bắt đầu job
    videostringCSS selector cho video
    internal_link_limitintegerGiới hạn internal links
    ai_enabledbooleanBật AI xử lý sau crawl
    ai_batch_sizeintegerSố bài xử lý mỗi batch
    ai_interval_minutesintegerKhoảng cách giữa các batch (phút)
    ai_next_run_timedatetimeThời gian chạy AI tiếp theo
    ai_use_translatebooleanDùng AI dịch nội dung

    18.3. CrawlerService (app/Services/Crawler/CrawlerService.php)#

    MethodMô tả
    execute($config)Thực thi crawl job theo cấu hình
    testCrawl($config)Test crawl không lưu vào DB

    18.4. Crawler Strategy & Pagination#

    FileMô tả
    TimeStrategy/ITimeStrategy.phpInterface cho time strategy
    TimeStrategy/DailyStrategy.phpChiến lược chạy hàng ngày
    TimeStrategy/HourlyStrategy.phpChiến lược chạy hàng giờ
    TimeStrategy/TimeStrategyFactory.phpFactory tạo strategy
    Pagination/PaginationStrategyInterface.phpInterface cho pagination
    Pagination/LinkPagination.phpPagination qua link trang
    Pagination/ClickPagination.phpPagination qua nút "Xem thêm"

    18.5. Crawl Routes (Backend)#


    19. AI Update Content System#

    19.1. AIAssistantController (Core/Http/Controllers/AIAssistantController.php)#

    MethodRouteMô tả
    AISetting()GET /ai-settingsTrang cấu hình AI settings
    updateAISetting(Request)POST /ai-settings-updateCập nhật AI settings
    generateContent(Request)POST /generate-content-with-aiTạo nội dung bằng AI
    generateUpdateContent(Request)PUT /generate-content-with-aiCập nhật nội dung bằng AI
    updateContentBlogs(Request, $id)GET /crawl-ai, GET /crawl-ai/{id}AI xử lý bài viết crawl
    forceRunSingleCrawlJobAI($id, Request)GET /crawl-ai/{id} (force)Force chạy AI cho 1 job
    generateUpdateOutput($type, $request, $workspace)-Tạo output AI (internal)
    generatePromptForShortDescription(Request)-Tạo prompt cho mô tả ngắn
    generatePromptForBlogContent(Request)-Tạo prompt cho nội dung blog
    generatePromptForBlogTitle(Request)-Tạo prompt cho tiêu đề blog
    translateEditorialTone(Request)-Dịch/chỉnh sửa giọng văn
    viewBlogAILogs($id)GET /blog/{id}/ai-logsXem AI logs của 1 blog
    listAILogs(Request)GET /ai-logsDanh sách tất cả AI logs
    showAILogDetail($logId)GET /ai-logs/{logId}Chi tiết 1 AI log
    deleteAILog($logId)DELETE /ai-logs/{logId}Xóa AI log

    19.2. AI Settings#

    Bảng: open_ai_settings
    FieldMô tả
    api_keyOpenAI API Key
    default_modelModel mặc định (e.g., gpt-4, gpt-4o, gpt-3.5-turbo)
    title_rewritePrompt cho rewrite tiêu đề
    description_rewritePrompt cho rewrite mô tả
    content_rewritePrompt cho rewrite nội dung
    title_and_description_rewritePrompt cho rewrite cả 2
    title_model_nameModel cho title generation
    description_model_nameModel cho description generation
    workspaceWorkspace AI settings
    retry_chainsRetry chain configuration
    custom_model_fieldsCustom model fields
    ai_blog_statusTrạng thái blog sau khi AI xử lý
    ai_job_settingsCấu hình job AI (batch_size, interval)
    mattermost_webhook_urlWebhook URL cho Mattermost notification

    19.3. AI API Logs#

    Bảng: ai_api_logs (Core/Models/AIApiLog.php)
    Lưu trữ chi tiết mỗi lần gọi API AI:
    FieldMô tả
    blog_idID bài viết liên quan
    crawl_job_idID crawl job liên quan
    modelModel AI được sử dụng
    prompt_typeLoại prompt (title, description, content)
    input_tokensSố tokens đầu vào
    output_tokensSố tokens đầu ra
    total_tokensTổng tokens
    costChi phí API
    responseFull response từ API
    statusTrạng thái (success, error)
    created_atThời gian gọi

    19.4. AI Routes (Backend - Auth Required)#


    20. Các Models Quan trọng (Core)#

    ModelBảngMô tả
    Core\Models\TlBlogtl_blogsBài viết chính
    Core\Models\TlBlogCategorytl_blog_categoriesDanh mục bài viết
    Core\Models\TlBlogTagtl_blog_tagsTags bài viết
    Core\Models\TlBlogCommenttl_blog_commentsBình luận
    Core\Models\TlPagetl_pagesTrang tĩnh
    Core\Models\UserusersNgười dùng
    Core\Models\RolerolesVai trò
    Core\Models\PermissionpermissionsQuyền hạn
    Core\Models\AIApiLogai_api_logsAI API call logs (id, blog_id, crawl_job_id, operation_type, model_name, api_url, request_data, response_data, http_code, retry_attempt, success, error_message, duration_ms)
    App\Models\CrawlJobcrawl_jobsCrawl jobs
    App\Models\CrawlConfig-Crawl configuration
    App\Models\CrawlImagecrawl_imagesCrawled images cache
    App\Models\HeatmapClickheatmap_clicksHeatmap click data

    21. Các Helper Functions Quan trọng#

    HelperFileMô tả
    getCategoryUrlPrefix()HelperLấy prefix URL danh mục (mặc định: danh-muc)
    getTagUrlPrefix()HelperLấy prefix URL tag (mặc định: tag)
    getActiveTheme()HelperLấy theme hiện tại
    getThemeOption($option, $theme_id)HelperLấy cấu hình theme option
    isActivePluging($plugin)HelperKiểm tra plugin có active không
    getFrontLocale()HelperLấy ngôn ngữ frontend
    front_translate($text)HelperDịch text frontend
    toastNotification($type, $message)HelperHiển thị toast notification
    newlooksTimeAgo($date)HelperFormat thời gian relative
    getImageVariation($image, $size)HelperLấy image variant
    getAdminPrefix()HelperLấy admin URL prefix

    22. Tên Route Quan trọng (Route Names)#

    22.1. Core Backend Routes#

    Tên RouteController@Method
    core.loginAuthenticationController@login
    core.attemptLoginAuthenticationController@attemptLogin
    core.logoutAuthenticationController@logout
    core.dashboardDashboardController@dashboard
    core.general.settingsGeneralSettingsController@generalSettings
    core.email.smtp.configurationEmailController@smtpConfiguration
    core.email.templatesEmailController@emailTemplates
    core.blogBlogController@blog
    core.add.blogBlogController@addBlog
    core.store.blogBlogController@storeBlog
    core.edit.blogBlogController@editBlog
    core.update.blogBlogController@updateBlog
    core.delete.blogBlogController@deleteBlog
    core.bulk.delete.blogBlogController@bulkDeleteBlog
    core.blog.categoryBlogCategoryController@blogCategory
    core.store.blog.categoryBlogCategoryController@storeBlogCategory
    core.edit.blog.categoryBlogCategoryController@editBlogCategory
    core.update.blog.categoryBlogCategoryController@updateBlogCategory
    core.delete.blog.categoryBlogCategoryController@deleteBlogCategory
    core.tagTagController@tag
    core.store.tagTagController@storeTag
    core.edit.tagTagController@editTag
    core.update.tagTagController@updateTag
    core.delete.tagTagController@deleteTag
    core.pagePageController@page
    core.page.addPageController@addPage
    core.page.storePageController@storePage
    core.page.editPageController@editPage
    core.page.updatePageController@updatePage
    core.page.deletePageController@deletePage
    core.page.make.homepagePageController@makeHomepage
    core.media.pageMediaController@mediaPage
    core.upload.media.fileMediaController@uploadMediaFile
    core.blog.commentCommentController@comment
    core.blog.comment.bulk.actionCommentController@bulkAction
    core.blog.comment.deleteCommentController@commentDelete
    core.blog.comment.replyCommentController@replyBlogComment
    core.usersUserController@users
    core.add.userUserController@addUser
    core.edit.userUserController@editUser
    core.delete.userUserController@deleteUser
    core.blog.share.optionsBlogController@shareOptions
    core.blog.share.options.update.statusBlogController@shareOptionUpdateStatus
    core.blog.historyBlogController@blogHistory
    core.blog.history.detailBlogController@blogHistoryDetail
    core.blog.history.compareBlogController@compareBlogHistory
    core.blog.history.restoreBlogController@restoreBlogHistory
    core.blog.history.deleteBlogController@deleteBlogHistory
    core.blog.draft.previewBlogController@blogDraftPreview
    core.blog.previewBlogController@blogPreview
    core.blog.ai.settingAIAssistantController@AISetting
    core.blog.update.ai.settingAIAssistantController@updateAISetting
    core.blog.generate.content.with.aiAIAssistantController@generateContent
    core.blog.update.content.with.aiAIAssistantController@generateUpdateContent
    core.blog.all.content.with.aiAIAssistantController@updateContentBlogs
    core.blog.ai.crawl.singleAIAssistantController@updateContentBlogs
    core.update.crawl.imagesCrawlNewsJob@updateCrawlImages
    core.blog.ai.logsAIAssistantController@viewBlogAILogs
    core.ai.logs.listAIAssistantController@listAILogs
    core.ai.logs.showAIAssistantController@showAILogDetail
    core.ai.logs.deleteAIAssistantController@deleteAILog
    core.internal.links.indexInternalLinkController@index
    core.internal.links.createInternalLinkController@create
    core.internal.links.storeInternalLinkController@store
    core.internal.links.editInternalLinkController@edit
    core.internal.links.updateInternalLinkController@update
    core.internal.links.destroyInternalLinkController@destroy
    core.internal.links.settingsInternalLinkController@settings
    core.internal.links.import.csvInternalLinkController@importCsv
    core.rolesRolePermissionController@roles
    core.permissionsRolePermissionController@permissions
    core.languagesLanguageController@allLanguages
    core.plugins.indexPluginsController@index
    core.themes.indexThemesController@index
    core.manage.menusMenuController@index
    core.sitemapSystemController@serveSitemap
    core.admin.generate.sitemapSystemController@generateSitemap
    core.admin.clear.system.cacheSystemController@clearSystemCache
    core.seo.settingsSeoController@seoSettings
    core.ads.listCustomAdsController@adsList
    core.backup.files.listBackupController@filesBackup
    core.backup.database.listBackupController@databaseBackup
    core.content-replace.indexContentReplaceController@index
    core.content-replace.previewContentReplaceController@preview
    core.content-replace.executeContentReplaceController@execute
    core.blog.csv.import.exportCSVImportExportController@csvImportExport
    core.blog.csv.import.submitCSVImportExportController@submit
    core.blog.csv.exportCSVImportExportController@export
    core.get.login.activityActivityLogController@getLoginActivity
    core.get.all.login.activityActivityLogController@getAllLoginActivity
    core.license.activeDashboardController@licenseActive
    core.admin.welcomeSystemController@welcome

    22.2. Crawl Job Routes#

    Tên RouteController@Method
    crawl_jobs.indexCrawlJobController@index
    crawl_jobs.addCrawlJobController@add
    crawl_jobs.storeCrawlJobController@store
    crawl_jobs.editCrawlJobController@edit
    crawl_jobs.previewCrawlJobController@preview
    crawl_jobs.destroyCrawlJobController@destroy
    crawl_jobs.dashboardCrawlJobController@dashboard
    crawl_jobs.force_run_aiCrawlJobController@forceRunAI
    crawl_jobs.statusCrawlJobController@getStatus
    crawl_jobs.toggle_activeCrawlJobController@toggleActive

    22.3. Theme Backend Routes#

    Tên RouteController@Method
    theme.newslooks.widgetsWidgetController@widgets
    theme.newslooks.widget.get_input_fieldWidgetController@getWidgetInputFields
    theme.newslooks.widget.addToSidebarWidgetController@addWidgetToSidebar
    theme.newslooks.widget.removeFromSidebarWidgetController@removeWidgetFromSidebar
    theme.newslooks.widget.widgetSidebarFormWidgetController@saveWidgetSidebarInput
    theme.newslooks.widget.saveWidgetOrderWidgetController@saveWidgetOrder
    theme.newslooks.optionsThemeOptionController@themeOptions
    theme.newslooks.get.option.formThemeOptionController@getOptionForm
    theme.newslooks.save.option.formThemeOptionController@saveOptionForm
    theme.newslooks.theme-option.importThemeOptionController@importThemeOption
    theme.newslooks.theme-option.downloadThemeOptionController@downloadThemeOption
    theme.newslooks.vote.indexVotingController@index
    theme.newslooks.vote.createVotingController@create
    theme.newslooks.vote.storeVotingController@store
    theme.newslooks.vote.editVotingController@edit
    theme.newslooks.vote.updateVotingController@update
    theme.newslooks.vote.deleteVotingController@delete
    theme.newslooks.usersManageUserController@allUsers
    theme.newslooks.users.statusManageUserController@statusUpdate
    theme.newslooks.users.deleteManageUserController@deleteUser
    theme.newslooks.analytics.dashboardAnalyticsDashboardController@index
    theme.newslooks.visitor.reportsReportController@visitorReports
    theme.newslooks.country.reportsReportController@countryReports
    theme.newslooks.browser.reportsReportController@browserReports
    theme.newslooks.device.reportsReportController@deviceReports

    22.4. Heatmap & Analytics Routes#

    Tên RouteController@Method
    admin.heatmap.indexHeatmapDashboardController@index
    admin.heatmap.trackHeatmapDashboardController@track
    api.heatmap.clickHeatmapClickController@store
    api.heatmap.gridHeatmapClickController@grid
    pagebuilder.league-rankingProxyController@leagueRank
    pagebuilder.hot-tipsProxyController@hotTips

    23. Các Service Quan trọng#

    ServiceFileMô tả
    CrawlerServiceapp/Services/Crawler/CrawlerService.phpService chính cho crawl data
    DefaultCrawlerapp/Services/Crawler/DefaultCrawler.phpCrawler implementation mặc định
    ContentReplaceServiceapp/Services/ContentReplaceService.phpThay thế nội dung hàng loạt
    AnalyticsServiceapp/Services/AnalyticsService.phpAnalytics data processing

    24. Các API Endpoints (Public)#

    EndpointMethodMô tả
    /blogsGETPhân trang bài viết
    /blogs-searchGETTìm kiếm bài viết
    /heatmap/clickPOSTGhi nhận click heatmap
    /heatmap/gridGETLấy dữ liệu heatmap grid
    /exchange-rateGETTỷ giá ngoại hối
    /location-cityGETVị trí và thành phố
    /newsletter/storePOSTĐăng ký newsletter
    /contact/submitPOSTGửi liên hệ
    /poll-votePOSTBình chọn poll
    /language-changePOSTĐổi ngôn ngữ
    /post/password/loadPOSTLoad nội dung bài viết có password
    /post/commentPOSTLoad bình luận
    /post/comment/createPOSTTạo bình luận
    /page/password/loadPOSTLoad nội dung page có password
    /user/readingList/updatePOSTCập nhật danh sách đọc
    /user/readingList/removeDELETEXóa khỏi danh sách đọc
    /ajax/pagebuilder/league-rankGETProxy - xếp hạng giải đấu
    /ajax/pagebuilder/hot-tipsGETProxy - tips nóng
    sitemap.xmlGETSitemap XML

    25. Các Controller Quan trọng (Core)#

    ControllerFileMô tả
    AuthenticationControllerCore/Http/Controllers/Auth/AuthenticationController.phpAuth login/logout/reset
    BlogControllerCore/Http/Controllers/BlogController.phpCRUD blog posts
    BlogCategoryControllerCore/Http/Controllers/BlogCategoryController.phpCRUD blog categories
    TagControllerCore/Http/Controllers/TagController.phpCRUD tags
    PageControllerCore/Http/Controllers/PageController.phpCRUD pages
    CommentControllerCore/Http/Controllers/CommentController.phpQuản lý bình luận
    UserControllerCore/Http/Controllers/UserController.phpQuản lý users
    RolePermissionControllerCore/Http/Controllers/RolePermissionController.phpRoles & Permissions
    LanguageControllerCore/Http/Controllers/LanguageController.phpQuản lý ngôn ngữ
    MenuControllerCore/Http/Controllers/MenuController.phpQuản lý menus
    MediaControllerCore/Http/Controllers/MediaController.phpQuản lý media files
    EmailControllerCore/Http/Controllers/EmailController.phpEmail settings & templates
    SeoControllerCore/Http/Controllers/SeoController.phpSEO settings
    PluginsControllerCore/Http/Controllers/PluginsController.phpPlugin management
    ThemesControllerCore/Http/Controllers/ThemesController.phpTheme management
    DashboardControllerCore/Http/Controllers/DashboardController.phpAdmin dashboard
    SystemControllerCore/Http/Controllers/SystemController.phpSystem settings
    BackupControllerCore/Http/Controllers/BackupController.phpBackup files & database
    ActivityLogControllerCore/Http/Controllers/ActivityLogController.phpLogin activity logs
    GeneralSettingsControllerCore/Http/Controllers/GeneralSettingsController.phpGeneral settings
    StyleControllerCore/Http/Controllers/StyleController.phpStyle/mood settings
    CustomAdsControllerCore/Http/Controllers/CustomAdsController.phpQuản lý quảng cáo
    CSVImportExportControllerCore/Http/Controllers/CSVImportExportController.phpImport/export CSV
    InternalLinkControllerCore/Http/Controllers/InternalLinkController.phpInternal link manager
    AIAssistantControllerCore/Http/Controllers/AIAssistantController.phpAI content generation
    HeatmapDashboardControllerapp/Http/Controllers/Admin/HeatmapDashboardController.phpHeatmap analytics
    HeatmapClickControllerapp/Http/Controllers/HeatmapClickController.phpHeatmap click ingestion
    ExchangeRateControllerapp/Http/Controllers/ExchangeRateController.phpTỷ giá ngoại hối
    ProxyControllerapp/Http/Controllers/ProxyController.phpProxy cho pagebuilder widgets
    UpdateControllerapp/Http/Controllers/UpdateController.phpSystem update
    MigrationControllerapp/Http/Controllers/MigrationController.phpDatabase migrations

    26. Content Replace System#

    26.1. ContentReplaceController (Core/Http/Controllers/ContentReplaceController.php)#

    MethodRouteMô tả
    index()GET /content-replaceTrang quản lý replace
    preview(Request)POST /content-replace/previewPreview thay thế trước khi áp dụng
    execute(Request)POST /content-replace/executeThực thi thay thế hàng loạt

    26.2. ContentReplaceService (app/Services/ContentReplaceService.php)#

    Service xử lý thay thế text hàng loạt trong blog content.

    27. Internal Link Manager#

    27.1. InternalLinkController (Core/Http/Controllers/InternalLinkController.php)#

    MethodRouteMô tả
    index()GET /internal-linksDanh sách internal links
    create()GET /internal-links/createForm tạo mới
    store(Request)POST /internal-linksTạo internal link
    edit($id)GET /internal-links/{id}/editForm chỉnh sửa
    update(Request, $id)PUT /internal-links/{id}Cập nhật internal link
    destroy($id)DELETE /internal-links/{id}Xóa internal link
    toggleStatus($id)POST /internal-links/toggle-statusBật/tắt trạng thái
    settings()GET /internal-links/settingsCấu hình internal links
    saveSettings(Request)POST /internal-links/settingsLưu cấu hình
    testReplace(Request)POST /internal-links/testTest replace
    previewBlog(Request)POST /internal-links/preview-blogPreview blog với links
    importCsv(Request)POST /internal-links/import-csvImport từ CSV

    28. System Backup#

    28.1. BackupController (Core/Http/Controllers/BackupController.php)#

    MethodRouteMô tả
    filesBackup()GET /backup/filesDanh sách file backups
    fileBackupGenerate()GET /backup/generate-backup-fileTạo file backup
    fileBackupDelete()POST /backup/delete-backup-fileXóa file backup
    fileBackupDownload()GET /backup/download-backup-file/{filename}Download file backup
    databaseBackup()GET /backup/databaseDanh sách database backups
    databaseBackupGenerate()GET /backup/generate-database-backupTạo database backup
    databaseBackupDownload()GET /backup/download-backup-database/{filename}Download DB backup
    databaseBackupDelete()POST /backup/delete-backup-databaseXóa DB backup

    29. Middleware#

    MiddlewareMô tả
    tract.visitorTheo dõi lượt truy cập website
    authYêu cầu đăng nhập
    admin.guardGuard cho admin panel
    user.guardGuard cho frontend user
    throttleGiới hạn request rate
    demoChặn thao tác thay đổi trên demo mode
    menu.maintainDuy trì menu structure
    themelooks / thelooksLicense check middleware (obfuscated)
    license / licenseLicense verification (obfuscated)
    can:...Kiểm tra permission

    30. Cấu hình Quan trọng#

    30.1. Database Tables#

    BảngMô tả
    tl_blogsBài viết blog
    tl_blogs_categoriesDanh mục bài viết (pivot)
    tl_blogs_tagsTags bài viết (pivot)
    tl_blogs_commentsBình luận bài viết
    tl_pagesTrang tĩnh
    tl_menusMenus
    tl_languagesNgôn ngữ
    tl_theme_sidebarsSidebars
    tl_widgetsWidgets
    tl_votesBình chọn/Polls
    tl_vote_countsLượt bình chọn
    tl_vote_translationsDịch bình chọn
    tl_visitorsVisitor tracking data
    tl_reading_listsUser reading lists
    tl_blog_historiesBlog edit history
    uploaded_filesMedia files
    rolesUser roles
    permissionsPermissions
    usersUsers
    open_ai_settingsAI configuration
    ai_api_logsAI API call logs
    crawl_jobsCrawl job definitions
    crawl_imagesCrawled images cache
    heatmap_clicksHeatmap click data
    ai_provider_keysAI provider API keys

    30.2. Config Files#

    FileMô tả
    config/mail.phpEmail/SMTP configuration
    config/settings.phpApplication settings (blog_status, etc.)

    31. View Files - Backend Core#

    Các view templates backend core nằm trong Core/Views/base/:
    ViewMô tả
    blog/settings/ai_setting.blade.phpAI settings page
    blog/settings/ai_compare.blade.phpAI content comparison
    blog/ai_logs.blade.phpAI logs listing
    blog/history_detail.blade.phpBlog history detail
    media/partial/media_details_side_bar.blade.phpMedia details sidebar
    media/partial/media_details_pop_up.blade.phpMedia details popup
    email/email_templates/*.blade.phpEmail templates
    email/smtp/test_mail.blade.phpTest email template
    errors/theme_required_plugin_failed.blade.phpError - missing plugin
    base/sitemap/sitemap.blade.phpSitemap view
    base/system/update/system_update.blade.phpSystem update page
    base/license/*.blade.phpLicense pages
    base/welcome/index.blade.phpWelcome page

    32. TÀI LIỆU BÀN GIAO CHI TIẾT API & ENDPOINTS (API DOCS)#

    Tài liệu này cung cấp chi tiết toàn bộ danh sách API, Endpoints, logic xử lý (Controllers, Middleware), mô tả Params/Payload cũng như cấu trúc dữ liệu Model liên quan để đội ngũ phát triển mới nắm bắt và vận hành hệ thống NewsLooks.
    Tài liệu thích hợp để Import vào Apidog (dạng Article/Document), hoặc dùng làm tài liệu tham chiếu mã nguồn trực tiếp cho Front-end & Back-end Developer.

    32.1. FRONTEND & PUBLIC ENDPOINTS#

    Nhóm API phục vụ hiển thị nội dung giao diện, không yêu cầu đăng nhập. Điểm chung là chịu sự kiểm soát của Middleware tract.visitor để theo dõi visitor tĩnh và throttle để chống spam request.

    32.1.1. Core Pages & Utilities (Tiện ích và Dữ liệu chung)#

    MethodEndpointController@Action (Route Name)Payload / Query ParamsMô tả Chi Tiết Cốt Lõi
    GET/FrontendController@index (home)-Render Homepage (Trang chủ) sử dụng hệ thống Widget Page Builder đọc cấu hình từ file JSON Theme Options. Kích hoạt Tracking visitor.
    GET/chinh-sach-bao-matFrontendController@privacyPolicy-Truy xuất nội dung trang tĩnh (Page): Chính sách bảo mật. Gọi model TlPage.
    GET/dieu-khoan-su-dungFrontendController@termsOfService-Truy xuất nội dung trang tĩnh (Page): Điều khoản. Gọi model TlPage.
    POST/language-changeFrontendController@changeLanguage (theme.newslooks.language.change){ lang: string }Thay đổi ngôn ngữ hiển thị giao diện Frontend. Setup biến Session/Cookie locale rồi return back.
    GET/sitemap.xmlSystemController@serveSitemap (core.sitemap)-Đọc file XML nội bộ hoặc sinh tự động Sitemap cho Google/Bing Bots quét bài phục vụ SEO.
    GET/exchange-rateExchangeRateController-API proxy trả về tỉ giá ngoại hối theo thời gian thực (Dữ liệu cache Redis/DB từ API Bank).
    GET/location-cityFrontendController?search=keywordTrả về danh sách thành phố/vị trí địa lý theo format mảng JSON phục vụ auto-fill dropdown.
    POST/contact/submitFrontendController@sendMessage (theme.newslooks.contact.submit)name, email, subject, messageUser gửi form liên hệ. Chức năng lưu vào DB contact và gửi E-Mail trực tiếp tới Admin qua SMTP Mailer.
    POST/newsletter/storeNewsletterController@store (theme.newslooks.newsletter.store)emailUser đăng ký nhận email bản tin. Lưu danh sách DB nội bộ và tự động gọi API đẩy vào List Mailchimp nếu cấu hình hoạt động.
    POST/poll-voteFrontendController@vote (theme.newslooks.vote.give)poll_id, option_idTham gia bình chọn (Poll/Voting). Validate 1 IP / 1 Option, cập nhật bảng Model VoteCount.

    32.1.2. Module Hệ Thống Bài Viết (Blog & Category)#

    Nhóm API chuyên xử lý dữ liệu tin tức thể thao. Xử lý tập trung qua FrontendBlogRepository mapping các bảng tl_blogs, tl_blog_categories, tl_blog_tags.
    MethodEndpointController@ActionParamsMô tả Chi Tiết Cơ Sở Dữ Liệu
    GET/postsFrontendBlogController@blogspage, per_pageDanh sách bài viết tổng hợp hiển thị giao diện phân trang Grid/List hỗn hợp.
    GET/blogsFrontendBlogController@getBlogsPaginationpage, category_idAPI (JSON) trả về phân trang dữ liệu bài viết chuẩn JSON phục vụ tính năng "Load More" (Ajax Scroll) mà không chuyển trang.
    GET/blogs-searchFrontendBlogController@findBlogsPaginationq (từ khóa)API (JSON) truy xuất tìm kiếm LIKE %q% bài viết theo title, sapo hoặc content. Trả về format thẻ bài viết.
    GET/{prefix}/{permalink}FrontendBlogController@blogByCategory-Router động Truy xuất bài viết theo URL Category (VD: /danh-muc/the-thao). Query Model cấu trúc Parent-Child.
    GET/{prefix}/videoFrontendBlogController@blogByVideo-Lọc và trả cấu trúc các bài viết chỉ chứa format Video.
    GET/{tag_prefix}/{permalink}FrontendBlogController@blogByTag-Truy vấn các bài viết map với Models TlBlogTag thông qua khóa ngoại (VD: /tag/bong-da-anh).
    GET/search/{text}FrontendBlogController@blogBySearch-UI Trang hiển thị các kết quả truy vấn Full-text search toàn website.
    GET/author/{name}FrontendBlogController@blogByAuthor-Filter các bài viết được xuất bản (Publish) bởi một Account của Author cụ thể (Bảng users).
    GET/filter/{filter}FrontendBlogController@blogByFilterfilter=popular/recentLọc và sắp xếp nội dung Bài viết Nổi bật (views count lớn), Phổ biến, hoặc Cũ hơn qua Query Builder.
    GET/{permalink}FrontendController@pageOrBlogDetails-Core Router Catch-all: Render chi tiết. Server tiến hành First-check trong DB bảng tl_pages (ưu tiên Page tĩnh trước), nếu Fail => truy vấn vào tl_blogs.
    GET/v2/{permalink}FrontendBlogController@blogDetailsV2-Render giao diện Detail Bài viết Version 2 (Template Modern/Sport Layout).
    POST/post/password/loadFrontendBlogController@getBlogContentid, passwordNhập mật khẩu để mở khóa bài viết có thuộc tính Protected. Server check đúng Pass => Tạo session valid -> return HTML Content qua AJAX.
    POST/page/password/loadFrontendController@getPageContentid, passwordMở khóa riêng cho định dạng cấu trúc Page Protected tĩnh (tương tự như trên).
    POST/post/commentFrontendBlogController@loadBlogCommentblog_id, pageAPI load danh sách Comment cho một tin tức. Dữ liệu JOIN bảng users + tl_blog_comments (Kèm tính năng Nested).
    POST/post/comment/createFrontendBlogController@createBlogCommentblog_id, comment, parent_idNhận Submit bình luận con/cha. Model tạo record mới trạng thái Pending/Publish tùy biến Config của Web.

    32.1.3. Module Widgets & API Page Builder Data#

    MethodEndpointController NodeTrả về / Mô Tả Logic
    GET/ajax/pagebuilder/league-rankProxyController@leagueRankGọi ProxyAPI truy xuất / Caching dữ liệu Bảng xếp hạng các giải đấu Thể Thao (Bóng đá) từ Helper SportsDataHelper.
    GET/ajax/pagebuilder/hot-tipsProxyController@hotTipsTrả về chuỗi nhận định, tips nóng hổi của các chuyên gia để nhúng UI vào Widget Page Builder.
    POST/heatmap/clickHeatmapClickController@storeNhận fetch từ Client log lại sự kiện user Click (Tham số nhận: Tọa độ ngầm X-Y, User-Agent Browser, Window Width). Ghi DB heatmap_clicks.
    GET/heatmap/gridHeatmapClickController@gridTrả ma trận dữ liệu tọa độ (Array point clusters) theo Filter để Frontend Vẽ lớp Heatmap Overlay.

    32.2. MODULE AUTHENTICATION & USER PORTAL#

    Nhóm API liên quan đến quản lý thành viên đăng ký website, đòi hỏi Middleware Check Authentication (auth, user.guard). Tương tác Models: User, Role.

    32.2.1. Tài khoản & Đăng nhập (Auth Controller)#

    MethodEndpointController@ActionChi Tiết Nghiệp Vụ Cốt Lõi
    GET/user/loginUserController@loginTrả UI giao diện đăng nhập dành riêng Frontend User (tách biệt cổng Admin).
    POST/user/login-submitUserController@attemptLoginPost credentials (email/password). Auth Attempt -> Nếu hợp lệ Record nhật ký Event login vào bảng activity_log -> Trả về Session cookie.
    GET/user/registrationUserController@registrationRequest UI trang đăng ký.
    POST/user/registration-submitUserController@registrationSubmitNhận dữ liệu Create User: Auto sinh mã hóa mật khẩu Hash bcrypt, Check Unique Username/Email, Gán Role Default là User.
    GET/user/auth/{provider}SocialAuthController@redirectToProviderKhởi tạo OAuth2 thông qua Provider (google, facebook). Server gọi SDK sinh URL ủy quyền Redirect và gửi về Client.
    GET/user/auth/{provider}/callbackSocialAuthController@handleProviderCallbackMáy chủ nhận Auth Code JWT từ Provider, gọi API truy xuất Email & Profile; Kiểm tra nếu tồn tại Email thì mapping login, chưa có thì tạo mới Auto User.
    GET/user/logoutUserController@logoutHủy toàn bộ User Session Key, Cookie Token, Redirect về vị trí trang chủ.

    32.2.2. Dashboard & Cá nhân người dùng#

    MethodEndpointPayload Request / Mô tả
    GET/user/dashboardCổng chính Admin Portal mini cho user: Aggregate Thống kê số block Comments, số Reading Lists saved.
    GET/user/profileAPI Endpoint nội bộ load form view Thông tin Bio cá nhân, SĐT, Data Contact.
    POST/user/update-profile/{user}Multipart Upload formData: Chứa ảnh Avatar (Lưu server/S3), chỉnh sửa các Profile strings.
    POST/user/update-password/{user}Request { old_pass, new_pass, confirm_pass }. Backend compare bcrypt password cũ, validate chuỗi mật khẩu mới, update.
    GET/user/commentsFetch lịch sử toàn phần của tất cả Comments user đã đăng tải. Tính năng hỗ trợ user quản lý bình luận.
    POST/user/readingList/updateNhận param blog_id. Chức năng "Lưu bài viết Đọc sau" (Bookmark). Insert/Update DB record vào bảng tl_reading_lists liên kết relation ID User.
    DELETE/user/readingList/removeNhận param blog_id. Remove mapping Foreign Key (Blog-User) lưu ở bảng tl_reading_lists.

    32.3. BACKEND API ADMIN CORE (CMS SYSTEM)#

    Nhóm chức năng chỉ định dành cho Ban Quản Trị Website. Chặn ngặt nghèo bởi Middleware bảo mật: auth, admin.guard, Role/Permission. Tiền tố Prefix chung: /admin/....

    32.3.1. Content Management (Blog / Page / Thư viện)#

    MethodThực Thể RoutingLuồng thực thi (Nghiệp vụ Controller thao tác)
    GET/POSTQuản lý Posts (core.blog)Thêm, xem, publish, chỉnh sửa status bài viết. (Sử dụng Model TlBlog). Lưu thông tin Taxonomies, Tags, Meta Seo.
    PUT/DELCập nhật/Xóa Blog (core.update.blog)Thao tác Modify bài viết. Nếu xóa (Force/Soft Delete) thì tích hợp Bulk Delete Data qua Repository.
    RESTQuản lý Category (core.blog.category)CRUD cho hệ thống Danh mục. Nested Set Data Hierarchy (Parent - Child levels).
    RESTQuản lý Page tĩnh (core.page)Tạo Page độc lập (Ex: Giới thiệu chung), render qua JSON config của Newslooks Page Builder plugin.
    GET/POSTMedia Editor (core.media.page)Tool quản lý Media. Upload hình ảnh -> Resize server sinh các variants image size (VD: thumb, lagre). Lưu vào uploaded_files.
    POST/DELDuyệt Comment (core.blog.comment)Panel quản lý Comment người dùng: Cho hiển thị/Ẩn, Reply ẩn danh Admin.
    POSTTrack Lịch Sử (core.blog.history.compare)Tra lại lịch sử thay đổi Revisions của bài đăng, diff compare chuỗi text (Cấu trúc Log Changes), Trigger rollback.

    32.3.2. Setting & System Configurations#

    MethodRoute Name / Logic HandleModule Thao tác / Kết quả
    POSTCấu hình SMTP (core.email.smtp.configuration)Lưu cấu hình cổng Email gửi đi (Host, Port, User, Password_app, SSL/TLS). Test Mail SMTP trực tiếp (Bắt lỗi Exception Socket).
    POSTSetting SEO tổng thể (core.seo.settings)Setting Meta Title, Description, Image OpenGraph chung mặc định của toàn trang.
    RESTMulti-language (core.languages)Quản lý Resource JSON Language pack (front_translate). Ghi đè file dịch / Quản trị key.
    GETQuản trị Plugin (core.plugins.index)Xem thông tin Plugin system, License verification checking, Status of active features.
    GET/POSTMenu Builder (core.manage.menus)Công cụ Builder Header/Footer dạng kéo thả Drag/Drop cấp bậc nested-tree (Node cha con) và Sync DB.
    RESTQuản trị Banner (core.ads.list)CRUD list danh sách Custom Quảng cáo (Header Ad, Sidebar Ad) qua các Slot Banner code injection.

    32.4. MODULES NÂNG CAO ĐẶC TRƯNG - NEWSLOOKS ENGINE#

    Các tiện ích tối thượng tạo nên lợi thế quản lý của hệ thống: Auto Crawler, Auto AI Rewrite, Tự động Internal Link và Tích hợp Proxy.

    32.4.1. Crawler - Hệ thống Cào Dữ Liệu Tự Động (CronJobs)#

    Controller core: CrawlJobController, CrawlNewsJob
    Models thao tác: CrawlJob, CrawlImage, các pattern Crawler (DailyStrategy, LinkPagination).
    MethodEndpoint Workflow (/admin/crawl-jobs...)Mô tả Data Flow chi tiết
    GET/Fetch & Render DataTables JSON các bản ghi cấu hình Job đang chạy (tl_crawl_jobs).
    GET/POST/add & POST /Add/Update Crawler Job config: Map Config Target URL, thiết lập CSS Selectors (Title/Body/Time), set Tần suất (Cron rate), set Pagination (Next url / Load more), Map setting vào AI Content Modifier.
    POST/previewTool Submit Config -> Máy chủ thực thi Guzzle Request 1 bài ngẫu nhiên -> Cào Body -> Render thử UI trả về Browser cho Admin test trước khi Apply.
    GET/dashboardTổng hợp Chart Statistic: Số Queue đã chạy, % Error Catching Logs, Timeline jobs qua JSON feed.
    POST/{id}/force-run-aiTriggler bắt máy chủ khởi chạy Worker AI Assistant ép buộc theo Job thủ công mà không cần chờ Timer Cronjob.
    GET/{id}/statusEndpoint định dạng Ajax Request Pooling: Client sẽ gọi 3s/1 lần để render Job Progress Bar đang cào.
    POST/{id}/toggle-activeAction bật / tắt trạng thái (Boolean) dừng cào hoặc tiếp tục cào định kỳ.

    32.4.2. Lõi Trợ Lý AI (AI Content Generator & Rewriter)#

    Controller core: AIAssistantController
    Tác động Models/Bảng: open_ai_settings, ai_api_logs.
    MethodThực thể Endpoint DataXử Lý Máy Chủ Lõi (Behind The Scenes)
    GET/POST/admin/ai-settings
    core.blog.ai.setting
    Load & Config (1 Row) ở database cho API Keys, Model ID Default (VD: gpt-4o-mini), Model chuyên trách (Translate Node, Rewrite Node). Quản trị JSON Prompts. Webhook Mattermost setup.
    POST/PUT/admin/generate-content-with-aiManual mode: Trình duyệt bắn chuỗi Content qua Axios -> Server Build prompt theo cấu hình -> Call Model API (VD OpenAI) -> Wait stream -> Generate Result Push back trực tiếp qua Editor UI.
    GET/admin/crawl-aiAuto mode: Cronjob trigger -> Server select Batch (VD: 5 bài cần cào Crawler chưa Modify) -> Build Workspace Chain API -> Translate Tone/Rewrite -> Map fallback Models (Nếu model 1 tạch server limit -> dùng model 2) -> Kết thúc gọi CURL Notify chốt Mattermost báo cáo Status. Update blog table.
    GET/admin/crawl-news/{id}Lệnh Call API chạy độc quyền 1 Job Scraping chỉ định.
    GET/admin/update-crawl-imagesBackground API Worker scan bảng crawl_images, call Image URLs -> Storage vật lý -> Sync records map vào Media Manager DB và replace domain nội bộ vào Post Content HTML.
    GET/DEL/admin/ai-logs / {logId}Module Audit: Ghi Data Tracking Call API request Payload/Response JSON Body, calculate lượng Token Input/Output tiêu hao -> Sinh Report Log hiển thị (Bảng ai_api_logs).

    32.4.3. Quản Lý Liên Kết Nội Bộ Tự Động (Auto Internal Link)#

    Controller core: InternalLinkController
    Mục tiêu: Tối ưu SEO On-Page bằng cách Cấu hình [Từ khóa] -> [URL liên kết], hệ thống tự Match content và replace Regex HTML thành Tag <a> hiển thị cho Client.
    MethodEndpointQuy Trình Chức Năng
    GET/POST/admin/internal-linksQuản trị CRUD Table Mapping: Keyword Target -> Anchortext Link URL. Tùy chọn rule DoFollow/NoFollow.
    POST/admin/internal-links/toggle-statusAPI Pause/Resume cắm cờ Disable tạm thời cho 1 Rule từ khóa (Update Boolean status).
    GET/POST/admin/internal-links/settingsAPI form lưu config Server limits: Giới hạn tối đa số liên kết chèn tự động trên mỗi bài Content (VD: Tối đa 3 Link khác nhau).
    POST/admin/internal-links/testInput Sandbox String Text -> Server gọi Service InternalLinkProcessor -> Chạy thuật toán Regex tránh thẻ HTML tồn tại (<a,...>) -> Trả Output Text chèn Tag <a> thử.
    POST/admin/internal-links/preview-blogInput Blog ID -> Lấy content thật truy cập -> Pass qua Processor -> Render thử HTML. Cho Admin xem preview trước khi chèn để soi Layout.
    POST/admin/internal-links/import-csvHandle file Upload Bulk: Parse dạng file CSV, import insert hàng ngàn Rules Keyword Mapping 1 lúc.

    32.4.4. Thống Kê, System Tools & File Tiện Ích Hành Cấp#

    Trách nhiệm bảo vệ: Root Admin level.
    MethodRouting API / System HandleHệ Sinh Thái Phân Tích & Bảo Trì
    GET/admin/analyticsFetch Dashboard Graph Chart phân tích chỉ số web traffic Real-time (Truy xuất tl_visitors).
    POST/admin/website-visitor-reportsEndpoint lọc Data Export / Table list Logs chi tiết Logs Session vào web.
    POST/admin/country-reports, browser...Aggregation Query -> Trả JSON Data biểu đồ tròn phân hóa Device (Mobile/PC), Country Map traffic.
    POSTcore.content-replace.previewTiện ích Update Mass Content: Truy vấn Tìm (Old String) -> Thay (New String). Sử dụng Regex LIKE %. API sẽ Scan Content toàn DB xem có bao Record đang dính Cụm từ Cũ để Preview List.
    POSTcore.content-replace.executeAction thực thi Lệnh REPLACE Database Query (UPDATE fields SET content = REPLACE(content, 'old', 'new')) -> Refresh Cache hệ thống.
    GET/POSTSystem Backup (/admin/backup..)Server Module gọi Command Line / Shell Command để Zip source code (generate-backup-file) hoặc dump Database tables SQL (generate-database-backup). Trả Response file .zip, .sql header Stream force Download. Xóa vật lý Backup sau lệnh Delete.

    32.4.5. Quản Trị Hệ Thống Visual Theo Component (Theme Options / Widgets)#

    Cốt lõi của Framework System Page Builder kéo thả. Quản trị phân tách API JSON config Option cho Frontend Indexer.
    MethodAPI Server HookGiao Việc Layout Frontend
    GET/POST/admin/manage-widgetsComponent Hub UI. Trả Layout UI kéo thả các Widgets đăng ký từ Backend.
    Các view templates backend core nằm trong Core/Views/base/:
    ViewMô tả
    blog/settings/ai_setting.blade.phpAI settings page
    blog/settings/ai_compare.blade.phpAI content comparison
    blog/ai_logs.blade.phpAI logs listing
    blog/history_detail.blade.phpBlog history detail
    media/partial/media_details_side_bar.blade.phpMedia details sidebar
    media/partial/media_details_pop_up.blade.phpMedia details popup
    email/email_templates/*.blade.phpEmail templates
    email/smtp/test_mail.blade.phpTest email template
    errors/theme_required_plugin_failed.blade.phpError - missing plugin
    base/sitemap/sitemap.blade.phpSitemap view
    base/system/update/system_update.blade.phpSystem update page
    base/license/*.blade.phpLicense pages
    base/welcome/index.blade.phpWelcome page

    33. TÀI LIỆU BÀN GIAO CHI TIẾT API & ENDPOINTS (API DOCS)#

    Tài liệu này cung cấp chi tiết toàn bộ danh sách API, Endpoints, logic xử lý (Controllers, Middleware), mô tả Params/Payload cũng như cấu trúc dữ liệu Model liên quan để đội ngũ phát triển mới nắm bắt và vận hành hệ thống NewsLooks.
    Tài liệu thích hợp để Import vào Apidog (dạng Article/Document), hoặc dùng làm tài liệu tham chiếu mã nguồn trực tiếp cho Front-end & Back-end Developer.

    33.1. FRONTEND & PUBLIC ENDPOINTS#

    Nhóm API phục vụ hiển thị nội dung giao diện, không yêu cầu đăng nhập. Điểm chung là chịu sự kiểm soát của Middleware tract.visitor để theo dõi visitor tĩnh và throttle để chống spam request.

    33.1.1. Core Pages & Utilities (Tiện ích và Dữ liệu chung)#

    MethodEndpointController@Action (Route Name)Payload / Query ParamsMô tả Chi Tiết Cốt Lõi
    GET/FrontendController@index (home)-Render Homepage (Trang chủ) sử dụng hệ thống Widget Page Builder đọc cấu hình từ file JSON Theme Options. Kích hoạt Tracking visitor.
    GET/chinh-sach-bao-matFrontendController@privacyPolicy-Truy xuất nội dung trang tĩnh (Page): Chính sách bảo mật. Gọi model TlPage.
    GET/dieu-khoan-su-dungFrontendController@termsOfService-Truy xuất nội dung trang tĩnh (Page): Điều khoản. Gọi model TlPage.
    POST/language-changeFrontendController@changeLanguage (theme.newslooks.language.change){ lang: string }Thay đổi ngôn ngữ hiển thị giao diện Frontend. Setup biến Session/Cookie locale rồi return back.
    GET/sitemap.xmlSystemController@serveSitemap (core.sitemap)-Đọc file XML nội bộ hoặc sinh tự động Sitemap cho Google/Bing Bots quét bài phục vụ SEO.
    GET/exchange-rateExchangeRateController-API proxy trả về tỉ giá ngoại hối theo thời gian thực (Dữ liệu cache Redis/DB từ API Bank).
    GET/location-cityFrontendController?search=keywordTrả về danh sách thành phố/vị trí địa lý theo format mảng JSON phục vụ auto-fill dropdown.
    POST/contact/submitFrontendController@sendMessage (theme.newslooks.contact.submit)name, email, subject, messageUser gửi form liên hệ. Chức năng lưu vào DB contact và gửi E-Mail trực tiếp tới Admin qua SMTP Mailer.
    POST/newsletter/storeNewsletterController@store (theme.newslooks.newsletter.store)emailUser đăng ký nhận email bản tin. Lưu danh sách DB nội bộ và tự động gọi API đẩy vào List Mailchimp nếu cấu hình hoạt động.
    POST/poll-voteFrontendController@vote (theme.newslooks.vote.give)poll_id, option_idTham gia bình chọn (Poll/Voting). Validate 1 IP / 1 Option, cập nhật bảng Model VoteCount.

    33.1.2. Module Hệ Thống Bài Viết (Blog & Category)#

    Nhóm API chuyên xử lý dữ liệu tin tức thể thao. Xử lý tập trung qua FrontendBlogRepository mapping các bảng tl_blogs, tl_blog_categories, tl_blog_tags.
    MethodEndpointController@ActionParamsMô tả Chi Tiết Cơ Sở Dữ Liệu
    GET/postsFrontendBlogController@blogspage, per_pageDanh sách bài viết tổng hợp hiển thị giao diện phân trang Grid/List hỗn hợp.
    GET/blogsFrontendBlogController@getBlogsPaginationpage, category_idAPI (JSON) trả về phân trang dữ liệu bài viết chuẩn JSON phục vụ tính năng "Load More" (Ajax Scroll) mà không chuyển trang.
    GET/blogs-searchFrontendBlogController@findBlogsPaginationq (từ khóa)API (JSON) truy xuất tìm kiếm LIKE %q% bài viết theo title, sapo hoặc content. Trả về format thẻ bài viết.
    GET/{prefix}/{permalink}FrontendBlogController@blogByCategory-Router động Truy xuất bài viết theo URL Category (VD: /danh-muc/the-thao). Query Model cấu trúc Parent-Child.
    GET/{prefix}/videoFrontendBlogController@blogByVideo-Lọc và trả cấu trúc các bài viết chỉ chứa format Video.
    GET/{tag_prefix}/{permalink}FrontendBlogController@blogByTag-Truy vấn các bài viết map với Models TlBlogTag thông qua khóa ngoại (VD: /tag/bong-da-anh).
    GET/search/{text}FrontendBlogController@blogBySearch-UI Trang hiển thị các kết quả truy vấn Full-text search toàn website.
    GET/author/{name}FrontendBlogController@blogByAuthor-Filter các bài viết được xuất bản (Publish) bởi một Account của Author cụ thể (Bảng users).
    GET/filter/{filter}FrontendBlogController@blogByFilterfilter=popular/recentLọc và sắp xếp nội dung Bài viết Nổi bật (views count lớn), Phổ biến, hoặc Cũ hơn qua Query Builder.
    GET/{permalink}FrontendController@pageOrBlogDetails-Core Router Catch-all: Render chi tiết. Server tiến hành First-check trong DB bảng tl_pages (ưu tiên Page tĩnh trước), nếu Fail => truy vấn vào tl_blogs.
    GET/v2/{permalink}FrontendBlogController@blogDetailsV2-Render giao diện Detail Bài viết Version 2 (Template Modern/Sport Layout).
    POST/post/password/loadFrontendBlogController@getBlogContentid, passwordNhập mật khẩu để mở khóa bài viết có thuộc tính Protected. Server check đúng Pass => Tạo session valid -> return HTML Content qua AJAX.
    POST/page/password/loadFrontendController@getPageContentid, passwordMở khóa riêng cho định dạng cấu trúc Page Protected tĩnh (tương tự như trên).
    POST/post/commentFrontendBlogController@loadBlogCommentblog_id, pageAPI load danh sách Comment cho một tin tức. Dữ liệu JOIN bảng users + tl_blog_comments (Kèm tính năng Nested).
    POST/post/comment/createFrontendBlogController@createBlogCommentblog_id, comment, parent_idNhận Submit bình luận con/cha. Model tạo record mới trạng thái Pending/Publish tùy biến Config của Web.

    33.1.3. Module Widgets & API Page Builder Data#

    | Method | Endpoint | Controller Node | Trả về / Mô Tả Logic |
    |---|---|---|
    | GET | /ajax/pagebuilder/league-rank| ProxyController@leagueRank | Gọi ProxyAPI truy xuất / Caching dữ liệu Bảng xếp hạng các giải đấu Thể Thao (Bóng đá) từ Helper SportsDataHelper. |
    | GET | /ajax/pagebuilder/hot-tips | ProxyController@hotTips | Trả về chuỗi nhận định, tips nóng hổi của các chuyên gia để nhúng UI vào Widget Page Builder. |
    | POST| /heatmap/click | HeatmapClickController@store | Nhận fetch từ Client log lại sự kiện user Click (Tham số nhận: Tọa độ ngầm X-Y, User-Agent Browser, Window Width). Ghi DB heatmap_clicks. |
    | GET | /heatmap/grid | HeatmapClickController@grid | Trả ma trận dữ liệu tọa độ (Array point clusters) theo Filter để Frontend Vẽ lớp Heatmap Overlay. |

    33.2. MODULE AUTHENTICATION & USER PORTAL#

    Nhóm API liên quan đến quản lý thành viên đăng ký website, đòi hỏi Middleware Check Authentication (auth, user.guard). Tương tác Models: User, Role.

    33.2.1. Tài khoản & Đăng nhập (Auth Controller)#

    MethodEndpointController@ActionChi Tiết Nghiệp Vụ Cốt Lõi
    GET/user/loginUserController@loginTrả UI giao diện đăng nhập dành riêng Frontend User (tách biệt cổng Admin).
    POST/user/login-submitUserController@attemptLoginPost credentials (email/password). Auth Attempt -> Nếu hợp lệ Record nhật ký Event login vào bảng activity_log -> Trả về Session cookie.
    GET/user/registrationUserController@registrationRequest UI trang đăng ký.
    POST/user/registration-submitUserController@registrationSubmitNhận dữ liệu Create User: Auto sinh mã hóa mật khẩu Hash bcrypt, Check Unique Username/Email, Gán Role Default là User.
    GET/user/auth/{provider}SocialAuthController@redirectToProviderKhởi tạo OAuth2 thông qua Provider (google, facebook). Server gọi SDK sinh URL ủy quyền Redirect và gửi về Client.
    GET/user/auth/{provider}/callbackSocialAuthController@handleProviderCallbackMáy chủ nhận Auth Code JWT từ Provider, gọi API truy xuất Email & Profile; Kiểm tra nếu tồn tại Email thì mapping login, chưa có thì tạo mới Auto User.
    GET/user/logoutUserController@logoutHủy toàn bộ User Session Key, Cookie Token, Redirect về vị trí trang chủ.

    33.2.2. Dashboard & Cá nhân người dùng#

    MethodEndpointPayload Request / Mô tả
    GET/user/dashboardCổng chính Admin Portal mini cho user: Aggregate Thống kê số block Comments, số Reading Lists saved.
    GET/user/profileAPI Endpoint nội bộ load form view Thông tin Bio cá nhân, SĐT, Data Contact.
    POST/user/update-profile/{user}Multipart Upload formData: Chứa ảnh Avatar (Lưu server/S3), chỉnh sửa các Profile strings.
    POST/user/update-password/{user}Request { old_pass, new_pass, confirm_pass }. Backend compare bcrypt password cũ, validate chuỗi mật khẩu mới, update.
    GET/user/commentsFetch lịch sử toàn phần của tất cả Comments user đã đăng tải. Tính năng hỗ trợ user quản lý bình luận.
    POST/user/readingList/updateNhận param blog_id. Chức năng "Lưu bài viết Đọc sau" (Bookmark). Insert/Update DB record vào bảng tl_reading_lists liên kết relation ID User.
    DELETE/user/readingList/removeNhận param blog_id. Remove mapping Foreign Key (Blog-User) lưu ở bảng tl_reading_lists.

    33.3. BACKEND API ADMIN CORE (CMS SYSTEM)#

    Nhóm chức năng chỉ định dành cho Ban Quản Trị Website. Chặn ngặt nghèo bởi Middleware bảo mật: auth, admin.guard, Role/Permission. Tiền tố Prefix chung: /admin/....

    33.3.1. Content Management (Blog / Page / Thư viện)#

    MethodThực Thể RoutingLuồng thực thi (Nghiệp vụ Controller thao tác)
    GET/POSTQuản lý Posts (core.blog)Thêm, xem, publish, chỉnh sửa status bài viết. (Sử dụng Model TlBlog). Lưu thông tin Taxonomies, Tags, Meta Seo.
    PUT/DELCập nhật/Xóa Blog (core.update.blog)Thao tác Modify bài viết. Nếu xóa (Force/Soft Delete) thì tích hợp Bulk Delete Data qua Repository.
    RESTQuản lý Category (core.blog.category)CRUD cho hệ thống Danh mục. Nested Set Data Hierarchy (Parent - Child levels).
    RESTQuản lý Page tĩnh (core.page)Tạo Page độc lập (Ex: Giới thiệu chung), render qua JSON config của Newslooks Page Builder plugin.
    GET/POSTMedia Editor (core.media.page)Tool quản lý Media. Upload hình ảnh -> Resize server sinh các variants image size (VD: thumb, lagre). Lưu vào uploaded_files.
    POST/DELDuyệt Comment (core.blog.comment)Panel quản lý Comment người dùng: Cho hiển thị/Ẩn, Reply ẩn danh Admin.
    POSTTrack Lịch Sử (core.blog.history.compare)Tra lại lịch sử thay đổi Revisions của bài đăng, diff compare chuỗi text (Cấu trúc Log Changes), Trigger rollback.

    33.3.2. Setting & System Configurations#

    MethodRoute Name / Logic HandleModule Thao tác / Kết quả
    POSTCấu hình SMTP (core.email.smtp.configuration)Lưu cấu hình cổng Email gửi đi (Host, Port, User, Password_app, SSL/TLS). Test Mail SMTP trực tiếp (Bắt lỗi Exception Socket).
    POSTSetting SEO tổng thể (core.seo.settings)Setting Meta Title, Description, Image OpenGraph chung mặc định của toàn trang.
    RESTMulti-language (core.languages)Quản lý Resource JSON Language pack (front_translate). Ghi đè file dịch / Quản trị key.
    GETQuản trị Plugin (core.plugins.index)Xem thông tin Plugin system, License verification checking, Status of active features.
    GET/POSTMenu Builder (core.manage.menus)Công cụ Builder Header/Footer dạng kéo thả Drag/Drop cấp bậc nested-tree (Node cha con) và Sync DB.
    RESTQuản trị Banner (core.ads.list)CRUD list danh sách Custom Quảng cáo (Header Ad, Sidebar Ad) qua các Slot Banner code injection.

    33.4. MODULES NÂNG CAO ĐẶC TRƯNG - NEWSLOOKS ENGINE#

    Các tiện ích tối thượng tạo nên lợi thế quản lý của hệ thống: Auto Crawler, Auto AI Rewrite, Tự động Internal Link và Tích hợp Proxy.

    33.4.1. Crawler - Hệ thống Cào Dữ Liệu Tự Động (CronJobs)#

    Controller core: CrawlJobController, CrawlNewsJob
    Models thao tác: CrawlJob, CrawlImage, các pattern Crawler (DailyStrategy, LinkPagination).
    MethodEndpoint Workflow (/admin/crawl-jobs...)Mô tả Data Flow chi tiết
    GET/Fetch & Render DataTables JSON các bản ghi cấu hình Job đang chạy (tl_crawl_jobs).
    GET/POST/add & POST /Add/Update Crawler Job config: Map Config Target URL, thiết lập CSS Selectors (Title/Body/Time), set Tần suất (Cron rate), set Pagination (Next url / Load more), Map setting vào AI Content Modifier.
    POST/previewTool Submit Config -> Máy chủ thực thi Guzzle Request 1 bài ngẫu nhiên -> Cào Body -> Render thử UI trả về Browser cho Admin test trước khi Apply.
    GET/dashboardTổng hợp Chart Statistic: Số Queue đã chạy, % Error Catching Logs, Timeline jobs qua JSON feed.
    POST/{id}/force-run-aiTriggler bắt máy chủ khởi chạy Worker AI Assistant ép buộc theo Job thủ công mà không cần chờ Timer Cronjob.
    GET/{id}/statusEndpoint định dạng Ajax Request Pooling: Client sẽ gọi 3s/1 lần để render Job Progress Bar đang cào.
    POST/{id}/toggle-activeAction bật / tắt trạng thái (Boolean) dừng cào hoặc tiếp tục cào định kỳ.

    33.4.2. Lõi Trợ Lý AI (AI Content Generator & Rewriter)#

    Controller core: AIAssistantController
    Tác động Models/Bảng: open_ai_settings, ai_api_logs.
    MethodThực thể Endpoint DataXử Lý Máy Chủ Lõi (Behind The Scenes)
    GET/POST/admin/ai-settings
    core.blog.ai.setting
    Load & Config (1 Row) ở database cho API Keys, Model ID Default (VD: gpt-4o-mini), Model chuyên trách (Translate Node, Rewrite Node). Quản trị JSON Prompts. Webhook Mattermost setup.
    POST/PUT/admin/generate-content-with-aiManual mode: Trình duyệt bắn chuỗi Content qua Axios -> Server Build prompt theo cấu hình -> Call Model API (VD OpenAI) -> Wait stream -> Generate Result Push back trực tiếp qua Editor UI.
    GET/admin/crawl-aiAuto mode: Cronjob trigger -> Server select Batch (VD: 5 bài cần cào Crawler chưa Modify) -> Build Workspace Chain API -> Translate Tone/Rewrite -> Map fallback Models (Nếu model 1 tạch server limit -> dùng model 2) -> Kết thúc gọi CURL Notify chốt Mattermost báo cáo Status. Update blog table.
    GET/admin/crawl-news/{id}Lệnh Call API chạy độc quyền 1 Job Scraping chỉ định.
    GET/admin/update-crawl-imagesBackground API Worker scan bảng crawl_images, call Image URLs -> Storage vật lý -> Sync records map vào Media Manager DB và replace domain nội bộ vào Post Content HTML.
    GET/DEL/admin/ai-logs / {logId}Module Audit: Ghi Data Tracking Call API request Payload/Response JSON Body, calculate lượng Token Input/Output tiêu hao -> Sinh Report Log hiển thị (Bảng ai_api_logs).

    33.4.3. Quản Lý Liên Kết Nội Bộ Tự Động (Auto Internal Link)#

    Controller core: InternalLinkController
    Mục tiêu: Tối ưu SEO On-Page bằng cách Cấu hình [Từ khóa] -> [URL liên kết], hệ thống tự Match content và replace Regex HTML thành Tag <a> hiển thị cho Client.
    MethodEndpointQuy Trình Chức Năng
    GET/POST/admin/internal-linksQuản trị CRUD Table Mapping: Keyword Target -> Anchortext Link URL. Tùy chọn rule DoFollow/NoFollow.
    POST/admin/internal-links/toggle-statusAPI Pause/Resume cắm cờ Disable tạm thời cho 1 Rule từ khóa (Update Boolean status).
    GET/POST/admin/internal-links/settingsAPI form lưu config Server limits: Giới hạn tối đa số liên kết chèn tự động trên mỗi bài Content (VD: Tối đa 3 Link khác nhau).
    POST/admin/internal-links/testInput Sandbox String Text -> Server gọi Service InternalLinkProcessor -> Chạy thuật toán Regex tránh thẻ HTML tồn tại (<a,...>) -> Trả Output Text chèn Tag <a> thử.
    POST/admin/internal-links/preview-blogInput Blog ID -> Lấy content thật truy cập -> Pass qua Processor -> Render thử HTML. Cho Admin xem preview trước khi chèn để soi Layout.
    POST/admin/internal-links/import-csvHandle file Upload Bulk: Parse dạng file CSV, import insert hàng ngàn Rules Keyword Mapping 1 lúc.

    33.4.4. Thống Kê, System Tools & File Tiện Ích Hành Cấp#

    Trách nhiệm bảo vệ: Root Admin level.
    MethodRouting API / System HandleHệ Sinh Thái Phân Tích & Bảo Trì
    GET/admin/analyticsFetch Dashboard Graph Chart phân tích chỉ số web traffic Real-time (Truy xuất tl_visitors).
    POST/admin/website-visitor-reportsEndpoint lọc Data Export / Table list Logs chi tiết Logs Session vào web.
    POST/admin/country-reports, browser...Aggregation Query -> Trả JSON Data biểu đồ tròn phân hóa Device (Mobile/PC), Country Map traffic.
    POSTcore.content-replace.previewTiện ích Update Mass Content: Truy vấn Tìm (Old String) -> Thay (New String). Sử dụng Regex LIKE %. API sẽ Scan Content toàn DB xem có bao Record đang dính Cụm từ Cũ để Preview List.
    POSTcore.content-replace.executeAction thực thi Lệnh REPLACE Database Query (UPDATE fields SET content = REPLACE(content, 'old', 'new')) -> Refresh Cache hệ thống.
    GET/POSTSystem Backup (/admin/backup..)Server Module gọi Command Line / Shell Command để Zip source code (generate-backup-file) hoặc dump Database tables SQL (generate-database-backup). Trả Response file .zip, .sql header Stream force Download. Xóa vật lý Backup sau lệnh Delete.

    33.4.5. Quản Trị Hệ Thống Visual Theo Component (Theme Options / Widgets)#

    Cốt lõi của Framework System Page Builder kéo thả. Quản trị phân tách API JSON config Option cho Frontend Indexer.
    MethodAPI Server HookGiao Việc Layout Frontend
    GET/POST/admin/manage-widgetsComponent Hub UI. Trả Layout UI kéo thả các Widgets đăng ký từ Backend.
    POST/admin/get-widget-inputFrontend Editor kéo 1 thẻ widget (Ex: Lịch thi đấu) => Component gọi Backend hỏi Fields Setting (Mã HTML Input/Select) => Trả UI Form Input Params.
    POST/admin/add-widget-sidebarRequest Hook -> Thêm Item ID Widget vào Sidebar Component Box.
    POST/admin/save-sidebar-widget-formTrigger Serialize toàn bộ Data Parameter Form Settings thành JSON Data Base64 -> Lưu Table tl_widgets.
    POST/admin/widget-order-saveUpdate lại Index Sortable thứ tự order Box.
    POST/admin/save-theme-option-formGhi đè toàn bộ Setting Hệ Theme Layout Component (Color, CSS Logo, Footer Text, Layout Width) vào cache config.
    POST/admin/import-theme-optionĐón Upload JSON Option Layout -> Validate JSON Parsing -> Merge Config đè lên layout Cũ Website.

    34. CHUYÊN ĐỀ SÂU: HỆ THỐNG CÀO DỮ LIỆU & TRÍ TUỆ NHÂN TẠO (CRAWLER & AI)#

    Hệ thống tin tức NewsLooks được trang bị công cụ tự động hóa toàn diện từ bước thu thập dữ liệu thô (Scraping) đến bước tinh chỉnh nội dung bằng trí tuệ nhân tạo (AI Assistant) chống trùng lặp dữ liệu (Plagiarism) và tối ưu SEO.

    34.1. Kiến Trúc Tự Động Hóa (Automation Architecture)#

    Hệ thống sử dụng Laravel Task Scheduling (Console/Kernel.php) kết hợp với Supervisor / Cronjob trên máy chủ để chạy ngầm các tiến trình (Worker).
    1.
    Cronjob Core: * * * * * cd /path-to-project && php artisan schedule:run >> /dev/null 2>&1
    2.
    Workers hoạt động liên tục:
    CrawlNewsJob: Worker quét các Website cấu hình và tiến hành Bóc tách dữ liệu (Scrape Data).
    AIUpdateJob: Worker kích hoạt AI xử lý lại các dữ liệu vừa cào.
    ImageSyncJob: Worker tải ngầm mảng hình ảnh từ thẻ <img src="..."> của target về thư mục /storage local.

    34.2. Chi Tiết: Module Crawler (Cào Dữ Liệu Tự Động)#

    A. Chu trình hoạt động (Data Scraping Lifecycle)
    1.
    Admin thiết lập Crawl Job qua UI (/admin/crawl-jobs/add). Cung cấp Target URL (Ví dụ trang đối thủ hoặc báo mạng RSS).
    2.
    Admin test cấu hình bộ lọc CSS Selectors (Dựa trên kỹ thuật DOM Crawler / Goutte PHP DOM Parser):
    Link list Selector: Vị trí Class/ID thẻ <a> chứa bài viết trong danh mục.
    Title Selector: Vị trí Header <h1> trong bài.
    Content Selector: Vị trí thẻ div bọc nội dung văn bản bài.
    Remove Elements: Các chuỗi class/id thừa không lấy (VD: .ads-banner, .author-bio, iframe) để nội dung được sạch.
    Pagination Strategy: Crawler tự bấm Next page hay bấm Load More khi chuyển trang.
    3.
    Khi Cronjob chạy, Kernel check DB tìm các Job có active = 1 và frequency_time <= NOW().
    4.
    Kernel Request Service CrawlerService@execute($config). Dịch vụ này fetch HTML nguồn, parse cây DOM, chạy vòng lặp bóc tách Text và lưu Array.
    5.
    Record dữ liệu thô được Insert vào bảng tl_blogs với trạng thái cấu hình (Draft hoặc Pending). Cột name_crawl được ghi lại URL nguồn để hệ thống đối soát không bao giờ cào trùng URL cũ.
    6.
    Toàn bộ hình ảnh External Links trong bài cào được ghi tạm vào queue bảng crawl_images chờ Worker Tải Ảnh chạy.
    B. Tables & Relational Database
    Bảng crawl_jobs: Lưu thiết lập selectors, interval timer, trạng thái crawl của 1 Nguồn cấu hình.
    Bảng crawl_images: Queue lưu URL ảnh ngoại lai chờ download. Map theo blog_id.
    C. Cấu trúc Pattern Kỹ Thuật (Crawler System Strategy)
    Hệ thống áp dụng Pattern Polymorphic Strategy cho phân đoạn hành vi Crawler:
    TimeStrategy: Khởi tạo Interface. Cho phép HourlyStrategy (Chạy mỗi múi giờ), DailyStrategy (Mỗi ngày lúc 0h).
    PaginationStrategy: Lựa chọn loại phân trang web đích. Hỗ trợ LinkPagination (Quét dạng URL/Page=1,2,3), ClickPagination (Quét các trang dạng ajax Load More).

    34.3. Chi Tiết: Module Trợ Lý AI (AI Content Generator & Rewriter)#

    Module cốt lõi giúp xào bài (Content Spinning) hàng loạt. Nhận text thô từ Crawler -> Phối hợp với Open AI Models hoặc Local Models qua API -> Trả về bài Text mới có chất lượng ngữ nghĩa mượt mà, chống Copy-Paste.
    A. Quản Trị Hệ Mô Hình (Fallback & Workspace Context Model)
    Bảng open_ai_settings lưu thông tin API Key base và Cấu trúc chuỗi Model Chain. Hệ thống tích hợp tính năng Workspace Retry Pattern.
    1.
    Gọi API mồi (gpt-4o-mini). Bị lỗi (Rate limit do token hết hoặc API Timeout)? -> Fallback sang Model dự phòng (gpt-3.5-turbo) -> Tiếp tục lỗi? Fallback (claude-haiku).
    2.
    Tách biệt Model chuyên môn: Admin có quyền cấp Model đắt tiền/Thanh lịch cho các thao tác khó, Model rẻ cho Text dễ:
    translate_model_name: Dịch văn bản ngoại ngữ (VD crawl báo Anh) (Nhẹ nhàng, độ khó vừa, dùng Model rẻ).
    content_model_name: Trực tiếp viết lại Logic Nội dung HTML (Độ khó cao, không làm vỡ HTML Tags, dùng GPT-4).
    B. Workflow Chạy AI Tự Động theo Lô (Auto Batching Execution)
    Quá trình diễn ra tại file AIAssistantController@updateContentBlogs.
    1.
    Lấy Queue: Worker gọi DB Query SELECT các tl_blogs đang ở trạng thái Pending, có nhãn name_crawl (chứng tỏ là Hàng Cào Dữ Liệu) và ai_processed = 0 (Chưa từng chạy AI).
    2.
    Chunking HTML: Controller cắt content HTML thành các chunks vừa vặn với kích cỡ Tokens của khung Context Window API, bảo vệ không làm đứt chuỗi cấu trúc HTML Tags.
    3.
    Thực thi 3 Operation Vòng lặp tuần tự:
    (1) Node Translation: Dịch văn bản thô ngoại ngữ về Tiếng Việt (Thông qua Prompt System cấp quyền Role Translator).
    (2) Node Meta Edit: Gọi Prompt viết lại Tiêu đề {blog_title} và Tóm tắt {short_details} theo format SEO, clickbait.
    (3) Node Tone Edit: Gọi Prompt tùy chỉnh giọng văn body {blog_content} (Giọng báo chí, nghiêm túc, phong cách thể thao..).
    4.
    HTML DOM Parser Re-matching: Sau khi AI Response chuỗi Text. Server gọi thư viện Parser HTML DOM map lại thẻ <p>, <h2>, <img src...> để bài đăng không bị gập gốc thẻ HTML.
    5.
    Finalize DB & Bot Notification:
    Cập nhật bài viết lên Publish để Visitor xem.
    INSERT dữ liệu báo cáo Logging vào ai_api_logs (thống kê Cost $ đã tiêu, Token In/Out, ID Model nào đã gọi).
    Trigger Curl Webhook đẩy Push Notification Message đến máy chủ Chat nội bộ Mattermost thông báo: ✅ "Hoàn thành: Trợ lý AI vừa xào xong 5 bài viết cập nhật lên hệ thống thành công".
    Trường hợp Crash: Báo còi khẩn: ❌ "Bot AI Error: Hệ thống API ngắt kết nối hoặc Client Hết quota Tokens Limit. Lỗi: Insufficient quota" lên Error Channel Mattermost riêng.
    C. Đặc tả Bộ Prompts System Injection
    Sự thông minh của NewsLooks phụ thuộc vào kiến trúc gieo Prompts (Lưu file text System Role trong DB Settings). Nó chia Role rõ ràng:
    Title Rewrite Prompt: Giao Role AI: "Là một biên tập viên báo chí giật tít kỳ cựu chuyên nghiệp, hãy viết lại dòng tiêu đề ({blog_title}) giới hạn khoảng 60 từ bám sát nhất nội dung bóng đá, chuẩn SEO."
    Content Rewrite Prompt: Giao Role AI: "Viết lại dựa trên dàn bài HTML định dạng. Hãy xử lý giữ nguyên tuyệt đối cấu trúc thẻ bọc hình ảnh. Trình bày nội dung với phong vị của dân thể thao châm biếm sâu sắc. Từ khóa mục tiêu: {focus_keyword}."
    (Admin hoàn toàn có thể hiệu chỉnh System Role Prompting này cho từng Operation độc lập ngay trên Web Backend UI Menu /admin/ai-settings để dễ dàng đổi góc nhìn content trang web thành trang giải trí, trang tin tức chính trị hay blog bốc phốt tùy ý mà không cần đụng 1 dòng code Backend nào).

    Phiên bản v1.5 API Endpoints Documentation
    Modified at 2026-03-24 02:48:13
    Built with