1. Thethaoso
Sport FE (Bongdalu, Bongdako,..)
  • Bongdalu
    • Tổng quan về Bongdalu
    • Architecture
      • System
      • Database
      • Source Code
    • Development
      • Production
  • Bongdako
    • Tổng quan về Bongdako
    • Architecture
      • System
      • Database
      • Source Code
    • Development
      • Local
      • DEV
      • Production
  • ADMIN-BANNER
    • Tổng quan
    • Logic
      • Logic tổng thể
    • Projects
      • Architecture
        • System
        • Source Code
      • Development
        • Develop
        • Production
      • Public API
        • API
      • Database
        • Cấu trúc Database
      • Admin FE
        • Hướng dẫn Đăng nhập
        • QUẢN LÝ SITE (SITE MANAGEMENT)
        • QUẢN LÝ GIẢI ĐẤU (LEAGUE MANAGEMENT)
        • QUẢN LÝ NHÀ CUNG CẤP (SUPPLIER MANAGEMENT)
        • TIP & CHUYÊN GIA - TAB QUẢN LÝ TIPS (TIPS MANAGEMENT)
        • WHITELIST
        • QUẢN LÝ MINIGAME (MINIGAME MANAGEMENT)
        • TRAFFIC REPORT
        • TOOLS - RAPID DATA
        • TOOLS - LIVE SITES
        • TOOLS - SUPPLIERS
        • THEME / PLUGIN
        • NGƯỜI DÙNG - PHÂN QUYỀN VÀ HIỂN THỊ (PERMISSION & DISPLAY MANAGEMENT)
        • QUẢN LÝ NGƯỜI DÙNG (USER MANAGEMENT)
        • NGƯỜI DÙNG - QUẢN LÝ NHÓM QUYỀN (ROLE GROUP MANAGEMENT)
  • Landing Pages
    • Tổng quan
  • Mini Games
    • Lucky Wheel
      • Tổng quan
    • Free Kick
      • Tổng quan
  • Thethaoso
    • Tổng quan
    • Tasklist
    • Vận hành
  1. Thethaoso

Tổng quan

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-31 07:02:10
Previous
Tổng quan
Next
Tasklist
Built with